diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index d8d99622bda..271f154f560 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -1707,14 +1707,6 @@ "ImportPath": "github.com/gorilla/websocket", "Rev": "6eb6ad425a89d9da7a5549bc6da8f79ba5c17844" }, - { - "ImportPath": "github.com/gregjones/httpcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" - }, - { - "ImportPath": "github.com/gregjones/httpcache/diskcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" - }, { "ImportPath": "github.com/grpc-ecosystem/go-grpc-prometheus", "Comment": "v1.1-4-g2500245", @@ -2247,11 +2239,6 @@ "Comment": "v0.3.5-10-g0049ab3", "Rev": "0049ab3dc4c4c70a9eee23087437b69c0dde2130" }, - { - "ImportPath": "github.com/peterbourgon/diskv", - "Comment": "v2.0.0-2-g5dfcb07", - "Rev": "5dfcb07a075adbaaa4094cddfd160b1e1c77a043" - }, { "ImportPath": "github.com/pkg/errors", "Comment": "v0.7.0-13-ga221380", diff --git a/Godeps/LICENSES b/Godeps/LICENSES index 5aeb01e9ee6..5911292ad9c 100644 --- a/Godeps/LICENSES +++ b/Godeps/LICENSES @@ -59441,34 +59441,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================================================ -================================================================================ -= vendor/github.com/gregjones/httpcache licensed under: = - -Copyright © 2012 Greg Jones (greg.jones@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -= vendor/github.com/gregjones/httpcache/LICENSE.txt 3cfef421226b2dacde78a4871380ac24 - -================================================================================ - - -================================================================================ -= vendor/github.com/gregjones/httpcache/diskcache licensed under: = - -Copyright © 2012 Greg Jones (greg.jones@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -= vendor/github.com/gregjones/httpcache/LICENSE.txt 3cfef421226b2dacde78a4871380ac24 - -================================================================================ - - ================================================================================ = vendor/github.com/grpc-ecosystem/go-grpc-prometheus licensed under: = @@ -71602,33 +71574,6 @@ SOFTWARE. ================================================================================ -================================================================================ -= vendor/github.com/peterbourgon/diskv licensed under: = - -Copyright (c) 2011-2012 Peter Bourgon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -= vendor/github.com/peterbourgon/diskv/LICENSE f9f3e815fc84aa04c4f4db33c553eef9 - -================================================================================ - - ================================================================================ = vendor/github.com/pkg/errors licensed under: = diff --git a/OWNERS b/OWNERS index 1f898c88e7f..ec80d280a66 100644 --- a/OWNERS +++ b/OWNERS @@ -10,7 +10,7 @@ approvers: - brendandburns - dchen1107 - jbeda - - jregan # To modify BUILD files per proposal #598 + - monopole # To move code per kubernetes/community#598 - lavalamp - smarterclayton - thockin diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES index 4a86bd44268..eb109e9f5a9 100644 --- a/OWNERS_ALIASES +++ b/OWNERS_ALIASES @@ -53,7 +53,6 @@ aliases: - dchen1107 - derekwaynecarr - dims - - euank - feiskyer - mtaufen - ncdc diff --git a/api/BUILD b/api/BUILD index 6eef3bf055a..fe152d74d80 100644 --- a/api/BUILD +++ b/api/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 02b632f57de..f6f20f3fa56 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -21339,6 +21339,160 @@ } ] }, + "/apis/apps/v1beta1/namespaces/{namespace}/statefulsets/{name}/scale": { + "get": { + "description": "read scale of the specified StatefulSet", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "apps_v1beta1" + ], + "operationId": "readAppsV1beta1NamespacedStatefulSetScale", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1beta1.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Scale", + "version": "v1beta1" + } + }, + "put": { + "description": "replace scale of the specified StatefulSet", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "apps_v1beta1" + ], + "operationId": "replaceAppsV1beta1NamespacedStatefulSetScale", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1beta1.Scale" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1beta1.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Scale", + "version": "v1beta1" + } + }, + "patch": { + "description": "partially update scale of the specified StatefulSet", + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "apps_v1beta1" + ], + "operationId": "patchAppsV1beta1NamespacedStatefulSetScale", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1beta1.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Scale", + "version": "v1beta1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "name of the Scale", + "name": "name", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "object name and auth scope, such as for teams and projects", + "name": "namespace", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + } + ] + }, "/apis/apps/v1beta1/namespaces/{namespace}/statefulsets/{name}/status": { "get": { "description": "read status of the specified StatefulSet", @@ -23752,78 +23906,6 @@ } ] }, - "/apis/apps/v1beta2/namespaces/{namespace}/deployments/{name}/rollback": { - "post": { - "description": "create rollback of a Deployment", - "consumes": [ - "*/*" - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "schemes": [ - "https" - ], - "tags": [ - "apps_v1beta2" - ], - "operationId": "createAppsV1beta2NamespacedDeploymentRollback", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.api.apps.v1beta2.DeploymentRollback" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.apps.v1beta2.DeploymentRollback" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "x-kubernetes-action": "post", - "x-kubernetes-group-version-kind": { - "group": "apps", - "kind": "DeploymentRollback", - "version": "v1beta2" - } - }, - "parameters": [ - { - "uniqueItems": true, - "type": "string", - "description": "name of the DeploymentRollback", - "name": "name", - "in": "path", - "required": true - }, - { - "uniqueItems": true, - "type": "string", - "description": "object name and auth scope, such as for teams and projects", - "name": "namespace", - "in": "path", - "required": true - }, - { - "uniqueItems": true, - "type": "string", - "description": "If 'true', then the output is pretty printed.", - "name": "pretty", - "in": "query" - } - ] - }, "/apis/apps/v1beta2/namespaces/{namespace}/deployments/{name}/scale": { "get": { "description": "read scale of the specified Deployment", @@ -25360,6 +25442,160 @@ } ] }, + "/apis/apps/v1beta2/namespaces/{namespace}/statefulsets/{name}/scale": { + "get": { + "description": "read scale of the specified StatefulSet", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "apps_v1beta2" + ], + "operationId": "readAppsV1beta2NamespacedStatefulSetScale", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1beta2.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Scale", + "version": "v1beta2" + } + }, + "put": { + "description": "replace scale of the specified StatefulSet", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "apps_v1beta2" + ], + "operationId": "replaceAppsV1beta2NamespacedStatefulSetScale", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1beta2.Scale" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1beta2.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Scale", + "version": "v1beta2" + } + }, + "patch": { + "description": "partially update scale of the specified StatefulSet", + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "apps_v1beta2" + ], + "operationId": "patchAppsV1beta2NamespacedStatefulSetScale", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1beta2.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Scale", + "version": "v1beta2" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "name of the Scale", + "name": "name", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "object name and auth scope, such as for teams and projects", + "name": "namespace", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + } + ] + }, "/apis/apps/v1beta2/namespaces/{namespace}/statefulsets/{name}/status": { "get": { "description": "read status of the specified StatefulSet", @@ -31428,710 +31664,6 @@ } ] }, - "/apis/batch/v2alpha1/namespaces/{namespace}/scheduledjobs": { - "get": { - "description": "list or watch objects of kind ScheduledJob", - "consumes": [ - "*/*" - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "schemes": [ - "https" - ], - "tags": [ - "batch_v2alpha1" - ], - "operationId": "listBatchV2alpha1NamespacedScheduledJob", - "parameters": [ - { - "uniqueItems": true, - "type": "string", - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "name": "fieldSelector", - "in": "query" - }, - { - "uniqueItems": true, - "type": "boolean", - "description": "If true, partially initialized resources are included in the response.", - "name": "includeUninitialized", - "in": "query" - }, - { - "uniqueItems": true, - "type": "string", - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "name": "labelSelector", - "in": "query" - }, - { - "uniqueItems": true, - "type": "string", - "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", - "name": "resourceVersion", - "in": "query" - }, - { - "uniqueItems": true, - "type": "integer", - "description": "Timeout for the list/watch call.", - "name": "timeoutSeconds", - "in": "query" - }, - { - "uniqueItems": true, - "type": "boolean", - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "name": "watch", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.batch.v2alpha1.CronJobList" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "x-kubernetes-action": "list", - "x-kubernetes-group-version-kind": { - "group": "batch", - "kind": "ScheduledJob", - "version": "v2alpha1" - } - }, - "post": { - "description": "create a ScheduledJob", - "consumes": [ - "*/*" - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "schemes": [ - "https" - ], - "tags": [ - "batch_v2alpha1" - ], - "operationId": "createBatchV2alpha1NamespacedScheduledJob", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.api.batch.v2alpha1.CronJob" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.batch.v2alpha1.CronJob" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "x-kubernetes-action": "post", - "x-kubernetes-group-version-kind": { - "group": "batch", - "kind": "ScheduledJob", - "version": "v2alpha1" - } - }, - "delete": { - "description": "delete collection of ScheduledJob", - "consumes": [ - "*/*" - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "schemes": [ - "https" - ], - "tags": [ - "batch_v2alpha1" - ], - "operationId": "deleteBatchV2alpha1CollectionNamespacedScheduledJob", - "parameters": [ - { - "uniqueItems": true, - "type": "string", - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "name": "fieldSelector", - "in": "query" - }, - { - "uniqueItems": true, - "type": "boolean", - "description": "If true, partially initialized resources are included in the response.", - "name": "includeUninitialized", - "in": "query" - }, - { - "uniqueItems": true, - "type": "string", - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "name": "labelSelector", - "in": "query" - }, - { - "uniqueItems": true, - "type": "string", - "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", - "name": "resourceVersion", - "in": "query" - }, - { - "uniqueItems": true, - "type": "integer", - "description": "Timeout for the list/watch call.", - "name": "timeoutSeconds", - "in": "query" - }, - { - "uniqueItems": true, - "type": "boolean", - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "name": "watch", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "x-kubernetes-action": "deletecollection", - "x-kubernetes-group-version-kind": { - "group": "batch", - "kind": "ScheduledJob", - "version": "v2alpha1" - } - }, - "parameters": [ - { - "uniqueItems": true, - "type": "string", - "description": "object name and auth scope, such as for teams and projects", - "name": "namespace", - "in": "path", - "required": true - }, - { - "uniqueItems": true, - "type": "string", - "description": "If 'true', then the output is pretty printed.", - "name": "pretty", - "in": "query" - } - ] - }, - "/apis/batch/v2alpha1/namespaces/{namespace}/scheduledjobs/{name}": { - "get": { - "description": "read the specified ScheduledJob", - "consumes": [ - "*/*" - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "schemes": [ - "https" - ], - "tags": [ - "batch_v2alpha1" - ], - "operationId": "readBatchV2alpha1NamespacedScheduledJob", - "parameters": [ - { - "uniqueItems": true, - "type": "boolean", - "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'.", - "name": "exact", - "in": "query" - }, - { - "uniqueItems": true, - "type": "boolean", - "description": "Should this value be exported. Export strips fields that a user can not specify.", - "name": "export", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.batch.v2alpha1.CronJob" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "x-kubernetes-action": "get", - "x-kubernetes-group-version-kind": { - "group": "batch", - "kind": "ScheduledJob", - "version": "v2alpha1" - } - }, - "put": { - "description": "replace the specified ScheduledJob", - "consumes": [ - "*/*" - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "schemes": [ - "https" - ], - "tags": [ - "batch_v2alpha1" - ], - "operationId": "replaceBatchV2alpha1NamespacedScheduledJob", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.api.batch.v2alpha1.CronJob" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.batch.v2alpha1.CronJob" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "x-kubernetes-action": "put", - "x-kubernetes-group-version-kind": { - "group": "batch", - "kind": "ScheduledJob", - "version": "v2alpha1" - } - }, - "delete": { - "description": "delete a ScheduledJob", - "consumes": [ - "*/*" - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "schemes": [ - "https" - ], - "tags": [ - "batch_v2alpha1" - ], - "operationId": "deleteBatchV2alpha1NamespacedScheduledJob", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" - } - }, - { - "uniqueItems": true, - "type": "integer", - "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", - "name": "gracePeriodSeconds", - "in": "query" - }, - { - "uniqueItems": true, - "type": "boolean", - "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", - "name": "orphanDependents", - "in": "query" - }, - { - "uniqueItems": true, - "type": "string", - "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.", - "name": "propagationPolicy", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "x-kubernetes-action": "delete", - "x-kubernetes-group-version-kind": { - "group": "batch", - "kind": "ScheduledJob", - "version": "v2alpha1" - } - }, - "patch": { - "description": "partially update the specified ScheduledJob", - "consumes": [ - "application/json-patch+json", - "application/merge-patch+json", - "application/strategic-merge-patch+json" - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "schemes": [ - "https" - ], - "tags": [ - "batch_v2alpha1" - ], - "operationId": "patchBatchV2alpha1NamespacedScheduledJob", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.batch.v2alpha1.CronJob" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "x-kubernetes-action": "patch", - "x-kubernetes-group-version-kind": { - "group": "batch", - "kind": "ScheduledJob", - "version": "v2alpha1" - } - }, - "parameters": [ - { - "uniqueItems": true, - "type": "string", - "description": "name of the ScheduledJob", - "name": "name", - "in": "path", - "required": true - }, - { - "uniqueItems": true, - "type": "string", - "description": "object name and auth scope, such as for teams and projects", - "name": "namespace", - "in": "path", - "required": true - }, - { - "uniqueItems": true, - "type": "string", - "description": "If 'true', then the output is pretty printed.", - "name": "pretty", - "in": "query" - } - ] - }, - "/apis/batch/v2alpha1/namespaces/{namespace}/scheduledjobs/{name}/status": { - "get": { - "description": "read status of the specified ScheduledJob", - "consumes": [ - "*/*" - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "schemes": [ - "https" - ], - "tags": [ - "batch_v2alpha1" - ], - "operationId": "readBatchV2alpha1NamespacedScheduledJobStatus", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.batch.v2alpha1.CronJob" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "x-kubernetes-action": "get", - "x-kubernetes-group-version-kind": { - "group": "batch", - "kind": "ScheduledJob", - "version": "v2alpha1" - } - }, - "put": { - "description": "replace status of the specified ScheduledJob", - "consumes": [ - "*/*" - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "schemes": [ - "https" - ], - "tags": [ - "batch_v2alpha1" - ], - "operationId": "replaceBatchV2alpha1NamespacedScheduledJobStatus", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.api.batch.v2alpha1.CronJob" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.batch.v2alpha1.CronJob" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "x-kubernetes-action": "put", - "x-kubernetes-group-version-kind": { - "group": "batch", - "kind": "ScheduledJob", - "version": "v2alpha1" - } - }, - "patch": { - "description": "partially update status of the specified ScheduledJob", - "consumes": [ - "application/json-patch+json", - "application/merge-patch+json", - "application/strategic-merge-patch+json" - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "schemes": [ - "https" - ], - "tags": [ - "batch_v2alpha1" - ], - "operationId": "patchBatchV2alpha1NamespacedScheduledJobStatus", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.batch.v2alpha1.CronJob" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "x-kubernetes-action": "patch", - "x-kubernetes-group-version-kind": { - "group": "batch", - "kind": "ScheduledJob", - "version": "v2alpha1" - } - }, - "parameters": [ - { - "uniqueItems": true, - "type": "string", - "description": "name of the ScheduledJob", - "name": "name", - "in": "path", - "required": true - }, - { - "uniqueItems": true, - "type": "string", - "description": "object name and auth scope, such as for teams and projects", - "name": "namespace", - "in": "path", - "required": true - }, - { - "uniqueItems": true, - "type": "string", - "description": "If 'true', then the output is pretty printed.", - "name": "pretty", - "in": "query" - } - ] - }, - "/apis/batch/v2alpha1/scheduledjobs": { - "get": { - "description": "list or watch objects of kind ScheduledJob", - "consumes": [ - "*/*" - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "schemes": [ - "https" - ], - "tags": [ - "batch_v2alpha1" - ], - "operationId": "listBatchV2alpha1ScheduledJobForAllNamespaces", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.batch.v2alpha1.CronJobList" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "x-kubernetes-action": "list", - "x-kubernetes-group-version-kind": { - "group": "batch", - "kind": "ScheduledJob", - "version": "v2alpha1" - } - }, - "parameters": [ - { - "uniqueItems": true, - "type": "string", - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "name": "fieldSelector", - "in": "query" - }, - { - "uniqueItems": true, - "type": "boolean", - "description": "If true, partially initialized resources are included in the response.", - "name": "includeUninitialized", - "in": "query" - }, - { - "uniqueItems": true, - "type": "string", - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "name": "labelSelector", - "in": "query" - }, - { - "uniqueItems": true, - "type": "string", - "description": "If 'true', then the output is pretty printed.", - "name": "pretty", - "in": "query" - }, - { - "uniqueItems": true, - "type": "string", - "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", - "name": "resourceVersion", - "in": "query" - }, - { - "uniqueItems": true, - "type": "integer", - "description": "Timeout for the list/watch call.", - "name": "timeoutSeconds", - "in": "query" - }, - { - "uniqueItems": true, - "type": "boolean", - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "name": "watch", - "in": "query" - } - ] - }, "/apis/batch/v2alpha1/watch/cronjobs": { "get": { "description": "watch individual changes to a list of CronJob", @@ -32426,300 +31958,6 @@ } ] }, - "/apis/batch/v2alpha1/watch/namespaces/{namespace}/scheduledjobs": { - "get": { - "description": "watch individual changes to a list of ScheduledJob", - "consumes": [ - "*/*" - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "schemes": [ - "https" - ], - "tags": [ - "batch_v2alpha1" - ], - "operationId": "watchBatchV2alpha1NamespacedScheduledJobList", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "x-kubernetes-action": "watchlist", - "x-kubernetes-group-version-kind": { - "group": "batch", - "kind": "ScheduledJob", - "version": "v2alpha1" - } - }, - "parameters": [ - { - "uniqueItems": true, - "type": "string", - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "name": "fieldSelector", - "in": "query" - }, - { - "uniqueItems": true, - "type": "boolean", - "description": "If true, partially initialized resources are included in the response.", - "name": "includeUninitialized", - "in": "query" - }, - { - "uniqueItems": true, - "type": "string", - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "name": "labelSelector", - "in": "query" - }, - { - "uniqueItems": true, - "type": "string", - "description": "object name and auth scope, such as for teams and projects", - "name": "namespace", - "in": "path", - "required": true - }, - { - "uniqueItems": true, - "type": "string", - "description": "If 'true', then the output is pretty printed.", - "name": "pretty", - "in": "query" - }, - { - "uniqueItems": true, - "type": "string", - "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", - "name": "resourceVersion", - "in": "query" - }, - { - "uniqueItems": true, - "type": "integer", - "description": "Timeout for the list/watch call.", - "name": "timeoutSeconds", - "in": "query" - }, - { - "uniqueItems": true, - "type": "boolean", - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "name": "watch", - "in": "query" - } - ] - }, - "/apis/batch/v2alpha1/watch/namespaces/{namespace}/scheduledjobs/{name}": { - "get": { - "description": "watch changes to an object of kind ScheduledJob", - "consumes": [ - "*/*" - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "schemes": [ - "https" - ], - "tags": [ - "batch_v2alpha1" - ], - "operationId": "watchBatchV2alpha1NamespacedScheduledJob", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "x-kubernetes-action": "watch", - "x-kubernetes-group-version-kind": { - "group": "batch", - "kind": "ScheduledJob", - "version": "v2alpha1" - } - }, - "parameters": [ - { - "uniqueItems": true, - "type": "string", - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "name": "fieldSelector", - "in": "query" - }, - { - "uniqueItems": true, - "type": "boolean", - "description": "If true, partially initialized resources are included in the response.", - "name": "includeUninitialized", - "in": "query" - }, - { - "uniqueItems": true, - "type": "string", - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "name": "labelSelector", - "in": "query" - }, - { - "uniqueItems": true, - "type": "string", - "description": "name of the ScheduledJob", - "name": "name", - "in": "path", - "required": true - }, - { - "uniqueItems": true, - "type": "string", - "description": "object name and auth scope, such as for teams and projects", - "name": "namespace", - "in": "path", - "required": true - }, - { - "uniqueItems": true, - "type": "string", - "description": "If 'true', then the output is pretty printed.", - "name": "pretty", - "in": "query" - }, - { - "uniqueItems": true, - "type": "string", - "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", - "name": "resourceVersion", - "in": "query" - }, - { - "uniqueItems": true, - "type": "integer", - "description": "Timeout for the list/watch call.", - "name": "timeoutSeconds", - "in": "query" - }, - { - "uniqueItems": true, - "type": "boolean", - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "name": "watch", - "in": "query" - } - ] - }, - "/apis/batch/v2alpha1/watch/scheduledjobs": { - "get": { - "description": "watch individual changes to a list of ScheduledJob", - "consumes": [ - "*/*" - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "schemes": [ - "https" - ], - "tags": [ - "batch_v2alpha1" - ], - "operationId": "watchBatchV2alpha1ScheduledJobListForAllNamespaces", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "x-kubernetes-action": "watchlist", - "x-kubernetes-group-version-kind": { - "group": "batch", - "kind": "ScheduledJob", - "version": "v2alpha1" - } - }, - "parameters": [ - { - "uniqueItems": true, - "type": "string", - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "name": "fieldSelector", - "in": "query" - }, - { - "uniqueItems": true, - "type": "boolean", - "description": "If true, partially initialized resources are included in the response.", - "name": "includeUninitialized", - "in": "query" - }, - { - "uniqueItems": true, - "type": "string", - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "name": "labelSelector", - "in": "query" - }, - { - "uniqueItems": true, - "type": "string", - "description": "If 'true', then the output is pretty printed.", - "name": "pretty", - "in": "query" - }, - { - "uniqueItems": true, - "type": "string", - "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", - "name": "resourceVersion", - "in": "query" - }, - { - "uniqueItems": true, - "type": "integer", - "description": "Timeout for the list/watch call.", - "name": "timeoutSeconds", - "in": "query" - }, - { - "uniqueItems": true, - "type": "boolean", - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "name": "watch", - "in": "query" - } - ] - }, "/apis/certificates.k8s.io/": { "get": { "description": "get information of a group", @@ -41621,6 +40859,2927 @@ } } }, + "/apis/rbac.authorization.k8s.io/v1/": { + "get": { + "description": "get available resources", + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "getRbacAuthorizationV1APIResources", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + } + } + }, + "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings": { + "get": { + "description": "list or watch objects of kind ClusterRoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "listRbacAuthorizationV1ClusterRoleBinding", + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBindingList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + }, + "post": { + "description": "create a ClusterRoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "createRbacAuthorizationV1ClusterRoleBinding", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + }, + "delete": { + "description": "delete collection of ClusterRoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "deleteRbacAuthorizationV1CollectionClusterRoleBinding", + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings/{name}": { + "get": { + "description": "read the specified ClusterRoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "readRbacAuthorizationV1ClusterRoleBinding", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + }, + "put": { + "description": "replace the specified ClusterRoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "replaceRbacAuthorizationV1ClusterRoleBinding", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + }, + "delete": { + "description": "delete a ClusterRoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "deleteRbacAuthorizationV1ClusterRoleBinding", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "uniqueItems": true, + "type": "integer", + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "name": "gracePeriodSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "name": "orphanDependents", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.", + "name": "propagationPolicy", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + }, + "patch": { + "description": "partially update the specified ClusterRoleBinding", + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "patchRbacAuthorizationV1ClusterRoleBinding", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "name of the ClusterRoleBinding", + "name": "name", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/clusterroles": { + "get": { + "description": "list or watch objects of kind ClusterRole", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "listRbacAuthorizationV1ClusterRole", + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + }, + "post": { + "description": "create a ClusterRole", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "createRbacAuthorizationV1ClusterRole", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRole" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRole" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + }, + "delete": { + "description": "delete collection of ClusterRole", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "deleteRbacAuthorizationV1CollectionClusterRole", + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/clusterroles/{name}": { + "get": { + "description": "read the specified ClusterRole", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "readRbacAuthorizationV1ClusterRole", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRole" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + }, + "put": { + "description": "replace the specified ClusterRole", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "replaceRbacAuthorizationV1ClusterRole", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRole" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRole" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + }, + "delete": { + "description": "delete a ClusterRole", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "deleteRbacAuthorizationV1ClusterRole", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "uniqueItems": true, + "type": "integer", + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "name": "gracePeriodSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "name": "orphanDependents", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.", + "name": "propagationPolicy", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + }, + "patch": { + "description": "partially update the specified ClusterRole", + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "patchRbacAuthorizationV1ClusterRole", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRole" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "name of the ClusterRole", + "name": "name", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolebindings": { + "get": { + "description": "list or watch objects of kind RoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "listRbacAuthorizationV1NamespacedRoleBinding", + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBindingList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "post": { + "description": "create a RoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "createRbacAuthorizationV1NamespacedRoleBinding", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBinding" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "delete": { + "description": "delete collection of RoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "deleteRbacAuthorizationV1CollectionNamespacedRoleBinding", + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "object name and auth scope, such as for teams and projects", + "name": "namespace", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolebindings/{name}": { + "get": { + "description": "read the specified RoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "readRbacAuthorizationV1NamespacedRoleBinding", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "put": { + "description": "replace the specified RoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "replaceRbacAuthorizationV1NamespacedRoleBinding", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBinding" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "delete": { + "description": "delete a RoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "deleteRbacAuthorizationV1NamespacedRoleBinding", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "uniqueItems": true, + "type": "integer", + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "name": "gracePeriodSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "name": "orphanDependents", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.", + "name": "propagationPolicy", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "patch": { + "description": "partially update the specified RoleBinding", + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "patchRbacAuthorizationV1NamespacedRoleBinding", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "name of the RoleBinding", + "name": "name", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "object name and auth scope, such as for teams and projects", + "name": "namespace", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/roles": { + "get": { + "description": "list or watch objects of kind Role", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "listRbacAuthorizationV1NamespacedRole", + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "post": { + "description": "create a Role", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "createRbacAuthorizationV1NamespacedRole", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Role" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Role" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "delete": { + "description": "delete collection of Role", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "deleteRbacAuthorizationV1CollectionNamespacedRole", + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "object name and auth scope, such as for teams and projects", + "name": "namespace", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/roles/{name}": { + "get": { + "description": "read the specified Role", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "readRbacAuthorizationV1NamespacedRole", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Role" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "put": { + "description": "replace the specified Role", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "replaceRbacAuthorizationV1NamespacedRole", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Role" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Role" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "delete": { + "description": "delete a Role", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "deleteRbacAuthorizationV1NamespacedRole", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "uniqueItems": true, + "type": "integer", + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "name": "gracePeriodSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "name": "orphanDependents", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.", + "name": "propagationPolicy", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "patch": { + "description": "partially update the specified Role", + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "patchRbacAuthorizationV1NamespacedRole", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Role" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "name of the Role", + "name": "name", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "object name and auth scope, such as for teams and projects", + "name": "namespace", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/rolebindings": { + "get": { + "description": "list or watch objects of kind RoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "listRbacAuthorizationV1RoleBindingForAllNamespaces", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBindingList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/roles": { + "get": { + "description": "list or watch objects of kind Role", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "listRbacAuthorizationV1RoleForAllNamespaces", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/clusterrolebindings": { + "get": { + "description": "watch individual changes to a list of ClusterRoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "watchRbacAuthorizationV1ClusterRoleBindingList", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/clusterrolebindings/{name}": { + "get": { + "description": "watch changes to an object of kind ClusterRoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "watchRbacAuthorizationV1ClusterRoleBinding", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "name of the ClusterRoleBinding", + "name": "name", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/clusterroles": { + "get": { + "description": "watch individual changes to a list of ClusterRole", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "watchRbacAuthorizationV1ClusterRoleList", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/clusterroles/{name}": { + "get": { + "description": "watch changes to an object of kind ClusterRole", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "watchRbacAuthorizationV1ClusterRole", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "name of the ClusterRole", + "name": "name", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/rolebindings": { + "get": { + "description": "watch individual changes to a list of RoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "watchRbacAuthorizationV1NamespacedRoleBindingList", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "object name and auth scope, such as for teams and projects", + "name": "namespace", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/rolebindings/{name}": { + "get": { + "description": "watch changes to an object of kind RoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "watchRbacAuthorizationV1NamespacedRoleBinding", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "name of the RoleBinding", + "name": "name", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "object name and auth scope, such as for teams and projects", + "name": "namespace", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/roles": { + "get": { + "description": "watch individual changes to a list of Role", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "watchRbacAuthorizationV1NamespacedRoleList", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "object name and auth scope, such as for teams and projects", + "name": "namespace", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/roles/{name}": { + "get": { + "description": "watch changes to an object of kind Role", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "watchRbacAuthorizationV1NamespacedRole", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "name of the Role", + "name": "name", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "object name and auth scope, such as for teams and projects", + "name": "namespace", + "in": "path", + "required": true + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/rolebindings": { + "get": { + "description": "watch individual changes to a list of RoleBinding", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "watchRbacAuthorizationV1RoleBindingListForAllNamespaces", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/roles": { + "get": { + "description": "watch individual changes to a list of Role", + "consumes": [ + "*/*" + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "operationId": "watchRbacAuthorizationV1RoleListForAllNamespaces", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "parameters": [ + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "name": "fieldSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "If true, partially initialized resources are included in the response.", + "name": "includeUninitialized", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "name": "labelSelector", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "If 'true', then the output is pretty printed.", + "name": "pretty", + "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "name": "resourceVersion", + "in": "query" + }, + { + "uniqueItems": true, + "type": "integer", + "description": "Timeout for the list/watch call.", + "name": "timeoutSeconds", + "in": "query" + }, + { + "uniqueItems": true, + "type": "boolean", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "name": "watch", + "in": "query" + } + ] + }, "/apis/rbac.authorization.k8s.io/v1alpha1/": { "get": { "description": "get available resources", @@ -50956,7 +53115,7 @@ ] }, "io.k8s.api.apps.v1beta1.DeploymentRollback": { - "description": "DeploymentRollback stores the information required to rollback a deployment.", + "description": "DEPRECATED. DeploymentRollback stores the information required to rollback a deployment.", "required": [ "name", "rollbackTo" @@ -51025,7 +53184,7 @@ "format": "int32" }, "rollbackTo": { - "description": "The config this deployment is rolling back to. Will be cleared after rollback is done.", + "description": "DEPRECATED. The config this deployment is rolling back to. Will be cleared after rollback is done.", "$ref": "#/definitions/io.k8s.api.apps.v1beta1.RollbackConfig" }, "selector": { @@ -51105,6 +53264,7 @@ } }, "io.k8s.api.apps.v1beta1.RollbackConfig": { + "description": "DEPRECATED.", "properties": { "revision": { "description": "The revision to rollback to. If set to 0, rollback to the last revision.", @@ -51317,6 +53477,11 @@ "replicas" ], "properties": { + "collisionCount": { + "description": "collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.", + "type": "integer", + "format": "int64" + }, "currentReplicas": { "description": "currentReplicas is the number of Pods created by the StatefulSet controller from the StatefulSet version indicated by currentRevision.", "type": "integer", @@ -51530,7 +53695,7 @@ "$ref": "#/definitions/io.k8s.api.apps.v1beta2.RollingUpdateDaemonSet" }, "type": { - "description": "Type of daemon set update. Can be \"RollingUpdate\" or \"OnDelete\". Default is OnDelete.", + "description": "Type of daemon set update. Can be \"RollingUpdate\" or \"OnDelete\". Default is RollingUpdate.", "type": "string" } } @@ -51634,45 +53799,6 @@ } ] }, - "io.k8s.api.apps.v1beta2.DeploymentRollback": { - "description": "WIP: This is not ready to be used and we plan to make breaking changes to it. DeploymentRollback stores the information required to rollback a deployment.", - "required": [ - "name", - "rollbackTo" - ], - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", - "type": "string" - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", - "type": "string" - }, - "name": { - "description": "Required: This must match the Name of a deployment.", - "type": "string" - }, - "rollbackTo": { - "description": "The config of this deployment rollback.", - "$ref": "#/definitions/io.k8s.api.apps.v1beta2.RollbackConfig" - }, - "updatedAnnotations": { - "description": "The annotations to be updated to a deployment", - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "x-kubernetes-group-version-kind": [ - { - "group": "apps", - "kind": "DeploymentRollback", - "version": "v1beta2" - } - ] - }, "io.k8s.api.apps.v1beta2.DeploymentSpec": { "description": "WIP: This is not ready to be used and we plan to make breaking changes to it. DeploymentSpec is the specification of the desired behavior of the Deployment.", "required": [ @@ -51703,10 +53829,6 @@ "type": "integer", "format": "int32" }, - "rollbackTo": { - "description": "The config this deployment is rolling back to. Will be cleared after rollback is done.", - "$ref": "#/definitions/io.k8s.api.apps.v1beta2.RollbackConfig" - }, "selector": { "description": "Label selector for pods. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment.", "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector" @@ -51943,16 +54065,6 @@ } } }, - "io.k8s.api.apps.v1beta2.RollbackConfig": { - "description": "WIP: This is not ready to be used and we plan to make breaking changes to it.", - "properties": { - "revision": { - "description": "The revision to rollback to. If set to 0, rollback to the last revision.", - "type": "integer", - "format": "int64" - } - } - }, "io.k8s.api.apps.v1beta2.RollingUpdateDaemonSet": { "description": "WIP: This is not ready to be used and we plan to make breaking changes to it. Spec to control the desired behavior of daemon set rolling update.", "properties": { @@ -51979,7 +54091,7 @@ "description": "WIP: This is not ready to be used and we plan to make breaking changes to it. RollingUpdateStatefulSetStrategy is used to communicate parameter for RollingUpdateStatefulSetStrategyType.", "properties": { "partition": { - "description": "Partition indicates the ordinal at which the StatefulSet should be partitioned.", + "description": "Partition indicates the ordinal at which the StatefulSet should be partitioned. Default value is 0.", "type": "integer", "format": "int32" } @@ -52166,6 +54278,11 @@ "replicas" ], "properties": { + "collisionCount": { + "description": "collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.", + "type": "integer", + "format": "int64" + }, "currentReplicas": { "description": "currentReplicas is the number of Pods created by the StatefulSet controller from the StatefulSet version indicated by currentRevision.", "type": "integer", @@ -52209,7 +54326,7 @@ "$ref": "#/definitions/io.k8s.api.apps.v1beta2.RollingUpdateStatefulSetStrategy" }, "type": { - "description": "Type indicates the type of the StatefulSetUpdateStrategy.", + "description": "Type indicates the type of the StatefulSetUpdateStrategy. Default is RollingUpdate.", "type": "string" } } @@ -53598,11 +55715,6 @@ "group": "batch", "kind": "CronJob", "version": "v2alpha1" - }, - { - "group": "batch", - "kind": "ScheduledJob", - "version": "v2alpha1" } ] }, @@ -53637,11 +55749,6 @@ "group": "batch", "kind": "CronJobList", "version": "v2alpha1" - }, - { - "group": "batch", - "kind": "ScheduledJobList", - "version": "v2alpha1" } ] }, @@ -54997,17 +57104,13 @@ }, "io.k8s.api.core.v1.FCVolumeSource": { "description": "Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write once. Fibre Channel volumes support ownership management and SELinux relabeling.", - "required": [ - "targetWWNs", - "lun" - ], "properties": { "fsType": { "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", "type": "string" }, "lun": { - "description": "Required: FC target lun number", + "description": "Optional: FC target lun number", "type": "integer", "format": "int32" }, @@ -55016,7 +57119,14 @@ "type": "boolean" }, "targetWWNs": { - "description": "Required: FC target worldwide names (WWNs)", + "description": "Optional: FC target worldwide names (WWNs)", + "type": "array", + "items": { + "type": "string" + } + }, + "wwids": { + "description": "Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.", "type": "array", "items": { "type": "string" @@ -55689,6 +57799,29 @@ } } }, + "io.k8s.api.core.v1.NodeConfigSource": { + "description": "NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + "type": "string" + }, + "configMapRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.ObjectReference" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "type": "string" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "NodeConfigSource", + "version": "v1" + } + ] + }, "io.k8s.api.core.v1.NodeDaemonEndpoints": { "description": "NodeDaemonEndpoints lists ports opened by daemons running on the Node.", "properties": { @@ -55791,6 +57924,10 @@ "io.k8s.api.core.v1.NodeSpec": { "description": "NodeSpec describes the attributes that a node is created with.", "properties": { + "configSource": { + "description": "If specified, the source to get node configuration from The DynamicKubeletConfig feature gate must be enabled for the Kubelet to use this field", + "$ref": "#/definitions/io.k8s.api.core.v1.NodeConfigSource" + }, "externalID": { "description": "External ID of the node assigned by some machine database (e.g. a cloud provider). Deprecated.", "type": "string" @@ -56382,7 +58519,7 @@ } }, "requiredDuringSchedulingIgnoredDuringExecution": { - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", + "description": "If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", "type": "array", "items": { "$ref": "#/definitions/io.k8s.api.core.v1.PodAffinityTerm" @@ -56421,7 +58558,7 @@ } }, "requiredDuringSchedulingIgnoredDuringExecution": { - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", + "description": "If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", "type": "array", "items": { "$ref": "#/definitions/io.k8s.api.core.v1.PodAffinityTerm" @@ -57760,6 +59897,10 @@ "x-kubernetes-patch-merge-key": "port", "x-kubernetes-patch-strategy": "merge" }, + "publishNotReadyAddresses": { + "description": "publishNotReadyAddresses, when set to true, indicates that DNS implementations must publish the notReadyAddresses of subsets for the Endpoints associated with the Service. The default value is false. The primary use case for setting this field is to use a StatefulSet's Headless Service to propagate SRV records for its Pods without respect to their readiness for purpose of peer discovery. This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints when that annotation is deprecated and all clients have been converted to use this field.", + "type": "boolean" + }, "selector": { "description": "Route service traffic to pods with label keys and values matching this selector. If empty or not present, the service is assumed to have an external process managing its endpoints, which Kubernetes will not modify. Only applies to types ClusterIP, NodePort, and LoadBalancer. Ignored if type is ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/", "type": "object", @@ -58380,7 +60521,7 @@ ] }, "io.k8s.api.extensions.v1beta1.DeploymentRollback": { - "description": "DeploymentRollback stores the information required to rollback a deployment.", + "description": "DEPRECATED. DeploymentRollback stores the information required to rollback a deployment.", "required": [ "name", "rollbackTo" @@ -58449,7 +60590,7 @@ "format": "int32" }, "rollbackTo": { - "description": "The config this deployment is rolling back to. Will be cleared after rollback is done.", + "description": "DEPRECATED. The config this deployment is rolling back to. Will be cleared after rollback is done.", "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.RollbackConfig" }, "selector": { @@ -59192,6 +61333,7 @@ } }, "io.k8s.api.extensions.v1beta1.RollbackConfig": { + "description": "DEPRECATED.", "properties": { "revision": { "description": "The revision to rollback to. If set to 0, rollback to the last revision.", @@ -59617,6 +61759,378 @@ } } }, + "io.k8s.api.rbac.v1.ClusterRole": { + "description": "ClusterRole is a cluster level, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding or ClusterRoleBinding.", + "required": [ + "rules" + ], + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "description": "Standard object's metadata.", + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "rules": { + "description": "Rules holds all the PolicyRules for this ClusterRole", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.PolicyRule" + } + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + ] + }, + "io.k8s.api.rbac.v1.ClusterRoleBinding": { + "description": "ClusterRoleBinding references a ClusterRole, but not contain it. It can reference a ClusterRole in the global namespace, and adds who information via Subject.", + "required": [ + "subjects", + "roleRef" + ], + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "description": "Standard object's metadata.", + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "roleRef": { + "description": "RoleRef can only reference a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error.", + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleRef" + }, + "subjects": { + "description": "Subjects holds references to the objects the role applies to.", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Subject" + } + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + ] + }, + "io.k8s.api.rbac.v1.ClusterRoleBindingList": { + "description": "ClusterRoleBindingList is a collection of ClusterRoleBindings", + "required": [ + "items" + ], + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of ClusterRoleBindings", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding" + } + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "description": "Standard object's metadata.", + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBindingList", + "version": "v1" + } + ] + }, + "io.k8s.api.rbac.v1.ClusterRoleList": { + "description": "ClusterRoleList is a collection of ClusterRoles", + "required": [ + "items" + ], + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of ClusterRoles", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRole" + } + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "description": "Standard object's metadata.", + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleList", + "version": "v1" + } + ] + }, + "io.k8s.api.rbac.v1.PolicyRule": { + "description": "PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to.", + "required": [ + "verbs" + ], + "properties": { + "apiGroups": { + "description": "APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed.", + "type": "array", + "items": { + "type": "string" + } + }, + "nonResourceURLs": { + "description": "NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as \"pods\" or \"secrets\") or non-resource URL paths (such as \"/api\"), but not both.", + "type": "array", + "items": { + "type": "string" + } + }, + "resourceNames": { + "description": "ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed.", + "type": "array", + "items": { + "type": "string" + } + }, + "resources": { + "description": "Resources is a list of resources this rule applies to. ResourceAll represents all resources.", + "type": "array", + "items": { + "type": "string" + } + }, + "verbs": { + "description": "Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "io.k8s.api.rbac.v1.Role": { + "description": "Role is a namespaced, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding.", + "required": [ + "rules" + ], + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "description": "Standard object's metadata.", + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "rules": { + "description": "Rules holds all the PolicyRules for this Role", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.PolicyRule" + } + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + ] + }, + "io.k8s.api.rbac.v1.RoleBinding": { + "description": "RoleBinding references a role, but does not contain it. It can reference a Role in the same namespace or a ClusterRole in the global namespace. It adds who information via Subjects and namespace information by which namespace it exists in. RoleBindings in a given namespace only have effect in that namespace.", + "required": [ + "subjects", + "roleRef" + ], + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "description": "Standard object's metadata.", + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "roleRef": { + "description": "RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error.", + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleRef" + }, + "subjects": { + "description": "Subjects holds references to the objects the role applies to.", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Subject" + } + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + ] + }, + "io.k8s.api.rbac.v1.RoleBindingList": { + "description": "RoleBindingList is a collection of RoleBindings", + "required": [ + "items" + ], + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of RoleBindings", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBinding" + } + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "description": "Standard object's metadata.", + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBindingList", + "version": "v1" + } + ] + }, + "io.k8s.api.rbac.v1.RoleList": { + "description": "RoleList is a collection of Roles", + "required": [ + "items" + ], + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of Roles", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Role" + } + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "description": "Standard object's metadata.", + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "RoleList", + "version": "v1" + } + ] + }, + "io.k8s.api.rbac.v1.RoleRef": { + "description": "RoleRef contains information that points to the role being used", + "required": [ + "apiGroup", + "kind", + "name" + ], + "properties": { + "apiGroup": { + "description": "APIGroup is the group for the resource being referenced", + "type": "string" + }, + "kind": { + "description": "Kind is the type of resource being referenced", + "type": "string" + }, + "name": { + "description": "Name is the name of resource being referenced", + "type": "string" + } + } + }, + "io.k8s.api.rbac.v1.Subject": { + "description": "Subject contains a reference to the object or user identities a role binding applies to. This can either hold a direct API object reference, or a value for non-objects such as user and group names.", + "required": [ + "kind", + "name" + ], + "properties": { + "apiGroup": { + "description": "APIGroup holds the API group of the referenced subject. Defaults to \"\" for ServiceAccount subjects. Defaults to \"rbac.authorization.k8s.io\" for User and Group subjects.", + "type": "string" + }, + "kind": { + "description": "Kind of object being referenced. Values defined by this API group are \"User\", \"Group\", and \"ServiceAccount\". If the Authorizer does not recognized the kind value, the Authorizer should report an error.", + "type": "string" + }, + "name": { + "description": "Name of the object being referenced.", + "type": "string" + }, + "namespace": { + "description": "Namespace of the referenced object. If the object kind is non-namespace, such as \"User\" or \"Group\", and this value is not empty the Authorizer should report an error.", + "type": "string" + } + } + }, "io.k8s.api.rbac.v1alpha1.ClusterRole": { "description": "ClusterRole is a cluster level, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding or ClusterRoleBinding.", "required": [ @@ -61003,6 +63517,11 @@ "kind": "DeleteOptions", "version": "v1beta1" }, + { + "group": "rbac.authorization.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, { "group": "rbac.authorization.k8s.io", "kind": "DeleteOptions", @@ -61501,6 +64020,11 @@ "kind": "WatchEvent", "version": "v1beta1" }, + { + "group": "rbac.authorization.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, { "group": "rbac.authorization.k8s.io", "kind": "WatchEvent", diff --git a/api/swagger-spec/apps_v1beta1.json b/api/swagger-spec/apps_v1beta1.json index 5524e1f712d..1f99ebc6bfa 100644 --- a/api/swagger-spec/apps_v1beta1.json +++ b/api/swagger-spec/apps_v1beta1.json @@ -2982,6 +2982,171 @@ } ] }, + { + "path": "/apis/apps/v1beta1/namespaces/{namespace}/statefulsets/{name}/scale", + "description": "API at /apis/apps/v1beta1", + "operations": [ + { + "type": "v1beta1.Scale", + "method": "GET", + "summary": "read scale of the specified StatefulSet", + "nickname": "readNamespacedStatefulSetScale", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the Scale", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1beta1.Scale" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1beta1.Scale", + "method": "PUT", + "summary": "replace scale of the specified StatefulSet", + "nickname": "replaceNamespacedStatefulSetScale", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1beta1.Scale", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the Scale", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1beta1.Scale" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1beta1.Scale", + "method": "PATCH", + "summary": "partially update scale of the specified StatefulSet", + "nickname": "patchNamespacedStatefulSetScale", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.Patch", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the Scale", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1beta1.Scale" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json" + ] + } + ] + }, { "path": "/apis/apps/v1beta1/namespaces/{namespace}/statefulsets/{name}/status", "description": "API at /apis/apps/v1beta1", @@ -3645,7 +3810,7 @@ }, "rollbackTo": { "$ref": "v1beta1.RollbackConfig", - "description": "The config this deployment is rolling back to. Will be cleared after rollback is done." + "description": "DEPRECATED. The config this deployment is rolling back to. Will be cleared after rollback is done." }, "progressDeadlineSeconds": { "type": "integer", @@ -4466,22 +4631,18 @@ "v1.FCVolumeSource": { "id": "v1.FCVolumeSource", "description": "Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write once. Fibre Channel volumes support ownership management and SELinux relabeling.", - "required": [ - "targetWWNs", - "lun" - ], "properties": { "targetWWNs": { "type": "array", "items": { "type": "string" }, - "description": "Required: FC target worldwide names (WWNs)" + "description": "Optional: FC target worldwide names (WWNs)" }, "lun": { "type": "integer", "format": "int32", - "description": "Required: FC target lun number" + "description": "Optional: FC target lun number" }, "fsType": { "type": "string", @@ -4490,6 +4651,13 @@ "readOnly": { "type": "boolean", "description": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts." + }, + "wwids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously." } } }, @@ -5544,7 +5712,7 @@ "items": { "$ref": "v1.PodAffinityTerm" }, - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." + "description": "If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." }, "preferredDuringSchedulingIgnoredDuringExecution": { "type": "array", @@ -5604,7 +5772,7 @@ "items": { "$ref": "v1.PodAffinityTerm" }, - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." + "description": "If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." }, "preferredDuringSchedulingIgnoredDuringExecution": { "type": "array", @@ -5689,6 +5857,7 @@ }, "v1beta1.RollbackConfig": { "id": "v1beta1.RollbackConfig", + "description": "DEPRECATED.", "properties": { "revision": { "type": "integer", @@ -5781,7 +5950,7 @@ }, "v1beta1.DeploymentRollback": { "id": "v1beta1.DeploymentRollback", - "description": "DeploymentRollback stores the information required to rollback a deployment.", + "description": "DEPRECATED. DeploymentRollback stores the information required to rollback a deployment.", "required": [ "name", "rollbackTo" @@ -6110,6 +6279,11 @@ "updateRevision": { "type": "string", "description": "updateRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas)" + }, + "collisionCount": { + "type": "integer", + "format": "int64", + "description": "collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision." } } }, diff --git a/api/swagger-spec/apps_v1beta2.json b/api/swagger-spec/apps_v1beta2.json index dec3f47f914..15214f0a2a7 100644 --- a/api/swagger-spec/apps_v1beta2.json +++ b/api/swagger-spec/apps_v1beta2.json @@ -1895,67 +1895,6 @@ } ] }, - { - "path": "/apis/apps/v1beta2/namespaces/{namespace}/deployments/{name}/rollback", - "description": "API at /apis/apps/v1beta2", - "operations": [ - { - "type": "v1beta2.DeploymentRollback", - "method": "POST", - "summary": "create rollback of a Deployment", - "nickname": "createNamespacedDeploymentRollback", - "parameters": [ - { - "type": "string", - "paramType": "query", - "name": "pretty", - "description": "If 'true', then the output is pretty printed.", - "required": false, - "allowMultiple": false - }, - { - "type": "v1beta2.DeploymentRollback", - "paramType": "body", - "name": "body", - "description": "", - "required": true, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "namespace", - "description": "object name and auth scope, such as for teams and projects", - "required": true, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "name", - "description": "name of the DeploymentRollback", - "required": true, - "allowMultiple": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "v1beta2.DeploymentRollback" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "consumes": [ - "*/*" - ] - } - ] - }, { "path": "/apis/apps/v1beta2/namespaces/{namespace}/deployments/{name}/scale", "description": "API at /apis/apps/v1beta2", @@ -4338,6 +4277,171 @@ } ] }, + { + "path": "/apis/apps/v1beta2/namespaces/{namespace}/statefulsets/{name}/scale", + "description": "API at /apis/apps/v1beta2", + "operations": [ + { + "type": "v1beta2.Scale", + "method": "GET", + "summary": "read scale of the specified StatefulSet", + "nickname": "readNamespacedStatefulSetScale", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the Scale", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1beta2.Scale" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1beta2.Scale", + "method": "PUT", + "summary": "replace scale of the specified StatefulSet", + "nickname": "replaceNamespacedStatefulSetScale", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1beta2.Scale", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the Scale", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1beta2.Scale" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1beta2.Scale", + "method": "PATCH", + "summary": "partially update scale of the specified StatefulSet", + "nickname": "patchNamespacedStatefulSetScale", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.Patch", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the Scale", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1beta2.Scale" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json" + ] + } + ] + }, { "path": "/apis/apps/v1beta2/namespaces/{namespace}/statefulsets/{name}/status", "description": "API at /apis/apps/v1beta2", @@ -5682,22 +5786,18 @@ "v1.FCVolumeSource": { "id": "v1.FCVolumeSource", "description": "Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write once. Fibre Channel volumes support ownership management and SELinux relabeling.", - "required": [ - "targetWWNs", - "lun" - ], "properties": { "targetWWNs": { "type": "array", "items": { "type": "string" }, - "description": "Required: FC target worldwide names (WWNs)" + "description": "Optional: FC target worldwide names (WWNs)" }, "lun": { "type": "integer", "format": "int32", - "description": "Required: FC target lun number" + "description": "Optional: FC target lun number" }, "fsType": { "type": "string", @@ -5706,6 +5806,13 @@ "readOnly": { "type": "boolean", "description": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts." + }, + "wwids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously." } } }, @@ -6760,7 +6867,7 @@ "items": { "$ref": "v1.PodAffinityTerm" }, - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." + "description": "If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." }, "preferredDuringSchedulingIgnoredDuringExecution": { "type": "array", @@ -6820,7 +6927,7 @@ "items": { "$ref": "v1.PodAffinityTerm" }, - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." + "description": "If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." }, "preferredDuringSchedulingIgnoredDuringExecution": { "type": "array", @@ -6881,7 +6988,7 @@ "properties": { "type": { "type": "string", - "description": "Type of daemon set update. Can be \"RollingUpdate\" or \"OnDelete\". Default is OnDelete." + "description": "Type of daemon set update. Can be \"RollingUpdate\" or \"OnDelete\". Default is RollingUpdate." }, "rollingUpdate": { "$ref": "v1beta2.RollingUpdateDaemonSet", @@ -7117,10 +7224,6 @@ "type": "boolean", "description": "Indicates that the deployment is paused." }, - "rollbackTo": { - "$ref": "v1beta2.RollbackConfig", - "description": "The config this deployment is rolling back to. Will be cleared after rollback is done." - }, "progressDeadlineSeconds": { "type": "integer", "format": "int32", @@ -7156,17 +7259,6 @@ } } }, - "v1beta2.RollbackConfig": { - "id": "v1beta2.RollbackConfig", - "description": "WIP: This is not ready to be used and we plan to make breaking changes to it.", - "properties": { - "revision": { - "type": "integer", - "format": "int64", - "description": "The revision to rollback to. If set to 0, rollback to the last revision." - } - } - }, "v1beta2.DeploymentStatus": { "id": "v1beta2.DeploymentStatus", "description": "WIP: This is not ready to be used and we plan to make breaking changes to it. DeploymentStatus is the most recently observed status of the Deployment.", @@ -7249,36 +7341,6 @@ } } }, - "v1beta2.DeploymentRollback": { - "id": "v1beta2.DeploymentRollback", - "description": "WIP: This is not ready to be used and we plan to make breaking changes to it. DeploymentRollback stores the information required to rollback a deployment.", - "required": [ - "name", - "rollbackTo" - ], - "properties": { - "kind": { - "type": "string", - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" - }, - "apiVersion": { - "type": "string", - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources" - }, - "name": { - "type": "string", - "description": "Required: This must match the Name of a deployment." - }, - "updatedAnnotations": { - "type": "object", - "description": "The annotations to be updated to a deployment" - }, - "rollbackTo": { - "$ref": "v1beta2.RollbackConfig", - "description": "The config of this deployment rollback." - } - } - }, "v1beta2.Scale": { "id": "v1beta2.Scale", "description": "WIP: This is not ready to be used and we plan to make breaking changes to it. Scale represents a scaling request for a resource.", @@ -7671,7 +7733,7 @@ "properties": { "type": { "type": "string", - "description": "Type indicates the type of the StatefulSetUpdateStrategy." + "description": "Type indicates the type of the StatefulSetUpdateStrategy. Default is RollingUpdate." }, "rollingUpdate": { "$ref": "v1beta2.RollingUpdateStatefulSetStrategy", @@ -7686,7 +7748,7 @@ "partition": { "type": "integer", "format": "int32", - "description": "Partition indicates the ordinal at which the StatefulSet should be partitioned." + "description": "Partition indicates the ordinal at which the StatefulSet should be partitioned. Default value is 0." } } }, @@ -7729,6 +7791,11 @@ "updateRevision": { "type": "string", "description": "updateRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas)" + }, + "collisionCount": { + "type": "integer", + "format": "int64", + "description": "collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision." } } }, diff --git a/api/swagger-spec/batch_v1.json b/api/swagger-spec/batch_v1.json index 33efe7cb224..0b4e34e902a 100644 --- a/api/swagger-spec/batch_v1.json +++ b/api/swagger-spec/batch_v1.json @@ -2213,22 +2213,18 @@ "v1.FCVolumeSource": { "id": "v1.FCVolumeSource", "description": "Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write once. Fibre Channel volumes support ownership management and SELinux relabeling.", - "required": [ - "targetWWNs", - "lun" - ], "properties": { "targetWWNs": { "type": "array", "items": { "type": "string" }, - "description": "Required: FC target worldwide names (WWNs)" + "description": "Optional: FC target worldwide names (WWNs)" }, "lun": { "type": "integer", "format": "int32", - "description": "Required: FC target lun number" + "description": "Optional: FC target lun number" }, "fsType": { "type": "string", @@ -2237,6 +2233,13 @@ "readOnly": { "type": "boolean", "description": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts." + }, + "wwids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously." } } }, @@ -3291,7 +3294,7 @@ "items": { "$ref": "v1.PodAffinityTerm" }, - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." + "description": "If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." }, "preferredDuringSchedulingIgnoredDuringExecution": { "type": "array", @@ -3351,7 +3354,7 @@ "items": { "$ref": "v1.PodAffinityTerm" }, - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." + "description": "If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." }, "preferredDuringSchedulingIgnoredDuringExecution": { "type": "array", diff --git a/api/swagger-spec/batch_v2alpha1.json b/api/swagger-spec/batch_v2alpha1.json index 3a9c6a88db8..2122d7df850 100644 --- a/api/swagger-spec/batch_v2alpha1.json +++ b/api/swagger-spec/batch_v2alpha1.json @@ -1034,1032 +1034,6 @@ } ] }, - { - "path": "/apis/batch/v2alpha1/namespaces/{namespace}/scheduledjobs", - "description": "API at /apis/batch/v2alpha1", - "operations": [ - { - "type": "v2alpha1.CronJobList", - "method": "GET", - "summary": "list or watch objects of kind ScheduledJob", - "nickname": "listNamespacedScheduledJob", - "parameters": [ - { - "type": "string", - "paramType": "query", - "name": "pretty", - "description": "If 'true', then the output is pretty printed.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "labelSelector", - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "fieldSelector", - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "required": false, - "allowMultiple": false - }, - { - "type": "boolean", - "paramType": "query", - "name": "includeUninitialized", - "description": "If true, partially initialized resources are included in the response.", - "required": false, - "allowMultiple": false - }, - { - "type": "boolean", - "paramType": "query", - "name": "watch", - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "resourceVersion", - "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", - "required": false, - "allowMultiple": false - }, - { - "type": "integer", - "paramType": "query", - "name": "timeoutSeconds", - "description": "Timeout for the list/watch call.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "namespace", - "description": "object name and auth scope, such as for teams and projects", - "required": true, - "allowMultiple": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "v2alpha1.CronJobList" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "consumes": [ - "*/*" - ] - }, - { - "type": "v2alpha1.CronJob", - "method": "POST", - "summary": "create a ScheduledJob", - "nickname": "createNamespacedScheduledJob", - "parameters": [ - { - "type": "string", - "paramType": "query", - "name": "pretty", - "description": "If 'true', then the output is pretty printed.", - "required": false, - "allowMultiple": false - }, - { - "type": "v2alpha1.CronJob", - "paramType": "body", - "name": "body", - "description": "", - "required": true, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "namespace", - "description": "object name and auth scope, such as for teams and projects", - "required": true, - "allowMultiple": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "v2alpha1.CronJob" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "consumes": [ - "*/*" - ] - }, - { - "type": "v1.Status", - "method": "DELETE", - "summary": "delete collection of ScheduledJob", - "nickname": "deletecollectionNamespacedScheduledJob", - "parameters": [ - { - "type": "string", - "paramType": "query", - "name": "pretty", - "description": "If 'true', then the output is pretty printed.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "labelSelector", - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "fieldSelector", - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "required": false, - "allowMultiple": false - }, - { - "type": "boolean", - "paramType": "query", - "name": "includeUninitialized", - "description": "If true, partially initialized resources are included in the response.", - "required": false, - "allowMultiple": false - }, - { - "type": "boolean", - "paramType": "query", - "name": "watch", - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "resourceVersion", - "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", - "required": false, - "allowMultiple": false - }, - { - "type": "integer", - "paramType": "query", - "name": "timeoutSeconds", - "description": "Timeout for the list/watch call.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "namespace", - "description": "object name and auth scope, such as for teams and projects", - "required": true, - "allowMultiple": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "v1.Status" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "consumes": [ - "*/*" - ] - } - ] - }, - { - "path": "/apis/batch/v2alpha1/watch/namespaces/{namespace}/scheduledjobs", - "description": "API at /apis/batch/v2alpha1", - "operations": [ - { - "type": "v1.WatchEvent", - "method": "GET", - "summary": "watch individual changes to a list of ScheduledJob", - "nickname": "watchNamespacedScheduledJobList", - "parameters": [ - { - "type": "string", - "paramType": "query", - "name": "pretty", - "description": "If 'true', then the output is pretty printed.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "labelSelector", - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "fieldSelector", - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "required": false, - "allowMultiple": false - }, - { - "type": "boolean", - "paramType": "query", - "name": "includeUninitialized", - "description": "If true, partially initialized resources are included in the response.", - "required": false, - "allowMultiple": false - }, - { - "type": "boolean", - "paramType": "query", - "name": "watch", - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "resourceVersion", - "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", - "required": false, - "allowMultiple": false - }, - { - "type": "integer", - "paramType": "query", - "name": "timeoutSeconds", - "description": "Timeout for the list/watch call.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "namespace", - "description": "object name and auth scope, such as for teams and projects", - "required": true, - "allowMultiple": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "v1.WatchEvent" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "consumes": [ - "*/*" - ] - } - ] - }, - { - "path": "/apis/batch/v2alpha1/namespaces/{namespace}/scheduledjobs/{name}", - "description": "API at /apis/batch/v2alpha1", - "operations": [ - { - "type": "v2alpha1.CronJob", - "method": "GET", - "summary": "read the specified ScheduledJob", - "nickname": "readNamespacedScheduledJob", - "parameters": [ - { - "type": "string", - "paramType": "query", - "name": "pretty", - "description": "If 'true', then the output is pretty printed.", - "required": false, - "allowMultiple": false - }, - { - "type": "boolean", - "paramType": "query", - "name": "export", - "description": "Should this value be exported. Export strips fields that a user can not specify.", - "required": false, - "allowMultiple": false - }, - { - "type": "boolean", - "paramType": "query", - "name": "exact", - "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "namespace", - "description": "object name and auth scope, such as for teams and projects", - "required": true, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "name", - "description": "name of the ScheduledJob", - "required": true, - "allowMultiple": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "v2alpha1.CronJob" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "consumes": [ - "*/*" - ] - }, - { - "type": "v2alpha1.CronJob", - "method": "PUT", - "summary": "replace the specified ScheduledJob", - "nickname": "replaceNamespacedScheduledJob", - "parameters": [ - { - "type": "string", - "paramType": "query", - "name": "pretty", - "description": "If 'true', then the output is pretty printed.", - "required": false, - "allowMultiple": false - }, - { - "type": "v2alpha1.CronJob", - "paramType": "body", - "name": "body", - "description": "", - "required": true, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "namespace", - "description": "object name and auth scope, such as for teams and projects", - "required": true, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "name", - "description": "name of the ScheduledJob", - "required": true, - "allowMultiple": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "v2alpha1.CronJob" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "consumes": [ - "*/*" - ] - }, - { - "type": "v2alpha1.CronJob", - "method": "PATCH", - "summary": "partially update the specified ScheduledJob", - "nickname": "patchNamespacedScheduledJob", - "parameters": [ - { - "type": "string", - "paramType": "query", - "name": "pretty", - "description": "If 'true', then the output is pretty printed.", - "required": false, - "allowMultiple": false - }, - { - "type": "v1.Patch", - "paramType": "body", - "name": "body", - "description": "", - "required": true, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "namespace", - "description": "object name and auth scope, such as for teams and projects", - "required": true, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "name", - "description": "name of the ScheduledJob", - "required": true, - "allowMultiple": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "v2alpha1.CronJob" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "consumes": [ - "application/json-patch+json", - "application/merge-patch+json", - "application/strategic-merge-patch+json" - ] - }, - { - "type": "v1.Status", - "method": "DELETE", - "summary": "delete a ScheduledJob", - "nickname": "deleteNamespacedScheduledJob", - "parameters": [ - { - "type": "string", - "paramType": "query", - "name": "pretty", - "description": "If 'true', then the output is pretty printed.", - "required": false, - "allowMultiple": false - }, - { - "type": "v1.DeleteOptions", - "paramType": "body", - "name": "body", - "description": "", - "required": true, - "allowMultiple": false - }, - { - "type": "integer", - "paramType": "query", - "name": "gracePeriodSeconds", - "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", - "required": false, - "allowMultiple": false - }, - { - "type": "boolean", - "paramType": "query", - "name": "orphanDependents", - "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "propagationPolicy", - "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "namespace", - "description": "object name and auth scope, such as for teams and projects", - "required": true, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "name", - "description": "name of the ScheduledJob", - "required": true, - "allowMultiple": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "v1.Status" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "consumes": [ - "*/*" - ] - } - ] - }, - { - "path": "/apis/batch/v2alpha1/watch/namespaces/{namespace}/scheduledjobs/{name}", - "description": "API at /apis/batch/v2alpha1", - "operations": [ - { - "type": "v1.WatchEvent", - "method": "GET", - "summary": "watch changes to an object of kind ScheduledJob", - "nickname": "watchNamespacedScheduledJob", - "parameters": [ - { - "type": "string", - "paramType": "query", - "name": "pretty", - "description": "If 'true', then the output is pretty printed.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "labelSelector", - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "fieldSelector", - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "required": false, - "allowMultiple": false - }, - { - "type": "boolean", - "paramType": "query", - "name": "includeUninitialized", - "description": "If true, partially initialized resources are included in the response.", - "required": false, - "allowMultiple": false - }, - { - "type": "boolean", - "paramType": "query", - "name": "watch", - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "resourceVersion", - "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", - "required": false, - "allowMultiple": false - }, - { - "type": "integer", - "paramType": "query", - "name": "timeoutSeconds", - "description": "Timeout for the list/watch call.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "namespace", - "description": "object name and auth scope, such as for teams and projects", - "required": true, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "name", - "description": "name of the ScheduledJob", - "required": true, - "allowMultiple": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "v1.WatchEvent" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "consumes": [ - "*/*" - ] - } - ] - }, - { - "path": "/apis/batch/v2alpha1/scheduledjobs", - "description": "API at /apis/batch/v2alpha1", - "operations": [ - { - "type": "v2alpha1.CronJobList", - "method": "GET", - "summary": "list or watch objects of kind ScheduledJob", - "nickname": "listScheduledJobForAllNamespaces", - "parameters": [ - { - "type": "string", - "paramType": "query", - "name": "pretty", - "description": "If 'true', then the output is pretty printed.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "labelSelector", - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "fieldSelector", - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "required": false, - "allowMultiple": false - }, - { - "type": "boolean", - "paramType": "query", - "name": "includeUninitialized", - "description": "If true, partially initialized resources are included in the response.", - "required": false, - "allowMultiple": false - }, - { - "type": "boolean", - "paramType": "query", - "name": "watch", - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "resourceVersion", - "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", - "required": false, - "allowMultiple": false - }, - { - "type": "integer", - "paramType": "query", - "name": "timeoutSeconds", - "description": "Timeout for the list/watch call.", - "required": false, - "allowMultiple": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "v2alpha1.CronJobList" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "consumes": [ - "*/*" - ] - } - ] - }, - { - "path": "/apis/batch/v2alpha1/watch/scheduledjobs", - "description": "API at /apis/batch/v2alpha1", - "operations": [ - { - "type": "v1.WatchEvent", - "method": "GET", - "summary": "watch individual changes to a list of ScheduledJob", - "nickname": "watchScheduledJobListForAllNamespaces", - "parameters": [ - { - "type": "string", - "paramType": "query", - "name": "pretty", - "description": "If 'true', then the output is pretty printed.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "labelSelector", - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "fieldSelector", - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "required": false, - "allowMultiple": false - }, - { - "type": "boolean", - "paramType": "query", - "name": "includeUninitialized", - "description": "If true, partially initialized resources are included in the response.", - "required": false, - "allowMultiple": false - }, - { - "type": "boolean", - "paramType": "query", - "name": "watch", - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "query", - "name": "resourceVersion", - "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", - "required": false, - "allowMultiple": false - }, - { - "type": "integer", - "paramType": "query", - "name": "timeoutSeconds", - "description": "Timeout for the list/watch call.", - "required": false, - "allowMultiple": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "v1.WatchEvent" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "consumes": [ - "*/*" - ] - } - ] - }, - { - "path": "/apis/batch/v2alpha1/namespaces/{namespace}/scheduledjobs/{name}/status", - "description": "API at /apis/batch/v2alpha1", - "operations": [ - { - "type": "v2alpha1.CronJob", - "method": "GET", - "summary": "read status of the specified ScheduledJob", - "nickname": "readNamespacedScheduledJobStatus", - "parameters": [ - { - "type": "string", - "paramType": "query", - "name": "pretty", - "description": "If 'true', then the output is pretty printed.", - "required": false, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "namespace", - "description": "object name and auth scope, such as for teams and projects", - "required": true, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "name", - "description": "name of the ScheduledJob", - "required": true, - "allowMultiple": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "v2alpha1.CronJob" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "consumes": [ - "*/*" - ] - }, - { - "type": "v2alpha1.CronJob", - "method": "PUT", - "summary": "replace status of the specified ScheduledJob", - "nickname": "replaceNamespacedScheduledJobStatus", - "parameters": [ - { - "type": "string", - "paramType": "query", - "name": "pretty", - "description": "If 'true', then the output is pretty printed.", - "required": false, - "allowMultiple": false - }, - { - "type": "v2alpha1.CronJob", - "paramType": "body", - "name": "body", - "description": "", - "required": true, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "namespace", - "description": "object name and auth scope, such as for teams and projects", - "required": true, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "name", - "description": "name of the ScheduledJob", - "required": true, - "allowMultiple": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "v2alpha1.CronJob" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "consumes": [ - "*/*" - ] - }, - { - "type": "v2alpha1.CronJob", - "method": "PATCH", - "summary": "partially update status of the specified ScheduledJob", - "nickname": "patchNamespacedScheduledJobStatus", - "parameters": [ - { - "type": "string", - "paramType": "query", - "name": "pretty", - "description": "If 'true', then the output is pretty printed.", - "required": false, - "allowMultiple": false - }, - { - "type": "v1.Patch", - "paramType": "body", - "name": "body", - "description": "", - "required": true, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "namespace", - "description": "object name and auth scope, such as for teams and projects", - "required": true, - "allowMultiple": false - }, - { - "type": "string", - "paramType": "path", - "name": "name", - "description": "name of the ScheduledJob", - "required": true, - "allowMultiple": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "v2alpha1.CronJob" - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "consumes": [ - "application/json-patch+json", - "application/merge-patch+json", - "application/strategic-merge-patch+json" - ] - } - ] - }, { "path": "/apis/batch/v2alpha1", "description": "API at /apis/batch/v2alpha1", @@ -3294,22 +2268,18 @@ "v1.FCVolumeSource": { "id": "v1.FCVolumeSource", "description": "Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write once. Fibre Channel volumes support ownership management and SELinux relabeling.", - "required": [ - "targetWWNs", - "lun" - ], "properties": { "targetWWNs": { "type": "array", "items": { "type": "string" }, - "description": "Required: FC target worldwide names (WWNs)" + "description": "Optional: FC target worldwide names (WWNs)" }, "lun": { "type": "integer", "format": "int32", - "description": "Required: FC target lun number" + "description": "Optional: FC target lun number" }, "fsType": { "type": "string", @@ -3318,6 +2288,13 @@ "readOnly": { "type": "boolean", "description": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts." + }, + "wwids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously." } } }, @@ -4372,7 +3349,7 @@ "items": { "$ref": "v1.PodAffinityTerm" }, - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." + "description": "If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." }, "preferredDuringSchedulingIgnoredDuringExecution": { "type": "array", @@ -4432,7 +3409,7 @@ "items": { "$ref": "v1.PodAffinityTerm" }, - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." + "description": "If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." }, "preferredDuringSchedulingIgnoredDuringExecution": { "type": "array", diff --git a/api/swagger-spec/extensions_v1beta1.json b/api/swagger-spec/extensions_v1beta1.json index 2c74fe32ae9..28fbd8d968b 100644 --- a/api/swagger-spec/extensions_v1beta1.json +++ b/api/swagger-spec/extensions_v1beta1.json @@ -7323,22 +7323,18 @@ "v1.FCVolumeSource": { "id": "v1.FCVolumeSource", "description": "Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write once. Fibre Channel volumes support ownership management and SELinux relabeling.", - "required": [ - "targetWWNs", - "lun" - ], "properties": { "targetWWNs": { "type": "array", "items": { "type": "string" }, - "description": "Required: FC target worldwide names (WWNs)" + "description": "Optional: FC target worldwide names (WWNs)" }, "lun": { "type": "integer", "format": "int32", - "description": "Required: FC target lun number" + "description": "Optional: FC target lun number" }, "fsType": { "type": "string", @@ -7347,6 +7343,13 @@ "readOnly": { "type": "boolean", "description": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts." + }, + "wwids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously." } } }, @@ -8401,7 +8404,7 @@ "items": { "$ref": "v1.PodAffinityTerm" }, - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." + "description": "If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." }, "preferredDuringSchedulingIgnoredDuringExecution": { "type": "array", @@ -8461,7 +8464,7 @@ "items": { "$ref": "v1.PodAffinityTerm" }, - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." + "description": "If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." }, "preferredDuringSchedulingIgnoredDuringExecution": { "type": "array", @@ -8759,7 +8762,7 @@ }, "rollbackTo": { "$ref": "v1beta1.RollbackConfig", - "description": "The config this deployment is rolling back to. Will be cleared after rollback is done." + "description": "DEPRECATED. The config this deployment is rolling back to. Will be cleared after rollback is done." }, "progressDeadlineSeconds": { "type": "integer", @@ -8798,6 +8801,7 @@ }, "v1beta1.RollbackConfig": { "id": "v1beta1.RollbackConfig", + "description": "DEPRECATED.", "properties": { "revision": { "type": "integer", @@ -8890,7 +8894,7 @@ }, "v1beta1.DeploymentRollback": { "id": "v1beta1.DeploymentRollback", - "description": "DeploymentRollback stores the information required to rollback a deployment.", + "description": "DEPRECATED. DeploymentRollback stores the information required to rollback a deployment.", "required": [ "name", "rollbackTo" diff --git a/api/swagger-spec/rbac.authorization.k8s.io_v1.json b/api/swagger-spec/rbac.authorization.k8s.io_v1.json new file mode 100644 index 00000000000..45e4af03bc4 --- /dev/null +++ b/api/swagger-spec/rbac.authorization.k8s.io_v1.json @@ -0,0 +1,3652 @@ +{ + "swaggerVersion": "1.2", + "apiVersion": "rbac.authorization.k8s.io/v1", + "basePath": "https://10.10.10.10:6443", + "resourcePath": "/apis/rbac.authorization.k8s.io/v1", + "info": { + "title": "", + "description": "" + }, + "apis": [ + { + "path": "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.ClusterRoleBindingList", + "method": "GET", + "summary": "list or watch objects of kind ClusterRoleBinding", + "nickname": "listClusterRoleBinding", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.ClusterRoleBindingList" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1.ClusterRoleBinding", + "method": "POST", + "summary": "create a ClusterRoleBinding", + "nickname": "createClusterRoleBinding", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.ClusterRoleBinding", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.ClusterRoleBinding" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1.Status", + "method": "DELETE", + "summary": "delete collection of ClusterRoleBinding", + "nickname": "deletecollectionClusterRoleBinding", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.Status" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/watch/clusterrolebindings", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.WatchEvent", + "method": "GET", + "summary": "watch individual changes to a list of ClusterRoleBinding", + "nickname": "watchClusterRoleBindingList", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.WatchEvent" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings/{name}", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.ClusterRoleBinding", + "method": "GET", + "summary": "read the specified ClusterRoleBinding", + "nickname": "readClusterRoleBinding", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the ClusterRoleBinding", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.ClusterRoleBinding" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1.ClusterRoleBinding", + "method": "PUT", + "summary": "replace the specified ClusterRoleBinding", + "nickname": "replaceClusterRoleBinding", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.ClusterRoleBinding", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the ClusterRoleBinding", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.ClusterRoleBinding" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1.ClusterRoleBinding", + "method": "PATCH", + "summary": "partially update the specified ClusterRoleBinding", + "nickname": "patchClusterRoleBinding", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.Patch", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the ClusterRoleBinding", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.ClusterRoleBinding" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json" + ] + }, + { + "type": "v1.Status", + "method": "DELETE", + "summary": "delete a ClusterRoleBinding", + "nickname": "deleteClusterRoleBinding", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.DeleteOptions", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "gracePeriodSeconds", + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "orphanDependents", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the ClusterRoleBinding", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.Status" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/watch/clusterrolebindings/{name}", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.WatchEvent", + "method": "GET", + "summary": "watch changes to an object of kind ClusterRoleBinding", + "nickname": "watchClusterRoleBinding", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the ClusterRoleBinding", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.WatchEvent" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/clusterroles", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.ClusterRoleList", + "method": "GET", + "summary": "list or watch objects of kind ClusterRole", + "nickname": "listClusterRole", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.ClusterRoleList" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1.ClusterRole", + "method": "POST", + "summary": "create a ClusterRole", + "nickname": "createClusterRole", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.ClusterRole", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.ClusterRole" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1.Status", + "method": "DELETE", + "summary": "delete collection of ClusterRole", + "nickname": "deletecollectionClusterRole", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.Status" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/watch/clusterroles", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.WatchEvent", + "method": "GET", + "summary": "watch individual changes to a list of ClusterRole", + "nickname": "watchClusterRoleList", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.WatchEvent" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/clusterroles/{name}", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.ClusterRole", + "method": "GET", + "summary": "read the specified ClusterRole", + "nickname": "readClusterRole", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the ClusterRole", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.ClusterRole" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1.ClusterRole", + "method": "PUT", + "summary": "replace the specified ClusterRole", + "nickname": "replaceClusterRole", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.ClusterRole", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the ClusterRole", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.ClusterRole" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1.ClusterRole", + "method": "PATCH", + "summary": "partially update the specified ClusterRole", + "nickname": "patchClusterRole", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.Patch", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the ClusterRole", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.ClusterRole" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json" + ] + }, + { + "type": "v1.Status", + "method": "DELETE", + "summary": "delete a ClusterRole", + "nickname": "deleteClusterRole", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.DeleteOptions", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "gracePeriodSeconds", + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "orphanDependents", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the ClusterRole", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.Status" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/watch/clusterroles/{name}", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.WatchEvent", + "method": "GET", + "summary": "watch changes to an object of kind ClusterRole", + "nickname": "watchClusterRole", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the ClusterRole", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.WatchEvent" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolebindings", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.RoleBindingList", + "method": "GET", + "summary": "list or watch objects of kind RoleBinding", + "nickname": "listNamespacedRoleBinding", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.RoleBindingList" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1.RoleBinding", + "method": "POST", + "summary": "create a RoleBinding", + "nickname": "createNamespacedRoleBinding", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.RoleBinding", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.RoleBinding" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1.Status", + "method": "DELETE", + "summary": "delete collection of RoleBinding", + "nickname": "deletecollectionNamespacedRoleBinding", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.Status" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/rolebindings", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.WatchEvent", + "method": "GET", + "summary": "watch individual changes to a list of RoleBinding", + "nickname": "watchNamespacedRoleBindingList", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.WatchEvent" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolebindings/{name}", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.RoleBinding", + "method": "GET", + "summary": "read the specified RoleBinding", + "nickname": "readNamespacedRoleBinding", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the RoleBinding", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.RoleBinding" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1.RoleBinding", + "method": "PUT", + "summary": "replace the specified RoleBinding", + "nickname": "replaceNamespacedRoleBinding", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.RoleBinding", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the RoleBinding", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.RoleBinding" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1.RoleBinding", + "method": "PATCH", + "summary": "partially update the specified RoleBinding", + "nickname": "patchNamespacedRoleBinding", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.Patch", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the RoleBinding", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.RoleBinding" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json" + ] + }, + { + "type": "v1.Status", + "method": "DELETE", + "summary": "delete a RoleBinding", + "nickname": "deleteNamespacedRoleBinding", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.DeleteOptions", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "gracePeriodSeconds", + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "orphanDependents", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the RoleBinding", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.Status" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/rolebindings/{name}", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.WatchEvent", + "method": "GET", + "summary": "watch changes to an object of kind RoleBinding", + "nickname": "watchNamespacedRoleBinding", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the RoleBinding", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.WatchEvent" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/rolebindings", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.RoleBindingList", + "method": "GET", + "summary": "list or watch objects of kind RoleBinding", + "nickname": "listRoleBindingForAllNamespaces", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.RoleBindingList" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/watch/rolebindings", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.WatchEvent", + "method": "GET", + "summary": "watch individual changes to a list of RoleBinding", + "nickname": "watchRoleBindingListForAllNamespaces", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.WatchEvent" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/roles", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.RoleList", + "method": "GET", + "summary": "list or watch objects of kind Role", + "nickname": "listNamespacedRole", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.RoleList" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1.Role", + "method": "POST", + "summary": "create a Role", + "nickname": "createNamespacedRole", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.Role", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.Role" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1.Status", + "method": "DELETE", + "summary": "delete collection of Role", + "nickname": "deletecollectionNamespacedRole", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.Status" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/roles", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.WatchEvent", + "method": "GET", + "summary": "watch individual changes to a list of Role", + "nickname": "watchNamespacedRoleList", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.WatchEvent" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/roles/{name}", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.Role", + "method": "GET", + "summary": "read the specified Role", + "nickname": "readNamespacedRole", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the Role", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.Role" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1.Role", + "method": "PUT", + "summary": "replace the specified Role", + "nickname": "replaceNamespacedRole", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.Role", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the Role", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.Role" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + }, + { + "type": "v1.Role", + "method": "PATCH", + "summary": "partially update the specified Role", + "nickname": "patchNamespacedRole", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.Patch", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the Role", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.Role" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json" + ] + }, + { + "type": "v1.Status", + "method": "DELETE", + "summary": "delete a Role", + "nickname": "deleteNamespacedRole", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "v1.DeleteOptions", + "paramType": "body", + "name": "body", + "description": "", + "required": true, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "gracePeriodSeconds", + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "orphanDependents", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the Role", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.Status" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/roles/{name}", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.WatchEvent", + "method": "GET", + "summary": "watch changes to an object of kind Role", + "nickname": "watchNamespacedRole", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "namespace", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "path", + "name": "name", + "description": "name of the Role", + "required": true, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.WatchEvent" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/roles", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.RoleList", + "method": "GET", + "summary": "list or watch objects of kind Role", + "nickname": "listRoleForAllNamespaces", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.RoleList" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1/watch/roles", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.WatchEvent", + "method": "GET", + "summary": "watch individual changes to a list of Role", + "nickname": "watchRoleListForAllNamespaces", + "parameters": [ + { + "type": "string", + "paramType": "query", + "name": "pretty", + "description": "If 'true', then the output is pretty printed.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "labelSelector", + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "fieldSelector", + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "includeUninitialized", + "description": "If true, partially initialized resources are included in the response.", + "required": false, + "allowMultiple": false + }, + { + "type": "boolean", + "paramType": "query", + "name": "watch", + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "resourceVersion", + "description": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", + "required": false, + "allowMultiple": false + }, + { + "type": "integer", + "paramType": "query", + "name": "timeoutSeconds", + "description": "Timeout for the list/watch call.", + "required": false, + "allowMultiple": false + } + ], + "responseMessages": [ + { + "code": 200, + "message": "OK", + "responseModel": "v1.WatchEvent" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "consumes": [ + "*/*" + ] + } + ] + }, + { + "path": "/apis/rbac.authorization.k8s.io/v1", + "description": "API at /apis/rbac.authorization.k8s.io/v1", + "operations": [ + { + "type": "v1.APIResourceList", + "method": "GET", + "summary": "get available resources", + "nickname": "getAPIResources", + "parameters": [], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ] + } + ] + } + ], + "models": { + "v1.ClusterRoleBindingList": { + "id": "v1.ClusterRoleBindingList", + "description": "ClusterRoleBindingList is a collection of ClusterRoleBindings", + "required": [ + "items" + ], + "properties": { + "kind": { + "type": "string", + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" + }, + "apiVersion": { + "type": "string", + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources" + }, + "metadata": { + "$ref": "v1.ListMeta", + "description": "Standard object's metadata." + }, + "items": { + "type": "array", + "items": { + "$ref": "v1.ClusterRoleBinding" + }, + "description": "Items is a list of ClusterRoleBindings" + } + } + }, + "v1.ListMeta": { + "id": "v1.ListMeta", + "description": "ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.", + "properties": { + "selfLink": { + "type": "string", + "description": "SelfLink is a URL representing this object. Populated by the system. Read-only." + }, + "resourceVersion": { + "type": "string", + "description": "String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency" + } + } + }, + "v1.ClusterRoleBinding": { + "id": "v1.ClusterRoleBinding", + "description": "ClusterRoleBinding references a ClusterRole, but not contain it. It can reference a ClusterRole in the global namespace, and adds who information via Subject.", + "required": [ + "subjects", + "roleRef" + ], + "properties": { + "kind": { + "type": "string", + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" + }, + "apiVersion": { + "type": "string", + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources" + }, + "metadata": { + "$ref": "v1.ObjectMeta", + "description": "Standard object's metadata." + }, + "subjects": { + "type": "array", + "items": { + "$ref": "v1.Subject" + }, + "description": "Subjects holds references to the objects the role applies to." + }, + "roleRef": { + "$ref": "v1.RoleRef", + "description": "RoleRef can only reference a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error." + } + } + }, + "v1.ObjectMeta": { + "id": "v1.ObjectMeta", + "description": "ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create.", + "properties": { + "name": { + "type": "string", + "description": "Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names" + }, + "generateName": { + "type": "string", + "description": "GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.\n\nIf this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header).\n\nApplied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency" + }, + "namespace": { + "type": "string", + "description": "Namespace defines the space within each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty.\n\nMust be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces" + }, + "selfLink": { + "type": "string", + "description": "SelfLink is a URL representing this object. Populated by the system. Read-only." + }, + "uid": { + "type": "string", + "description": "UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations.\n\nPopulated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids" + }, + "resourceVersion": { + "type": "string", + "description": "An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency" + }, + "generation": { + "type": "integer", + "format": "int64", + "description": "A sequence number representing a specific generation of the desired state. Populated by the system. Read-only." + }, + "creationTimestamp": { + "type": "string", + "description": "CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC.\n\nPopulated by the system. Read-only. Null for lists. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata" + }, + "deletionTimestamp": { + "type": "string", + "description": "DeletionTimestamp is RFC 3339 date and time at which this resource will be deleted. This field is set by the server when a graceful deletion is requested by the user, and is not directly settable by a client. The resource is expected to be deleted (no longer visible from resource lists, and not reachable by name) after the time in this field. Once set, this value may not be unset or be set further into the future, although it may be shortened or the resource may be deleted prior to this time. For example, a user may request that a pod is deleted in 30 seconds. The Kubelet will react by sending a graceful termination signal to the containers in the pod. After that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL) to the container and after cleanup, remove the pod from the API. In the presence of network partitions, this object may still exist after this timestamp, until an administrator or automated process can determine the resource is fully terminated. If not set, graceful deletion of the object has not been requested.\n\nPopulated by the system when a graceful deletion is requested. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata" + }, + "deletionGracePeriodSeconds": { + "type": "integer", + "format": "int64", + "description": "Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only." + }, + "labels": { + "type": "object", + "description": "Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels" + }, + "annotations": { + "type": "object", + "description": "Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations" + }, + "ownerReferences": { + "type": "array", + "items": { + "$ref": "v1.OwnerReference" + }, + "description": "List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller." + }, + "initializers": { + "$ref": "v1.Initializers", + "description": "An initializer is a controller which enforces some system invariant at object creation time. This field is a list of initializers that have not yet acted on this object. If nil or empty, this object has been completely initialized. Otherwise, the object is considered uninitialized and is hidden (in list/watch and get calls) from clients that haven't explicitly asked to observe uninitialized objects.\n\nWhen an object is created, the system will populate this list with the current set of initializers. Only privileged users may set or modify this list. Once it is empty, it may not be modified further by any user." + }, + "finalizers": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Must be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed." + }, + "clusterName": { + "type": "string", + "description": "The name of the cluster which the object belongs to. This is used to distinguish resources with same name and namespace in different clusters. This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request." + } + } + }, + "v1.OwnerReference": { + "id": "v1.OwnerReference", + "description": "OwnerReference contains enough information to let you identify an owning object. Currently, an owning object must be in the same namespace, so there is no namespace field.", + "required": [ + "apiVersion", + "kind", + "name", + "uid" + ], + "properties": { + "apiVersion": { + "type": "string", + "description": "API version of the referent." + }, + "kind": { + "type": "string", + "description": "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" + }, + "name": { + "type": "string", + "description": "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names" + }, + "uid": { + "type": "string", + "description": "UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids" + }, + "controller": { + "type": "boolean", + "description": "If true, this reference points to the managing controller." + }, + "blockOwnerDeletion": { + "type": "boolean", + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned." + } + } + }, + "v1.Initializers": { + "id": "v1.Initializers", + "description": "Initializers tracks the progress of initialization.", + "required": [ + "pending" + ], + "properties": { + "pending": { + "type": "array", + "items": { + "$ref": "v1.Initializer" + }, + "description": "Pending is a list of initializers that must execute in order before this object is visible. When the last pending initializer is removed, and no failing result is set, the initializers struct will be set to nil and the object is considered as initialized and visible to all clients." + }, + "result": { + "$ref": "v1.Status", + "description": "If result is set with the Failure field, the object will be persisted to storage and then deleted, ensuring that other clients can observe the deletion." + } + } + }, + "v1.Initializer": { + "id": "v1.Initializer", + "description": "Initializer is information about an initializer that has not yet completed.", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "name of the process that is responsible for initializing this object." + } + } + }, + "v1.Status": { + "id": "v1.Status", + "description": "Status is a return value for calls that don't return other objects.", + "properties": { + "kind": { + "type": "string", + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" + }, + "apiVersion": { + "type": "string", + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources" + }, + "metadata": { + "$ref": "v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" + }, + "status": { + "type": "string", + "description": "Status of the operation. One of: \"Success\" or \"Failure\". More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status" + }, + "message": { + "type": "string", + "description": "A human-readable description of the status of this operation." + }, + "reason": { + "type": "string", + "description": "A machine-readable description of why this operation is in the \"Failure\" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it." + }, + "details": { + "$ref": "v1.StatusDetails", + "description": "Extended data associated with the reason. Each reason may define its own extended details. This field is optional and the data returned is not guaranteed to conform to any schema except that defined by the reason type." + }, + "code": { + "type": "integer", + "format": "int32", + "description": "Suggested HTTP return code for this status, 0 if not set." + } + } + }, + "v1.StatusDetails": { + "id": "v1.StatusDetails", + "description": "StatusDetails is a set of additional properties that MAY be set by the server to provide additional information about a response. The Reason field of a Status object defines what attributes will be set. Clients must ignore fields that do not match the defined type of each attribute, and should assume that any attribute may be empty, invalid, or under defined.", + "properties": { + "name": { + "type": "string", + "description": "The name attribute of the resource associated with the status StatusReason (when there is a single name which can be described)." + }, + "group": { + "type": "string", + "description": "The group attribute of the resource associated with the status StatusReason." + }, + "kind": { + "type": "string", + "description": "The kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" + }, + "uid": { + "type": "string", + "description": "UID of the resource. (when there is a single resource which can be described). More info: http://kubernetes.io/docs/user-guide/identifiers#uids" + }, + "causes": { + "type": "array", + "items": { + "$ref": "v1.StatusCause" + }, + "description": "The Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes." + }, + "retryAfterSeconds": { + "type": "integer", + "format": "int32", + "description": "If specified, the time in seconds before the operation should be retried. Some errors may indicate the client must take an alternate action - for those errors this field may indicate how long to wait before taking the alternate action." + } + } + }, + "v1.StatusCause": { + "id": "v1.StatusCause", + "description": "StatusCause provides more information about an api.Status failure, including cases when multiple errors are encountered.", + "properties": { + "reason": { + "type": "string", + "description": "A machine-readable description of the cause of the error. If this value is empty there is no information available." + }, + "message": { + "type": "string", + "description": "A human-readable description of the cause of the error. This field may be presented as-is to a reader." + }, + "field": { + "type": "string", + "description": "The field of the resource that has caused this error, as named by its JSON serialization. May include dot and postfix notation for nested attributes. Arrays are zero-indexed. Fields may appear more than once in an array of causes due to fields having multiple errors. Optional.\n\nExamples:\n \"name\" - the field \"name\" on the current resource\n \"items[0].name\" - the field \"name\" on the first array entry in \"items\"" + } + } + }, + "v1.Subject": { + "id": "v1.Subject", + "description": "Subject contains a reference to the object or user identities a role binding applies to. This can either hold a direct API object reference, or a value for non-objects such as user and group names.", + "required": [ + "kind", + "name" + ], + "properties": { + "kind": { + "type": "string", + "description": "Kind of object being referenced. Values defined by this API group are \"User\", \"Group\", and \"ServiceAccount\". If the Authorizer does not recognized the kind value, the Authorizer should report an error." + }, + "apiGroup": { + "type": "string", + "description": "APIGroup holds the API group of the referenced subject. Defaults to \"\" for ServiceAccount subjects. Defaults to \"rbac.authorization.k8s.io\" for User and Group subjects." + }, + "name": { + "type": "string", + "description": "Name of the object being referenced." + }, + "namespace": { + "type": "string", + "description": "Namespace of the referenced object. If the object kind is non-namespace, such as \"User\" or \"Group\", and this value is not empty the Authorizer should report an error." + } + } + }, + "v1.RoleRef": { + "id": "v1.RoleRef", + "description": "RoleRef contains information that points to the role being used", + "required": [ + "apiGroup", + "kind", + "name" + ], + "properties": { + "apiGroup": { + "type": "string", + "description": "APIGroup is the group for the resource being referenced" + }, + "kind": { + "type": "string", + "description": "Kind is the type of resource being referenced" + }, + "name": { + "type": "string", + "description": "Name is the name of resource being referenced" + } + } + }, + "v1.WatchEvent": { + "id": "v1.WatchEvent", + "required": [ + "type", + "object" + ], + "properties": { + "type": { + "type": "string" + }, + "object": { + "type": "string" + } + } + }, + "v1.Patch": { + "id": "v1.Patch", + "description": "Patch is provided to give a concrete name and type to the Kubernetes PATCH request body.", + "properties": {} + }, + "v1.DeleteOptions": { + "id": "v1.DeleteOptions", + "description": "DeleteOptions may be provided when deleting an API object.", + "properties": { + "kind": { + "type": "string", + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" + }, + "apiVersion": { + "type": "string", + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources" + }, + "gracePeriodSeconds": { + "type": "integer", + "format": "int64", + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately." + }, + "preconditions": { + "$ref": "v1.Preconditions", + "description": "Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned." + }, + "orphanDependents": { + "type": "boolean", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both." + }, + "propagationPolicy": { + "$ref": "v1.DeletionPropagation", + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy." + } + } + }, + "v1.Preconditions": { + "id": "v1.Preconditions", + "description": "Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.", + "properties": { + "uid": { + "$ref": "types.UID", + "description": "Specifies the target UID." + } + } + }, + "types.UID": { + "id": "types.UID", + "properties": {} + }, + "v1.DeletionPropagation": { + "id": "v1.DeletionPropagation", + "properties": {} + }, + "v1.ClusterRoleList": { + "id": "v1.ClusterRoleList", + "description": "ClusterRoleList is a collection of ClusterRoles", + "required": [ + "items" + ], + "properties": { + "kind": { + "type": "string", + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" + }, + "apiVersion": { + "type": "string", + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources" + }, + "metadata": { + "$ref": "v1.ListMeta", + "description": "Standard object's metadata." + }, + "items": { + "type": "array", + "items": { + "$ref": "v1.ClusterRole" + }, + "description": "Items is a list of ClusterRoles" + } + } + }, + "v1.ClusterRole": { + "id": "v1.ClusterRole", + "description": "ClusterRole is a cluster level, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding or ClusterRoleBinding.", + "required": [ + "rules" + ], + "properties": { + "kind": { + "type": "string", + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" + }, + "apiVersion": { + "type": "string", + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources" + }, + "metadata": { + "$ref": "v1.ObjectMeta", + "description": "Standard object's metadata." + }, + "rules": { + "type": "array", + "items": { + "$ref": "v1.PolicyRule" + }, + "description": "Rules holds all the PolicyRules for this ClusterRole" + } + } + }, + "v1.PolicyRule": { + "id": "v1.PolicyRule", + "description": "PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to.", + "required": [ + "verbs" + ], + "properties": { + "verbs": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds." + }, + "apiGroups": { + "type": "array", + "items": { + "type": "string" + }, + "description": "APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed." + }, + "resources": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Resources is a list of resources this rule applies to. ResourceAll represents all resources." + }, + "resourceNames": { + "type": "array", + "items": { + "type": "string" + }, + "description": "ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed." + }, + "nonResourceURLs": { + "type": "array", + "items": { + "type": "string" + }, + "description": "NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as \"pods\" or \"secrets\") or non-resource URL paths (such as \"/api\"), but not both." + } + } + }, + "v1.RoleBindingList": { + "id": "v1.RoleBindingList", + "description": "RoleBindingList is a collection of RoleBindings", + "required": [ + "items" + ], + "properties": { + "kind": { + "type": "string", + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" + }, + "apiVersion": { + "type": "string", + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources" + }, + "metadata": { + "$ref": "v1.ListMeta", + "description": "Standard object's metadata." + }, + "items": { + "type": "array", + "items": { + "$ref": "v1.RoleBinding" + }, + "description": "Items is a list of RoleBindings" + } + } + }, + "v1.RoleBinding": { + "id": "v1.RoleBinding", + "description": "RoleBinding references a role, but does not contain it. It can reference a Role in the same namespace or a ClusterRole in the global namespace. It adds who information via Subjects and namespace information by which namespace it exists in. RoleBindings in a given namespace only have effect in that namespace.", + "required": [ + "subjects", + "roleRef" + ], + "properties": { + "kind": { + "type": "string", + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" + }, + "apiVersion": { + "type": "string", + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources" + }, + "metadata": { + "$ref": "v1.ObjectMeta", + "description": "Standard object's metadata." + }, + "subjects": { + "type": "array", + "items": { + "$ref": "v1.Subject" + }, + "description": "Subjects holds references to the objects the role applies to." + }, + "roleRef": { + "$ref": "v1.RoleRef", + "description": "RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error." + } + } + }, + "v1.RoleList": { + "id": "v1.RoleList", + "description": "RoleList is a collection of Roles", + "required": [ + "items" + ], + "properties": { + "kind": { + "type": "string", + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" + }, + "apiVersion": { + "type": "string", + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources" + }, + "metadata": { + "$ref": "v1.ListMeta", + "description": "Standard object's metadata." + }, + "items": { + "type": "array", + "items": { + "$ref": "v1.Role" + }, + "description": "Items is a list of Roles" + } + } + }, + "v1.Role": { + "id": "v1.Role", + "description": "Role is a namespaced, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding.", + "required": [ + "rules" + ], + "properties": { + "kind": { + "type": "string", + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" + }, + "apiVersion": { + "type": "string", + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources" + }, + "metadata": { + "$ref": "v1.ObjectMeta", + "description": "Standard object's metadata." + }, + "rules": { + "type": "array", + "items": { + "$ref": "v1.PolicyRule" + }, + "description": "Rules holds all the PolicyRules for this Role" + } + } + }, + "v1.APIResourceList": { + "id": "v1.APIResourceList", + "description": "APIResourceList is a list of APIResource, it is used to expose the name of the resources supported in a specific group and version, and if the resource is namespaced.", + "required": [ + "groupVersion", + "resources" + ], + "properties": { + "kind": { + "type": "string", + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" + }, + "apiVersion": { + "type": "string", + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources" + }, + "groupVersion": { + "type": "string", + "description": "groupVersion is the group and version this APIResourceList is for." + }, + "resources": { + "type": "array", + "items": { + "$ref": "v1.APIResource" + }, + "description": "resources contains the name of the resources and if they are namespaced." + } + } + }, + "v1.APIResource": { + "id": "v1.APIResource", + "description": "APIResource specifies the name of a resource and whether it is namespaced.", + "required": [ + "name", + "singularName", + "namespaced", + "kind", + "verbs" + ], + "properties": { + "name": { + "type": "string", + "description": "name is the plural name of the resource." + }, + "singularName": { + "type": "string", + "description": "singularName is the singular name of the resource. This allows clients to handle plural and singular opaquely. The singularName is more correct for reporting status on a single item and both singular and plural are allowed from the kubectl CLI interface." + }, + "namespaced": { + "type": "boolean", + "description": "namespaced indicates if a resource is namespaced or not." + }, + "kind": { + "type": "string", + "description": "kind is the kind for the resource (e.g. 'Foo' is the kind for a resource 'foo')" + }, + "verbs": { + "type": "array", + "items": { + "type": "string" + }, + "description": "verbs is a list of supported kube verbs (this includes get, list, watch, create, update, patch, delete, deletecollection, and proxy)" + }, + "shortNames": { + "type": "array", + "items": { + "type": "string" + }, + "description": "shortNames is a list of suggested short names of the resource." + }, + "categories": { + "type": "array", + "items": { + "type": "string" + }, + "description": "categories is a list of the grouped resources this resource belongs to (e.g. 'all')" + } + } + } + } + } diff --git a/api/swagger-spec/resourceListing.json b/api/swagger-spec/resourceListing.json index c632996ff14..9bb4a865b45 100644 --- a/api/swagger-spec/resourceListing.json +++ b/api/swagger-spec/resourceListing.json @@ -105,6 +105,10 @@ "path": "/apis/rbac.authorization.k8s.io/v1beta1", "description": "API at /apis/rbac.authorization.k8s.io/v1beta1" }, + { + "path": "/apis/rbac.authorization.k8s.io/v1", + "description": "API at /apis/rbac.authorization.k8s.io/v1" + }, { "path": "/apis/rbac.authorization.k8s.io/v1alpha1", "description": "API at /apis/rbac.authorization.k8s.io/v1alpha1" diff --git a/api/swagger-spec/settings.k8s.io_v1alpha1.json b/api/swagger-spec/settings.k8s.io_v1alpha1.json index 01f1f2ddbbb..168d97d5434 100644 --- a/api/swagger-spec/settings.k8s.io_v1alpha1.json +++ b/api/swagger-spec/settings.k8s.io_v1alpha1.json @@ -2031,22 +2031,18 @@ "v1.FCVolumeSource": { "id": "v1.FCVolumeSource", "description": "Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write once. Fibre Channel volumes support ownership management and SELinux relabeling.", - "required": [ - "targetWWNs", - "lun" - ], "properties": { "targetWWNs": { "type": "array", "items": { "type": "string" }, - "description": "Required: FC target worldwide names (WWNs)" + "description": "Optional: FC target worldwide names (WWNs)" }, "lun": { "type": "integer", "format": "int32", - "description": "Required: FC target lun number" + "description": "Optional: FC target lun number" }, "fsType": { "type": "string", @@ -2055,6 +2051,13 @@ "readOnly": { "type": "boolean", "description": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts." + }, + "wwids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously." } } }, diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index b7ee59b203d..9d20973c73e 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -18318,6 +18318,10 @@ "$ref": "v1.Taint" }, "description": "If specified, the node's taints." + }, + "configSource": { + "$ref": "v1.NodeConfigSource", + "description": "If specified, the source to get node configuration from The DynamicKubeletConfig feature gate must be enabled for the Kubelet to use this field" } } }, @@ -18347,6 +18351,23 @@ } } }, + "v1.NodeConfigSource": { + "id": "v1.NodeConfigSource", + "description": "NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.", + "properties": { + "kind": { + "type": "string", + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" + }, + "apiVersion": { + "type": "string", + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources" + }, + "configMapRef": { + "$ref": "v1.ObjectReference" + } + } + }, "v1.NodeStatus": { "id": "v1.NodeStatus", "description": "NodeStatus is information about the current status of a node.", @@ -19195,22 +19216,18 @@ "v1.FCVolumeSource": { "id": "v1.FCVolumeSource", "description": "Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write once. Fibre Channel volumes support ownership management and SELinux relabeling.", - "required": [ - "targetWWNs", - "lun" - ], "properties": { "targetWWNs": { "type": "array", "items": { "type": "string" }, - "description": "Required: FC target worldwide names (WWNs)" + "description": "Optional: FC target worldwide names (WWNs)" }, "lun": { "type": "integer", "format": "int32", - "description": "Required: FC target lun number" + "description": "Optional: FC target lun number" }, "fsType": { "type": "string", @@ -19219,6 +19236,13 @@ "readOnly": { "type": "boolean", "description": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts." + }, + "wwids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously." } } }, @@ -20847,7 +20871,7 @@ "items": { "$ref": "v1.PodAffinityTerm" }, - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." + "description": "If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." }, "preferredDuringSchedulingIgnoredDuringExecution": { "type": "array", @@ -20907,7 +20931,7 @@ "items": { "$ref": "v1.PodAffinityTerm" }, - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." + "description": "If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." }, "preferredDuringSchedulingIgnoredDuringExecution": { "type": "array", @@ -21790,6 +21814,10 @@ "type": "integer", "format": "int32", "description": "healthCheckNodePort specifies the healthcheck nodePort for the service. If not specified, HealthCheckNodePort is created by the service api backend with the allocated nodePort. Will use user-specified nodePort value if specified by the client. Only effects when Type is set to LoadBalancer and ExternalTrafficPolicy is set to Local." + }, + "publishNotReadyAddresses": { + "type": "boolean", + "description": "publishNotReadyAddresses, when set to true, indicates that DNS implementations must publish the notReadyAddresses of subsets for the Endpoints associated with the Service. The default value is false. The primary use case for setting this field is to use a StatefulSet's Headless Service to propagate SRV records for its Pods without respect to their readiness for purpose of peer discovery. This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints when that annotation is deprecated and all clients have been converted to use this field." } } }, diff --git a/build/root/.kazelcfg.json b/build/root/.kazelcfg.json index e8f32e586d3..3d5d1a1edb7 100644 --- a/build/root/.kazelcfg.json +++ b/build/root/.kazelcfg.json @@ -4,6 +4,5 @@ "^_.*" ], "AddSourcesRules": true, - "VendorMultipleBuildFiles": true, "K8sOpenAPIGen": true } diff --git a/build/root/BUILD.root b/build/root/BUILD.root index de10cbaafda..56627f257dd 100644 --- a/build/root/BUILD.root +++ b/build/root/BUILD.root @@ -1,6 +1,9 @@ -package(default_visibility = ["//visibility:public"]) +# gazelle:exclude _artifacts +# gazelle:exclude _gopath +# gazelle:exclude _output +# gazelle:exclude _tmp -licenses(["notice"]) +package(default_visibility = ["//visibility:public"]) load("@io_bazel_rules_go//go:def.bzl", "go_prefix") load("@io_kubernetes_build//defs:build.bzl", "gcs_upload") diff --git a/build/root/WORKSPACE b/build/root/WORKSPACE index 8617e1905e2..866af12da0e 100644 --- a/build/root/WORKSPACE +++ b/build/root/WORKSPACE @@ -1,15 +1,15 @@ http_archive( name = "io_bazel_rules_go", - sha256 = "abdea3986d9e850eda27b12163b0b558accdb5bca69ef945b022356f920d430d", - strip_prefix = "rules_go-473417ec48310325e1fcb1c154621a83197a17fe", - urls = ["https://github.com/bazelbuild/rules_go/archive/473417ec48310325e1fcb1c154621a83197a17fe.tar.gz"], + sha256 = "f9cc31e9d66dad1154de3c214158916411040e2c2614e4fbc2bab67330e95f82", + strip_prefix = "rules_go-82483596ec203eb9c1849937636f4cbed83733eb", + urls = ["https://github.com/bazelbuild/rules_go/archive/82483596ec203eb9c1849937636f4cbed83733eb.tar.gz"], ) http_archive( name = "io_kubernetes_build", - sha256 = "232fec0ffcb53df5e87fc036ae3e966ea32122fc89ead4c32581b3255c1ab7d0", - strip_prefix = "repo-infra-f521b5d472e00e05da5394994942064510a6e8bf", - urls = ["https://github.com/kubernetes/repo-infra/archive/f521b5d472e00e05da5394994942064510a6e8bf.tar.gz"], + sha256 = "5ba54d17d582ec099ba65d4e409e318e209216b15be819c922a5baae3f4d4283", + strip_prefix = "repo-infra-e9d1a126ef355ff5d38e20612c889b07728225a4", + urls = ["https://github.com/kubernetes/repo-infra/archive/e9d1a126ef355ff5d38e20612c889b07728225a4.tar.gz"], ) ETCD_VERSION = "3.0.17" diff --git a/build/visible_to/BUILD b/build/visible_to/BUILD index ccba17fd2e1..df805b5a3e3 100644 --- a/build/visible_to/BUILD +++ b/build/visible_to/BUILD @@ -360,6 +360,7 @@ package_group( packages = [ "//pkg/kubectl", "//pkg/kubectl/cmd", + "//pkg/kubectl/proxy", ], ) diff --git a/build/visible_to/OWNERS b/build/visible_to/OWNERS index 3e1133eafa4..8bc54f89e4e 100644 --- a/build/visible_to/OWNERS +++ b/build/visible_to/OWNERS @@ -3,9 +3,9 @@ reviewers: - dchen1107 - ixdy - jbeda - - jregan - lavalamp - mikedanese + - monopole - pwittrock - smarterclayton - thockin @@ -15,9 +15,9 @@ approvers: - dchen1107 - ixdy - jbeda - - jregan - lavalamp - mikedanese + - monopole - pwittrock - smarterclayton - thockin diff --git a/cluster/BUILD b/cluster/BUILD index ab35ed4b032..f438392f5be 100644 --- a/cluster/BUILD +++ b/cluster/BUILD @@ -2,8 +2,6 @@ package(default_visibility = ["//visibility:public"]) load("@io_bazel//tools/build_defs/pkg:pkg.bzl", "pkg_tar") -licenses(["notice"]) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/cluster/addons/cluster-monitoring/stackdriver/heapster-controller.yaml b/cluster/addons/cluster-monitoring/stackdriver/heapster-controller.yaml index c34f5ef1afa..502976fc8ae 100644 --- a/cluster/addons/cluster-monitoring/stackdriver/heapster-controller.yaml +++ b/cluster/addons/cluster-monitoring/stackdriver/heapster-controller.yaml @@ -64,6 +64,26 @@ spec: - name: usr-ca-certs mountPath: /usr/share/ca-certificates readOnly: true + - name: prom-to-sd + image: gcr.io/google-containers/prometheus-to-sd:v0.2.1 + command: + - /monitor + - --source=heapster:http://localhost:8082?whitelisted=stackdriver_requests_count,stackdriver_timeseries_count + - --stackdriver-prefix=container.googleapis.com/internal/addons + - --pod-id=$(POD_NAME) + - --namespace-id=$(POD_NAMESPACE) + volumeMounts: + - name: ssl-certs + mountPath: /etc/ssl/certs + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace - image: gcr.io/google_containers/addon-resizer:2.0 name: heapster-nanny resources: diff --git a/cluster/addons/fluentd-elasticsearch/es-image/BUILD b/cluster/addons/fluentd-elasticsearch/es-image/BUILD index b2766104112..12604875528 100644 --- a/cluster/addons/fluentd-elasticsearch/es-image/BUILD +++ b/cluster/addons/fluentd-elasticsearch/es-image/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "es-image", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["elasticsearch_logging_discovery.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/cluster/gce/container-linux/configure-helper.sh b/cluster/gce/container-linux/configure-helper.sh index f8a1f8531e1..b2aaee20d92 100755 --- a/cluster/gce/container-linux/configure-helper.sh +++ b/cluster/gce/container-linux/configure-helper.sh @@ -1155,7 +1155,7 @@ function start-cluster-autoscaler { local -r src_file="${KUBE_HOME}/kube-manifests/kubernetes/gci-trusty/cluster-autoscaler.manifest" remove-salt-config-comments "${src_file}" - local params="${AUTOSCALER_MIG_CONFIG} ${CLOUD_CONFIG_OPT} ${AUTOSCALER_EXPANDER_CONFIG:-}" + local params="${AUTOSCALER_MIG_CONFIG} ${CLOUD_CONFIG_OPT} ${AUTOSCALER_EXPANDER_CONFIG:---expander=price}" sed -i -e "s@{{params}}@${params}@g" "${src_file}" sed -i -e "s@{{cloud_config_mount}}@${CLOUD_CONFIG_MOUNT}@g" "${src_file}" sed -i -e "s@{{cloud_config_volume}}@${CLOUD_CONFIG_VOLUME}@g" "${src_file}" diff --git a/cluster/gce/gci/configure-helper.sh b/cluster/gce/gci/configure-helper.sh index e6fbfa582ee..f8f7ffc79f6 100644 --- a/cluster/gce/gci/configure-helper.sh +++ b/cluster/gce/gci/configure-helper.sh @@ -524,6 +524,8 @@ function create-master-audit-policy { - group: "storage.k8s.io"' cat <"${path}" +apiVersion: audit.k8s.io/v1alpha1 +kind: Policy rules: # The following requests were manually identified as high-volume and low-risk, # so drop them. @@ -1558,7 +1560,7 @@ function start-cluster-autoscaler { local -r src_file="${KUBE_HOME}/kube-manifests/kubernetes/gci-trusty/cluster-autoscaler.manifest" remove-salt-config-comments "${src_file}" - local params="${AUTOSCALER_MIG_CONFIG} ${CLOUD_CONFIG_OPT} ${AUTOSCALER_EXPANDER_CONFIG:-}" + local params="${AUTOSCALER_MIG_CONFIG} ${CLOUD_CONFIG_OPT} ${AUTOSCALER_EXPANDER_CONFIG:---expander=price}" sed -i -e "s@{{params}}@${params}@g" "${src_file}" sed -i -e "s@{{cloud_config_mount}}@${CLOUD_CONFIG_MOUNT}@g" "${src_file}" sed -i -e "s@{{cloud_config_volume}}@${CLOUD_CONFIG_VOLUME}@g" "${src_file}" @@ -1606,7 +1608,7 @@ function wait-for-apiserver-and-update-fluentd { kubectl set resources --dry-run --local -f ${fluentd_gcp_yaml} \ --limits=memory=${FLUENTD_GCP_MEMORY_LIMIT} \ --requests=cpu=${FLUENTD_GCP_CPU_REQUEST},memory=${FLUENTD_GCP_MEMORY_REQUEST} \ - -o yaml > ${fluentd_gcp_yaml}.tmp + --containers=fluentd-gcp -o yaml > ${fluentd_gcp_yaml}.tmp mv ${fluentd_gcp_yaml}.tmp ${fluentd_gcp_yaml} } diff --git a/cluster/gce/gci/mounter/BUILD b/cluster/gce/gci/mounter/BUILD index 444be64cbeb..763105b2a0e 100644 --- a/cluster/gce/gci/mounter/BUILD +++ b/cluster/gce/gci/mounter/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "mounter", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["mounter.go"], - tags = ["automanaged"], ) filegroup( diff --git a/cluster/gce/util.sh b/cluster/gce/util.sh index c430cb6d2a1..4ff33a801aa 100755 --- a/cluster/gce/util.sh +++ b/cluster/gce/util.sh @@ -953,6 +953,7 @@ function delete-subnetworks() { # # Assumed vars: # KUBE_TEMP: temporary directory +# NUM_NODES: #nodes in the cluster # # Args: # $1: host name @@ -1044,7 +1045,13 @@ function create-master() { create-certs "${MASTER_RESERVED_IP}" create-etcd-certs ${MASTER_NAME} - create-master-instance "${MASTER_RESERVED_IP}" & + if [[ "${NUM_NODES}" -ge "50" ]]; then + # We block on master creation for large clusters to avoid doing too much + # unnecessary work in case master start-up fails (like creation of nodes). + create-master-instance "${MASTER_RESERVED_IP}" + else + create-master-instance "${MASTER_RESERVED_IP}" & + fi } # Adds master replica to etcd cluster. diff --git a/cluster/get-kube.sh b/cluster/get-kube.sh index 5ae6333eebb..1f910727e9f 100755 --- a/cluster/get-kube.sh +++ b/cluster/get-kube.sh @@ -56,6 +56,9 @@ # Set KUBERNETES_SKIP_DOWNLOAD to skip downloading a release. # Set KUBERNETES_SKIP_CONFIRM to skip the installation confirmation prompt. # Set KUBERNETES_SKIP_CREATE_CLUSTER to skip starting a cluster. +# Set KUBERNETES_SKIP_RELEASE_VALIDATION to skip trying to validate the +# Kubernetes release string. This implies that you know what you're doing +# and have set KUBERNETES_RELEASE and KUBERNETES_RELEASE_URL properly. set -o errexit set -o nounset @@ -179,13 +182,15 @@ release=${KUBERNETES_RELEASE:-"release/stable"} # Validate Kubernetes release version. # Translate a published version / (e.g. "release/stable") to version number. set_binary_version "${release}" -if [[ ${KUBE_VERSION} =~ ${KUBE_CI_VERSION_REGEX} ]]; then - # Override KUBERNETES_RELEASE_URL to point to the CI bucket; - # this will be used by get-kube-binaries.sh. - KUBERNETES_RELEASE_URL="${KUBERNETES_CI_RELEASE_URL}" -elif ! [[ ${KUBE_VERSION} =~ ${KUBE_RELEASE_VERSION_REGEX} ]]; then - echo "Version doesn't match regexp" >&2 - exit 1 +if [[ -z "${KUBERNETES_SKIP_RELEASE_VALIDATION-}" ]]; then + if [[ ${KUBE_VERSION} =~ ${KUBE_CI_VERSION_REGEX} ]]; then + # Override KUBERNETES_RELEASE_URL to point to the CI bucket; + # this will be used by get-kube-binaries.sh. + KUBERNETES_RELEASE_URL="${KUBERNETES_CI_RELEASE_URL}" + elif ! [[ ${KUBE_VERSION} =~ ${KUBE_RELEASE_VERSION_REGEX} ]]; then + echo "Version doesn't match regexp" >&2 + exit 1 + fi fi kubernetes_tar_url="${KUBERNETES_RELEASE_URL}/${KUBE_VERSION}/${file}" diff --git a/cluster/gke/config-common.sh b/cluster/gke/config-common.sh deleted file mode 100644 index 51982057f19..00000000000 --- a/cluster/gke/config-common.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash - -# 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. - -# This script should be sourced as a part of config-test or config-default. -# Specifically, the following environment variables are assumed: -# - CLUSTER_NAME (the name of the cluster) - -if [ ! -z "${REGION:-}" ] && [ ! -z "${ZONE:-}" ]; then - echo "Only one of REGION and ZONE can be set." >&2 - exit 1 -fi -if [ -z "${REGION:-}" ]; then - ZONE="${ZONE:-us-central1-f}" -fi -NUM_NODES="${NUM_NODES:-3}" -ADDITIONAL_ZONES="${ADDITIONAL_ZONES:-}" -CLUSTER_API_VERSION="${CLUSTER_API_VERSION:-}" -NETWORK="${NETWORK:-default}" -FIREWALL_SSH="${FIREWALL_SSH:-${NETWORK}-allow-ssh}" -GCLOUD="${GCLOUD:-gcloud}" -CMD_GROUP="${CMD_GROUP:-}" -GCLOUD_CONFIG_DIR="${GCLOUD_CONFIG_DIR:-${HOME}/.config/gcloud/kubernetes}" -MACHINE_TYPE="${MACHINE_TYPE:-n1-standard-2}" -IMAGE_TYPE="${IMAGE_TYPE:-}" -if [[ "${FEDERATION:-}" == true ]]; then - NODE_SCOPES="${NODE_SCOPES:-compute-rw,storage-ro,https://www.googleapis.com/auth/ndev.clouddns.readwrite}" -else - NODE_SCOPES="${NODE_SCOPES:-compute-rw,storage-ro}" -fi - -# WARNING: any new vars added here must correspond to options that can be -# passed to `gcloud {CMD_GROUP} container clusters create`, or they will -# have no effect. If you change/add a var used to toggle a value in -# cluster/gce/configure-vm.sh, please ping someone on GKE. - -# This is a hack, but I keep setting this when I run commands manually, and -# then things grossly fail during normal runs because cluster/kubecfg.sh and -# cluster/kubectl.sh both use this if it's set. -unset KUBERNETES_MASTER diff --git a/cluster/gke/config-default.sh b/cluster/gke/config-default.sh deleted file mode 100644 index b611b91ec8b..00000000000 --- a/cluster/gke/config-default.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/bash - -# 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. - -# The following are default-specific settings. -CLUSTER_NAME="${CLUSTER_NAME:-${USER}-gke}" -NETWORK=${KUBE_GKE_NETWORK:-default} - -# For ease of maintenance, extract any pieces that do not vary between default -# and test in a common config. -source $(dirname "${BASH_SOURCE}")/config-common.sh - -# Optional: Install node logging -ENABLE_NODE_LOGGING=false -LOGGING_DESTINATION=gcp # options: elasticsearch, gcp - -# Optional: When set to true, Elasticsearch and Kibana will be setup as part of the cluster bring up. -ENABLE_CLUSTER_LOGGING=false -ELASTICSEARCH_LOGGING_REPLICAS=1 - -# Optional: Deploy a L7 loadbalancer controller to fulfill Ingress requests: -# glbc - CE L7 Load Balancer Controller -ENABLE_L7_LOADBALANCING="${KUBE_ENABLE_L7_LOADBALANCING:-glbc}" - -# Optional: Cluster monitoring to setup as part of the cluster bring up: -# none - No cluster monitoring setup -# influxdb - Heapster, InfluxDB, and Grafana -# google - Heapster, Google Cloud Monitoring, and Google Cloud Logging -# standalone - Heapster only. Metrics available via Heapster REST API. -ENABLE_CLUSTER_MONITORING="${KUBE_ENABLE_CLUSTER_MONITORING:-standalone}" - -KUBE_DELETE_NETWORK=${KUBE_DELETE_NETWORK:-false} - -# Indicates if the values (i.e. KUBE_USER and KUBE_PASSWORD for basic -# authentication) in metadata should be treated as canonical, and therefore disk -# copies ought to be recreated/clobbered. -METADATA_CLOBBERS_CONFIG=true - -# Fluentd requirements -FLUENTD_GCP_MEMORY_LIMIT="${FLUENTD_GCP_MEMORY_LIMIT:-300Mi}" -FLUENTD_GCP_CPU_REQUEST="${FLUENTD_GCP_CPU_REQUEST:-100m}" -FLUENTD_GCP_MEMORY_REQUEST="${FLUENTD_GCP_MEMORY_REQUEST:-200Mi}" -# Adding to PROVIDER_VARS, since this is GCP-specific. -PROVIDER_VARS="${PROVIDER_VARS:-} FLUENTD_GCP_MEMORY_LIMIT FLUENTD_GCP_CPU_REQUEST FLUENTD_GCP_MEMORY_REQUEST" diff --git a/cluster/gke/config-test.sh b/cluster/gke/config-test.sh deleted file mode 100644 index e25d0a2a01e..00000000000 --- a/cluster/gke/config-test.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -# 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. - -# The following are test-specific settings. -CLUSTER_NAME="${CLUSTER_NAME:-${USER}-gke-e2e}" -NETWORK=${KUBE_GKE_NETWORK:-e2e} -NODE_TAG="k8s-${CLUSTER_NAME}-node" -IMAGE_TYPE="${KUBE_GKE_IMAGE_TYPE:-container_vm}" -ENABLE_KUBERNETES_ALPHA="${KUBE_GKE_ENABLE_KUBERNETES_ALPHA:-}" - -KUBE_DELETE_NETWORK=${KUBE_DELETE_NETWORK:-true} - -# For ease of maintenance, extract any pieces that do not vary between default -# and test in a common config. -source $(dirname "${BASH_SOURCE}")/config-common.sh diff --git a/cluster/gke/make-it-stop.sh b/cluster/gke/make-it-stop.sh deleted file mode 100755 index fdff5b51cc9..00000000000 --- a/cluster/gke/make-it-stop.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/bash - -# 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. - -echo "This is NOT a production-ready tool.\n\ -IT'S A HACKY, BEST-EFFORT WAY TO \"STOP\" CREATION OF THE GKE CLUSTER." -read -n 1 -p "Are you sure you want to proceed (y/N)?: " decision -echo "" -if [[ "${decision}" != "y" ]]; then - echo "Aborting..." - exit 0 -fi - -set -o errexit -set -o nounset -set -o pipefail - -KUBE_ROOT=$(dirname "${BASH_SOURCE}")/../.. - -if [ -f "${KUBE_ROOT}/cluster/env.sh" ]; then - source "${KUBE_ROOT}/cluster/env.sh" -fi - -source "${KUBE_ROOT}/cluster/gke/util.sh" -STAGING_ENDPOINT="CLOUDSDK_API_ENDPOINT_OVERRIDES_CONTAINER=https://staging-container.sandbox.googleapis.com/" - -detect-project -cluster=$(gcloud container operations list "--project=${PROJECT}" | grep "CREATE_CLUSTER" | grep "RUNNING" || true) -if [ -z "${cluster}" ]; then - echo "Couldn't find any cluster being created in production environment. Trying staging..." - cluster=$(env ${STAGING_ENDPOINT} gcloud container operations list "--project=${PROJECT}" | grep "CREATE_CLUSTER" | grep "RUNNING" || true) -fi - -if [ -z "${cluster}" ]; then - echo "No cluster creation in progress found. Aborting." - exit 0 -fi - -zone=$(echo "${cluster}" | tr -s "[:blank:]" | cut -f3 -d" ") -cluster_name=$(echo "${cluster}" | tr -s "[:blank:]" | cut -f4 -d" ") -gcloud="gcloud" -if [ "${zone}" == "us-east1-a" ]; then - gcloud="env ${STAGING_ENDPOINT} gcloud" -fi - -migs=$(${gcloud} compute instance-groups managed list --project=${PROJECT} --zones=${zone} | grep "gke-${cluster_name}" | cut -f1 -d" ") -echo "Managed instance groups for cluster ${cluster_name}: ${migs}" -for mig in ${migs}; do - echo "Resizing ${mig}..." - ${gcloud} compute instance-groups managed resize --project="${PROJECT}" --zone="${zone}" "${mig}" --size=1 -done - -echo "All managed instance groups resized to 1. Cluster creation operation should end soon, and you will be be able to delete the cluster." diff --git a/cluster/gke/util.sh b/cluster/gke/util.sh deleted file mode 100755 index 57c8f634f84..00000000000 --- a/cluster/gke/util.sh +++ /dev/null @@ -1,458 +0,0 @@ -#!/bin/bash - -# 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. - -# A library of helper functions and constant for the local config. - -# Uses the config file specified in $KUBE_CONFIG_FILE, or defaults to config-default.sh - -KUBE_PROMPT_FOR_UPDATE=${KUBE_PROMPT_FOR_UPDATE:-"n"} -KUBE_ROOT=$(dirname "${BASH_SOURCE}")/../.. -source "${KUBE_ROOT}/cluster/gke/${KUBE_CONFIG_FILE:-config-default.sh}" -source "${KUBE_ROOT}/cluster/common.sh" -source "${KUBE_ROOT}/hack/lib/util.sh" - -function with-retry() { - local retry_limit=$1 - local cmd=("${@:2}") - - local retry_count=0 - local rc=0 - - until [[ ${retry_count} -ge ${retry_limit} ]]; do - ((retry_count+=1)) - "${cmd[@]}" && rc=0 || rc=$? - if [[ ${rc} == 0 ]]; then - return 0 - fi - sleep 3 - done - - echo "Failed to execute '${cmd[@]}' for $retry_limit times." >&2 - - return ${rc} -} - -# Perform preparations required to run e2e tests -# -# Assumed vars: -# GCLOUD -function prepare-e2e() { - echo "... in gke:prepare-e2e()" >&2 - - # Ensure GCLOUD is set to some gcloud binary. - if [[ -z "${GCLOUD:-}" ]]; then - echo "GCLOUD environment variable is not set. It should be your gcloud binary. " >&2 - echo "A sane default is probably \$ export GCLOUD=gcloud" >&2 - exit 1 - fi -} - - -# Use the gcloud defaults to find the project. If it is already set in the -# environment then go with that. -# -# Assumed vars: -# GCLOUD -# Vars set: -# PROJECT -# SCOPE_ARGS -function detect-project() { - echo "... in gke:detect-project()" >&2 - if [[ -z "${PROJECT:-}" ]]; then - export PROJECT=$("${GCLOUD}" config list project --format 'value(core.project)') - echo "... Using project: ${PROJECT}" >&2 - fi - if [[ -z "${PROJECT:-}" ]]; then - echo "Could not detect Google Cloud Platform project. Set the default project using " >&2 - echo "'gcloud config set project '" >&2 - exit 1 - fi - - SCOPE_ARGS=( - "--project=${PROJECT}" - ) - - if [[ ! -z "${ZONE:-}" ]]; then - SCOPE_ARGS+=("--zone=${ZONE}") - fi - - if [[ ! -z "${REGION:-}" ]]; then - SCOPE_ARGS+=("--region=${REGION}") - fi -} - -# Execute prior to running tests to build a release if required for env. -# -# Assumed Vars: -# KUBE_ROOT -function test-build-release() { - echo "... in gke:test-build-release()" >&2 - "${KUBE_ROOT}/build/release.sh" -} - -# Verify needed binaries exist. -function verify-prereqs() { - echo "... in gke:verify-prereqs()" >&2 - if ! which gcloud >/dev/null; then - local resp - if [[ "${KUBE_PROMPT_FOR_UPDATE}" == "y" ]]; then - echo "Can't find gcloud in PATH. Do you wish to install the Google Cloud SDK? [Y/n]" - read resp - fi - if [[ "${resp}" != "n" && "${resp}" != "N" ]]; then - curl https://sdk.cloud.google.com | bash - fi - if ! which gcloud >/dev/null; then - echo "Can't find gcloud in PATH, please fix and retry. The Google Cloud " - echo "SDK can be downloaded from https://cloud.google.com/sdk/." - exit 1 - fi - fi - update-or-verify-gcloud -} - -# Validate a kubernetes cluster -function validate-cluster { - # Simply override the NUM_NODES variable if we've spread nodes across multiple - # zones before calling into the generic validate-cluster logic. - local EXPECTED_NUM_NODES="${NUM_NODES}" - if [ ! -z "${REGION:-}" ]; then - (( EXPECTED_NUM_NODES *= 3 )) - fi - for zone in $(echo "${ADDITIONAL_ZONES}" | sed "s/,/ /g") - do - (( EXPECTED_NUM_NODES += NUM_NODES )) - done - NUM_NODES=${EXPECTED_NUM_NODES} bash -c "${KUBE_ROOT}/cluster/validate-cluster.sh" -} - -# Instantiate a kubernetes cluster -# -# Assumed vars: -# GCLOUD -# CLUSTER_NAME -# ZONE (optional) -# REGION (optional) -# CLUSTER_API_VERSION (optional) -# NUM_NODES -# ADDITIONAL_ZONES (optional) -# NODE_SCOPES -# MACHINE_TYPE -# HEAPSTER_MACHINE_TYPE (optional) -# CLUSTER_IP_RANGE (optional) -# GKE_CREATE_FLAGS (optional, space delineated) -# ENABLE_KUBERNETES_ALPHA (optional) -function kube-up() { - echo "... in gke:kube-up()" >&2 - detect-project >&2 - - # Make the specified network if we need to. - if ! "${GCLOUD}" compute networks --project "${PROJECT}" describe "${NETWORK}" &>/dev/null; then - echo "Creating new network: ${NETWORK}" >&2 - with-retry 3 "${GCLOUD}" compute networks create "${NETWORK}" --project="${PROJECT}" --mode=auto - else - echo "... Using network: ${NETWORK}" >&2 - fi - - # Allow SSH on all nodes in the network. This doesn't actually check whether - # such a rule exists, only whether we've created this exact rule. - if ! "${GCLOUD}" compute firewall-rules --project "${PROJECT}" describe "${FIREWALL_SSH}" &>/dev/null; then - echo "Creating new firewall for SSH: ${FIREWALL_SSH}" >&2 - with-retry 3 "${GCLOUD}" compute firewall-rules create "${FIREWALL_SSH}" \ - --allow="tcp:22" \ - --network="${NETWORK}" \ - --project="${PROJECT}" \ - --source-ranges="0.0.0.0/0" - else - echo "... Using firewall-rule: ${FIREWALL_SSH}" >&2 - fi - - local shared_args=( - ${SCOPE_ARGS[@]} - "--scopes=${NODE_SCOPES}" - ) - - if [[ ! -z "${IMAGE_TYPE:-}" ]]; then - shared_args+=("--image-type=${IMAGE_TYPE}") - fi - - if [[ -z "${HEAPSTER_MACHINE_TYPE:-}" ]]; then - local -r nodes="${NUM_NODES}" - else - local -r nodes=$(( NUM_NODES - 1 )) - fi - - local create_args=( - ${shared_args[@]} - "--num-nodes=${nodes}" - "--network=${NETWORK}" - "--cluster-version=${CLUSTER_API_VERSION}" - "--machine-type=${MACHINE_TYPE}" - "--quiet" - ) - - if [[ ! -z "${ENABLE_KUBERNETES_ALPHA:-}" ]]; then - create_args+=("--enable-kubernetes-alpha") - fi - - if [[ ! -z "${ADDITIONAL_ZONES:-}" ]]; then - create_args+=("--additional-zones=${ADDITIONAL_ZONES}") - fi - - if [[ ! -z "${CLUSTER_IP_RANGE:-}" ]]; then - create_args+=("--cluster-ipv4-cidr=${CLUSTER_IP_RANGE}") - fi - - if [[ ! -z "${ENABLE_LEGACY_ABAC:-}" ]]; then - if [[ "${ENABLE_LEGACY_ABAC:-}" == "true" ]]; then - create_args+=("--enable-legacy-authorization") - else - create_args+=("--no-enable-legacy-authorization") - fi - fi - - create_args+=( ${GKE_CREATE_FLAGS:-} ) - - # Bring up the cluster. - "${GCLOUD}" ${CMD_GROUP:-} container clusters create "${CLUSTER_NAME}" "${create_args[@]}" - - create-kubeconfig-for-federation - - if [[ ! -z "${HEAPSTER_MACHINE_TYPE:-}" ]]; then - "${GCLOUD}" ${CMD_GROUP:-} container node-pools create "heapster-pool" --cluster "${CLUSTER_NAME}" --num-nodes=1 --machine-type="${HEAPSTER_MACHINE_TYPE}" "${shared_args[@]}" - fi -} - -# Execute prior to running tests to initialize required structure. This is -# called from hack/e2e-go only when running -up (it is run after kube-up, so -# the cluster already exists at this point). -# -# Assumed vars: -# CLUSTER_NAME -# GCLOUD -# ZONE -# Vars set: -# NODE_TAG -function test-setup() { - echo "... in gke:test-setup()" >&2 - # Detect the project into $PROJECT if it isn't set - detect-project >&2 - - "${KUBE_ROOT}/cluster/kube-up.sh" - - detect-nodes >&2 - - # At this point, CLUSTER_NAME should have been used, so its value is final. - NODE_TAG=$($GCLOUD compute instances list ${NODE_NAMES[0]} --project="${PROJECT}" --format='value(tags.items)' | grep -o "gke-${CLUSTER_NAME}-.\{8\}-node") - OLD_NODE_TAG="k8s-${CLUSTER_NAME}-node" - - # Open up port 80 & 8080 so common containers on minions can be reached. - with-retry 3 "${GCLOUD}" compute firewall-rules create \ - "${CLUSTER_NAME}-http-alt" \ - --allow tcp:80,tcp:8080 \ - --project "${PROJECT}" \ - --target-tags "${NODE_TAG},${OLD_NODE_TAG}" \ - --network="${NETWORK}" & - - with-retry 3 "${GCLOUD}" compute firewall-rules create \ - "${CLUSTER_NAME}-nodeports" \ - --allow tcp:30000-32767,udp:30000-32767 \ - --project "${PROJECT}" \ - --target-tags "${NODE_TAG},${OLD_NODE_TAG}" \ - --network="${NETWORK}" & - - # Wait for firewall rules. - kube::util::wait-for-jobs || { - echo "... gke:test-setup(): Could not create firewall" >&2 - return 1 - } -} - -# Detect the IP for the master. Note that on GKE, we don't know the name of the -# master, so KUBE_MASTER is not set. -# -# Assumed vars: -# ZONE -# CLUSTER_NAME -# Vars set: -# KUBE_MASTER_IP -function detect-master() { - echo "... in gke:detect-master()" >&2 - detect-project >&2 - KUBE_MASTER_IP=$("${GCLOUD}" ${CMD_GROUP:-} container clusters describe \ - ${SCOPE_ARGS[@]} --format='value(endpoint)' \ - "${CLUSTER_NAME}") -} - -# Assumed vars: -# none -# Vars set: -# NODE_NAMES -function detect-nodes() { - echo "... in gke:detect-nodes()" >&2 - detect-node-names -} - -# Detect minions created in the minion group -# -# Note that for zonal clusters this will only select nodes in the same zone as the -# cluster, meaning that it won't include all nodes in a multi-zone cluster. -# For regional clusters, this will select nodes only from arbitrarily chosen node instance group. -# -# Assumed vars: -# GCLOUD -# PROJECT -# ZONE (optional) -# REGION (optional) -# CLUSTER_NAME -# Vars set: -# NODE_NAMES -function detect-node-names { - echo "... in gke:detect-node-names()" >&2 - detect-project - detect-node-instance-groups - - NODE_NAMES=() - for group in "${NODE_INSTANCE_GROUPS[@]:-}"; do - # We can't simply use --zone "${ZONE}" as ZONE may not be set (e.g. when REGION is set). - local igm_zone=$(gcloud compute instance-groups managed list "${group}" --format='value(zone)') - NODE_NAMES+=($(gcloud compute instance-groups managed list-instances \ - "${group}" --zone "${igm_zone}" \ - --project "${PROJECT}" --format='value(instance)')) - done - echo "NODE_NAMES=${NODE_NAMES[*]:-}" -} - -# Detect instance group name generated by gke. -# -# Note that for zonal clusters the NODE_INSTANCE_GROUPS var will only have instance groups in the -# same zone as the cluster, meaning that it won't include all groups in a -# multi-zone cluster. -# For regional clusters, NODE_INSTANCE_GROUPS is set to arbitrarily chosen node instance group. -# The ALL_INSTANCE_GROUP_URLS will contain all the instance group URLs, -# which include multi-zone groups. -# -# Assumed vars: -# GCLOUD -# SCOPE_ARGS -# ZONE (optional) -# REGION (optional) -# CLUSTER_NAME -# Vars set: -# NODE_INSTANCE_GROUPS -# ALL_INSTANCE_GROUP_URLS -function detect-node-instance-groups { - echo "... in gke:detect-node-instance-groups()" >&2 - local urls=$("${GCLOUD}" ${CMD_GROUP:-} container clusters describe \ - ${SCOPE_ARGS[@]} --format='value(instanceGroupUrls)' "${CLUSTER_NAME}") - urls=(${urls//;/ }) - ALL_INSTANCE_GROUP_URLS=${urls[*]} - NODE_INSTANCE_GROUPS=() - if [[ ! -z "${ZONE:-}" ]]; then - for url in "${urls[@]:-}"; do - local igm_zone=$(expr ${url} : '.*/zones/\([a-z0-9-]*\)/') - if [[ "${igm_zone}" == "${ZONE}" ]]; then - NODE_INSTANCE_GROUPS+=("${url##*/}") - fi - done - fi - if [[ ! -z "${REGION:-}" ]]; then - NODE_INSTANCE_GROUPS+=("${urls[0]}") - fi -} - -# SSH to a node by name ($1) and run a command ($2). -# -# Assumed vars: -# GCLOUD -# ZONE -function ssh-to-node() { - echo "... in gke:ssh-to-node()" >&2 - detect-project >&2 - - local node="$1" - local cmd="$2" - # Loop until we can successfully ssh into the box - for try in {1..5}; do - if gcloud compute ssh --ssh-flag="-o LogLevel=quiet" --ssh-flag="-o ConnectTimeout=30" --project "${PROJECT}" --zone="${ZONE}" "${node}" --command "echo test > /dev/null"; then - break - fi - sleep 5 - done - # Then actually try the command. - gcloud compute ssh --ssh-flag="-o LogLevel=quiet" --ssh-flag="-o ConnectTimeout=30" --project "${PROJECT}" --zone="${ZONE}" "${node}" --command "${cmd}" -} - -# Execute after running tests to perform any required clean-up. This is called -# from hack/e2e.go. This calls kube-down, so the cluster still exists when this -# is called. -# -# Assumed vars: -# CLUSTER_NAME -# GCLOUD -# KUBE_ROOT -# ZONE -function test-teardown() { - echo "... in gke:test-teardown()" >&2 - - detect-project >&2 - - # Tear down the cluster first. - "${KUBE_ROOT}/cluster/kube-down.sh" || true - - # Then remove the firewall rules. We do it in this order because the - # time to delete a firewall is actually dependent on the number of - # instances, but we can safely delete the cluster before the firewall. - # - # NOTE: Keep in sync with names above in test-setup. - for fw in "${CLUSTER_NAME}-http-alt" "${CLUSTER_NAME}-nodeports" "${FIREWALL_SSH}"; do - if [[ -n $("${GCLOUD}" compute firewall-rules --project "${PROJECT}" describe "${fw}" --format='value(name)' 2>/dev/null || true) ]]; then - with-retry 3 "${GCLOUD}" compute firewall-rules delete "${fw}" --project="${PROJECT}" --quiet & - fi - done - - # Wait for firewall rule teardown. - kube::util::wait-for-jobs || true - - # It's unfortunate that the $FIREWALL_SSH rule and network are created in - # kube-up, but we can only really delete them in test-teardown. So much for - # symmetry. - if [[ "${KUBE_DELETE_NETWORK}" == "true" ]]; then - if [[ -n $("${GCLOUD}" compute networks --project "${PROJECT}" describe "${NETWORK}" --format='value(name)' 2>/dev/null || true) ]]; then - if ! with-retry 3 "${GCLOUD}" compute networks delete --project "${PROJECT}" --quiet "${NETWORK}"; then - echo "Failed to delete network '${NETWORK}'. Listing firewall-rules:" - "${GCLOUD}" compute firewall-rules --project "${PROJECT}" list --filter="network=${NETWORK}" - fi - fi - fi -} - -# Actually take down the cluster. This is called from test-teardown. -# -# Assumed vars: -# GCLOUD -# SCOPE_ARGS -# ZONE (optional) -# REGION (optional) -# CLUSTER_NAME -function kube-down() { - echo "... in gke:kube-down()" >&2 - detect-project >&2 - if "${GCLOUD}" ${CMD_GROUP:-} container clusters describe ${SCOPE_ARGS[@]} "${CLUSTER_NAME}" --quiet &>/dev/null; then - with-retry 3 "${GCLOUD}" ${CMD_GROUP:-} container clusters delete ${SCOPE_ARGS[@]} \ - "${CLUSTER_NAME}" --quiet - fi -} diff --git a/cluster/images/etcd-version-monitor/BUILD b/cluster/images/etcd-version-monitor/BUILD index e1532513dab..2904728a199 100644 --- a/cluster/images/etcd-version-monitor/BUILD +++ b/cluster/images/etcd-version-monitor/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "etcd-version-monitor", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["etcd-version-monitor.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", diff --git a/cluster/images/etcd/attachlease/BUILD b/cluster/images/etcd/attachlease/BUILD index 32a94f0ee62..32770e3d81e 100644 --- a/cluster/images/etcd/attachlease/BUILD +++ b/cluster/images/etcd/attachlease/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "attachlease", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["attachlease.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/clientv3:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/cluster/images/etcd/rollback/BUILD b/cluster/images/etcd/rollback/BUILD index 7928f290d4e..9f895ea49d3 100644 --- a/cluster/images/etcd/rollback/BUILD +++ b/cluster/images/etcd/rollback/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "rollback", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["rollback.go"], - tags = ["automanaged"], deps = [ "//third_party/forked/etcd221/wal:go_default_library", "//vendor/github.com/coreos/etcd/etcdserver:go_default_library", diff --git a/cluster/log-dump/log-dump.sh b/cluster/log-dump/log-dump.sh index 597b9347125..537e548a528 100755 --- a/cluster/log-dump/log-dump.sh +++ b/cluster/log-dump/log-dump.sh @@ -173,7 +173,7 @@ function dump_masters() { echo "Master SSH not supported for ${KUBERNETES_PROVIDER}" return else - if ! (detect-master &> /dev/null); then + if ! (detect-master); then echo "Master not detected. Is the cluster up?" return fi diff --git a/cmd/BUILD b/cmd/BUILD index 668d665382a..ec7ef8d0bea 100644 --- a/cmd/BUILD +++ b/cmd/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - filegroup( name = "package-srcs", srcs = glob(["**"]), @@ -24,6 +22,7 @@ filegroup( "//cmd/genyaml:all-srcs", "//cmd/gke-certificates-controller:all-srcs", "//cmd/hyperkube:all-srcs", + "//cmd/importverifier:all-srcs", "//cmd/kube-apiserver:all-srcs", "//cmd/kube-controller-manager:all-srcs", "//cmd/kube-proxy:all-srcs", diff --git a/cmd/clicheck/BUILD b/cmd/clicheck/BUILD index dd54b00a3ac..d68cb74e263 100644 --- a/cmd/clicheck/BUILD +++ b/cmd/clicheck/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "clicheck", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["check_cli_conventions.go"], - tags = ["automanaged"], deps = [ "//pkg/kubectl/cmd:go_default_library", "//pkg/kubectl/cmd/util:go_default_library", diff --git a/cmd/cloud-controller-manager/BUILD b/cmd/cloud-controller-manager/BUILD index d635b5548a4..5d5bfb99a31 100644 --- a/cmd/cloud-controller-manager/BUILD +++ b/cmd/cloud-controller-manager/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -18,14 +16,12 @@ go_binary( "-static", ], library = ":go_default_library", - tags = ["automanaged"], x_defs = version_x_defs(), ) go_library( name = "go_default_library", srcs = ["controller-manager.go"], - tags = ["automanaged"], deps = [ "//cmd/cloud-controller-manager/app:go_default_library", "//cmd/cloud-controller-manager/app/options:go_default_library", diff --git a/cmd/cloud-controller-manager/app/BUILD b/cmd/cloud-controller-manager/app/BUILD index e441565a1a8..fe0dc12eddf 100644 --- a/cmd/cloud-controller-manager/app/BUILD +++ b/cmd/cloud-controller-manager/app/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["controllermanager.go"], - tags = ["automanaged"], deps = [ "//cmd/cloud-controller-manager/app/options:go_default_library", "//pkg/api:go_default_library", diff --git a/cmd/cloud-controller-manager/app/options/BUILD b/cmd/cloud-controller-manager/app/options/BUILD index 94a6333d054..759babd29e0 100644 --- a/cmd/cloud-controller-manager/app/options/BUILD +++ b/cmd/cloud-controller-manager/app/options/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["options.go"], - tags = ["automanaged"], deps = [ "//pkg/apis/componentconfig:go_default_library", "//pkg/client/leaderelectionconfig:go_default_library", diff --git a/cmd/cloud-controller-manager/app/options/options.go b/cmd/cloud-controller-manager/app/options/options.go index 0f5a3e79689..2d57294ec88 100644 --- a/cmd/cloud-controller-manager/app/options/options.go +++ b/cmd/cloud-controller-manager/app/options/options.go @@ -71,6 +71,8 @@ func (s *CloudControllerManagerServer) AddFlags(fs *pflag.FlagSet) { fs.Var(componentconfig.IPVar{Val: &s.Address}, "address", "The IP address to serve on (set to 0.0.0.0 for all interfaces)") fs.StringVar(&s.CloudProvider, "cloud-provider", s.CloudProvider, "The provider of cloud services. Cannot be empty.") fs.StringVar(&s.CloudConfigFile, "cloud-config", s.CloudConfigFile, "The path to the cloud provider configuration file. Empty string for no configuration file.") + fs.BoolVar(&s.AllowUntaggedCloud, "allow-untagged-cloud", false, "Allow the cluster to run without the cluster-id on cloud instances. This is a legacy mode of operation and a cluster-id will be required in the future.") + fs.MarkDeprecated("allow-untagged-cloud", "This flag is deprecated and will be removed in a future release. A cluster-id will be required on cloud instances") fs.DurationVar(&s.MinResyncPeriod.Duration, "min-resync-period", s.MinResyncPeriod.Duration, "The resync period in reflectors will be random between MinResyncPeriod and 2*MinResyncPeriod") fs.DurationVar(&s.NodeMonitorPeriod.Duration, "node-monitor-period", s.NodeMonitorPeriod.Duration, "The period for syncing NodeStatus in NodeController.") diff --git a/cmd/cloud-controller-manager/controller-manager.go b/cmd/cloud-controller-manager/controller-manager.go index 28f906e528e..49f793294b5 100644 --- a/cmd/cloud-controller-manager/controller-manager.go +++ b/cmd/cloud-controller-manager/controller-manager.go @@ -61,6 +61,14 @@ func main() { glog.Fatalf("Cloud provider could not be initialized: %v", err) } + if cloud.HasClusterID() == false { + if s.AllowUntaggedCloud == true { + glog.Warning("detected a cluster without a ClusterID. A ClusterID will be required in the future. Please tag your cluster to avoid any future issues") + } else { + glog.Fatalf("no ClusterID Found. A ClusterID is required for the cloud provider to function properly. This check can be bypassed by setting the allow-untagged-cloud option") + } + } + if err := app.Run(s, cloud); err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) diff --git a/cmd/gendocs/BUILD b/cmd/gendocs/BUILD index a0a531a7241..009266dcd40 100644 --- a/cmd/gendocs/BUILD +++ b/cmd/gendocs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "gendocs", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["gen_kubectl_docs.go"], - tags = ["automanaged"], deps = [ "//cmd/genutils:go_default_library", "//pkg/kubectl/cmd:go_default_library", diff --git a/cmd/genkubedocs/BUILD b/cmd/genkubedocs/BUILD index 61f0c4f5133..05df97558ce 100644 --- a/cmd/genkubedocs/BUILD +++ b/cmd/genkubedocs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "genkubedocs", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["gen_kube_docs.go"], - tags = ["automanaged"], deps = [ "//cmd/cloud-controller-manager/app:go_default_library", "//cmd/genutils:go_default_library", diff --git a/cmd/genman/BUILD b/cmd/genman/BUILD index b6e57067d74..95bf96d78b7 100644 --- a/cmd/genman/BUILD +++ b/cmd/genman/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "genman", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["gen_kube_man.go"], - tags = ["automanaged"], deps = [ "//cmd/cloud-controller-manager/app:go_default_library", "//cmd/genutils:go_default_library", diff --git a/cmd/genslateyaml/BUILD b/cmd/genslateyaml/BUILD index 6125a0be7e4..8a840dcafcb 100644 --- a/cmd/genslateyaml/BUILD +++ b/cmd/genslateyaml/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "genslateyaml", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["gen_slate_yaml.go"], - tags = ["automanaged"], deps = [ "//pkg/kubectl/cmd:go_default_library", "//pkg/kubectl/cmd/util:go_default_library", diff --git a/cmd/genswaggertypedocs/BUILD b/cmd/genswaggertypedocs/BUILD index 17f8325dd7b..946519a4d29 100644 --- a/cmd/genswaggertypedocs/BUILD +++ b/cmd/genswaggertypedocs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "genswaggertypedocs", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["swagger_type_docs.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/cmd/genutils/BUILD b/cmd/genutils/BUILD index e3f842da462..eb7a2a17f99 100644 --- a/cmd/genutils/BUILD +++ b/cmd/genutils/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,14 +9,12 @@ load( go_library( name = "go_default_library", srcs = ["genutils.go"], - tags = ["automanaged"], ) go_test( name = "go_default_test", srcs = ["genutils_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/cmd/genyaml/BUILD b/cmd/genyaml/BUILD index e7bd9171cc7..093a743f963 100644 --- a/cmd/genyaml/BUILD +++ b/cmd/genyaml/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "genyaml", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["gen_kubectl_yaml.go"], - tags = ["automanaged"], deps = [ "//cmd/genutils:go_default_library", "//pkg/kubectl/cmd:go_default_library", diff --git a/cmd/gke-certificates-controller/BUILD b/cmd/gke-certificates-controller/BUILD index 787fedd608e..760df37eecf 100644 --- a/cmd/gke-certificates-controller/BUILD +++ b/cmd/gke-certificates-controller/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,10 +9,9 @@ load( go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//cmd/gke-certificates-controller/app:go_default_library", - "//pkg/util/logs:go_default_library", + "//pkg/kubectl/util/logs:go_default_library", "//pkg/version/verflag:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library", @@ -40,5 +37,4 @@ filegroup( go_binary( name = "gke-certificates-controller", library = ":go_default_library", - tags = ["automanaged"], ) diff --git a/cmd/gke-certificates-controller/app/BUILD b/cmd/gke-certificates-controller/app/BUILD index 0d2ba7408f4..6bbb27d25da 100644 --- a/cmd/gke-certificates-controller/app/BUILD +++ b/cmd/gke-certificates-controller/app/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "gke_signer.go", "options.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/certificates/install:go_default_library", @@ -56,7 +53,6 @@ go_test( name = "go_default_test", srcs = ["gke_signer_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", "//vendor/k8s.io/client-go/tools/record:go_default_library", diff --git a/cmd/gke-certificates-controller/main.go b/cmd/gke-certificates-controller/main.go index 21e07157cd4..a0679d95d69 100644 --- a/cmd/gke-certificates-controller/main.go +++ b/cmd/gke-certificates-controller/main.go @@ -25,7 +25,7 @@ import ( "k8s.io/apiserver/pkg/util/flag" "k8s.io/kubernetes/cmd/gke-certificates-controller/app" - "k8s.io/kubernetes/pkg/util/logs" + "k8s.io/kubernetes/pkg/kubectl/util/logs" "k8s.io/kubernetes/pkg/version/verflag" "github.com/spf13/pflag" diff --git a/cmd/hyperkube/BUILD b/cmd/hyperkube/BUILD index 9d05d7045a4..09030869bef 100644 --- a/cmd/hyperkube/BUILD +++ b/cmd/hyperkube/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -13,7 +11,6 @@ load("//pkg/version:def.bzl", "version_x_defs") go_binary( name = "hyperkube", library = ":go_default_library", - tags = ["automanaged"], x_defs = version_x_defs(), ) @@ -21,7 +18,6 @@ go_test( name = "go_default_test", srcs = ["hyperkube_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/spf13/cobra:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", @@ -44,7 +40,6 @@ go_library( "main.go", "server.go", ], - tags = ["automanaged"], deps = [ "//cmd/kube-apiserver/app:go_default_library", "//cmd/kube-apiserver/app/options:go_default_library", diff --git a/cmd/hyperkube/kubelet.go b/cmd/hyperkube/kubelet.go index 518692ba4d1..1b2b65edebe 100644 --- a/cmd/hyperkube/kubelet.go +++ b/cmd/hyperkube/kubelet.go @@ -23,8 +23,12 @@ import ( // NewKubelet creates a new hyperkube Server object that includes the // description and flags. -func NewKubelet() *Server { - s := options.NewKubeletServer() +func NewKubelet() (*Server, error) { + s, err := options.NewKubeletServer() + if err != nil { + return nil, err + } + hks := Server{ name: "kubelet", SimpleUsage: "kubelet", @@ -39,5 +43,5 @@ func NewKubelet() *Server { }, } s.AddFlags(hks.Flags()) - return &hks + return &hks, nil } diff --git a/cmd/hyperkube/main.go b/cmd/hyperkube/main.go index e1e07b7d164..ef49d067508 100644 --- a/cmd/hyperkube/main.go +++ b/cmd/hyperkube/main.go @@ -20,6 +20,7 @@ limitations under the License. package main import ( + "fmt" "os" _ "k8s.io/kubernetes/pkg/client/metrics/prometheus" // for client metric registration @@ -36,7 +37,12 @@ func main() { hk.AddServer(NewKubeAPIServer()) hk.AddServer(NewKubeControllerManager()) hk.AddServer(NewScheduler()) - hk.AddServer(NewKubelet()) + if kubelet, err := NewKubelet(); err != nil { + fmt.Fprintf(os.Stderr, "error: %v\n", err) + os.Exit(1) + } else { + hk.AddServer(kubelet) + } hk.AddServer(NewKubeProxy()) hk.AddServer(NewKubeAggregator()) diff --git a/vendor/github.com/gregjones/httpcache/diskcache/BUILD b/cmd/importverifier/BUILD similarity index 72% rename from vendor/github.com/gregjones/httpcache/diskcache/BUILD rename to cmd/importverifier/BUILD index e7580ec7077..fe686e68839 100644 --- a/vendor/github.com/gregjones/httpcache/diskcache/BUILD +++ b/cmd/importverifier/BUILD @@ -1,17 +1,19 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", + "go_binary", "go_library", ) +go_binary( + name = "importverifier", + library = ":go_default_library", +) + go_library( name = "go_default_library", - srcs = ["diskcache.go"], - tags = ["automanaged"], - deps = ["//vendor/github.com/peterbourgon/diskv:go_default_library"], + srcs = ["importverifier.go"], ) filegroup( diff --git a/cmd/importverifier/importverifier.go b/cmd/importverifier/importverifier.go new file mode 100644 index 00000000000..b3188a375e4 --- /dev/null +++ b/cmd/importverifier/importverifier.go @@ -0,0 +1,268 @@ +/* +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 main + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "log" + "os" + "os/exec" + "path/filepath" + "strings" +) + +// Package is a subset of cmd/go.Package +type Package struct { + Dir string `json:",omitempty"` // directory containing package sources + ImportPath string `json:",omitempty"` // import path of package in dir + Imports []string `json:",omitempty"` // import paths used by this package + TestImports []string `json:",omitempty"` // imports from TestGoFiles + XTestImports []string `json:",omitempty"` // imports from XTestGoFiles +} + +// ImportRestriction describes a set of allowable import +// trees for a tree of source code +type ImportRestriction struct { + // BaseDir is the root of the package tree that is + // restricted by this configuration, given as a + // relative path from the root of the repository + BaseDir string `json:"baseImportPath"` + // IgnoredSubTrees are roots of sub-trees of the + // BaseDir for which we do not want to enforce + // any import restrictions whatsoever, given as + // relative paths from the root of the repository + IgnoredSubTrees []string `json:"ignoredSubTrees,omitempty"` + // AllowedImports are roots of package trees that + // are allowed to be imported from the BaseDir, + // given as paths that would be used in a Go + // import statement + AllowedImports []string `json:"allowedImports"` +} + +// ForbiddenImportsFor determines all of the forbidden +// imports for a package given the import restrictions +func (i *ImportRestriction) ForbiddenImportsFor(pkg Package) ([]string, error) { + if restricted, err := i.isRestrictedDir(pkg.Dir); err != nil { + return []string{}, err + } else if !restricted { + return []string{}, nil + } + + return i.forbiddenImportsFor(pkg), nil +} + +// isRestrictedDir determines if the source directory has +// any restrictions placed on it by this configuration. +// A path will be restricted if: +// - it falls under the base import path +// - it does not fall under any of the ignored sub-trees +func (i *ImportRestriction) isRestrictedDir(dir string) (bool, error) { + if under, err := isPathUnder(i.BaseDir, dir); err != nil { + return false, err + } else if !under { + return false, nil + } + + for _, ignored := range i.IgnoredSubTrees { + if under, err := isPathUnder(ignored, dir); err != nil { + return false, err + } else if under { + return false, nil + } + } + + return true, nil +} + +// isPathUnder determines if path is under base +func isPathUnder(base, path string) (bool, error) { + absBase, err := filepath.Abs(base) + if err != nil { + return false, err + } + absPath, err := filepath.Abs(path) + if err != nil { + return false, err + } + + relPath, err := filepath.Rel(absBase, absPath) + if err != nil { + return false, err + } + + // if path is below base, the relative path + // from base to path will not start with `../` + return !strings.HasPrefix(relPath, "."), nil +} + +// forbiddenImportsFor determines all of the forbidden +// imports for a package given the import restrictions +// and returns a deduplicated list of them +func (i *ImportRestriction) forbiddenImportsFor(pkg Package) []string { + forbiddenImportSet := map[string]struct{}{} + for _, imp := range append(pkg.Imports, append(pkg.TestImports, pkg.XTestImports...)...) { + path := extractVendorPath(imp) + if i.isForbidden(path) { + forbiddenImportSet[path] = struct{}{} + } + } + + var forbiddenImports []string + for imp := range forbiddenImportSet { + forbiddenImports = append(forbiddenImports, imp) + } + return forbiddenImports +} + +// extractVendorPath removes a vendor prefix if one exists +func extractVendorPath(path string) string { + vendorPath := "/vendor/" + if !strings.Contains(path, vendorPath) { + return path + } + + return path[strings.Index(path, vendorPath)+len(vendorPath):] +} + +// isForbidden determines if an import is forbidden, +// which is true when the import is: +// - of a package under the rootPackage +// - is not of the base import path or a sub-package of it +// - is not of an allowed path or a sub-package of one +func (i *ImportRestriction) isForbidden(imp string) bool { + importsBelowRoot := strings.HasPrefix(imp, rootPackage) + importsBelowBase := strings.HasPrefix(imp, i.BaseDir) + importsAllowed := false + for _, allowed := range i.AllowedImports { + importsAllowed = importsAllowed || strings.HasPrefix(imp, allowed) + } + + return importsBelowRoot && !importsBelowBase && !importsAllowed +} + +var rootPackage string + +func main() { + if len(os.Args) != 3 { + log.Fatalf("Usage: %s ROOT RESTRICTIONS.json", os.Args[0]) + } + + rootPackage = os.Args[1] + configFile := os.Args[2] + importRestrictions, err := loadImportRestrictions(configFile) + if err != nil { + log.Fatalf("Failed to load import restrictions: %v", err) + } + + foundForbiddenImports := false + for _, restriction := range importRestrictions { + log.Printf("Inspecting imports under %s...\n", restriction.BaseDir) + packages, err := resolvePackageTree(restriction.BaseDir) + if err != nil { + log.Fatalf("Failed to resolve package tree: %v", err) + } else if len(packages) == 0 { + log.Fatalf("Found no packages under tree %s", restriction.BaseDir) + } + + log.Printf("- validating imports for %d packages in the tree", len(packages)) + restrictionViolated := false + for _, pkg := range packages { + if forbidden, err := restriction.ForbiddenImportsFor(pkg); err != nil { + log.Fatalf("-- failed to validate imports: %v", err) + } else if len(forbidden) != 0 { + logForbiddenPackages(pkg.ImportPath, forbidden) + restrictionViolated = true + } + } + if restrictionViolated { + foundForbiddenImports = true + log.Println("- FAIL") + } else { + log.Println("- OK") + } + } + + if foundForbiddenImports { + os.Exit(1) + } +} + +func loadImportRestrictions(configFile string) ([]ImportRestriction, error) { + config, err := ioutil.ReadFile(configFile) + if err != nil { + return nil, fmt.Errorf("failed to load configuration from %s: %v", configFile, err) + } + + var importRestrictions []ImportRestriction + if err := json.Unmarshal(config, &importRestrictions); err != nil { + return nil, fmt.Errorf("failed to unmarshal from %s: %v", configFile, err) + } + + return importRestrictions, nil +} + +func resolvePackageTree(treeBase string) ([]Package, error) { + cmd := "go" + args := []string{"list", "-json", fmt.Sprintf("%s...", treeBase)} + stdout, err := exec.Command(cmd, args...).Output() + if err != nil { + var message string + if ee, ok := err.(*exec.ExitError); ok { + message = fmt.Sprintf("%v\n%v", ee, ee.Stderr) + } else { + message = fmt.Sprintf("%v", err) + } + return nil, fmt.Errorf("failed to run `%s %s`: %v", cmd, strings.Join(args, " "), message) + } + + packages, err := decodePackages(bytes.NewReader(stdout)) + if err != nil { + return nil, fmt.Errorf("failed to decode packages: %v", err) + } + + return packages, nil +} + +func decodePackages(r io.Reader) ([]Package, error) { + // `go list -json` concatenates package definitions + // instead of emitting a single valid JSON, so we + // need to stream the output to decode it into the + // data we are looking for instead of just using a + // simple JSON decoder on stdout + var packages []Package + decoder := json.NewDecoder(r) + for decoder.More() { + var pkg Package + if err := decoder.Decode(&pkg); err != nil { + return nil, fmt.Errorf("invalid package: %v", err) + } + packages = append(packages, pkg) + } + + return packages, nil +} + +func logForbiddenPackages(base string, forbidden []string) { + log.Printf("-- found forbidden imports for %s:\n", base) + for _, forbiddenPackage := range forbidden { + log.Printf("--- %s\n", forbiddenPackage) + } +} diff --git a/cmd/kube-apiserver/BUILD b/cmd/kube-apiserver/BUILD index 373aad377b4..6a942cadc92 100644 --- a/cmd/kube-apiserver/BUILD +++ b/cmd/kube-apiserver/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -18,14 +16,12 @@ go_binary( "-static", ], library = ":go_default_library", - tags = ["automanaged"], x_defs = version_x_defs(), ) go_library( name = "go_default_library", srcs = ["apiserver.go"], - tags = ["automanaged"], deps = [ "//cmd/kube-apiserver/app:go_default_library", "//cmd/kube-apiserver/app/options:go_default_library", diff --git a/cmd/kube-apiserver/app/BUILD b/cmd/kube-apiserver/app/BUILD index 5ae34121120..6c66431bb09 100644 --- a/cmd/kube-apiserver/app/BUILD +++ b/cmd/kube-apiserver/app/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "plugins.go", "server.go", ], - tags = ["automanaged"], deps = [ "//cmd/kube-apiserver/app/options:go_default_library", "//pkg/api:go_default_library", diff --git a/cmd/kube-apiserver/app/aggregator.go b/cmd/kube-apiserver/app/aggregator.go index bf7530104da..6261a39fc42 100644 --- a/cmd/kube-apiserver/app/aggregator.go +++ b/cmd/kube-apiserver/app/aggregator.go @@ -186,6 +186,7 @@ var apiVersionPriorities = map[schema.GroupVersion]priority{ {Group: "certificates.k8s.io", Version: "v1beta1"}: {group: 17300, version: 9}, {Group: "networking.k8s.io", Version: "v1"}: {group: 17200, version: 15}, {Group: "policy", Version: "v1beta1"}: {group: 17100, version: 9}, + {Group: "rbac.authorization.k8s.io", Version: "v1"}: {group: 17000, version: 15}, {Group: "rbac.authorization.k8s.io", Version: "v1beta1"}: {group: 17000, version: 12}, {Group: "rbac.authorization.k8s.io", Version: "v1alpha1"}: {group: 17000, version: 9}, {Group: "settings.k8s.io", Version: "v1alpha1"}: {group: 16900, version: 9}, diff --git a/cmd/kube-apiserver/app/options/BUILD b/cmd/kube-apiserver/app/options/BUILD index 8a6c0592eba..6e5b3d19963 100644 --- a/cmd/kube-apiserver/app/options/BUILD +++ b/cmd/kube-apiserver/app/options/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "options.go", "validation.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation:go_default_library", @@ -33,7 +30,6 @@ go_test( name = "go_default_test", srcs = ["options_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/kubeapiserver/options:go_default_library", diff --git a/cmd/kube-apiserver/app/options/options_test.go b/cmd/kube-apiserver/app/options/options_test.go index a7c9274303a..b96a878ec27 100644 --- a/cmd/kube-apiserver/app/options/options_test.go +++ b/cmd/kube-apiserver/app/options/options_test.go @@ -166,7 +166,9 @@ func TestAddFlagsFlag(t *testing.T) { ServiceAccounts: &kubeoptions.ServiceAccountAuthenticationOptions{ Lookup: true, }, - TokenFile: &kubeoptions.TokenFileAuthenticationOptions{}, + TokenFile: &kubeoptions.TokenFileAuthenticationOptions{}, + TokenSuccessCacheTTL: 10 * time.Second, + TokenFailureCacheTTL: 0, }, Authorization: &kubeoptions.BuiltInAuthorizationOptions{ Mode: "AlwaysDeny", diff --git a/cmd/kube-apiserver/app/testing/BUILD b/cmd/kube-apiserver/app/testing/BUILD index ce33e30777a..7e4e275b7b5 100644 --- a/cmd/kube-apiserver/app/testing/BUILD +++ b/cmd/kube-apiserver/app/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["server_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", "//vendor/k8s.io/api/apps/v1beta1:go_default_library", @@ -33,7 +30,6 @@ go_test( go_library( name = "go_default_library", srcs = ["testserver.go"], - tags = ["automanaged"], deps = [ "//cmd/kube-apiserver/app:go_default_library", "//cmd/kube-apiserver/app/options:go_default_library", diff --git a/cmd/kube-controller-manager/BUILD b/cmd/kube-controller-manager/BUILD index 6d7de6abe5a..36c2af786ce 100644 --- a/cmd/kube-controller-manager/BUILD +++ b/cmd/kube-controller-manager/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -18,14 +16,12 @@ go_binary( "-static", ], library = ":go_default_library", - tags = ["automanaged"], x_defs = version_x_defs(), ) go_library( name = "go_default_library", srcs = ["controller-manager.go"], - tags = ["automanaged"], deps = [ "//cmd/kube-controller-manager/app:go_default_library", "//cmd/kube-controller-manager/app/options:go_default_library", diff --git a/cmd/kube-controller-manager/app/BUILD b/cmd/kube-controller-manager/app/BUILD index 9c3b6ef699a..1f11c248de8 100644 --- a/cmd/kube-controller-manager/app/BUILD +++ b/cmd/kube-controller-manager/app/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -23,7 +21,6 @@ go_library( "plugins.go", "policy.go", ], - tags = ["automanaged"], deps = [ "//cmd/kube-controller-manager/app/options:go_default_library", "//pkg/api:go_default_library", @@ -63,6 +60,7 @@ go_library( "//pkg/controller/job:go_default_library", "//pkg/controller/namespace:go_default_library", "//pkg/controller/node:go_default_library", + "//pkg/controller/node/ipam:go_default_library", "//pkg/controller/podautoscaler:go_default_library", "//pkg/controller/podautoscaler/metrics:go_default_library", "//pkg/controller/podgc:go_default_library", @@ -152,6 +150,5 @@ go_test( name = "go_default_test", srcs = ["controller_manager_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library"], ) diff --git a/cmd/kube-controller-manager/app/controllermanager.go b/cmd/kube-controller-manager/app/controllermanager.go index 7fed1789165..2c5e2518fc0 100644 --- a/cmd/kube-controller-manager/app/controllermanager.go +++ b/cmd/kube-controller-manager/app/controllermanager.go @@ -163,7 +163,12 @@ func Run(s *options.CMServer) error { ClientConfig: kubeconfig, } var clientBuilder controller.ControllerClientBuilder - if len(s.ServiceAccountKeyFile) > 0 && s.UseServiceAccountCredentials { + if s.UseServiceAccountCredentials { + if len(s.ServiceAccountKeyFile) > 0 { + // It's possible another controller process is creating the tokens for us. + // If one isn't, we'll timeout and exit when our client builder is unable to create the tokens. + glog.Warningf("--use-service-account-credentials was specified without providing a --service-account-private-key-file") + } clientBuilder = controller.SAControllerClientBuilder{ ClientConfig: restclient.AnonymousClientConfig(kubeconfig), CoreClient: kubeClient.CoreV1(), @@ -342,6 +347,7 @@ func NewControllerInitializers() map[string]InitFunc { func GetAvailableResources(clientBuilder controller.ControllerClientBuilder) (map[schema.GroupVersionResource]bool, error) { var discoveryClient discovery.DiscoveryInterface + var healthzContent string // If apiserver is not running we should wait for some time and fail only then. This is particularly // important when we start apiserver and controller manager at the same time. err := wait.PollImmediate(time.Second, 10*time.Second, func() (bool, error) { @@ -352,17 +358,19 @@ func GetAvailableResources(clientBuilder controller.ControllerClientBuilder) (ma } healthStatus := 0 - client.Discovery().RESTClient().Get().AbsPath("/healthz").Do().StatusCode(&healthStatus) + resp := client.Discovery().RESTClient().Get().AbsPath("/healthz").Do().StatusCode(&healthStatus) if healthStatus != http.StatusOK { glog.Errorf("Server isn't healthy yet. Waiting a little while.") return false, nil } + content, _ := resp.Raw() + healthzContent = string(content) discoveryClient = client.Discovery() return true, nil }) if err != nil { - return nil, fmt.Errorf("failed to get api versions from server: %v", err) + return nil, fmt.Errorf("failed to get api versions from server: %v: %v", healthzContent, err) } resourceMap, err := discoveryClient.ServerResources() @@ -403,6 +411,14 @@ func CreateControllerContext(s *options.CMServer, rootClientBuilder, clientBuild if cloud != nil { // Initialize the cloud provider with a reference to the clientBuilder cloud.Initialize(rootClientBuilder) + + if cloud.HasClusterID() == false { + if s.AllowUntaggedCloud == true { + glog.Warning("detected a cluster without a ClusterID. A ClusterID will be required in the future. Please tag your cluster to avoid any future issues") + } else { + return ControllerContext{}, fmt.Errorf("no ClusterID Found. A ClusterID is required for the cloud provider to function properly. This check can be bypassed by setting the allow-untagged-cloud option") + } + } } ctx := ControllerContext{ diff --git a/cmd/kube-controller-manager/app/core.go b/cmd/kube-controller-manager/app/core.go index 5dd170140af..0d6f3dca1fe 100644 --- a/cmd/kube-controller-manager/app/core.go +++ b/cmd/kube-controller-manager/app/core.go @@ -42,6 +42,7 @@ import ( "k8s.io/kubernetes/pkg/controller/garbagecollector" namespacecontroller "k8s.io/kubernetes/pkg/controller/namespace" nodecontroller "k8s.io/kubernetes/pkg/controller/node" + "k8s.io/kubernetes/pkg/controller/node/ipam" "k8s.io/kubernetes/pkg/controller/podgc" replicationcontroller "k8s.io/kubernetes/pkg/controller/replication" resourcequotacontroller "k8s.io/kubernetes/pkg/controller/resourcequota" @@ -108,7 +109,7 @@ func startNodeController(ctx ControllerContext) (bool, error) { serviceCIDR, int(ctx.Options.NodeCIDRMaskSize), ctx.Options.AllocateNodeCIDRs, - nodecontroller.CIDRAllocatorType(ctx.Options.CIDRAllocatorType), + ipam.CIDRAllocatorType(ctx.Options.CIDRAllocatorType), ctx.Options.EnableTaintManager, utilfeature.DefaultFeatureGate.Enabled(features.TaintBasedEvictions), ) @@ -339,7 +340,7 @@ func startGarbageCollectorController(ctx ControllerContext) (bool, error) { // Periodically refresh the RESTMapper with new discovery information and sync // the garbage collector. - go garbageCollector.Sync(restMapper, discoveryClient, 30*time.Second, ctx.Stop) + go garbageCollector.Sync(gcClientset.Discovery(), 30*time.Second, ctx.Stop) return true, nil } diff --git a/cmd/kube-controller-manager/app/options/BUILD b/cmd/kube-controller-manager/app/options/BUILD index 39f587d08a7..6bbaaeb27e6 100644 --- a/cmd/kube-controller-manager/app/options/BUILD +++ b/cmd/kube-controller-manager/app/options/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["options.go"], - tags = ["automanaged"], deps = [ "//pkg/apis/componentconfig:go_default_library", "//pkg/client/leaderelectionconfig:go_default_library", diff --git a/cmd/kube-controller-manager/app/options/options.go b/cmd/kube-controller-manager/app/options/options.go index f7754b381d2..5b834261fa7 100644 --- a/cmd/kube-controller-manager/app/options/options.go +++ b/cmd/kube-controller-manager/app/options/options.go @@ -134,6 +134,8 @@ func (s *CMServer) AddFlags(fs *pflag.FlagSet, allControllers []string, disabled fs.BoolVar(&s.UseServiceAccountCredentials, "use-service-account-credentials", s.UseServiceAccountCredentials, "If true, use individual service account credentials for each controller.") fs.StringVar(&s.CloudProvider, "cloud-provider", s.CloudProvider, "The provider for cloud services. Empty string for no provider.") fs.StringVar(&s.CloudConfigFile, "cloud-config", s.CloudConfigFile, "The path to the cloud provider configuration file. Empty string for no configuration file.") + fs.BoolVar(&s.AllowUntaggedCloud, "allow-untagged-cloud", false, "Allow the cluster to run without the cluster-id on cloud instances. This is a legacy mode of operation and a cluster-id will be required in the future.") + fs.MarkDeprecated("allow-untagged-cloud", "This flag is deprecated and will be removed in a future release. A cluster-id will be required on cloud instances") fs.Int32Var(&s.ConcurrentEndpointSyncs, "concurrent-endpoint-syncs", s.ConcurrentEndpointSyncs, "The number of endpoint syncing operations that will be done concurrently. Larger number = faster endpoint updating, but more CPU (and network) load") fs.Int32Var(&s.ConcurrentServiceSyncs, "concurrent-service-syncs", s.ConcurrentServiceSyncs, "The number of services that are allowed to sync concurrently. Larger number = more responsive service management, but more CPU (and network) load") fs.Int32Var(&s.ConcurrentRCSyncs, "concurrent_rc_syncs", s.ConcurrentRCSyncs, "The number of replication controllers that are allowed to sync concurrently. Larger number = more responsive replica management, but more CPU (and network) load") diff --git a/cmd/kube-proxy/BUILD b/cmd/kube-proxy/BUILD index ee0d501d9f9..cb5875ad532 100644 --- a/cmd/kube-proxy/BUILD +++ b/cmd/kube-proxy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -18,14 +16,12 @@ go_binary( "-static", ], library = ":go_default_library", - tags = ["automanaged"], x_defs = version_x_defs(), ) go_library( name = "go_default_library", srcs = ["proxy.go"], - tags = ["automanaged"], deps = [ "//cmd/kube-proxy/app:go_default_library", "//pkg/client/metrics/prometheus:go_default_library", diff --git a/cmd/kube-proxy/app/BUILD b/cmd/kube-proxy/app/BUILD index 31f56757d46..e9bed5d7e89 100644 --- a/cmd/kube-proxy/app/BUILD +++ b/cmd/kube-proxy/app/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "conntrack.go", "server.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/componentconfig:go_default_library", @@ -69,7 +66,6 @@ go_test( name = "go_default_test", srcs = ["server_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/componentconfig:go_default_library", diff --git a/cmd/kubeadm/BUILD b/cmd/kubeadm/BUILD index c15300af93b..348384e8213 100644 --- a/cmd/kubeadm/BUILD +++ b/cmd/kubeadm/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -18,14 +16,12 @@ go_binary( "-static", ], library = ":go_default_library", - tags = ["automanaged"], x_defs = version_x_defs(), ) go_library( name = "go_default_library", srcs = ["kubeadm.go"], - tags = ["automanaged"], deps = ["//cmd/kubeadm/app:go_default_library"], ) diff --git a/cmd/kubeadm/app/BUILD b/cmd/kubeadm/app/BUILD index 3ede4d174f5..fb884978fa8 100644 --- a/cmd/kubeadm/app/BUILD +++ b/cmd/kubeadm/app/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["kubeadm.go"], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm/install:go_default_library", "//cmd/kubeadm/app/cmd:go_default_library", @@ -38,12 +35,15 @@ filegroup( "//cmd/kubeadm/app/node:all-srcs", "//cmd/kubeadm/app/phases/addons:all-srcs", "//cmd/kubeadm/app/phases/apiconfig:all-srcs", + "//cmd/kubeadm/app/phases/bootstraptoken/clusterinfo:all-srcs", + "//cmd/kubeadm/app/phases/bootstraptoken/node:all-srcs", "//cmd/kubeadm/app/phases/certs:all-srcs", "//cmd/kubeadm/app/phases/controlplane:all-srcs", "//cmd/kubeadm/app/phases/kubeconfig:all-srcs", "//cmd/kubeadm/app/phases/markmaster:all-srcs", "//cmd/kubeadm/app/phases/selfhosting:all-srcs", "//cmd/kubeadm/app/phases/token:all-srcs", + "//cmd/kubeadm/app/phases/uploadconfig:all-srcs", "//cmd/kubeadm/app/preflight:all-srcs", "//cmd/kubeadm/app/util:all-srcs", ], diff --git a/cmd/kubeadm/app/apis/kubeadm/BUILD b/cmd/kubeadm/app/apis/kubeadm/BUILD index ea3badd6a77..869f57a992b 100644 --- a/cmd/kubeadm/app/apis/kubeadm/BUILD +++ b/cmd/kubeadm/app/apis/kubeadm/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", diff --git a/cmd/kubeadm/app/apis/kubeadm/fuzzer/BUILD b/cmd/kubeadm/app/apis/kubeadm/fuzzer/BUILD index f2c41c93f16..03623499de0 100644 --- a/cmd/kubeadm/app/apis/kubeadm/fuzzer/BUILD +++ b/cmd/kubeadm/app/apis/kubeadm/fuzzer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["fuzzer.go"], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//vendor/github.com/google/gofuzz:go_default_library", diff --git a/cmd/kubeadm/app/apis/kubeadm/install/BUILD b/cmd/kubeadm/app/apis/kubeadm/install/BUILD index 7e3da0c15d9..1f125259886 100644 --- a/cmd/kubeadm/app/apis/kubeadm/install/BUILD +++ b/cmd/kubeadm/app/apis/kubeadm/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "install.go", ], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library", @@ -42,7 +39,6 @@ go_test( name = "go_default_test", srcs = ["install_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm/fuzzer:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip:go_default_library", diff --git a/cmd/kubeadm/app/apis/kubeadm/types.go b/cmd/kubeadm/app/apis/kubeadm/types.go index 2e132f913cd..93ad6803344 100644 --- a/cmd/kubeadm/app/apis/kubeadm/types.go +++ b/cmd/kubeadm/app/apis/kubeadm/types.go @@ -39,11 +39,6 @@ type MasterConfiguration struct { Token string TokenTTL time.Duration - // SelfHosted enables an alpha deployment type where the apiserver, scheduler, and - // controller manager are managed by Kubernetes itself. This option is likely to - // become the default in the future. - SelfHosted bool - APIServerExtraArgs map[string]string ControllerManagerExtraArgs map[string]string SchedulerExtraArgs map[string]string @@ -105,6 +100,21 @@ type NodeConfiguration struct { NodeName string TLSBootstrapToken string Token string + + // DiscoveryTokenCACertHashes specifies a set of public key pins to verify + // when token-based discovery is used. The root CA found during discovery + // must match one of these values. Specifying an empty set disables root CA + // pinning, which can be unsafe. Each hash is specified as ":", + // where the only currently supported type is "sha256". This is a hex-encoded + // SHA-256 hash of the Subject Public Key Info (SPKI) object in DER-encoded + // ASN.1. These hashes can be calculated using, for example, OpenSSL: + // openssl x509 -pubkey -in ca.crt openssl rsa -pubin -outform der 2>&/dev/null | openssl dgst -sha256 -hex + DiscoveryTokenCACertHashes []string + + // DiscoveryTokenUnsafeSkipCAVerification allows token-based discovery + // without CA verification via DiscoveryTokenCACertHashes. This can weaken + // the security of kubeadm since other nodes can impersonate the master. + DiscoveryTokenUnsafeSkipCAVerification bool } func (cfg *MasterConfiguration) GetMasterEndpoint() string { diff --git a/cmd/kubeadm/app/apis/kubeadm/v1alpha1/BUILD b/cmd/kubeadm/app/apis/kubeadm/v1alpha1/BUILD index d861234c205..3feef312b9d 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1alpha1/BUILD +++ b/cmd/kubeadm/app/apis/kubeadm/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/constants:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/cmd/kubeadm/app/apis/kubeadm/v1alpha1/types.go b/cmd/kubeadm/app/apis/kubeadm/v1alpha1/types.go index ca2b698f152..f7c1cdf7ac1 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1alpha1/types.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1alpha1/types.go @@ -38,11 +38,6 @@ type MasterConfiguration struct { Token string `json:"token"` TokenTTL time.Duration `json:"tokenTTL"` - // SelfHosted enables an alpha deployment type where the apiserver, scheduler, and - // controller manager are managed by Kubernetes itself. This option is likely to - // become the default in the future. - SelfHosted bool `json:"selfHosted"` - APIServerExtraArgs map[string]string `json:"apiServerExtraArgs"` ControllerManagerExtraArgs map[string]string `json:"controllerManagerExtraArgs"` SchedulerExtraArgs map[string]string `json:"schedulerExtraArgs"` @@ -103,4 +98,19 @@ type NodeConfiguration struct { NodeName string `json:"nodeName"` TLSBootstrapToken string `json:"tlsBootstrapToken"` Token string `json:"token"` + + // DiscoveryTokenCACertHashes specifies a set of public key pins to verify + // when token-based discovery is used. The root CA found during discovery + // must match one of these values. Specifying an empty set disables root CA + // pinning, which can be unsafe. Each hash is specified as ":", + // where the only currently supported type is "sha256". This is a hex-encoded + // SHA-256 hash of the Subject Public Key Info (SPKI) object in DER-encoded + // ASN.1. These hashes can be calculated using, for example, OpenSSL: + // openssl x509 -pubkey -in ca.crt openssl rsa -pubin -outform der 2>&/dev/null | openssl dgst -sha256 -hex + DiscoveryTokenCACertHashes []string `json:"discoveryTokenCACertHashes"` + + // DiscoveryTokenUnsafeSkipCAVerification allows token-based discovery + // without CA verification via DiscoveryTokenCACertHashes. This can weaken + // the security of kubeadm since other nodes can impersonate the master. + DiscoveryTokenUnsafeSkipCAVerification bool `json:"discoveryTokenUnsafeSkipCAVerification"` } diff --git a/cmd/kubeadm/app/apis/kubeadm/v1alpha1/zz_generated.deepcopy.go b/cmd/kubeadm/app/apis/kubeadm/v1alpha1/zz_generated.deepcopy.go index fddd84c7689..3750f87b64c 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1alpha1/zz_generated.deepcopy.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1alpha1/zz_generated.deepcopy.go @@ -194,6 +194,11 @@ func (in *NodeConfiguration) DeepCopyInto(out *NodeConfiguration) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.DiscoveryTokenCACertHashes != nil { + in, out := &in.DiscoveryTokenCACertHashes, &out.DiscoveryTokenCACertHashes + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/cmd/kubeadm/app/apis/kubeadm/validation/BUILD b/cmd/kubeadm/app/apis/kubeadm/validation/BUILD index f9b9adf17bb..c7412cc8938 100644 --- a/cmd/kubeadm/app/apis/kubeadm/validation/BUILD +++ b/cmd/kubeadm/app/apis/kubeadm/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", @@ -23,7 +20,6 @@ go_test( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/cmd/features:go_default_library", diff --git a/cmd/kubeadm/app/apis/kubeadm/validation/validation.go b/cmd/kubeadm/app/apis/kubeadm/validation/validation.go index 3c19c02d3ec..dbdd252dccb 100644 --- a/cmd/kubeadm/app/apis/kubeadm/validation/validation.go +++ b/cmd/kubeadm/app/apis/kubeadm/validation/validation.go @@ -137,6 +137,17 @@ func ValidateArgSelection(cfg *kubeadm.NodeConfiguration, fldPath *field.Path) f if len(cfg.DiscoveryTokenAPIServers) < 1 && len(cfg.DiscoveryToken) != 0 { allErrs = append(allErrs, field.Required(fldPath, "DiscoveryTokenAPIServers not set")) } + + if len(cfg.DiscoveryFile) != 0 && len(cfg.DiscoveryTokenCACertHashes) != 0 { + allErrs = append(allErrs, field.Invalid(fldPath, "", "DiscoveryTokenCACertHashes cannot be used with DiscoveryFile")) + } + + // TODO: convert this warning to an error after v1.8 + if len(cfg.DiscoveryFile) == 0 && len(cfg.DiscoveryTokenCACertHashes) == 0 && !cfg.DiscoveryTokenUnsafeSkipCAVerification { + fmt.Println("[validation] WARNING: using token-based discovery without DiscoveryTokenCACertHashes can be unsafe (see https://kubernetes.io/docs/admin/kubeadm/#kubeadm-join).") + fmt.Println("[validation] WARNING: Pass --discovery-token-unsafe-skip-ca-verification to disable this warning. This warning will become an error in Kubernetes 1.9.") + } + // TODO remove once we support multiple api servers if len(cfg.DiscoveryTokenAPIServers) > 1 { fmt.Println("[validation] WARNING: kubeadm doesn't fully support multiple API Servers yet") diff --git a/cmd/kubeadm/app/apis/kubeadm/zz_generated.deepcopy.go b/cmd/kubeadm/app/apis/kubeadm/zz_generated.deepcopy.go index 6e5eb7b00a1..7fae52156a9 100644 --- a/cmd/kubeadm/app/apis/kubeadm/zz_generated.deepcopy.go +++ b/cmd/kubeadm/app/apis/kubeadm/zz_generated.deepcopy.go @@ -199,6 +199,11 @@ func (in *NodeConfiguration) DeepCopyInto(out *NodeConfiguration) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.DiscoveryTokenCACertHashes != nil { + in, out := &in.DiscoveryTokenCACertHashes, &out.DiscoveryTokenCACertHashes + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/cmd/kubeadm/app/cmd/BUILD b/cmd/kubeadm/app/cmd/BUILD index 57d18294b2c..c28fe2504e2 100644 --- a/cmd/kubeadm/app/cmd/BUILD +++ b/cmd/kubeadm/app/cmd/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,25 +17,29 @@ go_library( "token.go", "version.go", ], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library", "//cmd/kubeadm/app/apis/kubeadm/validation:go_default_library", + "//cmd/kubeadm/app/cmd/features:go_default_library", "//cmd/kubeadm/app/cmd/phases:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/discovery:go_default_library", "//cmd/kubeadm/app/phases/addons:go_default_library", "//cmd/kubeadm/app/phases/apiconfig:go_default_library", + "//cmd/kubeadm/app/phases/bootstraptoken/clusterinfo:go_default_library", + "//cmd/kubeadm/app/phases/bootstraptoken/node:go_default_library", + "//cmd/kubeadm/app/phases/certs/pkiutil:go_default_library", "//cmd/kubeadm/app/phases/controlplane:go_default_library", "//cmd/kubeadm/app/phases/kubeconfig:go_default_library", "//cmd/kubeadm/app/phases/markmaster:go_default_library", "//cmd/kubeadm/app/phases/selfhosting:go_default_library", - "//cmd/kubeadm/app/phases/token:go_default_library", + "//cmd/kubeadm/app/phases/uploadconfig:go_default_library", "//cmd/kubeadm/app/preflight:go_default_library", "//cmd/kubeadm/app/util:go_default_library", "//cmd/kubeadm/app/util/config:go_default_library", "//cmd/kubeadm/app/util/kubeconfig:go_default_library", + "//cmd/kubeadm/app/util/pubkeypin:go_default_library", "//cmd/kubeadm/app/util/token:go_default_library", "//pkg/api:go_default_library", "//pkg/bootstrap/api:go_default_library", @@ -69,7 +71,6 @@ go_test( "token_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/preflight:go_default_library", diff --git a/cmd/kubeadm/app/cmd/features/BUILD b/cmd/kubeadm/app/cmd/features/BUILD index c5b61b4cbaf..2341efdef2d 100644 --- a/cmd/kubeadm/app/cmd/features/BUILD +++ b/cmd/kubeadm/app/cmd/features/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["features.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library"], ) diff --git a/cmd/kubeadm/app/cmd/features/features.go b/cmd/kubeadm/app/cmd/features/features.go index ad2a584b4b8..e77ef8412d2 100644 --- a/cmd/kubeadm/app/cmd/features/features.go +++ b/cmd/kubeadm/app/cmd/features/features.go @@ -31,6 +31,12 @@ const ( // FeatureList represents a list of feature gates type FeatureList map[utilfeature.Feature]utilfeature.FeatureSpec +// Enabled indicates whether a feature name has been enabled +func Enabled(featureList map[string]bool, featureName utilfeature.Feature) bool { + _, ok := featureList[string(featureName)] + return ok +} + // Supports indicates whether a feature name is supported on the given // feature set func Supports(featureList FeatureList, featureName string) bool { diff --git a/cmd/kubeadm/app/cmd/init.go b/cmd/kubeadm/app/cmd/init.go index bd2e8266663..9933ffd0647 100644 --- a/cmd/kubeadm/app/cmd/init.go +++ b/cmd/kubeadm/app/cmd/init.go @@ -31,18 +31,23 @@ import ( kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" + "k8s.io/kubernetes/cmd/kubeadm/app/cmd/features" cmdphases "k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" addonsphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/addons" apiconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/apiconfig" + clusterinfophase "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/clusterinfo" + nodebootstraptokenphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/node" + "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs/pkiutil" controlplanephase "k8s.io/kubernetes/cmd/kubeadm/app/phases/controlplane" kubeconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubeconfig" markmasterphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/markmaster" selfhostingphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/selfhosting" - tokenphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/token" + uploadconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/uploadconfig" "k8s.io/kubernetes/cmd/kubeadm/app/preflight" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config" + "k8s.io/kubernetes/cmd/kubeadm/app/util/pubkeypin" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/util/version" ) @@ -64,7 +69,7 @@ var ( You can now join any number of machines by running the following on each node as root: - kubeadm join --token {{.Token}} {{.MasterIP}}:{{.MasterPort}} + kubeadm join --token {{.Token}} {{.MasterIP}}:{{.MasterPort}} --discovery-token-ca-cert-hash {{.CAPubKeyPin}} `))) ) @@ -147,10 +152,6 @@ func NewCmdInit(out io.Writer) *cobra.Command { &skipTokenPrint, "skip-token-print", skipTokenPrint, "Skip printing of the default bootstrap token generated by 'kubeadm init'", ) - cmd.PersistentFlags().BoolVar( - &cfg.SelfHosted, "self-hosted", cfg.SelfHosted, - "[experimental] If kubeadm should make this control plane self-hosted", - ) cmd.PersistentFlags().StringVar( &cfg.Token, "token", cfg.Token, @@ -224,62 +225,76 @@ func (i *Init) Validate(cmd *cobra.Command) error { // Run executes master node provisioning, including certificates, needed static pod manifests, etc. func (i *Init) Run(out io.Writer) error { - // PHASE 1: Generate certificates - err := cmdphases.CreatePKIAssets(i.cfg) - if err != nil { - return err - } - - // PHASE 2: Generate kubeconfig files for the admin and the kubelet - err = kubeconfigphase.CreateInitKubeConfigFiles(kubeadmconstants.KubernetesDir, i.cfg) - if err != nil { - return err - } - - // PHASE 3: Bootstrap the control plane - if err := controlplanephase.WriteStaticPodManifests(i.cfg); err != nil { - return err - } - - adminKubeConfigPath := filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.AdminKubeConfigFileName) - client, err := kubeadmutil.CreateClientAndWaitForAPI(adminKubeConfigPath) - if err != nil { - return err - } - - if err := markmasterphase.MarkMaster(client, i.cfg.NodeName); err != nil { - return err - } - - // PHASE 4: Set up the bootstrap tokens - if !i.skipTokenPrint { - fmt.Printf("[token] Using token: %s\n", i.cfg.Token) - } - - tokenDescription := "The default bootstrap token generated by 'kubeadm init'." - if err := tokenphase.UpdateOrCreateToken(client, i.cfg.Token, false, i.cfg.TokenTTL, kubeadmconstants.DefaultTokenUsages, tokenDescription); err != nil { - return err - } - - if err := tokenphase.CreateBootstrapConfigMapIfNotExists(client, adminKubeConfigPath); err != nil { - return err - } - - // PHASE 5: Install and deploy all addons, and configure things as necessary - k8sVersion, err := version.ParseSemantic(i.cfg.KubernetesVersion) if err != nil { return fmt.Errorf("couldn't parse kubernetes version %q: %v", i.cfg.KubernetesVersion, err) } - // Create the necessary ServiceAccounts - err = apiconfigphase.CreateServiceAccounts(client) + // PHASE 1: Generate certificates + if err := cmdphases.CreatePKIAssets(i.cfg); err != nil { + return err + } + + // PHASE 2: Generate kubeconfig files for the admin and the kubelet + if err := kubeconfigphase.CreateInitKubeConfigFiles(kubeadmconstants.KubernetesDir, i.cfg); err != nil { + return err + } + + // PHASE 3: Bootstrap the control plane + if err := controlplanephase.WriteStaticPodManifests(i.cfg, k8sVersion, kubeadmconstants.GetStaticPodDirectory()); err != nil { + return err + } + + client, err := kubeadmutil.CreateClientAndWaitForAPI(kubeadmconstants.GetAdminKubeConfigPath()) if err != nil { return err } - err = apiconfigphase.CreateRBACRules(client, k8sVersion) - if err != nil { + // PHASE 4: Mark the master with the right label/taint + if err := markmasterphase.MarkMaster(client, i.cfg.NodeName); err != nil { + return err + } + + // PHASE 5: Set up the node bootstrap tokens + if !i.skipTokenPrint { + fmt.Printf("[token] Using token: %s\n", i.cfg.Token) + } + + // Create the default node bootstrap token + tokenDescription := "The default bootstrap token generated by 'kubeadm init'." + if err := nodebootstraptokenphase.UpdateOrCreateToken(client, i.cfg.Token, false, i.cfg.TokenTTL, kubeadmconstants.DefaultTokenUsages, tokenDescription); err != nil { + return err + } + // Create RBAC rules that makes the bootstrap tokens able to post CSRs + if err := nodebootstraptokenphase.AllowBootstrapTokensToPostCSRs(client); err != nil { + return err + } + // Create RBAC rules that makes the bootstrap tokens able to get their CSRs approved automatically + if err := nodebootstraptokenphase.AutoApproveNodeBootstrapTokens(client, k8sVersion); err != nil { + return err + } + + // Create the cluster-info ConfigMap with the associated RBAC rules + if err := clusterinfophase.CreateBootstrapConfigMapIfNotExists(client, kubeadmconstants.GetAdminKubeConfigPath()); err != nil { + return err + } + if err := clusterinfophase.CreateClusterInfoRBACRules(client); err != nil { + return err + } + + // PHASE 6: Install and deploy all addons, and configure things as necessary + + // Upload currently used configuration to the cluster + if err := uploadconfigphase.UploadConfiguration(i.cfg, client); err != nil { + return err + } + + // Create the necessary ServiceAccounts + if err := apiconfigphase.CreateServiceAccounts(client); err != nil { + return err + } + + if err := apiconfigphase.CreateRBACRules(client, k8sVersion); err != nil { return err } @@ -287,8 +302,8 @@ func (i *Init) Run(out io.Writer) error { return err } - // Is deployment type self-hosted? - if i.cfg.SelfHosted { + // PHASE 7: Make the control plane self-hosted if feature gate is enabled + if features.Enabled(i.cfg.FeatureFlags, features.SelfHosting) { // Temporary control plane is up, now we create our self hosted control // plane components and remove the static manifests: fmt.Println("[self-hosted] Creating self-hosted control plane...") @@ -297,10 +312,17 @@ func (i *Init) Run(out io.Writer) error { } } + // Load the CA certificate from so we can pin its public key + caCert, err := pkiutil.TryLoadCertFromDisk(i.cfg.CertificatesDir, kubeadmconstants.CACertAndKeyBaseName) + if err != nil { + return err + } + ctx := map[string]string{ "KubeConfigPath": filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.AdminKubeConfigFileName), "KubeConfigName": kubeadmconstants.AdminKubeConfigFileName, "Token": i.cfg.Token, + "CAPubKeyPin": pubkeypin.Hash(caCert), "MasterIP": i.cfg.API.AdvertiseAddress, "MasterPort": strconv.Itoa(int(i.cfg.API.BindPort)), } diff --git a/cmd/kubeadm/app/cmd/join.go b/cmd/kubeadm/app/cmd/join.go index a4b6a8e787e..acc8a094070 100644 --- a/cmd/kubeadm/app/cmd/join.go +++ b/cmd/kubeadm/app/cmd/join.go @@ -77,6 +77,21 @@ func NewCmdJoin(out io.Writer) *cobra.Command { the discovery information is loaded from a URL, HTTPS must be used and the host installed CA bundle is used to verify the connection. + If you use a shared token for discovery, you should also pass the + --discovery-token-ca-cert-hash flag to validate the public key of the + root certificate authority (CA) presented by the Kubernetes Master. The + value of this flag is specified as ":", + where the supported hash type is "sha256". The hash is calculated over + the bytes of the Subject Public Key Info (SPKI) object (as in RFC7469). + This value is available in the output of "kubeadm init" or can be + calcuated using standard tools. The --discovery-token-ca-cert-hash flag + may be repeated multiple times to allow more than one public key. + + If you cannot know the CA public key hash ahead of time, you can pass + the --discovery-token-unsafe-skip-ca-verification flag to disable this + verification. This weakens the kubeadm security model since other nodes + can potentially impersonate the Kubernetes Master. + The TLS bootstrap mechanism is also driven via a shared token. This is used to temporarily authenticate with the Kubernetes Master to submit a certificate signing request (CSR) for a locally created key pair. By @@ -117,6 +132,13 @@ func NewCmdJoin(out io.Writer) *cobra.Command { cmd.PersistentFlags().StringVar( &cfg.TLSBootstrapToken, "tls-bootstrap-token", "", "A token used for TLS bootstrapping") + cmd.PersistentFlags().StringSliceVar( + &cfg.DiscoveryTokenCACertHashes, "discovery-token-ca-cert-hash", []string{}, + "For token-based discovery, validate that the root CA public key matches this hash (format: \":\").") + cmd.PersistentFlags().BoolVar( + &cfg.DiscoveryTokenUnsafeSkipCAVerification, "discovery-token-unsafe-skip-ca-verification", false, + "For token-based discovery, allow joining without --discovery-token-ca-cert-hash pinning.") + cmd.PersistentFlags().StringVar( &cfg.Token, "token", "", "Use this token for both discovery-token and tls-bootstrap-token") diff --git a/cmd/kubeadm/app/cmd/phases/BUILD b/cmd/kubeadm/app/cmd/phases/BUILD index 5975ef330dc..dba06067655 100644 --- a/cmd/kubeadm/app/cmd/phases/BUILD +++ b/cmd/kubeadm/app/cmd/phases/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,30 +9,35 @@ load( go_library( name = "go_default_library", srcs = [ + "bootstraptoken.go", "certs.go", "kubeconfig.go", "markmaster.go", "phase.go", "preflight.go", "selfhosting.go", + "uploadconfig.go", ], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library", - "//cmd/kubeadm/app/apis/kubeadm/validation:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", + "//cmd/kubeadm/app/phases/bootstraptoken/clusterinfo:go_default_library", + "//cmd/kubeadm/app/phases/bootstraptoken/node:go_default_library", "//cmd/kubeadm/app/phases/certs:go_default_library", "//cmd/kubeadm/app/phases/certs/pkiutil:go_default_library", "//cmd/kubeadm/app/phases/kubeconfig:go_default_library", "//cmd/kubeadm/app/phases/markmaster:go_default_library", "//cmd/kubeadm/app/phases/selfhosting:go_default_library", + "//cmd/kubeadm/app/phases/uploadconfig:go_default_library", "//cmd/kubeadm/app/preflight:go_default_library", "//cmd/kubeadm/app/util:go_default_library", "//cmd/kubeadm/app/util/config:go_default_library", "//cmd/kubeadm/app/util/kubeconfig:go_default_library", "//pkg/api:go_default_library", + "//pkg/util/version:go_default_library", "//vendor/github.com/spf13/cobra:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", ], ) @@ -43,9 +46,9 @@ go_test( srcs = [ "certs_test.go", "kubeconfig_test.go", + "phase_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/apis/kubeadm/install:go_default_library", diff --git a/cmd/kubeadm/app/cmd/phases/bootstraptoken.go b/cmd/kubeadm/app/cmd/phases/bootstraptoken.go new file mode 100644 index 00000000000..f9b45358720 --- /dev/null +++ b/cmd/kubeadm/app/cmd/phases/bootstraptoken.go @@ -0,0 +1,139 @@ +/* +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 phases + +import ( + "fmt" + + "github.com/spf13/cobra" + + clientset "k8s.io/client-go/kubernetes" + "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/clusterinfo" + "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/node" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" + kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig" + versionutil "k8s.io/kubernetes/pkg/util/version" +) + +// NewCmdBootstrapToken returns the Cobra command for running the mark-master phase +func NewCmdBootstrapToken() *cobra.Command { + var kubeConfigFile string + cmd := &cobra.Command{ + Use: "bootstrap-token", + Short: "Manage kubeadm-specific Bootstrap Token functions.", + Aliases: []string{"bootstraptoken"}, + RunE: subCmdRunE("bootstrap-token"), + } + + cmd.PersistentFlags().StringVar(&kubeConfigFile, "kubeconfig", "/etc/kubernetes/admin.conf", "The KubeConfig file to use for talking to the cluster") + + // Add subcommands + cmd.AddCommand(NewSubCmdClusterInfo(&kubeConfigFile)) + cmd.AddCommand(NewSubCmdNodeBootstrapToken(&kubeConfigFile)) + + return cmd +} + +// NewSubCmdClusterInfo returns the Cobra command for running the cluster-info sub-phase +func NewSubCmdClusterInfo(kubeConfigFile *string) *cobra.Command { + cmd := &cobra.Command{ + Use: "cluster-info ", + Short: "Uploads and exposes the cluster-info ConfigMap publicly from the given cluster-info file", + Aliases: []string{"clusterinfo"}, + Run: func(cmd *cobra.Command, args []string) { + err := validateExactArgNumber(args, []string{"clusterinfo-file"}) + kubeadmutil.CheckErr(err) + + client, err := kubeconfigutil.ClientSetFromFile(*kubeConfigFile) + kubeadmutil.CheckErr(err) + + // Here it's safe to get args[0], since we've validated that the argument exists above in validateExactArgNumber + clusterInfoFile := args[0] + // Create the cluster-info ConfigMap or update if it already exists + err = clusterinfo.CreateBootstrapConfigMapIfNotExists(client, clusterInfoFile) + kubeadmutil.CheckErr(err) + + // Create the RBAC rules that expose the cluster-info ConfigMap properly + err = clusterinfo.CreateClusterInfoRBACRules(client) + kubeadmutil.CheckErr(err) + }, + } + return cmd +} + +// NewSubCmdNodeBootstrapToken returns the Cobra command for running the node sub-phase +func NewSubCmdNodeBootstrapToken(kubeConfigFile *string) *cobra.Command { + cmd := &cobra.Command{ + Use: "node", + Short: "Manages Node Bootstrap Tokens", + Aliases: []string{"clusterinfo"}, + RunE: subCmdRunE("node"), + } + + cmd.AddCommand(NewSubCmdNodeBootstrapTokenPostCSRs(kubeConfigFile)) + cmd.AddCommand(NewSubCmdNodeBootstrapTokenAutoApprove(kubeConfigFile)) + + return cmd +} + +// NewSubCmdNodeBootstrapTokenPostCSRs returns the Cobra command for running the allow-post-csrs sub-phase +func NewSubCmdNodeBootstrapTokenPostCSRs(kubeConfigFile *string) *cobra.Command { + cmd := &cobra.Command{ + Use: "allow-post-csrs", + Short: "Configure RBAC to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials", + Run: func(cmd *cobra.Command, args []string) { + client, err := kubeconfigutil.ClientSetFromFile(*kubeConfigFile) + kubeadmutil.CheckErr(err) + + err = node.AllowBootstrapTokensToPostCSRs(client) + kubeadmutil.CheckErr(err) + }, + } + return cmd +} + +// NewSubCmdNodeBootstrapToken returns the Cobra command for running the allow-auto-approve sub-phase +func NewSubCmdNodeBootstrapTokenAutoApprove(kubeConfigFile *string) *cobra.Command { + cmd := &cobra.Command{ + Use: "allow-auto-approve", + Short: "Configure RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token", + Run: func(cmd *cobra.Command, args []string) { + client, err := kubeconfigutil.ClientSetFromFile(*kubeConfigFile) + kubeadmutil.CheckErr(err) + + clusterVersion, err := getClusterVersion(client) + kubeadmutil.CheckErr(err) + + err = node.AutoApproveNodeBootstrapTokens(client, clusterVersion) + kubeadmutil.CheckErr(err) + }, + } + return cmd +} + +// getClusterVersion fetches the API server version and parses it +func getClusterVersion(client clientset.Interface) (*versionutil.Version, error) { + clusterVersionInfo, err := client.Discovery().ServerVersion() + if err != nil { + return nil, fmt.Errorf("failed to check server version: %v", err) + } + clusterVersion, err := versionutil.ParseSemantic(clusterVersionInfo.String()) + if err != nil { + return nil, fmt.Errorf("failed to parse server version: %v", err) + } + return clusterVersion, nil +} diff --git a/cmd/kubeadm/app/cmd/phases/certs.go b/cmd/kubeadm/app/cmd/phases/certs.go index a06dd885853..aa8c23ce1be 100644 --- a/cmd/kubeadm/app/cmd/phases/certs.go +++ b/cmd/kubeadm/app/cmd/phases/certs.go @@ -25,7 +25,6 @@ import ( kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" - "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" certphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs" "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs/pkiutil" @@ -132,24 +131,9 @@ func runCmdFunc(cmdFunc func(cfg *kubeadmapi.MasterConfiguration) error, cfgPath // are shared between sub commands and gets access to current value e.g. flags value. return func(cmd *cobra.Command, args []string) { - internalcfg := &kubeadmapi.MasterConfiguration{} - // Takes passed flags into account; the defaulting is executed once again enforcing assignement of - // static default values to cfg only for values not provided with flags - api.Scheme.Default(cfg) - api.Scheme.Convert(cfg, internalcfg, nil) - - // Loads configuration from config file, if provided - // Nb. --config overrides command line flags - err := configutil.TryLoadMasterConfiguration(*cfgPath, internalcfg) - kubeadmutil.CheckErr(err) - - // Applies dynamic defaults to settings not provided with flags - err = configutil.SetInitDynamicDefaults(internalcfg) - kubeadmutil.CheckErr(err) - - // Validates cfg (flags/configs + defaults + dynamic defaults) - err = validation.ValidateMasterConfiguration(internalcfg).ToAggregate() + // This call returns the ready-to-use configuration based on the configuration file that might or might not exist and the default cfg populated by flags + internalcfg, err := configutil.ConfigFileAndDefaultsToInternalConfig(*cfgPath, cfg) kubeadmutil.CheckErr(err) // Execute the cmdFunc diff --git a/cmd/kubeadm/app/cmd/phases/kubeconfig.go b/cmd/kubeadm/app/cmd/phases/kubeconfig.go index a009a5cb998..22197a41a86 100644 --- a/cmd/kubeadm/app/cmd/phases/kubeconfig.go +++ b/cmd/kubeadm/app/cmd/phases/kubeconfig.go @@ -24,7 +24,6 @@ import ( kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" - "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" kubeconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubeconfig" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" @@ -141,24 +140,9 @@ func runCmdFuncKubeConfig(cmdFunc func(outDir string, cfg *kubeadmapi.MasterConf // are shared between sub commands and gets access to current value e.g. flags value. return func(cmd *cobra.Command, args []string) { - internalcfg := &kubeadmapi.MasterConfiguration{} - // Takes passed flags into account; the defaulting is executed once again enforcing assignement of - // static default values to cfg only for values not provided with flags - api.Scheme.Default(cfg) - api.Scheme.Convert(cfg, internalcfg, nil) - - // Loads configuration from config file, if provided - // Nb. --config overrides command line flags - err := configutil.TryLoadMasterConfiguration(*cfgPath, internalcfg) - kubeadmutil.CheckErr(err) - - // Applies dynamic defaults to settings not provided with flags - err = configutil.SetInitDynamicDefaults(internalcfg) - kubeadmutil.CheckErr(err) - - // Validates cfg (flags/configs + defaults + dynamic defaults) - err = validation.ValidateMasterConfiguration(internalcfg).ToAggregate() + // This call returns the ready-to-use configuration based on the configuration file that might or might not exist and the default cfg populated by flags + internalcfg, err := configutil.ConfigFileAndDefaultsToInternalConfig(*cfgPath, cfg) kubeadmutil.CheckErr(err) // Execute the cmdFunc diff --git a/cmd/kubeadm/app/cmd/phases/markmaster.go b/cmd/kubeadm/app/cmd/phases/markmaster.go index 0d95dc851d3..33b50134758 100644 --- a/cmd/kubeadm/app/cmd/phases/markmaster.go +++ b/cmd/kubeadm/app/cmd/phases/markmaster.go @@ -22,6 +22,7 @@ import ( "github.com/spf13/cobra" markmasterphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/markmaster" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig" ) @@ -33,16 +34,11 @@ func NewCmdMarkMaster() *cobra.Command { Short: "Create KubeConfig files from given credentials.", Aliases: []string{"markmaster"}, RunE: func(_ *cobra.Command, args []string) error { - if len(args) < 1 || len(args[0]) == 0 { - return fmt.Errorf("missing required argument node-name") - } - if len(args) > 1 { - return fmt.Errorf("too many arguments, only one argument supported: node-name") - } + err := validateExactArgNumber(args, []string{"node-name"}) + kubeadmutil.CheckErr(err) + client, err := kubeconfigutil.ClientSetFromFile(kubeConfigFile) - if err != nil { - return err - } + kubeadmutil.CheckErr(err) nodeName := args[0] fmt.Printf("[markmaster] Will mark node %s as master by adding a label and a taint\n", nodeName) diff --git a/cmd/kubeadm/app/cmd/phases/phase.go b/cmd/kubeadm/app/cmd/phases/phase.go index e46414e6fea..e2b7a95437d 100644 --- a/cmd/kubeadm/app/cmd/phases/phase.go +++ b/cmd/kubeadm/app/cmd/phases/phase.go @@ -23,6 +23,7 @@ import ( "github.com/spf13/cobra" ) +// NewCmdPhase returns the cobra command for the "kubeadm phase" command (currently alpha-gated) func NewCmdPhase(out io.Writer) *cobra.Command { cmd := &cobra.Command{ Use: "phase", @@ -35,6 +36,8 @@ func NewCmdPhase(out io.Writer) *cobra.Command { cmd.AddCommand(NewCmdPreFlight()) cmd.AddCommand(NewCmdSelfhosting()) cmd.AddCommand(NewCmdMarkMaster()) + cmd.AddCommand(NewCmdUploadConfig()) + cmd.AddCommand(NewCmdBootstrapToken()) return cmd } @@ -53,3 +56,22 @@ func subCmdRunE(name string) func(*cobra.Command, []string) error { return fmt.Errorf("invalid subcommand: %q", args[0]) } } + +// validateExactArgNumber validates that the required top-level arguments are specified +func validateExactArgNumber(args []string, supportedArgs []string) error { + validArgs := 0 + // Disregard possible "" arguments; they are invalid + for _, arg := range args { + if len(arg) > 0 { + validArgs++ + } + } + + if validArgs < len(supportedArgs) { + return fmt.Errorf("missing one or more required arguments. Required arguments: %v", supportedArgs) + } + if validArgs > len(supportedArgs) { + return fmt.Errorf("too many arguments, only %d argument(s) supported: %v", validArgs, supportedArgs) + } + return nil +} diff --git a/cmd/kubeadm/app/cmd/phases/phase_test.go b/cmd/kubeadm/app/cmd/phases/phase_test.go new file mode 100644 index 00000000000..67a5283337f --- /dev/null +++ b/cmd/kubeadm/app/cmd/phases/phase_test.go @@ -0,0 +1,64 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package phases + +import ( + "testing" +) + +func TestValidateExactArgNumber(t *testing.T) { + var tests = []struct { + args, supportedArgs []string + expectedErr bool + }{ + { // one arg given and one arg expected + args: []string{"my-node-1234"}, + supportedArgs: []string{"node-name"}, + expectedErr: false, + }, + { // two args given and two args expected + args: []string{"my-node-1234", "foo"}, + supportedArgs: []string{"node-name", "second-toplevel-arg"}, + expectedErr: false, + }, + { // too few supplied args + args: []string{}, + supportedArgs: []string{"node-name"}, + expectedErr: true, + }, + { // too few non-empty args + args: []string{""}, + supportedArgs: []string{"node-name"}, + expectedErr: true, + }, + { // too many args + args: []string{"my-node-1234", "foo"}, + supportedArgs: []string{"node-name"}, + expectedErr: true, + }, + } + for _, rt := range tests { + actual := validateExactArgNumber(rt.args, rt.supportedArgs) + if (actual != nil) != rt.expectedErr { + t.Errorf( + "failed validateExactArgNumber:\n\texpected error: %t\n\t actual error: %t", + rt.expectedErr, + (actual != nil), + ) + } + } +} diff --git a/cmd/kubeadm/app/cmd/phases/uploadconfig.go b/cmd/kubeadm/app/cmd/phases/uploadconfig.go new file mode 100644 index 00000000000..bd2573f4f09 --- /dev/null +++ b/cmd/kubeadm/app/cmd/phases/uploadconfig.go @@ -0,0 +1,58 @@ +/* +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 phases + +import ( + "fmt" + + "github.com/spf13/cobra" + + kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" + "k8s.io/kubernetes/cmd/kubeadm/app/phases/uploadconfig" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" + configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config" + kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig" +) + +// NewCmdUploadConfig returns the Cobra command for running the uploadconfig phase +func NewCmdUploadConfig() *cobra.Command { + var cfgPath, kubeConfigFile string + cmd := &cobra.Command{ + Use: "upload-config", + Short: "Upload the currently used configuration for kubeadm to a ConfigMap in the cluster for future use in reconfiguration and upgrades of the cluster.", + Aliases: []string{"uploadconfig"}, + Run: func(_ *cobra.Command, args []string) { + if len(cfgPath) == 0 { + kubeadmutil.CheckErr(fmt.Errorf("The --config flag is mandatory")) + } + client, err := kubeconfigutil.ClientSetFromFile(kubeConfigFile) + kubeadmutil.CheckErr(err) + + defaultcfg := &kubeadmapiext.MasterConfiguration{} + internalcfg, err := configutil.ConfigFileAndDefaultsToInternalConfig(cfgPath, defaultcfg) + kubeadmutil.CheckErr(err) + + err = uploadconfig.UploadConfiguration(internalcfg, client) + kubeadmutil.CheckErr(err) + }, + } + + cmd.Flags().StringVar(&kubeConfigFile, "kubeconfig", "/etc/kubernetes/admin.conf", "The KubeConfig file to use for talking to the cluster") + cmd.Flags().StringVar(&cfgPath, "config", "", "Path to kubeadm config file (WARNING: Usage of a configuration file is experimental)") + + return cmd +} diff --git a/cmd/kubeadm/app/cmd/reset.go b/cmd/kubeadm/app/cmd/reset.go index fcba36065c5..779b290d694 100644 --- a/cmd/kubeadm/app/cmd/reset.go +++ b/cmd/kubeadm/app/cmd/reset.go @@ -97,7 +97,7 @@ func (r *Reset) Run(out io.Writer) error { // Try to unmount mounted directories under /var/lib/kubelet in order to be able to remove the /var/lib/kubelet directory later fmt.Printf("[reset] Unmounting mounted directories in %q\n", "/var/lib/kubelet") - umountDirsCmd := "cat /proc/mounts | awk '{print $2}' | grep '/var/lib/kubelet' | xargs -r umount" + umountDirsCmd := "awk '$2 ~ path {print $2}' path=/var/lib/kubelet /proc/mounts | xargs -r umount" umountOutputBytes, err := exec.Command("sh", "-c", umountDirsCmd).Output() if err != nil { fmt.Printf("[reset] Failed to unmount mounted directories in /var/lib/kubelet: %s\n", string(umountOutputBytes)) diff --git a/cmd/kubeadm/app/cmd/token.go b/cmd/kubeadm/app/cmd/token.go index deb7f7a607a..730356605bb 100644 --- a/cmd/kubeadm/app/cmd/token.go +++ b/cmd/kubeadm/app/cmd/token.go @@ -34,7 +34,7 @@ import ( clientset "k8s.io/client-go/kubernetes" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" - tokenphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/token" + tokenphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/node" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig" tokenutil "k8s.io/kubernetes/cmd/kubeadm/app/util/token" diff --git a/cmd/kubeadm/app/constants/BUILD b/cmd/kubeadm/app/constants/BUILD index 735d973a56e..1e7597d46fa 100644 --- a/cmd/kubeadm/app/constants/BUILD +++ b/cmd/kubeadm/app/constants/BUILD @@ -1,16 +1,14 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", + "go_test", ) go_library( name = "go_default_library", srcs = ["constants.go"], - tags = ["automanaged"], deps = [ "//pkg/util/version:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -29,3 +27,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +go_test( + name = "go_default_test", + srcs = ["constants_test.go"], + library = ":go_default_library", +) diff --git a/cmd/kubeadm/app/constants/constants.go b/cmd/kubeadm/app/constants/constants.go index 51d8134c44b..20105623390 100644 --- a/cmd/kubeadm/app/constants/constants.go +++ b/cmd/kubeadm/app/constants/constants.go @@ -17,6 +17,7 @@ limitations under the License. package constants import ( + "fmt" "path/filepath" "time" @@ -95,8 +96,30 @@ const ( // It's copied over to kubeadm until it's merged in core: https://github.com/kubernetes/kubernetes/pull/39112 LabelNodeRoleMaster = "node-role.kubernetes.io/master" + // MasterConfigurationConfigMap specifies in what ConfigMap in the kube-system namespace the `kubeadm init` configuration should be stored + MasterConfigurationConfigMap = "kubeadm-config" + + // MasterConfigurationConfigMapKey specifies in what ConfigMap key the master configuration should be stored + MasterConfigurationConfigMapKey = "MasterConfiguration" + // MinExternalEtcdVersion indicates minimum external etcd version which kubeadm supports MinExternalEtcdVersion = "3.0.14" + + // DefaultEtcdVersion indicates the default etcd version that kubeadm uses + DefaultEtcdVersion = "3.0.17" + + Etcd = "etcd" + KubeAPIServer = "kube-apiserver" + KubeControllerManager = "kube-controller-manager" + KubeScheduler = "kube-scheduler" + KubeProxy = "kube-proxy" + + // SelfHostingPrefix describes the prefix workloads that are self-hosted by kubeadm has + SelfHostingPrefix = "self-hosted-" + + // NodeBootstrapTokenAuthGroup specifies which group a Node Bootstrap Token should be authenticated in + // TODO: This should be changed in the v1.8 dev cycle to a node-BT-specific group instead of the generic Bootstrap Token group that is used now + NodeBootstrapTokenAuthGroup = "system:bootstrappers" ) var ( @@ -119,11 +142,33 @@ var ( // DefaultTokenUsages specifies the default functions a token will get DefaultTokenUsages = []string{"signing", "authentication"} + // MasterComponents defines the master component names + MasterComponents = []string{KubeAPIServer, KubeControllerManager, KubeScheduler} + // MinimumControlPlaneVersion specifies the minimum control plane version kubeadm can deploy MinimumControlPlaneVersion = version.MustParseSemantic("v1.7.0") + + // MinimumCSRAutoApprovalClusterRolesVersion defines whether kubeadm can rely on the built-in CSR approval ClusterRole or not (note, the binding is always created by kubeadm!) + // TODO: Remove this when the v1.9 cycle starts and we bump the minimum supported version to v1.8.0 + MinimumCSRAutoApprovalClusterRolesVersion = version.MustParseSemantic("v1.8.0-alpha.3") ) -// BuildStaticManifestFilepath returns the location on the disk where the Static Pod should be present -func BuildStaticManifestFilepath(componentName string) string { - return filepath.Join(KubernetesDir, ManifestsSubDirName, componentName+".yaml") +// GetStaticPodDirectory returns the location on the disk where the Static Pod should be present +func GetStaticPodDirectory() string { + return filepath.Join(KubernetesDir, ManifestsSubDirName) +} + +// GetStaticPodFilepath returns the location on the disk where the Static Pod should be present +func GetStaticPodFilepath(componentName, manifestsDir string) string { + return filepath.Join(manifestsDir, componentName+".yaml") +} + +// GetAdminKubeConfigPath returns the location on the disk where admin kubeconfig is located by default +func GetAdminKubeConfigPath() string { + return filepath.Join(KubernetesDir, AdminKubeConfigFileName) +} + +// AddSelfHostedPrefix adds the self-hosted- prefix to the component name +func AddSelfHostedPrefix(componentName string) string { + return fmt.Sprintf("%s%s", SelfHostingPrefix, componentName) } diff --git a/cmd/kubeadm/app/constants/constants_test.go b/cmd/kubeadm/app/constants/constants_test.go new file mode 100644 index 00000000000..29cffa2abbd --- /dev/null +++ b/cmd/kubeadm/app/constants/constants_test.go @@ -0,0 +1,112 @@ +/* +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 constants + +import ( + "testing" +) + +func TestGetStaticPodDirectory(t *testing.T) { + expected := "/etc/kubernetes/manifests" + actual := GetStaticPodDirectory() + + if actual != expected { + t.Errorf( + "failed GetStaticPodDirectory:\n\texpected: %s\n\t actual: %s", + expected, + actual, + ) + } +} + +func TestGetAdminKubeConfigPath(t *testing.T) { + expected := "/etc/kubernetes/admin.conf" + actual := GetAdminKubeConfigPath() + + if actual != expected { + t.Errorf( + "failed GetAdminKubeConfigPath:\n\texpected: %s\n\t actual: %s", + expected, + actual, + ) + } +} + +func TestGetStaticPodFilepath(t *testing.T) { + var tests = []struct { + componentName, manifestsDir, expected string + }{ + { + componentName: "kube-apiserver", + manifestsDir: "/etc/kubernetes/manifests", + expected: "/etc/kubernetes/manifests/kube-apiserver.yaml", + }, + { + componentName: "kube-controller-manager", + manifestsDir: "/etc/kubernetes/manifests/", + expected: "/etc/kubernetes/manifests/kube-controller-manager.yaml", + }, + { + componentName: "foo", + manifestsDir: "/etc/bar/", + expected: "/etc/bar/foo.yaml", + }, + } + for _, rt := range tests { + actual := GetStaticPodFilepath(rt.componentName, rt.manifestsDir) + if actual != rt.expected { + t.Errorf( + "failed GetStaticPodFilepath:\n\texpected: %s\n\t actual: %s", + rt.expected, + actual, + ) + } + } +} + +func TestAddSelfHostedPrefix(t *testing.T) { + var tests = []struct { + componentName, expected string + }{ + { + componentName: "kube-apiserver", + expected: "self-hosted-kube-apiserver", + }, + { + componentName: "kube-controller-manager", + expected: "self-hosted-kube-controller-manager", + }, + { + componentName: "kube-scheduler", + expected: "self-hosted-kube-scheduler", + }, + { + componentName: "foo", + expected: "self-hosted-foo", + }, + } + for _, rt := range tests { + actual := AddSelfHostedPrefix(rt.componentName) + if actual != rt.expected { + t.Errorf( + "failed AddSelfHostedPrefix:\n\texpected: %s\n\t actual: %s", + rt.expected, + actual, + ) + } + } +} diff --git a/cmd/kubeadm/app/discovery/BUILD b/cmd/kubeadm/app/discovery/BUILD index 628276987e3..8b5319e3512 100644 --- a/cmd/kubeadm/app/discovery/BUILD +++ b/cmd/kubeadm/app/discovery/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["discovery.go"], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/discovery/file:go_default_library", @@ -26,7 +23,6 @@ go_test( name = "go_default_test", srcs = ["discovery_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//cmd/kubeadm/app/apis/kubeadm:go_default_library"], ) diff --git a/cmd/kubeadm/app/discovery/discovery.go b/cmd/kubeadm/app/discovery/discovery.go index b452285fa41..a1bff386449 100644 --- a/cmd/kubeadm/app/discovery/discovery.go +++ b/cmd/kubeadm/app/discovery/discovery.go @@ -58,7 +58,7 @@ func GetValidatedClusterInfoObject(cfg *kubeadmapi.NodeConfiguration) (*clientcm } return file.RetrieveValidatedClusterInfo(cfg.DiscoveryFile) case len(cfg.DiscoveryToken) != 0: - return token.RetrieveValidatedClusterInfo(cfg.DiscoveryToken, cfg.DiscoveryTokenAPIServers) + return token.RetrieveValidatedClusterInfo(cfg.DiscoveryToken, cfg.DiscoveryTokenAPIServers, cfg.DiscoveryTokenCACertHashes) default: return nil, fmt.Errorf("couldn't find a valid discovery configuration.") } diff --git a/cmd/kubeadm/app/discovery/file/BUILD b/cmd/kubeadm/app/discovery/file/BUILD index fdc7b60afff..693a8c6ecf2 100644 --- a/cmd/kubeadm/app/discovery/file/BUILD +++ b/cmd/kubeadm/app/discovery/file/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["file.go"], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/util/kubeconfig:go_default_library", diff --git a/cmd/kubeadm/app/discovery/https/BUILD b/cmd/kubeadm/app/discovery/https/BUILD index 4d4686b190c..3e30f0106a9 100644 --- a/cmd/kubeadm/app/discovery/https/BUILD +++ b/cmd/kubeadm/app/discovery/https/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["https.go"], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/discovery/file:go_default_library", "//vendor/k8s.io/client-go/tools/clientcmd:go_default_library", diff --git a/cmd/kubeadm/app/discovery/token/BUILD b/cmd/kubeadm/app/discovery/token/BUILD index 45c345c156a..0d58c189f3b 100644 --- a/cmd/kubeadm/app/discovery/token/BUILD +++ b/cmd/kubeadm/app/discovery/token/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,10 +9,10 @@ load( go_library( name = "go_default_library", srcs = ["token.go"], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/util/kubeconfig:go_default_library", + "//cmd/kubeadm/app/util/pubkeypin:go_default_library", "//cmd/kubeadm/app/util/token:go_default_library", "//pkg/bootstrap/api:go_default_library", "//pkg/controller/bootstrap:go_default_library", @@ -43,7 +41,6 @@ go_test( name = "go_default_test", srcs = ["token_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/util/kubeconfig:go_default_library", "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", diff --git a/cmd/kubeadm/app/discovery/token/token.go b/cmd/kubeadm/app/discovery/token/token.go index f765a4153dc..a1dc464604f 100644 --- a/cmd/kubeadm/app/discovery/token/token.go +++ b/cmd/kubeadm/app/discovery/token/token.go @@ -17,6 +17,9 @@ limitations under the License. package token import ( + "bytes" + "crypto/x509" + "encoding/pem" "fmt" "sync" @@ -27,6 +30,7 @@ import ( clientcmdapi "k8s.io/client-go/tools/clientcmd/api" "k8s.io/kubernetes/cmd/kubeadm/app/constants" kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig" + "k8s.io/kubernetes/cmd/kubeadm/app/util/pubkeypin" tokenutil "k8s.io/kubernetes/cmd/kubeadm/app/util/token" bootstrapapi "k8s.io/kubernetes/pkg/bootstrap/api" "k8s.io/kubernetes/pkg/controller/bootstrap" @@ -35,32 +39,40 @@ import ( const BootstrapUser = "token-bootstrap-client" // RetrieveValidatedClusterInfo connects to the API Server and tries to fetch the cluster-info ConfigMap -// It then makes sure it can trust the API Server by looking at the JWS-signed tokens -func RetrieveValidatedClusterInfo(discoveryToken string, tokenAPIServers []string) (*clientcmdapi.Cluster, error) { - +// It then makes sure it can trust the API Server by looking at the JWS-signed tokens and (if rootCAPubKeys is not empty) +// validating the cluster CA against a set of pinned public keys +func RetrieveValidatedClusterInfo(discoveryToken string, tokenAPIServers, rootCAPubKeys []string) (*clientcmdapi.Cluster, error) { tokenId, tokenSecret, err := tokenutil.ParseToken(discoveryToken) if err != nil { return nil, err } + // Load the cfg.DiscoveryTokenCACertHashes into a pubkeypin.Set + pubKeyPins := pubkeypin.NewSet() + err = pubKeyPins.Allow(rootCAPubKeys...) + if err != nil { + return nil, err + } + // The function below runs for every endpoint, and all endpoints races with each other. // The endpoint that wins the race and completes the task first gets its kubeconfig returned below baseKubeConfig := runForEndpointsAndReturnFirst(tokenAPIServers, func(endpoint string) (*clientcmdapi.Config, error) { - bootstrapConfig := buildInsecureBootstrapKubeConfig(endpoint) - clusterName := bootstrapConfig.Contexts[bootstrapConfig.CurrentContext].Cluster + insecureBootstrapConfig := buildInsecureBootstrapKubeConfig(endpoint) + clusterName := insecureBootstrapConfig.Contexts[insecureBootstrapConfig.CurrentContext].Cluster - client, err := kubeconfigutil.KubeConfigToClientSet(bootstrapConfig) + insecureClient, err := kubeconfigutil.KubeConfigToClientSet(insecureBootstrapConfig) if err != nil { return nil, err } - fmt.Printf("[discovery] Created cluster-info discovery client, requesting info from %q\n", bootstrapConfig.Clusters[clusterName].Server) + fmt.Printf("[discovery] Created cluster-info discovery client, requesting info from %q\n", insecureBootstrapConfig.Clusters[clusterName].Server) - var clusterinfo *v1.ConfigMap + // Make an initial insecure connection to get the cluster-info ConfigMap + var insecureClusterInfo *v1.ConfigMap wait.PollImmediateInfinite(constants.DiscoveryRetryInterval, func() (bool, error) { var err error - clusterinfo, err = client.CoreV1().ConfigMaps(metav1.NamespacePublic).Get(bootstrapapi.ConfigMapClusterInfo, metav1.GetOptions{}) + insecureClusterInfo, err = insecureClient.CoreV1().ConfigMaps(metav1.NamespacePublic).Get(bootstrapapi.ConfigMapClusterInfo, metav1.GetOptions{}) if err != nil { fmt.Printf("[discovery] Failed to request cluster info, will try again: [%s]\n", err) return false, nil @@ -68,25 +80,82 @@ func RetrieveValidatedClusterInfo(discoveryToken string, tokenAPIServers []strin return true, nil }) - kubeConfigString, ok := clusterinfo.Data[bootstrapapi.KubeConfigKey] - if !ok || len(kubeConfigString) == 0 { + // Validate the MAC on the kubeconfig from the ConfigMap and load it + insecureKubeconfigString, ok := insecureClusterInfo.Data[bootstrapapi.KubeConfigKey] + if !ok || len(insecureKubeconfigString) == 0 { return nil, fmt.Errorf("there is no %s key in the %s ConfigMap. This API Server isn't set up for token bootstrapping, can't connect", bootstrapapi.KubeConfigKey, bootstrapapi.ConfigMapClusterInfo) } - detachedJWSToken, ok := clusterinfo.Data[bootstrapapi.JWSSignatureKeyPrefix+tokenId] + detachedJWSToken, ok := insecureClusterInfo.Data[bootstrapapi.JWSSignatureKeyPrefix+tokenId] if !ok || len(detachedJWSToken) == 0 { return nil, fmt.Errorf("there is no JWS signed token in the %s ConfigMap. This token id %q is invalid for this cluster, can't connect", bootstrapapi.ConfigMapClusterInfo, tokenId) } - if !bootstrap.DetachedTokenIsValid(detachedJWSToken, kubeConfigString, tokenId, tokenSecret) { + if !bootstrap.DetachedTokenIsValid(detachedJWSToken, insecureKubeconfigString, tokenId, tokenSecret) { return nil, fmt.Errorf("failed to verify JWS signature of received cluster info object, can't trust this API Server") } - - finalConfig, err := clientcmd.Load([]byte(kubeConfigString)) + insecureKubeconfigBytes := []byte(insecureKubeconfigString) + insecureConfig, err := clientcmd.Load(insecureKubeconfigBytes) if err != nil { return nil, fmt.Errorf("couldn't parse the kubeconfig file in the %s configmap: %v", bootstrapapi.ConfigMapClusterInfo, err) } - fmt.Printf("[discovery] Cluster info signature and contents are valid, will use API Server %q\n", bootstrapConfig.Clusters[clusterName].Server) - return finalConfig, nil + // If no TLS root CA pinning was specified, we're done + if pubKeyPins.Empty() { + fmt.Printf("[discovery] Cluster info signature and contents are valid and no TLS pinning was specified, will use API Server %q\n", endpoint) + return insecureConfig, nil + } + + // Load the cluster CA from the Config + if len(insecureConfig.Clusters) != 1 { + return nil, fmt.Errorf("expected the kubeconfig file in the %s configmap to have a single cluster, but it had %d", bootstrapapi.ConfigMapClusterInfo, len(insecureConfig.Clusters)) + } + var clusterCABytes []byte + for _, cluster := range insecureConfig.Clusters { + clusterCABytes = cluster.CertificateAuthorityData + } + clusterCA, err := parsePEMCert(clusterCABytes) + if err != nil { + return nil, fmt.Errorf("failed to parse cluster CA from the %s configmap: %v", bootstrapapi.ConfigMapClusterInfo, err) + + } + + // Validate the cluster CA public key against the pinned set + err = pubKeyPins.Check(clusterCA) + if err != nil { + return nil, fmt.Errorf("cluster CA found in %s configmap is invalid: %v", bootstrapapi.ConfigMapClusterInfo, err) + } + + // Now that we know the proported cluster CA, connect back a second time validating with that CA + secureBootstrapConfig := buildSecureBootstrapKubeConfig(endpoint, clusterCABytes) + secureClient, err := kubeconfigutil.KubeConfigToClientSet(secureBootstrapConfig) + if err != nil { + return nil, err + } + + fmt.Printf("[discovery] Requesting info from %q again to validate TLS against the pinned public key\n", insecureBootstrapConfig.Clusters[clusterName].Server) + var secureClusterInfo *v1.ConfigMap + wait.PollImmediateInfinite(constants.DiscoveryRetryInterval, func() (bool, error) { + var err error + secureClusterInfo, err = secureClient.CoreV1().ConfigMaps(metav1.NamespacePublic).Get(bootstrapapi.ConfigMapClusterInfo, metav1.GetOptions{}) + if err != nil { + fmt.Printf("[discovery] Failed to request cluster info, will try again: [%s]\n", err) + return false, nil + } + return true, nil + }) + + // Pull the kubeconfig from the securely-obtained ConfigMap and validate that it's the same as what we found the first time + secureKubeconfigBytes := []byte(secureClusterInfo.Data[bootstrapapi.KubeConfigKey]) + if !bytes.Equal(secureKubeconfigBytes, insecureKubeconfigBytes) { + return nil, fmt.Errorf("the second kubeconfig from the %s configmap (using validated TLS) was different from the first", bootstrapapi.ConfigMapClusterInfo) + } + + secureKubeconfig, err := clientcmd.Load(secureKubeconfigBytes) + if err != nil { + return nil, fmt.Errorf("couldn't parse the kubeconfig file in the %s configmap: %v", bootstrapapi.ConfigMapClusterInfo, err) + } + + fmt.Printf("[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server %q\n", endpoint) + return secureKubeconfig, nil }) return kubeconfigutil.GetClusterFromKubeConfig(baseKubeConfig), nil @@ -101,6 +170,13 @@ func buildInsecureBootstrapKubeConfig(endpoint string) *clientcmdapi.Config { return bootstrapConfig } +// buildSecureBootstrapKubeConfig makes a KubeConfig object that connects securely to the API Server for bootstrapping purposes (validating with the specified CA) +func buildSecureBootstrapKubeConfig(endpoint string, caCert []byte) *clientcmdapi.Config { + masterEndpoint := fmt.Sprintf("https://%s", endpoint) + bootstrapConfig := kubeconfigutil.CreateBasic(masterEndpoint, "kubernetes", BootstrapUser, caCert) + return bootstrapConfig +} + // runForEndpointsAndReturnFirst loops the endpoints slice and let's the endpoints race for connecting to the master func runForEndpointsAndReturnFirst(endpoints []string, fetchKubeConfigFunc func(string) (*clientcmdapi.Config, error)) *clientcmdapi.Config { stopChan := make(chan struct{}) @@ -131,3 +207,15 @@ func runForEndpointsAndReturnFirst(endpoints []string, fetchKubeConfigFunc func( wg.Wait() return resultingKubeConfig } + +// parsePEMCert decodes a PEM-formatted certificate and returns it as an x509.Certificate +func parsePEMCert(certData []byte) (*x509.Certificate, error) { + pemBlock, trailingData := pem.Decode(certData) + if pemBlock == nil { + return nil, fmt.Errorf("invalid PEM data") + } + if len(trailingData) != 0 { + return nil, fmt.Errorf("trailing data after first PEM block") + } + return x509.ParseCertificate(pemBlock.Bytes) +} diff --git a/cmd/kubeadm/app/discovery/token/token_test.go b/cmd/kubeadm/app/discovery/token/token_test.go index 06012608bd1..4c59ddfbd48 100644 --- a/cmd/kubeadm/app/discovery/token/token_test.go +++ b/cmd/kubeadm/app/discovery/token/token_test.go @@ -25,6 +25,30 @@ import ( kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig" ) +// testCertPEM is a simple self-signed test certificate issued with the openssl CLI: +// openssl req -new -newkey rsa:2048 -days 36500 -nodes -x509 -keyout /dev/null -out test.crt +const testCertPEM = ` +-----BEGIN CERTIFICATE----- +MIIDRDCCAiygAwIBAgIJAJgVaCXvC6HkMA0GCSqGSIb3DQEBBQUAMB8xHTAbBgNV +BAMTFGt1YmVhZG0ta2V5cGlucy10ZXN0MCAXDTE3MDcwNTE3NDMxMFoYDzIxMTcw +NjExMTc0MzEwWjAfMR0wGwYDVQQDExRrdWJlYWRtLWtleXBpbnMtdGVzdDCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK0ba8mHU9UtYlzM1Own2Fk/XGjR +J4uJQvSeGLtz1hID1IA0dLwruvgLCPadXEOw/f/IWIWcmT+ZmvIHZKa/woq2iHi5 ++HLhXs7aG4tjKGLYhag1hLjBI7icqV7ovkjdGAt9pWkxEzhIYClFMXDjKpMSynu+ +YX6nZ9tic1cOkHmx2yiZdMkuriRQnpTOa7bb03OC1VfGl7gHlOAIYaj4539WCOr8 ++ACTUMJUFEHcRZ2o8a/v6F9GMK+7SC8SJUI+GuroXqlMAdhEv4lX5Co52enYaClN ++D9FJLRpBv2YfiCQdJRaiTvCBSxEFz6BN+PtP5l2Hs703ZWEkOqCByM6HV8CAwEA +AaOBgDB+MB0GA1UdDgQWBBRQgUX8MhK2rWBWQiPHWcKzoWDH5DBPBgNVHSMESDBG +gBRQgUX8MhK2rWBWQiPHWcKzoWDH5KEjpCEwHzEdMBsGA1UEAxMUa3ViZWFkbS1r +ZXlwaW5zLXRlc3SCCQCYFWgl7wuh5DAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB +BQUAA4IBAQCaAUif7Pfx3X0F08cxhx8/Hdx4jcJw6MCq6iq6rsXM32ge43t8OHKC +pJW08dk58a3O1YQSMMvD6GJDAiAfXzfwcwY6j258b1ZlI9Ag0VokvhMl/XfdCsdh +AWImnL1t4hvU5jLaImUUMlYxMcSfHBGAm7WJIZ2LdEfg6YWfZh+WGbg1W7uxLxk6 +y4h5rWdNnzBHWAGf7zJ0oEDV6W6RSwNXtC0JNnLaeIUm/6xdSddJlQPwUv8YH4jX +c1vuFqTnJBPcb7W//R/GI2Paicm1cmns9NLnPR35exHxFTy+D1yxmGokpoPMdife +aH+sfuxT8xeTPb3kjzF9eJTlnEquUDLM +-----END CERTIFICATE-----` + func TestRunForEndpointsAndReturnFirst(t *testing.T) { tests := []struct { endpoints []string @@ -59,3 +83,33 @@ func TestRunForEndpointsAndReturnFirst(t *testing.T) { } } } + +func TestParsePEMCert(t *testing.T) { + for _, testCase := range []struct { + name string + input []byte + expectValid bool + }{ + {"invalid certificate data", []byte{0}, false}, + {"certificate with junk appended", []byte(testCertPEM + "\nABC"), false}, + {"multiple certificates", []byte(testCertPEM + "\n" + testCertPEM), false}, + {"valid", []byte(testCertPEM), true}, + } { + cert, err := parsePEMCert(testCase.input) + if testCase.expectValid { + if err != nil { + t.Errorf("failed TestParsePEMCert(%s): unexpected error %v", testCase.name, err) + } + if cert == nil { + t.Errorf("failed TestParsePEMCert(%s): returned nil", testCase.name) + } + } else { + if err == nil { + t.Errorf("failed TestParsePEMCert(%s): expected an error", testCase.name) + } + if cert != nil { + t.Errorf("failed TestParsePEMCert(%s): expected not to get a certificate back, but got one", testCase.name) + } + } + } +} diff --git a/cmd/kubeadm/app/images/BUILD b/cmd/kubeadm/app/images/BUILD index 6209daaf175..fbc474715da 100644 --- a/cmd/kubeadm/app/images/BUILD +++ b/cmd/kubeadm/app/images/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,9 +9,8 @@ load( go_library( name = "go_default_library", srcs = ["images.go"], - tags = ["automanaged"], deps = [ - "//cmd/kubeadm/app/apis/kubeadm:go_default_library", + "//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/util:go_default_library", ], ) @@ -22,8 +19,7 @@ go_test( name = "go_default_test", srcs = ["images_test.go"], library = ":go_default_library", - tags = ["automanaged"], - deps = ["//cmd/kubeadm/app/apis/kubeadm:go_default_library"], + deps = ["//cmd/kubeadm/app/constants:go_default_library"], ) filegroup( diff --git a/cmd/kubeadm/app/images/images.go b/cmd/kubeadm/app/images/images.go index d0a6922de54..2ac3fefa71b 100644 --- a/cmd/kubeadm/app/images/images.go +++ b/cmd/kubeadm/app/images/images.go @@ -20,29 +20,19 @@ import ( "fmt" "runtime" - kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + "k8s.io/kubernetes/cmd/kubeadm/app/constants" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" ) -const ( - KubeEtcdImage = "etcd" - KubeAPIServerImage = "apiserver" - KubeControllerManagerImage = "controller-manager" - KubeSchedulerImage = "scheduler" - - etcdVersion = "3.0.17" -) - -func GetCoreImage(image string, cfg *kubeadmapi.MasterConfiguration, overrideImage string) string { +func GetCoreImage(image, repoPrefix, k8sVersion, overrideImage string) string { if overrideImage != "" { return overrideImage } - repoPrefix := cfg.ImageRepository - kubernetesImageTag := kubeadmutil.KubernetesVersionToImageTag(cfg.KubernetesVersion) + kubernetesImageTag := kubeadmutil.KubernetesVersionToImageTag(k8sVersion) return map[string]string{ - KubeEtcdImage: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "etcd", runtime.GOARCH, etcdVersion), - KubeAPIServerImage: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "kube-apiserver", runtime.GOARCH, kubernetesImageTag), - KubeControllerManagerImage: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "kube-controller-manager", runtime.GOARCH, kubernetesImageTag), - KubeSchedulerImage: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "kube-scheduler", runtime.GOARCH, kubernetesImageTag), + constants.Etcd: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "etcd", runtime.GOARCH, constants.DefaultEtcdVersion), + constants.KubeAPIServer: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "kube-apiserver", runtime.GOARCH, kubernetesImageTag), + constants.KubeControllerManager: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "kube-controller-manager", runtime.GOARCH, kubernetesImageTag), + constants.KubeScheduler: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "kube-scheduler", runtime.GOARCH, kubernetesImageTag), }[image] } diff --git a/cmd/kubeadm/app/images/images_test.go b/cmd/kubeadm/app/images/images_test.go index 10a37f0703f..6c1173e6c25 100644 --- a/cmd/kubeadm/app/images/images_test.go +++ b/cmd/kubeadm/app/images/images_test.go @@ -21,15 +21,9 @@ import ( "runtime" "testing" - kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + "k8s.io/kubernetes/cmd/kubeadm/app/constants" ) -type getCoreImageTest struct { - i string - c *kubeadmapi.MasterConfiguration - o string -} - const ( testversion = "v10.1.2-alpha.1.100+0123456789abcdef+SOMETHING" expected = "v10.1.2-alpha.1.100_0123456789abcdef_SOMETHING" @@ -37,38 +31,43 @@ const ( ) func TestGetCoreImage(t *testing.T) { - var imageTest = []struct { - t getCoreImageTest - expected string + var tests = []struct { + image, repo, version, override, expected string }{ - {getCoreImageTest{o: "override"}, "override"}, - {getCoreImageTest{ - i: KubeEtcdImage, - c: &kubeadmapi.MasterConfiguration{ImageRepository: gcrPrefix}}, - fmt.Sprintf("%s/%s-%s:%s", gcrPrefix, "etcd", runtime.GOARCH, etcdVersion), + { + override: "override", + expected: "override", }, - {getCoreImageTest{ - i: KubeAPIServerImage, - c: &kubeadmapi.MasterConfiguration{ImageRepository: gcrPrefix, KubernetesVersion: testversion}}, - fmt.Sprintf("%s/%s-%s:%s", gcrPrefix, "kube-apiserver", runtime.GOARCH, expected), + { + image: constants.Etcd, + repo: gcrPrefix, + expected: fmt.Sprintf("%s/%s-%s:%s", gcrPrefix, "etcd", runtime.GOARCH, constants.DefaultEtcdVersion), }, - {getCoreImageTest{ - i: KubeControllerManagerImage, - c: &kubeadmapi.MasterConfiguration{ImageRepository: gcrPrefix, KubernetesVersion: testversion}}, - fmt.Sprintf("%s/%s-%s:%s", gcrPrefix, "kube-controller-manager", runtime.GOARCH, expected), + { + image: constants.KubeAPIServer, + repo: gcrPrefix, + version: testversion, + expected: fmt.Sprintf("%s/%s-%s:%s", gcrPrefix, "kube-apiserver", runtime.GOARCH, expected), }, - {getCoreImageTest{ - i: KubeSchedulerImage, - c: &kubeadmapi.MasterConfiguration{ImageRepository: gcrPrefix, KubernetesVersion: testversion}}, - fmt.Sprintf("%s/%s-%s:%s", gcrPrefix, "kube-scheduler", runtime.GOARCH, expected), + { + image: constants.KubeControllerManager, + repo: gcrPrefix, + version: testversion, + expected: fmt.Sprintf("%s/%s-%s:%s", gcrPrefix, "kube-controller-manager", runtime.GOARCH, expected), + }, + { + image: constants.KubeScheduler, + repo: gcrPrefix, + version: testversion, + expected: fmt.Sprintf("%s/%s-%s:%s", gcrPrefix, "kube-scheduler", runtime.GOARCH, expected), }, } - for _, it := range imageTest { - actual := GetCoreImage(it.t.i, it.t.c, it.t.o) - if actual != it.expected { + for _, rt := range tests { + actual := GetCoreImage(rt.image, rt.repo, rt.version, rt.override) + if actual != rt.expected { t.Errorf( "failed GetCoreImage:\n\texpected: %s\n\t actual: %s", - it.expected, + rt.expected, actual, ) } diff --git a/cmd/kubeadm/app/node/BUILD b/cmd/kubeadm/app/node/BUILD index 72441de453a..b06613c6bd4 100644 --- a/cmd/kubeadm/app/node/BUILD +++ b/cmd/kubeadm/app/node/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["validate.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", @@ -22,7 +19,6 @@ go_test( name = "go_default_test", srcs = ["validate_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/version:go_default_library", diff --git a/cmd/kubeadm/app/phases/addons/BUILD b/cmd/kubeadm/app/phases/addons/BUILD index 3515a7b908a..cfef337d446 100644 --- a/cmd/kubeadm/app/phases/addons/BUILD +++ b/cmd/kubeadm/app/phases/addons/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,11 +12,11 @@ go_library( "addons.go", "manifests.go", ], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/util:go_default_library", + "//cmd/kubeadm/app/util/apiclient:go_default_library", "//pkg/api:go_default_library", "//plugin/pkg/scheduler/algorithm:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -47,6 +45,5 @@ go_test( name = "go_default_test", srcs = ["addons_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//cmd/kubeadm/app/util:go_default_library"], ) diff --git a/cmd/kubeadm/app/phases/addons/addons.go b/cmd/kubeadm/app/phases/addons/addons.go index 029e3008acd..9accdb5ce36 100644 --- a/cmd/kubeadm/app/phases/addons/addons.go +++ b/cmd/kubeadm/app/phases/addons/addons.go @@ -30,6 +30,7 @@ import ( kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" + apiclientutil "k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm" ) @@ -100,14 +101,8 @@ func CreateKubeProxyAddon(configMapBytes, daemonSetbytes []byte, client clientse return fmt.Errorf("unable to decode kube-proxy configmap %v", err) } - if _, err := client.CoreV1().ConfigMaps(metav1.NamespaceSystem).Create(kubeproxyConfigMap); err != nil { - if !apierrors.IsAlreadyExists(err) { - return fmt.Errorf("unable to create a new kube-proxy configmap: %v", err) - } - - if _, err := client.CoreV1().ConfigMaps(metav1.NamespaceSystem).Update(kubeproxyConfigMap); err != nil { - return fmt.Errorf("unable to update the kube-proxy configmap: %v", err) - } + if err := apiclientutil.CreateConfigMapIfNotExists(client, kubeproxyConfigMap); err != nil { + return err } kubeproxyDaemonSet := &extensions.DaemonSet{} diff --git a/cmd/kubeadm/app/phases/apiconfig/BUILD b/cmd/kubeadm/app/phases/apiconfig/BUILD index c4d2fe0154a..bbd5dfa0f39 100644 --- a/cmd/kubeadm/app/phases/apiconfig/BUILD +++ b/cmd/kubeadm/app/phases/apiconfig/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["clusterroles_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", @@ -25,11 +22,9 @@ go_test( go_library( name = "go_default_library", srcs = ["clusterroles.go"], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/constants:go_default_library", - "//pkg/apis/rbac/v1beta1:go_default_library", - "//pkg/bootstrap/api:go_default_library", + "//cmd/kubeadm/app/util/apiclient:go_default_library", "//pkg/util/version:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", diff --git a/cmd/kubeadm/app/phases/apiconfig/clusterroles.go b/cmd/kubeadm/app/phases/apiconfig/clusterroles.go index 4a034fc0cb8..98730cee86e 100644 --- a/cmd/kubeadm/app/phases/apiconfig/clusterroles.go +++ b/cmd/kubeadm/app/phases/apiconfig/clusterroles.go @@ -25,29 +25,18 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" clientset "k8s.io/client-go/kubernetes" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" - rbachelper "k8s.io/kubernetes/pkg/apis/rbac/v1beta1" - bootstrapapi "k8s.io/kubernetes/pkg/bootstrap/api" + apiclientutil "k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient" "k8s.io/kubernetes/pkg/util/version" ) const ( // KubeProxyClusterRoleName sets the name for the kube-proxy ClusterRole KubeProxyClusterRoleName = "system:node-proxier" - // NodeBootstrapperClusterRoleName sets the name for the TLS Node Bootstrapper ClusterRole - NodeBootstrapperClusterRoleName = "system:node-bootstrapper" - // BootstrapSignerClusterRoleName sets the name for the ClusterRole that allows access to ConfigMaps in the kube-public ns - BootstrapSignerClusterRoleName = "system:bootstrap-signer-clusterinfo" - - clusterRoleKind = "ClusterRole" - roleKind = "Role" - serviceAccountKind = "ServiceAccount" - rbacAPIGroup = "rbac.authorization.k8s.io" - anonymousUser = "system:anonymous" - nodeAutoApproveBootstrap = "kubeadm:node-autoapprove-bootstrap" ) // CreateServiceAccounts creates the necessary serviceaccounts that kubeadm uses/might use, if they don't already exist. -func CreateServiceAccounts(clientset clientset.Interface) error { +func CreateServiceAccounts(client clientset.Interface) error { + // TODO: Each ServiceAccount should be created per-addon (decentralized) vs here serviceAccounts := []v1.ServiceAccount{ { ObjectMeta: metav1.ObjectMeta{ @@ -64,7 +53,7 @@ func CreateServiceAccounts(clientset clientset.Interface) error { } for _, sa := range serviceAccounts { - if _, err := clientset.CoreV1().ServiceAccounts(metav1.NamespaceSystem).Create(&sa); err != nil { + if _, err := client.CoreV1().ServiceAccounts(metav1.NamespaceSystem).Create(&sa); err != nil { if !apierrors.IsAlreadyExists(err) { return err } @@ -74,20 +63,11 @@ func CreateServiceAccounts(clientset clientset.Interface) error { } // CreateRBACRules creates the essential RBAC rules for a minimally set-up cluster -func CreateRBACRules(clientset clientset.Interface, k8sVersion *version.Version) error { - if err := createRoles(clientset); err != nil { +func CreateRBACRules(client clientset.Interface, k8sVersion *version.Version) error { + if err := createClusterRoleBindings(client); err != nil { return err } - if err := createRoleBindings(clientset); err != nil { - return err - } - if err := createClusterRoles(clientset); err != nil { - return err - } - if err := createClusterRoleBindings(clientset); err != nil { - return err - } - if err := deletePermissiveNodesBindingWhenUsingNodeAuthorization(clientset, k8sVersion); err != nil { + if err := deletePermissiveNodesBindingWhenUsingNodeAuthorization(client, k8sVersion); err != nil { return fmt.Errorf("failed to remove the permissive 'system:nodes' Group Subject in the 'system:node' ClusterRoleBinding: %v", err) } @@ -95,163 +75,32 @@ func CreateRBACRules(clientset clientset.Interface, k8sVersion *version.Version) return nil } -func createRoles(clientset clientset.Interface) error { - roles := []rbac.Role{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: BootstrapSignerClusterRoleName, - Namespace: metav1.NamespacePublic, - }, - Rules: []rbac.PolicyRule{ - rbachelper.NewRule("get").Groups("").Resources("configmaps").Names("cluster-info").RuleOrDie(), +func createClusterRoleBindings(client clientset.Interface) error { + // TODO: This ClusterRoleBinding should be created by the kube-proxy phase, not here + return apiclientutil.CreateClusterRoleBindingIfNotExists(client, &rbac.ClusterRoleBinding{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kubeadm:node-proxier", + }, + RoleRef: rbac.RoleRef{ + APIGroup: rbac.GroupName, + Kind: "ClusterRole", + Name: KubeProxyClusterRoleName, + }, + Subjects: []rbac.Subject{ + { + Kind: rbac.ServiceAccountKind, + Name: kubeadmconstants.KubeProxyServiceAccountName, + Namespace: metav1.NamespaceSystem, }, }, - } - for _, role := range roles { - if _, err := clientset.RbacV1beta1().Roles(role.ObjectMeta.Namespace).Create(&role); err != nil { - if !apierrors.IsAlreadyExists(err) { - return fmt.Errorf("unable to create RBAC role: %v", err) - } - - if _, err := clientset.RbacV1beta1().Roles(role.ObjectMeta.Namespace).Update(&role); err != nil { - return fmt.Errorf("unable to update RBAC role: %v", err) - } - } - } - return nil + }) } -func createRoleBindings(clientset clientset.Interface) error { - roleBindings := []rbac.RoleBinding{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "kubeadm:bootstrap-signer-clusterinfo", - Namespace: metav1.NamespacePublic, - }, - RoleRef: rbac.RoleRef{ - APIGroup: rbacAPIGroup, - Kind: roleKind, - Name: BootstrapSignerClusterRoleName, - }, - Subjects: []rbac.Subject{ - { - Kind: "User", - Name: anonymousUser, - }, - }, - }, - } +func deletePermissiveNodesBindingWhenUsingNodeAuthorization(client clientset.Interface, k8sVersion *version.Version) error { - for _, roleBinding := range roleBindings { - if _, err := clientset.RbacV1beta1().RoleBindings(roleBinding.ObjectMeta.Namespace).Create(&roleBinding); err != nil { - if !apierrors.IsAlreadyExists(err) { - return fmt.Errorf("unable to create RBAC rolebinding: %v", err) - } - - if _, err := clientset.RbacV1beta1().RoleBindings(roleBinding.ObjectMeta.Namespace).Update(&roleBinding); err != nil { - return fmt.Errorf("unable to update RBAC rolebinding: %v", err) - } - } - } - return nil -} - -func createClusterRoles(clientset clientset.Interface) error { - clusterRoles := []rbac.ClusterRole{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: nodeAutoApproveBootstrap, - }, - Rules: []rbac.PolicyRule{ - rbachelper.NewRule("create").Groups("certificates.k8s.io").Resources("certificatesigningrequests/nodeclient").RuleOrDie(), - }, - }, - } - - for _, roleBinding := range clusterRoles { - if _, err := clientset.RbacV1beta1().ClusterRoles().Create(&roleBinding); err != nil { - if !apierrors.IsAlreadyExists(err) { - return fmt.Errorf("unable to create RBAC clusterrole: %v", err) - } - - if _, err := clientset.RbacV1beta1().ClusterRoles().Update(&roleBinding); err != nil { - return fmt.Errorf("unable to update RBAC clusterrole: %v", err) - } - } - } - return nil -} - -func createClusterRoleBindings(clientset clientset.Interface) error { - clusterRoleBindings := []rbac.ClusterRoleBinding{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "kubeadm:kubelet-bootstrap", - }, - RoleRef: rbac.RoleRef{ - APIGroup: rbacAPIGroup, - Kind: clusterRoleKind, - Name: NodeBootstrapperClusterRoleName, - }, - Subjects: []rbac.Subject{ - { - Kind: "Group", - Name: bootstrapapi.BootstrapGroup, - }, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: nodeAutoApproveBootstrap, - }, - RoleRef: rbac.RoleRef{ - APIGroup: rbacAPIGroup, - Kind: clusterRoleKind, - Name: nodeAutoApproveBootstrap, - }, - Subjects: []rbac.Subject{ - { - Kind: "Group", - Name: bootstrapapi.BootstrapGroup, - }, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "kubeadm:node-proxier", - }, - RoleRef: rbac.RoleRef{ - APIGroup: rbacAPIGroup, - Kind: clusterRoleKind, - Name: KubeProxyClusterRoleName, - }, - Subjects: []rbac.Subject{ - { - Kind: serviceAccountKind, - Name: kubeadmconstants.KubeProxyServiceAccountName, - Namespace: metav1.NamespaceSystem, - }, - }, - }, - } - - for _, clusterRoleBinding := range clusterRoleBindings { - if _, err := clientset.RbacV1beta1().ClusterRoleBindings().Create(&clusterRoleBinding); err != nil { - if !apierrors.IsAlreadyExists(err) { - return fmt.Errorf("unable to create RBAC clusterrolebinding: %v", err) - } - - if _, err := clientset.RbacV1beta1().ClusterRoleBindings().Update(&clusterRoleBinding); err != nil { - return fmt.Errorf("unable to update RBAC clusterrolebinding: %v", err) - } - } - } - return nil -} - -func deletePermissiveNodesBindingWhenUsingNodeAuthorization(clientset clientset.Interface, k8sVersion *version.Version) error { - - nodesRoleBinding, err := clientset.RbacV1beta1().ClusterRoleBindings().Get(kubeadmconstants.NodesClusterRoleBinding, metav1.GetOptions{}) + // TODO: When the v1.9 cycle starts (targeting v1.9 at HEAD) and v1.8.0 is the minimum supported version, we can remove this function as the ClusterRoleBinding won't exist + // or already have no such permissive subject + nodesRoleBinding, err := client.RbacV1beta1().ClusterRoleBindings().Get(kubeadmconstants.NodesClusterRoleBinding, metav1.GetOptions{}) if err != nil { if apierrors.IsNotFound(err) { // Nothing to do; the RoleBinding doesn't exist @@ -271,7 +120,7 @@ func deletePermissiveNodesBindingWhenUsingNodeAuthorization(clientset clientset. nodesRoleBinding.Subjects = newSubjects - if _, err := clientset.RbacV1beta1().ClusterRoleBindings().Update(nodesRoleBinding); err != nil { + if _, err := client.RbacV1beta1().ClusterRoleBindings().Update(nodesRoleBinding); err != nil { return err } diff --git a/cmd/kubeadm/app/phases/bootstraptoken/clusterinfo/BUILD b/cmd/kubeadm/app/phases/bootstraptoken/clusterinfo/BUILD new file mode 100644 index 00000000000..6377b70aed5 --- /dev/null +++ b/cmd/kubeadm/app/phases/bootstraptoken/clusterinfo/BUILD @@ -0,0 +1,50 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = ["clusterinfo_test.go"], + library = ":go_default_library", + deps = [ + "//pkg/api:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", + "//vendor/k8s.io/client-go/testing:go_default_library", + ], +) + +go_library( + name = "go_default_library", + srcs = ["clusterinfo.go"], + deps = [ + "//cmd/kubeadm/app/util/apiclient:go_default_library", + "//pkg/apis/rbac/v1beta1:go_default_library", + "//pkg/bootstrap/api:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/tools/clientcmd:go_default_library", + "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/cmd/kubeadm/app/phases/bootstraptoken/clusterinfo/clusterinfo.go b/cmd/kubeadm/app/phases/bootstraptoken/clusterinfo/clusterinfo.go new file mode 100644 index 00000000000..fc7824094bb --- /dev/null +++ b/cmd/kubeadm/app/phases/bootstraptoken/clusterinfo/clusterinfo.go @@ -0,0 +1,105 @@ +/* +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 clusterinfo + +import ( + "fmt" + + "k8s.io/api/core/v1" + rbac "k8s.io/api/rbac/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apiserver/pkg/authentication/user" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/clientcmd" + clientcmdapi "k8s.io/client-go/tools/clientcmd/api" + apiclientutil "k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient" + rbachelper "k8s.io/kubernetes/pkg/apis/rbac/v1beta1" + bootstrapapi "k8s.io/kubernetes/pkg/bootstrap/api" +) + +const ( + // BootstrapSignerClusterRoleName sets the name for the ClusterRole that allows access to ConfigMaps in the kube-public ns + BootstrapSignerClusterRoleName = "kubeadm:bootstrap-signer-clusterinfo" +) + +// CreateBootstrapConfigMapIfNotExists creates the kube-public ConfigMap if it doesn't exist already +func CreateBootstrapConfigMapIfNotExists(client clientset.Interface, file string) error { + + fmt.Printf("[bootstraptoken] Creating the %q ConfigMap in the %q namespace\n", bootstrapapi.ConfigMapClusterInfo, metav1.NamespacePublic) + + adminConfig, err := clientcmd.LoadFromFile(file) + if err != nil { + return fmt.Errorf("failed to load admin kubeconfig [%v]", err) + } + + adminCluster := adminConfig.Contexts[adminConfig.CurrentContext].Cluster + // Copy the cluster from admin.conf to the bootstrap kubeconfig, contains the CA cert and the server URL + bootstrapConfig := &clientcmdapi.Config{ + Clusters: map[string]*clientcmdapi.Cluster{ + "": adminConfig.Clusters[adminCluster], + }, + } + bootstrapBytes, err := clientcmd.Write(*bootstrapConfig) + if err != nil { + return err + } + + // Create or update the ConfigMap in the kube-public namespace + return apiclientutil.CreateConfigMapIfNotExists(client, &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: bootstrapapi.ConfigMapClusterInfo, + Namespace: metav1.NamespacePublic, + }, + Data: map[string]string{ + bootstrapapi.KubeConfigKey: string(bootstrapBytes), + }, + }) +} + +// CreateClusterInfoRBACRules creates the RBAC rules for exposing the cluster-info ConfigMap in the kube-public namespace to unauthenticated users +func CreateClusterInfoRBACRules(client clientset.Interface) error { + err := apiclientutil.CreateRoleIfNotExists(client, &rbac.Role{ + ObjectMeta: metav1.ObjectMeta{ + Name: BootstrapSignerClusterRoleName, + Namespace: metav1.NamespacePublic, + }, + Rules: []rbac.PolicyRule{ + rbachelper.NewRule("get").Groups("").Resources("configmaps").Names(bootstrapapi.ConfigMapClusterInfo).RuleOrDie(), + }, + }) + if err != nil { + return err + } + + return apiclientutil.CreateRoleBindingIfNotExists(client, &rbac.RoleBinding{ + ObjectMeta: metav1.ObjectMeta{ + Name: BootstrapSignerClusterRoleName, + Namespace: metav1.NamespacePublic, + }, + RoleRef: rbac.RoleRef{ + APIGroup: rbac.GroupName, + Kind: "Role", + Name: BootstrapSignerClusterRoleName, + }, + Subjects: []rbac.Subject{ + { + Kind: rbac.UserKind, + Name: user.Anonymous, + }, + }, + }) +} diff --git a/cmd/kubeadm/app/phases/token/bootstrap_test.go b/cmd/kubeadm/app/phases/bootstraptoken/clusterinfo/clusterinfo_test.go similarity index 66% rename from cmd/kubeadm/app/phases/token/bootstrap_test.go rename to cmd/kubeadm/app/phases/bootstraptoken/clusterinfo/clusterinfo_test.go index 7a001e2e521..73c7a947b49 100644 --- a/cmd/kubeadm/app/phases/token/bootstrap_test.go +++ b/cmd/kubeadm/app/phases/bootstraptoken/clusterinfo/clusterinfo_test.go @@ -14,20 +14,17 @@ See the License for the specific language governing permissions and limitations under the License. */ -package token +package clusterinfo import ( - "bytes" "io/ioutil" "os" "testing" - "time" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" clientsetfake "k8s.io/client-go/kubernetes/fake" core "k8s.io/client-go/testing" - kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" "k8s.io/kubernetes/pkg/api" ) @@ -47,59 +44,29 @@ preferences: {} users: - name: kubernetes-admin` -func TestEncodeTokenSecretData(t *testing.T) { - var tests = []struct { - token *kubeadmapi.TokenDiscovery - t time.Duration - }{ - {token: &kubeadmapi.TokenDiscovery{ID: "foo", Secret: "bar"}}, // should use default - {token: &kubeadmapi.TokenDiscovery{ID: "foo", Secret: "bar"}, t: time.Second}, // should use default - } - for _, rt := range tests { - actual := encodeTokenSecretData(rt.token.ID, rt.token.Secret, rt.t, []string{}, "") - if !bytes.Equal(actual["token-id"], []byte(rt.token.ID)) { - t.Errorf( - "failed EncodeTokenSecretData:\n\texpected: %s\n\t actual: %s", - rt.token.ID, - actual["token-id"], - ) - } - if !bytes.Equal(actual["token-secret"], []byte(rt.token.Secret)) { - t.Errorf( - "failed EncodeTokenSecretData:\n\texpected: %s\n\t actual: %s", - rt.token.Secret, - actual["token-secret"], - ) - } - if rt.t > 0 { - if actual["expiration"] == nil { - t.Errorf( - "failed EncodeTokenSecretData, duration was not added to time", - ) - } - } - } -} - func TestCreateBootstrapConfigMapIfNotExists(t *testing.T) { tests := []struct { name string createErr error + updateErr error expectErr bool }{ { "successful case should have no error", nil, + nil, false, }, { - "duplicate creation should have no error", + "if both create and update errors, return error", apierrors.NewAlreadyExists(api.Resource("configmaps"), "test"), - false, + apierrors.NewUnauthorized("go away!"), + true, }, { "unexpected error should be returned", apierrors.NewUnauthorized("go away!"), + nil, true, }, } @@ -119,6 +86,11 @@ func TestCreateBootstrapConfigMapIfNotExists(t *testing.T) { return true, nil, tc.createErr }) } + if tc.updateErr != nil { + client.PrependReactor("update", "configmaps", func(action core.Action) (bool, runtime.Object, error) { + return true, nil, tc.updateErr + }) + } err = CreateBootstrapConfigMapIfNotExists(client, file.Name()) if tc.expectErr && err == nil { diff --git a/cmd/kubeadm/app/phases/bootstraptoken/node/BUILD b/cmd/kubeadm/app/phases/bootstraptoken/node/BUILD new file mode 100644 index 00000000000..5a999c0fe39 --- /dev/null +++ b/cmd/kubeadm/app/phases/bootstraptoken/node/BUILD @@ -0,0 +1,48 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = ["token_test.go"], + library = ":go_default_library", + deps = ["//cmd/kubeadm/app/apis/kubeadm:go_default_library"], +) + +go_library( + name = "go_default_library", + srcs = [ + "tlsbootstrap.go", + "token.go", + ], + deps = [ + "//cmd/kubeadm/app/constants:go_default_library", + "//cmd/kubeadm/app/util/apiclient:go_default_library", + "//cmd/kubeadm/app/util/token:go_default_library", + "//pkg/apis/rbac/v1beta1:go_default_library", + "//pkg/bootstrap/api:go_default_library", + "//pkg/util/version:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/cmd/kubeadm/app/phases/bootstraptoken/node/tlsbootstrap.go b/cmd/kubeadm/app/phases/bootstraptoken/node/tlsbootstrap.go new file mode 100644 index 00000000000..cb53271029b --- /dev/null +++ b/cmd/kubeadm/app/phases/bootstraptoken/node/tlsbootstrap.go @@ -0,0 +1,106 @@ +/* +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 node + +import ( + "fmt" + + rbac "k8s.io/api/rbac/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/kubernetes/cmd/kubeadm/app/constants" + apiclientutil "k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient" + rbachelper "k8s.io/kubernetes/pkg/apis/rbac/v1beta1" + "k8s.io/kubernetes/pkg/util/version" +) + +const ( + // NodeBootstrapperClusterRoleName defines the name of the auto-bootstrapped ClusterRole for letting someone post a CSR + // TODO: This value should be defined in an other, generic authz package instead of here + NodeBootstrapperClusterRoleName = "system:node-bootstrapper" + // NodeKubeletBootstrap defines the name of the ClusterRoleBinding that lets kubelets post CSRs + NodeKubeletBootstrap = "kubeadm:kubelet-bootstrap" + + // CSRAutoApprovalClusterRoleName defines the name of the auto-bootstrapped ClusterRole for making the csrapprover controller auto-approve the CSR + // TODO: This value should be defined in an other, generic authz package instead of here + CSRAutoApprovalClusterRoleName = "system:certificates.k8s.io:certificatesigningrequests:nodeclient" + // NodeAutoApproveBootstrap defines the name of the ClusterRoleBinding that makes the csrapprover approve node CSRs + NodeAutoApproveBootstrap = "kubeadm:node-autoapprove-bootstrap" +) + +// AllowBootstrapTokensToPostCSRs creates RBAC rules in a way the makes Node Bootstrap Tokens able to post CSRs +func AllowBootstrapTokensToPostCSRs(client clientset.Interface) error { + + fmt.Println("[bootstraptoken] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials") + + return apiclientutil.CreateClusterRoleBindingIfNotExists(client, &rbac.ClusterRoleBinding{ + ObjectMeta: metav1.ObjectMeta{ + Name: NodeKubeletBootstrap, + }, + RoleRef: rbac.RoleRef{ + APIGroup: rbac.GroupName, + Kind: "ClusterRole", + Name: NodeBootstrapperClusterRoleName, + }, + Subjects: []rbac.Subject{ + { + Kind: rbac.GroupKind, + Name: constants.NodeBootstrapTokenAuthGroup, + }, + }, + }) +} + +// AutoApproveNodeBootstrapTokens creates RBAC rules in a way that makes Node Bootstrap Tokens' CSR auto-approved by the csrapprover controller +func AutoApproveNodeBootstrapTokens(client clientset.Interface, k8sVersion *version.Version) error { + + fmt.Println("[bootstraptoken] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token") + + // TODO: When the v1.9 cycle starts (targeting v1.9 at HEAD) and v1.8.0 is the minimum supported version, we can remove this function as the ClusterRole will always exist + if k8sVersion.LessThan(constants.MinimumCSRAutoApprovalClusterRolesVersion) { + + err := apiclientutil.CreateClusterRoleIfNotExists(client, &rbac.ClusterRole{ + ObjectMeta: metav1.ObjectMeta{ + Name: CSRAutoApprovalClusterRoleName, + }, + Rules: []rbac.PolicyRule{ + rbachelper.NewRule("create").Groups("certificates.k8s.io").Resources("certificatesigningrequests/nodeclient").RuleOrDie(), + }, + }) + if err != nil { + return err + } + } + + // Always create this kubeadm-specific binding though + return apiclientutil.CreateClusterRoleBindingIfNotExists(client, &rbac.ClusterRoleBinding{ + ObjectMeta: metav1.ObjectMeta{ + Name: NodeAutoApproveBootstrap, + }, + RoleRef: rbac.RoleRef{ + APIGroup: rbac.GroupName, + Kind: "ClusterRole", + Name: CSRAutoApprovalClusterRoleName, + }, + Subjects: []rbac.Subject{ + { + Kind: "Group", + Name: constants.NodeBootstrapTokenAuthGroup, + }, + }, + }) +} diff --git a/cmd/kubeadm/app/phases/token/bootstrap.go b/cmd/kubeadm/app/phases/bootstraptoken/node/token.go similarity index 71% rename from cmd/kubeadm/app/phases/token/bootstrap.go rename to cmd/kubeadm/app/phases/bootstraptoken/node/token.go index 2bb3c0a5d27..e4c29912e4a 100644 --- a/cmd/kubeadm/app/phases/token/bootstrap.go +++ b/cmd/kubeadm/app/phases/bootstraptoken/node/token.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package token +package node import ( "fmt" @@ -24,14 +24,14 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" clientset "k8s.io/client-go/kubernetes" - "k8s.io/client-go/tools/clientcmd" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" tokenutil "k8s.io/kubernetes/cmd/kubeadm/app/util/token" bootstrapapi "k8s.io/kubernetes/pkg/bootstrap/api" ) const tokenCreateRetries = 5 +// TODO(mattmoyer): Move CreateNewToken, UpdateOrCreateToken and encodeTokenSecretData out of this package to client-go for a generic abstraction and client for a Bootstrap Token + // CreateNewToken tries to create a token and fails if one with the same ID already exists func CreateNewToken(client clientset.Interface, token string, tokenDuration time.Duration, usages []string, description string) error { return UpdateOrCreateToken(client, token, true, tokenDuration, usages, description) @@ -55,9 +55,8 @@ func UpdateOrCreateToken(client clientset.Interface, token string, failIfExists secret.Data = encodeTokenSecretData(tokenID, tokenSecret, tokenDuration, usages, description) if _, err := client.CoreV1().Secrets(metav1.NamespaceSystem).Update(secret); err == nil { return nil - } else { - lastErr = err } + lastErr = err continue } @@ -72,9 +71,8 @@ func UpdateOrCreateToken(client clientset.Interface, token string, failIfExists } if _, err := client.CoreV1().Secrets(metav1.NamespaceSystem).Create(secret); err == nil { return nil - } else { - lastErr = err } + lastErr = err continue } @@ -86,45 +84,10 @@ func UpdateOrCreateToken(client clientset.Interface, token string, failIfExists ) } -// CreateBootstrapConfigMapIfNotExists creates the public cluster-info ConfigMap (if it doesn't already exist) -func CreateBootstrapConfigMapIfNotExists(client clientset.Interface, file string) error { - adminConfig, err := clientcmd.LoadFromFile(file) - if err != nil { - return fmt.Errorf("failed to load admin kubeconfig [%v]", err) - } - - adminCluster := adminConfig.Contexts[adminConfig.CurrentContext].Cluster - // Copy the cluster from admin.conf to the bootstrap kubeconfig, contains the CA cert and the server URL - bootstrapConfig := &clientcmdapi.Config{ - Clusters: map[string]*clientcmdapi.Cluster{ - "": adminConfig.Clusters[adminCluster], - }, - } - bootstrapBytes, err := clientcmd.Write(*bootstrapConfig) - if err != nil { - return err - } - - bootstrapConfigMap := v1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{Name: bootstrapapi.ConfigMapClusterInfo}, - Data: map[string]string{ - bootstrapapi.KubeConfigKey: string(bootstrapBytes), - }, - } - - if _, err := client.CoreV1().ConfigMaps(metav1.NamespacePublic).Create(&bootstrapConfigMap); err != nil { - if apierrors.IsAlreadyExists(err) { - return nil - } - return err - } - return nil -} - // encodeTokenSecretData takes the token discovery object and an optional duration and returns the .Data for the Secret -func encodeTokenSecretData(tokenId, tokenSecret string, duration time.Duration, usages []string, description string) map[string][]byte { +func encodeTokenSecretData(tokenID, tokenSecret string, duration time.Duration, usages []string, description string) map[string][]byte { data := map[string][]byte{ - bootstrapapi.BootstrapTokenIDKey: []byte(tokenId), + bootstrapapi.BootstrapTokenIDKey: []byte(tokenID), bootstrapapi.BootstrapTokenSecretKey: []byte(tokenSecret), } diff --git a/cmd/kubeadm/app/phases/bootstraptoken/node/token_test.go b/cmd/kubeadm/app/phases/bootstraptoken/node/token_test.go new file mode 100644 index 00000000000..48a6f80e982 --- /dev/null +++ b/cmd/kubeadm/app/phases/bootstraptoken/node/token_test.go @@ -0,0 +1,59 @@ +/* +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 node + +import ( + "bytes" + "testing" + "time" + + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" +) + +func TestEncodeTokenSecretData(t *testing.T) { + var tests = []struct { + token *kubeadmapi.TokenDiscovery + t time.Duration + }{ + {token: &kubeadmapi.TokenDiscovery{ID: "foo", Secret: "bar"}}, // should use default + {token: &kubeadmapi.TokenDiscovery{ID: "foo", Secret: "bar"}, t: time.Second}, // should use default + } + for _, rt := range tests { + actual := encodeTokenSecretData(rt.token.ID, rt.token.Secret, rt.t, []string{}, "") + if !bytes.Equal(actual["token-id"], []byte(rt.token.ID)) { + t.Errorf( + "failed EncodeTokenSecretData:\n\texpected: %s\n\t actual: %s", + rt.token.ID, + actual["token-id"], + ) + } + if !bytes.Equal(actual["token-secret"], []byte(rt.token.Secret)) { + t.Errorf( + "failed EncodeTokenSecretData:\n\texpected: %s\n\t actual: %s", + rt.token.Secret, + actual["token-secret"], + ) + } + if rt.t > 0 { + if actual["expiration"] == nil { + t.Errorf( + "failed EncodeTokenSecretData, duration was not added to time", + ) + } + } + } +} diff --git a/cmd/kubeadm/app/phases/certs/BUILD b/cmd/kubeadm/app/phases/certs/BUILD index cc99563df8a..f144a02481a 100644 --- a/cmd/kubeadm/app/phases/certs/BUILD +++ b/cmd/kubeadm/app/phases/certs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["certs_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", @@ -25,7 +22,6 @@ go_library( "certs.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", diff --git a/cmd/kubeadm/app/phases/certs/pkiutil/BUILD b/cmd/kubeadm/app/phases/certs/pkiutil/BUILD index 221c8b5079b..38ec399197f 100644 --- a/cmd/kubeadm/app/phases/certs/pkiutil/BUILD +++ b/cmd/kubeadm/app/phases/certs/pkiutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,12 @@ go_test( name = "go_default_test", srcs = ["pki_helpers_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/client-go/util/cert:go_default_library"], ) go_library( name = "go_default_library", srcs = ["pki_helpers.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/client-go/util/cert:go_default_library"], ) diff --git a/cmd/kubeadm/app/phases/controlplane/BUILD b/cmd/kubeadm/app/phases/controlplane/BUILD index 4a3c9c8e1fb..72d10123b5f 100644 --- a/cmd/kubeadm/app/phases/controlplane/BUILD +++ b/cmd/kubeadm/app/phases/controlplane/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,12 +13,12 @@ go_test( "volumes_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", "//pkg/util/version:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library", ], @@ -32,7 +30,6 @@ go_library( "manifests.go", "volumes.go", ], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library", diff --git a/cmd/kubeadm/app/phases/controlplane/manifests.go b/cmd/kubeadm/app/phases/controlplane/manifests.go index 17e92ce64e5..5b019a9393e 100644 --- a/cmd/kubeadm/app/phases/controlplane/manifests.go +++ b/cmd/kubeadm/app/phases/controlplane/manifests.go @@ -45,78 +45,66 @@ const ( DefaultCloudConfigPath = "/etc/kubernetes/cloud-config" defaultv17AdmissionControl = "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota" - - etcd = "etcd" - kubeAPIServer = "kube-apiserver" - kubeControllerManager = "kube-controller-manager" - kubeScheduler = "kube-scheduler" ) // WriteStaticPodManifests builds manifest objects based on user provided configuration and then dumps it to disk // where kubelet will pick and schedule them. -func WriteStaticPodManifests(cfg *kubeadmapi.MasterConfiguration) error { - - // TODO: Move the "pkg/util/version".Version object into the internal API instead of always parsing the string - k8sVersion, err := version.ParseSemantic(cfg.KubernetesVersion) - if err != nil { - return err - } +func WriteStaticPodManifests(cfg *kubeadmapi.MasterConfiguration, k8sVersion *version.Version, manifestsDir string) error { // Get the required hostpath mounts mounts := getHostPathVolumesForTheControlPlane(cfg) // Prepare static pod specs staticPodSpecs := map[string]v1.Pod{ - kubeAPIServer: componentPod(v1.Container{ - Name: kubeAPIServer, - Image: images.GetCoreImage(images.KubeAPIServerImage, cfg, cfg.UnifiedControlPlaneImage), + kubeadmconstants.KubeAPIServer: componentPod(v1.Container{ + Name: kubeadmconstants.KubeAPIServer, + Image: images.GetCoreImage(kubeadmconstants.KubeAPIServer, cfg.ImageRepository, cfg.KubernetesVersion, cfg.UnifiedControlPlaneImage), Command: getAPIServerCommand(cfg, k8sVersion), - VolumeMounts: mounts.GetVolumeMounts(kubeAPIServer), + VolumeMounts: mounts.GetVolumeMounts(kubeadmconstants.KubeAPIServer), LivenessProbe: componentProbe(int(cfg.API.BindPort), "/healthz", v1.URISchemeHTTPS), Resources: componentResources("250m"), Env: getProxyEnvVars(), - }, mounts.GetVolumes(kubeAPIServer)), - kubeControllerManager: componentPod(v1.Container{ - Name: kubeControllerManager, - Image: images.GetCoreImage(images.KubeControllerManagerImage, cfg, cfg.UnifiedControlPlaneImage), + }, mounts.GetVolumes(kubeadmconstants.KubeAPIServer)), + kubeadmconstants.KubeControllerManager: componentPod(v1.Container{ + Name: kubeadmconstants.KubeControllerManager, + Image: images.GetCoreImage(kubeadmconstants.KubeControllerManager, cfg.ImageRepository, cfg.KubernetesVersion, cfg.UnifiedControlPlaneImage), Command: getControllerManagerCommand(cfg, k8sVersion), - VolumeMounts: mounts.GetVolumeMounts(kubeControllerManager), + VolumeMounts: mounts.GetVolumeMounts(kubeadmconstants.KubeControllerManager), LivenessProbe: componentProbe(10252, "/healthz", v1.URISchemeHTTP), Resources: componentResources("200m"), Env: getProxyEnvVars(), - }, mounts.GetVolumes(kubeControllerManager)), - kubeScheduler: componentPod(v1.Container{ - Name: kubeScheduler, - Image: images.GetCoreImage(images.KubeSchedulerImage, cfg, cfg.UnifiedControlPlaneImage), + }, mounts.GetVolumes(kubeadmconstants.KubeControllerManager)), + kubeadmconstants.KubeScheduler: componentPod(v1.Container{ + Name: kubeadmconstants.KubeScheduler, + Image: images.GetCoreImage(kubeadmconstants.KubeScheduler, cfg.ImageRepository, cfg.KubernetesVersion, cfg.UnifiedControlPlaneImage), Command: getSchedulerCommand(cfg), - VolumeMounts: mounts.GetVolumeMounts(kubeScheduler), + VolumeMounts: mounts.GetVolumeMounts(kubeadmconstants.KubeScheduler), LivenessProbe: componentProbe(10251, "/healthz", v1.URISchemeHTTP), Resources: componentResources("100m"), Env: getProxyEnvVars(), - }, mounts.GetVolumes(kubeScheduler)), + }, mounts.GetVolumes(kubeadmconstants.KubeScheduler)), } // Add etcd static pod spec only if external etcd is not configured if len(cfg.Etcd.Endpoints) == 0 { etcdPod := componentPod(v1.Container{ - Name: etcd, + Name: kubeadmconstants.Etcd, Command: getEtcdCommand(cfg), - Image: images.GetCoreImage(images.KubeEtcdImage, cfg, cfg.Etcd.Image), + Image: images.GetCoreImage(kubeadmconstants.Etcd, cfg.ImageRepository, "", cfg.Etcd.Image), // Mount the etcd datadir path read-write so etcd can store data in a more persistent manner VolumeMounts: []v1.VolumeMount{newVolumeMount(etcdVolumeName, cfg.Etcd.DataDir, false)}, LivenessProbe: componentProbe(2379, "/health", v1.URISchemeHTTP), }, []v1.Volume{newVolume(etcdVolumeName, cfg.Etcd.DataDir)}) - staticPodSpecs[etcd] = etcdPod + staticPodSpecs[kubeadmconstants.Etcd] = etcdPod } - manifestsPath := filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.ManifestsSubDirName) - if err := os.MkdirAll(manifestsPath, 0700); err != nil { - return fmt.Errorf("failed to create directory %q [%v]", manifestsPath, err) + if err := os.MkdirAll(manifestsDir, 0700); err != nil { + return fmt.Errorf("failed to create directory %q [%v]", manifestsDir, err) } for name, spec := range staticPodSpecs { - filename := filepath.Join(manifestsPath, name+".yaml") + filename := kubeadmconstants.GetStaticPodFilepath(name, manifestsDir) serialized, err := yaml.Marshal(spec) if err != nil { return fmt.Errorf("failed to marshal manifest for %q to YAML [%v]", name, err) @@ -166,6 +154,9 @@ func componentPod(container v1.Container, volumes []v1.Volume) v1.Pod { Name: container.Name, Namespace: metav1.NamespaceSystem, Annotations: map[string]string{kubetypes.CriticalPodAnnotationKey: ""}, + // The component and tier labels are useful for quickly identifying the control plane Pods when doing a .List() + // against Pods in the kube-system namespace. Can for example be used together with the WaitForPodsWithLabel function + Labels: map[string]string{"component": container.Name, "tier": "control-plane"}, }, Spec: v1.PodSpec{ Containers: []v1.Container{container}, diff --git a/cmd/kubeadm/app/phases/controlplane/manifests_test.go b/cmd/kubeadm/app/phases/controlplane/manifests_test.go index 25780b00c87..b84bf5ac02e 100644 --- a/cmd/kubeadm/app/phases/controlplane/manifests_test.go +++ b/cmd/kubeadm/app/phases/controlplane/manifests_test.go @@ -26,6 +26,7 @@ import ( "testing" "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/yaml" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" @@ -55,21 +56,25 @@ func TestWriteStaticPodManifests(t *testing.T) { expectedAPIProbePort int32 }{ { - cfg: &kubeadmapi.MasterConfiguration{}, - expectErr: true, + cfg: &kubeadmapi.MasterConfiguration{ + KubernetesVersion: "v1.7.0", + }, + expectErr: false, }, { cfg: &kubeadmapi.MasterConfiguration{ API: kubeadmapi.API{ BindPort: 443, }, + KubernetesVersion: "v1.7.0", }, - expectErr: true, + expectErr: false, expectedAPIProbePort: 443, }, } for _, rt := range tests { - actual := WriteStaticPodManifests(rt.cfg) + + actual := WriteStaticPodManifests(rt.cfg, version.MustParseSemantic(rt.cfg.KubernetesVersion), fmt.Sprintf("%s/etc/kubernetes/manifests", tmpdir)) if (actual == nil) && rt.expectErr { t.Error("expected an error from WriteStaticPodManifests but got none") continue @@ -179,22 +184,43 @@ func TestComponentProbe(t *testing.T) { func TestComponentPod(t *testing.T) { var tests = []struct { - n string + name string + expected v1.Pod }{ { - n: "foo", + name: "foo", + expected: v1.Pod{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "Pod", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "kube-system", + Annotations: map[string]string{"scheduler.alpha.kubernetes.io/critical-pod": ""}, + Labels: map[string]string{"component": "foo", "tier": "control-plane"}, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "foo", + }, + }, + HostNetwork: true, + Volumes: []v1.Volume{}, + }, + }, }, } for _, rt := range tests { - c := v1.Container{Name: rt.n} - v := []v1.Volume{} - actual := componentPod(c, v) - if actual.ObjectMeta.Name != rt.n { + c := v1.Container{Name: rt.name} + actual := componentPod(c, []v1.Volume{}) + if !reflect.DeepEqual(rt.expected, actual) { t.Errorf( - "failed componentPod:\n\texpected: %s\n\t actual: %s", - rt.n, - actual.ObjectMeta.Name, + "failed componentPod:\n\texpected: %v\n\t actual: %v", + rt.expected, + actual, ) } } diff --git a/cmd/kubeadm/app/phases/controlplane/volumes.go b/cmd/kubeadm/app/phases/controlplane/volumes.go index 4873595b365..14cf4c0bccb 100644 --- a/cmd/kubeadm/app/phases/controlplane/volumes.go +++ b/cmd/kubeadm/app/phases/controlplane/volumes.go @@ -49,36 +49,36 @@ func getHostPathVolumesForTheControlPlane(cfg *kubeadmapi.MasterConfiguration) c // HostPath volumes for the API Server // Read-only mount for the certificates directory // TODO: Always mount the K8s Certificates directory to a static path inside of the container - mounts.NewHostPathMount(kubeAPIServer, k8sCertsVolumeName, cfg.CertificatesDir, cfg.CertificatesDir, true) + mounts.NewHostPathMount(kubeadmconstants.KubeAPIServer, k8sCertsVolumeName, cfg.CertificatesDir, cfg.CertificatesDir, true) // Read-only mount for the ca certs (/etc/ssl/certs) directory - mounts.NewHostPathMount(kubeAPIServer, caCertsVolumeName, caCertsVolumePath, caCertsVolumePath, true) + mounts.NewHostPathMount(kubeadmconstants.KubeAPIServer, caCertsVolumeName, caCertsVolumePath, caCertsVolumePath, true) // If external etcd is specified, mount the directories needed for accessing the CA/serving certs and the private key if len(cfg.Etcd.Endpoints) != 0 { etcdVols, etcdVolMounts := getEtcdCertVolumes(cfg.Etcd) - mounts.AddHostPathMounts(kubeAPIServer, etcdVols, etcdVolMounts) + mounts.AddHostPathMounts(kubeadmconstants.KubeAPIServer, etcdVols, etcdVolMounts) } // HostPath volumes for the controller manager // Read-only mount for the certificates directory // TODO: Always mount the K8s Certificates directory to a static path inside of the container - mounts.NewHostPathMount(kubeControllerManager, k8sCertsVolumeName, cfg.CertificatesDir, cfg.CertificatesDir, true) + mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, k8sCertsVolumeName, cfg.CertificatesDir, cfg.CertificatesDir, true) // Read-only mount for the ca certs (/etc/ssl/certs) directory - mounts.NewHostPathMount(kubeControllerManager, caCertsVolumeName, caCertsVolumePath, caCertsVolumePath, true) + mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, caCertsVolumeName, caCertsVolumePath, caCertsVolumePath, true) // Read-only mount for the controller manager kubeconfig file controllerManagerKubeConfigFile := filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.ControllerManagerKubeConfigFileName) - mounts.NewHostPathMount(kubeControllerManager, kubeConfigVolumeName, controllerManagerKubeConfigFile, controllerManagerKubeConfigFile, true) + mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, kubeConfigVolumeName, controllerManagerKubeConfigFile, controllerManagerKubeConfigFile, true) // HostPath volumes for the scheduler // Read-only mount for the scheduler kubeconfig file schedulerKubeConfigFile := filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.SchedulerKubeConfigFileName) - mounts.NewHostPathMount(kubeScheduler, kubeConfigVolumeName, schedulerKubeConfigFile, schedulerKubeConfigFile, true) + mounts.NewHostPathMount(kubeadmconstants.KubeScheduler, kubeConfigVolumeName, schedulerKubeConfigFile, schedulerKubeConfigFile, true) // On some systems were we host-mount /etc/ssl/certs, it is also required to mount /etc/pki. This is needed // due to symlinks pointing from files in /etc/ssl/certs into /etc/pki/ if isPkiVolumeMountNeeded() { - mounts.NewHostPathMount(kubeAPIServer, caCertsPkiVolumeName, caCertsPkiVolumePath, caCertsPkiVolumePath, true) - mounts.NewHostPathMount(kubeControllerManager, caCertsPkiVolumeName, caCertsPkiVolumePath, caCertsPkiVolumePath, true) + mounts.NewHostPathMount(kubeadmconstants.KubeAPIServer, caCertsPkiVolumeName, caCertsPkiVolumePath, caCertsPkiVolumePath, true) + mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, caCertsPkiVolumeName, caCertsPkiVolumePath, caCertsPkiVolumePath, true) } return mounts diff --git a/cmd/kubeadm/app/phases/controlplane/volumes_test.go b/cmd/kubeadm/app/phases/controlplane/volumes_test.go index 9a9d521dfd5..81f58a28d16 100644 --- a/cmd/kubeadm/app/phases/controlplane/volumes_test.go +++ b/cmd/kubeadm/app/phases/controlplane/volumes_test.go @@ -25,6 +25,7 @@ import ( "k8s.io/api/core/v1" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" ) func TestNewVolume(t *testing.T) { @@ -304,7 +305,7 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { Etcd: kubeadmapi.Etcd{}, }, vol: map[string][]v1.Volume{ - kubeAPIServer: { + kubeadmconstants.KubeAPIServer: { { Name: "k8s-certs", VolumeSource: v1.VolumeSource{ @@ -318,7 +319,7 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { }, }, }, - kubeControllerManager: { + kubeadmconstants.KubeControllerManager: { { Name: "k8s-certs", VolumeSource: v1.VolumeSource{ @@ -338,7 +339,7 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { }, }, }, - kubeScheduler: { + kubeadmconstants.KubeScheduler: { { Name: "kubeconfig", VolumeSource: v1.VolumeSource{ @@ -348,7 +349,7 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { }, }, volMount: map[string][]v1.VolumeMount{ - kubeAPIServer: { + kubeadmconstants.KubeAPIServer: { { Name: "k8s-certs", MountPath: testCertsDir, @@ -360,7 +361,7 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { ReadOnly: true, }, }, - kubeControllerManager: { + kubeadmconstants.KubeControllerManager: { { Name: "k8s-certs", MountPath: testCertsDir, @@ -377,7 +378,7 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { ReadOnly: true, }, }, - kubeScheduler: { + kubeadmconstants.KubeScheduler: { { Name: "kubeconfig", MountPath: "/etc/kubernetes/scheduler.conf", @@ -398,7 +399,7 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { }, }, vol: map[string][]v1.Volume{ - kubeAPIServer: { + kubeadmconstants.KubeAPIServer: { { Name: "k8s-certs", VolumeSource: v1.VolumeSource{ @@ -424,7 +425,7 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { }, }, }, - kubeControllerManager: { + kubeadmconstants.KubeControllerManager: { { Name: "k8s-certs", VolumeSource: v1.VolumeSource{ @@ -444,7 +445,7 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { }, }, }, - kubeScheduler: { + kubeadmconstants.KubeScheduler: { { Name: "kubeconfig", VolumeSource: v1.VolumeSource{ @@ -454,7 +455,7 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { }, }, volMount: map[string][]v1.VolumeMount{ - kubeAPIServer: { + kubeadmconstants.KubeAPIServer: { { Name: "k8s-certs", MountPath: testCertsDir, @@ -476,7 +477,7 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { ReadOnly: true, }, }, - kubeControllerManager: { + kubeadmconstants.KubeControllerManager: { { Name: "k8s-certs", MountPath: testCertsDir, @@ -493,7 +494,7 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { ReadOnly: true, }, }, - kubeScheduler: { + kubeadmconstants.KubeScheduler: { { Name: "kubeconfig", MountPath: "/etc/kubernetes/scheduler.conf", diff --git a/cmd/kubeadm/app/phases/kubeconfig/BUILD b/cmd/kubeadm/app/phases/kubeconfig/BUILD index 2164a903bb9..2ead488e93e 100644 --- a/cmd/kubeadm/app/phases/kubeconfig/BUILD +++ b/cmd/kubeadm/app/phases/kubeconfig/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "kubeconfig.go", ], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", @@ -43,7 +40,6 @@ go_test( name = "go_default_test", srcs = ["kubeconfig_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", diff --git a/cmd/kubeadm/app/phases/markmaster/BUILD b/cmd/kubeadm/app/phases/markmaster/BUILD index 7495e2bc1f9..b1d36930507 100644 --- a/cmd/kubeadm/app/phases/markmaster/BUILD +++ b/cmd/kubeadm/app/phases/markmaster/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["markmaster_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/constants:go_default_library", "//pkg/kubelet/apis:go_default_library", @@ -27,7 +24,6 @@ go_test( go_library( name = "go_default_library", srcs = ["markmaster.go"], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/constants:go_default_library", "//pkg/kubelet/apis:go_default_library", diff --git a/cmd/kubeadm/app/phases/selfhosting/BUILD b/cmd/kubeadm/app/phases/selfhosting/BUILD index 5cd98a4045f..3818bfbcb12 100644 --- a/cmd/kubeadm/app/phases/selfhosting/BUILD +++ b/cmd/kubeadm/app/phases/selfhosting/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "selfhosting_volumes_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", @@ -32,7 +29,6 @@ go_library( "selfhosting.go", "selfhosting_volumes.go", ], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", diff --git a/cmd/kubeadm/app/phases/selfhosting/podspec_mutation.go b/cmd/kubeadm/app/phases/selfhosting/podspec_mutation.go index cf7b2edae7a..bcddca3d74b 100644 --- a/cmd/kubeadm/app/phases/selfhosting/podspec_mutation.go +++ b/cmd/kubeadm/app/phases/selfhosting/podspec_mutation.go @@ -25,19 +25,19 @@ import ( // mutatePodSpec makes a Static Pod-hosted PodSpec suitable for self-hosting func mutatePodSpec(cfg *kubeadmapi.MasterConfiguration, name string, podSpec *v1.PodSpec) { mutators := map[string][]func(*kubeadmapi.MasterConfiguration, *v1.PodSpec){ - kubeAPIServer: { + kubeadmconstants.KubeAPIServer: { addNodeSelectorToPodSpec, setMasterTolerationOnPodSpec, setRightDNSPolicyOnPodSpec, setVolumesOnKubeAPIServerPodSpec, }, - kubeControllerManager: { + kubeadmconstants.KubeControllerManager: { addNodeSelectorToPodSpec, setMasterTolerationOnPodSpec, setRightDNSPolicyOnPodSpec, setVolumesOnKubeControllerManagerPodSpec, }, - kubeScheduler: { + kubeadmconstants.KubeScheduler: { addNodeSelectorToPodSpec, setMasterTolerationOnPodSpec, setRightDNSPolicyOnPodSpec, diff --git a/cmd/kubeadm/app/phases/selfhosting/podspec_mutation_test.go b/cmd/kubeadm/app/phases/selfhosting/podspec_mutation_test.go index e84214bf8b8..9b2ce07b38b 100644 --- a/cmd/kubeadm/app/phases/selfhosting/podspec_mutation_test.go +++ b/cmd/kubeadm/app/phases/selfhosting/podspec_mutation_test.go @@ -32,7 +32,7 @@ func TestMutatePodSpec(t *testing.T) { expected v1.PodSpec }{ { - component: kubeAPIServer, + component: kubeadmconstants.KubeAPIServer, podSpec: &v1.PodSpec{}, expected: v1.PodSpec{ NodeSelector: map[string]string{ @@ -45,7 +45,7 @@ func TestMutatePodSpec(t *testing.T) { }, }, { - component: kubeControllerManager, + component: kubeadmconstants.KubeControllerManager, podSpec: &v1.PodSpec{}, expected: v1.PodSpec{ NodeSelector: map[string]string{ @@ -58,7 +58,7 @@ func TestMutatePodSpec(t *testing.T) { }, }, { - component: kubeScheduler, + component: kubeadmconstants.KubeScheduler, podSpec: &v1.PodSpec{}, expected: v1.PodSpec{ NodeSelector: map[string]string{ diff --git a/cmd/kubeadm/app/phases/selfhosting/selfhosting.go b/cmd/kubeadm/app/phases/selfhosting/selfhosting.go index 66762dc0493..c6ad27eff7c 100644 --- a/cmd/kubeadm/app/phases/selfhosting/selfhosting.go +++ b/cmd/kubeadm/app/phases/selfhosting/selfhosting.go @@ -20,7 +20,6 @@ import ( "fmt" "io/ioutil" "os" - "path/filepath" "time" "k8s.io/api/core/v1" @@ -35,14 +34,6 @@ import ( "k8s.io/kubernetes/pkg/api" ) -const ( - kubeAPIServer = "kube-apiserver" - kubeControllerManager = "kube-controller-manager" - kubeScheduler = "kube-scheduler" - - selfHostingPrefix = "self-hosted-" -) - // CreateSelfHostedControlPlane is responsible for turning a Static Pod-hosted control plane to a self-hosted one // It achieves that task this way: // 1. Load the Static Pod specification from disk (from /etc/kubernetes/manifests) @@ -64,12 +55,9 @@ func CreateSelfHostedControlPlane(cfg *kubeadmapi.MasterConfiguration, client cl return err } - // The sequence here isn't set in stone, but seems to work well to start with the API server - components := []string{kubeAPIServer, kubeControllerManager, kubeScheduler} - - for _, componentName := range components { + for _, componentName := range kubeadmconstants.MasterComponents { start := time.Now() - manifestPath := buildStaticManifestFilepath(componentName) + manifestPath := kubeadmconstants.GetStaticPodFilepath(componentName, kubeadmconstants.GetStaticPodDirectory()) // Load the Static Pod file in order to be able to create a self-hosted variant of that file podSpec, err := loadPodSpecFromFile(manifestPath) @@ -116,17 +104,17 @@ func buildDaemonSet(cfg *kubeadmapi.MasterConfiguration, name string, podSpec *v // Return a DaemonSet based on that Spec return &extensions.DaemonSet{ ObjectMeta: metav1.ObjectMeta{ - Name: addSelfHostedPrefix(name), + Name: kubeadmconstants.AddSelfHostedPrefix(name), Namespace: metav1.NamespaceSystem, Labels: map[string]string{ - "k8s-app": addSelfHostedPrefix(name), + "k8s-app": kubeadmconstants.AddSelfHostedPrefix(name), }, }, Spec: extensions.DaemonSetSpec{ Template: v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{ - "k8s-app": addSelfHostedPrefix(name), + "k8s-app": kubeadmconstants.AddSelfHostedPrefix(name), }, }, Spec: *podSpec, @@ -151,17 +139,7 @@ func loadPodSpecFromFile(manifestPath string) (*v1.PodSpec, error) { return &staticPod.Spec, nil } -// buildStaticManifestFilepath returns the location on the disk where the Static Pod should be present -func buildStaticManifestFilepath(componentName string) string { - return filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.ManifestsSubDirName, componentName+".yaml") -} - // buildSelfHostedWorkloadLabelQuery creates the right query for matching a self-hosted Pod func buildSelfHostedWorkloadLabelQuery(componentName string) string { - return fmt.Sprintf("k8s-app=%s", addSelfHostedPrefix(componentName)) -} - -// addSelfHostedPrefix adds the self-hosted- prefix to the component name -func addSelfHostedPrefix(componentName string) string { - return fmt.Sprintf("%s%s", selfHostingPrefix, componentName) + return fmt.Sprintf("k8s-app=%s", kubeadmconstants.AddSelfHostedPrefix(componentName)) } diff --git a/cmd/kubeadm/app/phases/selfhosting/selfhosting_test.go b/cmd/kubeadm/app/phases/selfhosting/selfhosting_test.go index 558276b5c29..f8d17589ee5 100644 --- a/cmd/kubeadm/app/phases/selfhosting/selfhosting_test.go +++ b/cmd/kubeadm/app/phases/selfhosting/selfhosting_test.go @@ -25,6 +25,7 @@ import ( "github.com/ghodss/yaml" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" ) const ( @@ -543,17 +544,17 @@ func TestBuildDaemonSet(t *testing.T) { dsBytes []byte }{ { - component: kubeAPIServer, + component: kubeadmconstants.KubeAPIServer, podBytes: []byte(testAPIServerPod), dsBytes: []byte(testAPIServerDaemonSet), }, { - component: kubeControllerManager, + component: kubeadmconstants.KubeControllerManager, podBytes: []byte(testControllerManagerPod), dsBytes: []byte(testControllerManagerDaemonSet), }, { - component: kubeScheduler, + component: kubeadmconstants.KubeScheduler, podBytes: []byte(testSchedulerPod), dsBytes: []byte(testSchedulerDaemonSet), }, diff --git a/cmd/kubeadm/app/phases/token/BUILD b/cmd/kubeadm/app/phases/token/BUILD index 68537accda7..7e76248ad95 100644 --- a/cmd/kubeadm/app/phases/token/BUILD +++ b/cmd/kubeadm/app/phases/token/BUILD @@ -1,44 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["bootstrap_test.go"], - library = ":go_default_library", - tags = ["automanaged"], - deps = [ - "//cmd/kubeadm/app/apis/kubeadm:go_default_library", - "//pkg/api:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["bootstrap.go"], - tags = ["automanaged"], - deps = [ - "//cmd/kubeadm/app/util/token:go_default_library", - "//pkg/bootstrap/api:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", - ], -) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/cmd/kubeadm/app/phases/uploadconfig/BUILD b/cmd/kubeadm/app/phases/uploadconfig/BUILD new file mode 100644 index 00000000000..d6803872e9e --- /dev/null +++ b/cmd/kubeadm/app/phases/uploadconfig/BUILD @@ -0,0 +1,35 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["uploadconfig.go"], + deps = [ + "//cmd/kubeadm/app/apis/kubeadm:go_default_library", + "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library", + "//cmd/kubeadm/app/constants:go_default_library", + "//pkg/api:go_default_library", + "//vendor/github.com/ghodss/yaml:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/cmd/kubeadm/app/phases/uploadconfig/uploadconfig.go b/cmd/kubeadm/app/phases/uploadconfig/uploadconfig.go new file mode 100644 index 00000000000..c6f0e39936d --- /dev/null +++ b/cmd/kubeadm/app/phases/uploadconfig/uploadconfig.go @@ -0,0 +1,67 @@ +/* +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 uploadconfig + +import ( + "fmt" + + "github.com/ghodss/yaml" + + "k8s.io/api/core/v1" + apierrs "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + clientset "k8s.io/client-go/kubernetes" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" + kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" + "k8s.io/kubernetes/pkg/api" +) + +// UploadConfiguration saves the MasterConfiguration used for later reference (when upgrading for instance) +func UploadConfiguration(cfg *kubeadmapi.MasterConfiguration, client clientset.Interface) error { + + fmt.Printf("[uploadconfig] Storing the configuration used in ConfigMap %q in the %q Namespace\n", kubeadmconstants.MasterConfigurationConfigMap, metav1.NamespaceSystem) + + // Convert cfg to the external version as that's the only version of the API that can be deserialized later + externalcfg := &kubeadmapiext.MasterConfiguration{} + api.Scheme.Convert(cfg, externalcfg, nil) + + cfgYaml, err := yaml.Marshal(*externalcfg) + if err != nil { + return err + } + + cm := &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: kubeadmconstants.MasterConfigurationConfigMap, + Namespace: metav1.NamespaceSystem, + }, + Data: map[string]string{ + kubeadmconstants.MasterConfigurationConfigMapKey: string(cfgYaml), + }, + } + + if _, err := client.CoreV1().ConfigMaps(cm.ObjectMeta.Namespace).Create(cm); err != nil { + if !apierrs.IsAlreadyExists(err) { + return err + } + if _, err := client.CoreV1().ConfigMaps(cm.ObjectMeta.Namespace).Update(cm); err != nil { + return err + } + } + return nil +} diff --git a/cmd/kubeadm/app/preflight/BUILD b/cmd/kubeadm/app/preflight/BUILD index 99c53133b98..28212bc28e4 100644 --- a/cmd/kubeadm/app/preflight/BUILD +++ b/cmd/kubeadm/app/preflight/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["checks.go"], - tags = ["automanaged"], deps = [ "//cmd/kube-apiserver/app/options:go_default_library", "//cmd/kube-controller-manager/app/options:go_default_library", @@ -32,7 +29,6 @@ go_test( name = "go_default_test", srcs = ["checks_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//vendor/github.com/renstrom/dedent:go_default_library", diff --git a/cmd/kubeadm/app/util/BUILD b/cmd/kubeadm/app/util/BUILD index c0872062fbc..8c6cb6b799e 100644 --- a/cmd/kubeadm/app/util/BUILD +++ b/cmd/kubeadm/app/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "template.go", "version.go", ], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/preflight:go_default_library", @@ -37,7 +34,6 @@ go_test( "version_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = ["//cmd/kubeadm/app/preflight:go_default_library"], ) @@ -52,8 +48,10 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//cmd/kubeadm/app/util/apiclient:all-srcs", "//cmd/kubeadm/app/util/config:all-srcs", "//cmd/kubeadm/app/util/kubeconfig:all-srcs", + "//cmd/kubeadm/app/util/pubkeypin:all-srcs", "//cmd/kubeadm/app/util/token:all-srcs", ], tags = ["automanaged"], diff --git a/cmd/kubeadm/app/util/apiclient/BUILD b/cmd/kubeadm/app/util/apiclient/BUILD new file mode 100644 index 00000000000..ef48337e99b --- /dev/null +++ b/cmd/kubeadm/app/util/apiclient/BUILD @@ -0,0 +1,30 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["idempotency.go"], + deps = [ + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/cmd/kubeadm/app/util/apiclient/idempotency.go b/cmd/kubeadm/app/util/apiclient/idempotency.go new file mode 100644 index 00000000000..4db6f98795b --- /dev/null +++ b/cmd/kubeadm/app/util/apiclient/idempotency.go @@ -0,0 +1,98 @@ +/* +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 util + +import ( + "fmt" + + "k8s.io/api/core/v1" + rbac "k8s.io/api/rbac/v1beta1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + clientset "k8s.io/client-go/kubernetes" +) + +// TODO: We should invent a dynamic mechanism for this using the dynamic client instead of hard-coding these functions per-type + +// CreateClusterRoleIfNotExists creates a ClusterRole if the target resource doesn't exist. If the resource exists already, this function will update the resource instead. +func CreateClusterRoleIfNotExists(client clientset.Interface, clusterRole *rbac.ClusterRole) error { + if _, err := client.RbacV1beta1().ClusterRoles().Create(clusterRole); err != nil { + if !apierrors.IsAlreadyExists(err) { + return fmt.Errorf("unable to create RBAC clusterrole: %v", err) + } + + if _, err := client.RbacV1beta1().ClusterRoles().Update(clusterRole); err != nil { + return fmt.Errorf("unable to update RBAC clusterrole: %v", err) + } + } + return nil +} + +// CreateClusterRoleBindingIfNotExists creates a ClusterRoleBinding if the target resource doesn't exist. If the resource exists already, this function will update the resource instead. +func CreateClusterRoleBindingIfNotExists(client clientset.Interface, clusterRoleBinding *rbac.ClusterRoleBinding) error { + if _, err := client.RbacV1beta1().ClusterRoleBindings().Create(clusterRoleBinding); err != nil { + if !apierrors.IsAlreadyExists(err) { + return fmt.Errorf("unable to create RBAC clusterrolebinding: %v", err) + } + + if _, err := client.RbacV1beta1().ClusterRoleBindings().Update(clusterRoleBinding); err != nil { + return fmt.Errorf("unable to update RBAC clusterrolebinding: %v", err) + } + } + return nil +} + +// CreateRoleIfNotExists creates a Role if the target resource doesn't exist. If the resource exists already, this function will update the resource instead. +func CreateRoleIfNotExists(client clientset.Interface, role *rbac.Role) error { + if _, err := client.RbacV1beta1().Roles(role.ObjectMeta.Namespace).Create(role); err != nil { + if !apierrors.IsAlreadyExists(err) { + return fmt.Errorf("unable to create RBAC role: %v", err) + } + + if _, err := client.RbacV1beta1().Roles(role.ObjectMeta.Namespace).Update(role); err != nil { + return fmt.Errorf("unable to update RBAC role: %v", err) + } + } + return nil +} + +// CreateRoleBindingIfNotExists creates a RoleBinding if the target resource doesn't exist. If the resource exists already, this function will update the resource instead. +func CreateRoleBindingIfNotExists(client clientset.Interface, roleBinding *rbac.RoleBinding) error { + if _, err := client.RbacV1beta1().RoleBindings(roleBinding.ObjectMeta.Namespace).Create(roleBinding); err != nil { + if !apierrors.IsAlreadyExists(err) { + return fmt.Errorf("unable to create RBAC rolebinding: %v", err) + } + + if _, err := client.RbacV1beta1().RoleBindings(roleBinding.ObjectMeta.Namespace).Update(roleBinding); err != nil { + return fmt.Errorf("unable to update RBAC rolebinding: %v", err) + } + } + return nil +} + +// CreateConfigMapIfNotExists creates a ConfigMap if the target resource doesn't exist. If the resource exists already, this function will update the resource instead. +func CreateConfigMapIfNotExists(client clientset.Interface, cm *v1.ConfigMap) error { + if _, err := client.CoreV1().ConfigMaps(cm.ObjectMeta.Namespace).Create(cm); err != nil { + if !apierrors.IsAlreadyExists(err) { + return fmt.Errorf("unable to create configmap: %v", err) + } + + if _, err := client.CoreV1().ConfigMaps(cm.ObjectMeta.Namespace).Update(cm); err != nil { + return fmt.Errorf("unable to update configmap: %v", err) + } + } + return nil +} diff --git a/cmd/kubeadm/app/util/config/BUILD b/cmd/kubeadm/app/util/config/BUILD index cb06b9973c4..bd2179ec3f4 100644 --- a/cmd/kubeadm/app/util/config/BUILD +++ b/cmd/kubeadm/app/util/config/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,9 +9,10 @@ load( go_library( name = "go_default_library", srcs = ["masterconfig.go"], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", + "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library", + "//cmd/kubeadm/app/apis/kubeadm/validation:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/util:go_default_library", "//cmd/kubeadm/app/util/token:go_default_library", @@ -29,7 +28,6 @@ go_test( name = "go_default_test", srcs = ["masterconfig_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/cmd/kubeadm/app/util/config/masterconfig.go b/cmd/kubeadm/app/util/config/masterconfig.go index f8b36532cc3..8cb6aaf018c 100644 --- a/cmd/kubeadm/app/util/config/masterconfig.go +++ b/cmd/kubeadm/app/util/config/masterconfig.go @@ -24,6 +24,8 @@ import ( "k8s.io/apimachinery/pkg/runtime" netutil "k8s.io/apimachinery/pkg/util/net" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" + "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" tokenutil "k8s.io/kubernetes/cmd/kubeadm/app/util/token" @@ -72,7 +74,7 @@ func SetInitDynamicDefaults(cfg *kubeadmapi.MasterConfiguration) error { } // TryLoadMasterConfiguration tries to loads a Master configuration from the given file (if defined) -func TryLoadMasterConfiguration(cfgPath string, cfg *kubeadmapi.MasterConfiguration) error { +func TryLoadMasterConfiguration(cfgPath string, cfg *kubeadmapiext.MasterConfiguration) error { if cfgPath != "" { b, err := ioutil.ReadFile(cfgPath) @@ -86,3 +88,34 @@ func TryLoadMasterConfiguration(cfgPath string, cfg *kubeadmapi.MasterConfigurat return nil } + +// ConfigFileAndDefaultsToInternalConfig takes a path to a config file and a versioned configuration that can serve as the default config +// If cfgPath is specified, defaultversionedcfg will always get overridden. Otherwise, the default config (often populated by flags) will be used. +// Then the external, versioned configuration is defaulted and converted to the internal type. +// Right thereafter, the configuration is defaulted again with dynamic values (like IP addresses of a machine, etc) +// Lastly, the internal config is validated and returned. +func ConfigFileAndDefaultsToInternalConfig(cfgPath string, defaultversionedcfg *kubeadmapiext.MasterConfiguration) (*kubeadmapi.MasterConfiguration, error) { + internalcfg := &kubeadmapi.MasterConfiguration{} + + // Loads configuration from config file, if provided + // Nb. --config overrides command line flags + if err := TryLoadMasterConfiguration(cfgPath, defaultversionedcfg); err != nil { + return nil, err + } + + // Takes passed flags into account; the defaulting is executed once again enforcing assignement of + // static default values to cfg only for values not provided with flags + api.Scheme.Default(defaultversionedcfg) + api.Scheme.Convert(defaultversionedcfg, internalcfg, nil) + + // Applies dynamic defaults to settings not provided with flags + if err := SetInitDynamicDefaults(internalcfg); err != nil { + return nil, err + } + + // Validates cfg (flags/configs + defaults + dynamic defaults) + if err := validation.ValidateMasterConfiguration(internalcfg).ToAggregate(); err != nil { + return nil, err + } + return internalcfg, nil +} diff --git a/cmd/kubeadm/app/util/kubeconfig/BUILD b/cmd/kubeadm/app/util/kubeconfig/BUILD index 4ff7a79be5d..3e81111cfe6 100644 --- a/cmd/kubeadm/app/util/kubeconfig/BUILD +++ b/cmd/kubeadm/app/util/kubeconfig/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["kubeconfig_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["kubeconfig.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/client-go/tools/clientcmd:go_default_library", diff --git a/cmd/kubeadm/app/util/pubkeypin/BUILD b/cmd/kubeadm/app/util/pubkeypin/BUILD new file mode 100644 index 00000000000..1fc60fd8e5d --- /dev/null +++ b/cmd/kubeadm/app/util/pubkeypin/BUILD @@ -0,0 +1,31 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = ["pubkeypin_test.go"], + library = ":go_default_library", +) + +go_library( + name = "go_default_library", + srcs = ["pubkeypin.go"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/cmd/kubeadm/app/util/pubkeypin/pubkeypin.go b/cmd/kubeadm/app/util/pubkeypin/pubkeypin.go new file mode 100644 index 00000000000..1766e957555 --- /dev/null +++ b/cmd/kubeadm/app/util/pubkeypin/pubkeypin.go @@ -0,0 +1,108 @@ +/* +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 pubkeypin provides primitives for x509 public key pinning in the +// style of RFC7469. +package pubkeypin + +import ( + "crypto/sha256" + "crypto/x509" + "encoding/hex" + "fmt" + "strings" +) + +const ( + // formatSHA256 is the prefix for pins that are full-length SHA-256 hashes encoded in base 16 (hex) + formatSHA256 = "sha256" +) + +// Set is a set of pinned x509 public keys. +type Set struct { + sha256Hashes map[string]bool +} + +// NewSet returns a new, empty PubKeyPinSet +func NewSet() *Set { + return &Set{make(map[string]bool)} +} + +// Allow adds an allowed public key hash to the Set +func (s *Set) Allow(pubKeyHashes ...string) error { + for _, pubKeyHash := range pubKeyHashes { + parts := strings.Split(pubKeyHash, ":") + if len(parts) != 2 { + return fmt.Errorf("invalid public key hash, expected \"format:value\"") + } + format, value := parts[0], parts[1] + + switch strings.ToLower(format) { + case "sha256": + return s.allowSHA256(value) + default: + return fmt.Errorf("unknown hash format %q", format) + } + } + return nil +} + +// Check if a certificate matches one of the public keys in the set +func (s *Set) Check(certificate *x509.Certificate) error { + if s.checkSHA256(certificate) { + return nil + } + return fmt.Errorf("public key %s not pinned", Hash(certificate)) +} + +// Empty returns true if the Set contains no pinned public keys. +func (s *Set) Empty() bool { + return len(s.sha256Hashes) == 0 +} + +// Hash calculates the SHA-256 hash of the Subject Public Key Information (SPKI) +// object in an x509 certificate (in DER encoding). It returns the full hash as a +// hex encoded string (suitable for passing to Set.Allow). +func Hash(certificate *x509.Certificate) string { + spkiHash := sha256.Sum256(certificate.RawSubjectPublicKeyInfo) + return formatSHA256 + ":" + strings.ToLower(hex.EncodeToString(spkiHash[:])) +} + +// allowSHA256 validates a "sha256" format hash and adds a canonical version of it into the Set +func (s *Set) allowSHA256(hash string) error { + // validate that the hash is the right length to be a full SHA-256 hash + hashLength := hex.DecodedLen(len(hash)) + if hashLength != sha256.Size { + return fmt.Errorf("expected a %d byte SHA-256 hash, found %d bytes", sha256.Size, hashLength) + } + + // validate that the hash is valid hex + _, err := hex.DecodeString(hash) + if err != nil { + return err + } + + // in the end, just store the original hex string in memory (in lowercase) + s.sha256Hashes[strings.ToLower(hash)] = true + return nil +} + +// checkSHA256 returns true if the certificate's "sha256" hash is pinned in the Set +func (s *Set) checkSHA256(certificate *x509.Certificate) bool { + actualHash := sha256.Sum256(certificate.RawSubjectPublicKeyInfo) + actualHashHex := strings.ToLower(hex.EncodeToString(actualHash[:])) + return s.sha256Hashes[actualHashHex] +} diff --git a/cmd/kubeadm/app/util/pubkeypin/pubkeypin_test.go b/cmd/kubeadm/app/util/pubkeypin/pubkeypin_test.go new file mode 100644 index 00000000000..4e578a4bdb9 --- /dev/null +++ b/cmd/kubeadm/app/util/pubkeypin/pubkeypin_test.go @@ -0,0 +1,158 @@ +/* +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 pubkeypin + +import ( + "crypto/x509" + "encoding/pem" + "strings" + "testing" +) + +// testCertPEM is a simple self-signed test certificate issued with the openssl CLI: +// openssl req -new -newkey rsa:2048 -days 36500 -nodes -x509 -keyout /dev/null -out test.crt +const testCertPEM = ` +-----BEGIN CERTIFICATE----- +MIIDRDCCAiygAwIBAgIJAJgVaCXvC6HkMA0GCSqGSIb3DQEBBQUAMB8xHTAbBgNV +BAMTFGt1YmVhZG0ta2V5cGlucy10ZXN0MCAXDTE3MDcwNTE3NDMxMFoYDzIxMTcw +NjExMTc0MzEwWjAfMR0wGwYDVQQDExRrdWJlYWRtLWtleXBpbnMtdGVzdDCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK0ba8mHU9UtYlzM1Own2Fk/XGjR +J4uJQvSeGLtz1hID1IA0dLwruvgLCPadXEOw/f/IWIWcmT+ZmvIHZKa/woq2iHi5 ++HLhXs7aG4tjKGLYhag1hLjBI7icqV7ovkjdGAt9pWkxEzhIYClFMXDjKpMSynu+ +YX6nZ9tic1cOkHmx2yiZdMkuriRQnpTOa7bb03OC1VfGl7gHlOAIYaj4539WCOr8 ++ACTUMJUFEHcRZ2o8a/v6F9GMK+7SC8SJUI+GuroXqlMAdhEv4lX5Co52enYaClN ++D9FJLRpBv2YfiCQdJRaiTvCBSxEFz6BN+PtP5l2Hs703ZWEkOqCByM6HV8CAwEA +AaOBgDB+MB0GA1UdDgQWBBRQgUX8MhK2rWBWQiPHWcKzoWDH5DBPBgNVHSMESDBG +gBRQgUX8MhK2rWBWQiPHWcKzoWDH5KEjpCEwHzEdMBsGA1UEAxMUa3ViZWFkbS1r +ZXlwaW5zLXRlc3SCCQCYFWgl7wuh5DAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB +BQUAA4IBAQCaAUif7Pfx3X0F08cxhx8/Hdx4jcJw6MCq6iq6rsXM32ge43t8OHKC +pJW08dk58a3O1YQSMMvD6GJDAiAfXzfwcwY6j258b1ZlI9Ag0VokvhMl/XfdCsdh +AWImnL1t4hvU5jLaImUUMlYxMcSfHBGAm7WJIZ2LdEfg6YWfZh+WGbg1W7uxLxk6 +y4h5rWdNnzBHWAGf7zJ0oEDV6W6RSwNXtC0JNnLaeIUm/6xdSddJlQPwUv8YH4jX +c1vuFqTnJBPcb7W//R/GI2Paicm1cmns9NLnPR35exHxFTy+D1yxmGokpoPMdife +aH+sfuxT8xeTPb3kjzF9eJTlnEquUDLM +-----END CERTIFICATE-----` + +// expectedHash can be verified using the openssl CLI: +// openssl x509 -pubkey -in test.crt openssl rsa -pubin -outform der 2>&/dev/null | openssl dgst -sha256 -hex +const expectedHash = `sha256:345959acb2c3b2feb87d281961c893f62a314207ef02599f1cc4a5fb255480b3` + +// testCert2PEM is a second test cert generated the same way as testCertPEM +const testCert2PEM = ` +-----BEGIN CERTIFICATE----- +MIID9jCCAt6gAwIBAgIJAN5MXZDic7qYMA0GCSqGSIb3DQEBBQUAMFkxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMTCXRlc3RDZXJ0MjAgFw0xNzA3MjQxNjA0 +MDFaGA8yMTE3MDYzMDE2MDQwMVowWTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNv +bWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDESMBAG +A1UEAxMJdGVzdENlcnQyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +0brwpJYN2ytPWzRBtZSVc3dhkQlA59AzxzqeLLkano0Pxo9NIc3T/y58nnRI8uaS +I1P7BzUfJTiUEvmAtX8NggqKK4ld/gPrU+IRww1CUYS4KCkA/0d0ctPy0JwBCjD+ +b57G3rmNE8c+0jns6J96ZzNtqmv6N+ZlFBAXm1p4S+k0kGi5+hoQ6H7SYXjk2lG+ +r/8jPQEjy/NSdw1dcCA0Nc6o+hPr32927dS6J9KOhBeXNYUNdbuDDmroM9/gN2e/ +YMSA1olLeDPQ7Xvhk0PIyEDnHh83AffPCx5yM3htVRGddjIsPAVUJEL3z5leJtxe +fzyPghOhHJY0PXqznDQTcwIDAQABo4G+MIG7MB0GA1UdDgQWBBRP0IJqv/5rQ4Uf +SByl77dJeEapRDCBiwYDVR0jBIGDMIGAgBRP0IJqv/5rQ4UfSByl77dJeEapRKFd +pFswWTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNVBAoT +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDESMBAGA1UEAxMJdGVzdENlcnQyggkA +3kxdkOJzupgwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA0RIMHc10 +wHHPMh9UflqBgDMF7gfbOL0juJfGloAOcohWWfMZBBJ0CQKMy3xRyoK3HmbW1eeb +iATjesw7t4VEAwf7mgKAd+eTfWYB952uq5qYJ2TI28mSofEq1Wz3RmrNkC1KCBs1 +u+YMFGwyl6necV9zKCeiju4jeovI1GA38TvH7MgYln6vMJ+FbgOXj7XCpek7dQiY +KGaeSSH218mGNQaWRQw2Sm3W6cFdANoCJUph4w18s7gjtFpfV63s80hXRps+vEyv +jEQMEQpG8Ss7HGJLGLBw/xAmG0e//XS/o2dDonbGbvzToFByz8OGxjMhk6yV6hdd ++iyvsLAw/MYMSA== +-----END CERTIFICATE----- +` + +// testCert is a small helper to get a test x509.Certificate from the PEM constants +func testCert(t *testing.T, pemString string) *x509.Certificate { + // Decode the example certificate from a PEM file into a PEM block + pemBlock, _ := pem.Decode([]byte(pemString)) + if pemBlock == nil { + t.Fatal("failed to parse test certificate PEM") + return nil + } + + // Parse the PEM block into an x509.Certificate + result, err := x509.ParseCertificate(pemBlock.Bytes) + if err != nil { + t.Fatalf("failed to parse test certificate: %v", err) + return nil + } + return result +} + +func TestSet(t *testing.T) { + s := NewSet() + if !s.Empty() { + t.Error("expected a new set to be empty") + return + } + err := s.Allow("xyz") + if err == nil || !s.Empty() { + t.Error("expected allowing junk to fail") + return + } + + err = s.Allow("0011223344") + if err == nil || !s.Empty() { + t.Error("expected allowing something too short to fail") + return + } + + err = s.Allow(expectedHash + expectedHash) + if err == nil || !s.Empty() { + t.Error("expected allowing something too long to fail") + return + } + + err = s.Check(testCert(t, testCertPEM)) + if err == nil { + t.Error("expected test cert to not be allowed (yet)") + return + } + + err = s.Allow(strings.ToUpper(expectedHash)) + if err != nil || s.Empty() { + t.Error("expected allowing uppercase expectedHash to succeed") + return + } + + err = s.Check(testCert(t, testCertPEM)) + if err != nil { + t.Errorf("expected test cert to be allowed, but got back: %v", err) + return + } + + err = s.Check(testCert(t, testCert2PEM)) + if err == nil { + t.Error("expected the second test cert to be disallowed") + return + } +} + +func TestHash(t *testing.T) { + actualHash := Hash(testCert(t, testCertPEM)) + if actualHash != expectedHash { + t.Errorf( + "failed to Hash() to the expected value\n\texpected: %q\n\t actual: %q", + expectedHash, + actualHash, + ) + } +} diff --git a/cmd/kubeadm/app/util/token/BUILD b/cmd/kubeadm/app/util/token/BUILD index 2e71b54f460..5b6ef3456f5 100644 --- a/cmd/kubeadm/app/util/token/BUILD +++ b/cmd/kubeadm/app/util/token/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,12 @@ go_test( name = "go_default_test", srcs = ["tokens_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//cmd/kubeadm/app/apis/kubeadm:go_default_library"], ) go_library( name = "go_default_library", srcs = ["tokens.go"], - tags = ["automanaged"], deps = ["//cmd/kubeadm/app/apis/kubeadm:go_default_library"], ) diff --git a/cmd/kubeadm/test/BUILD b/cmd/kubeadm/test/BUILD index 27b845a4ca3..447d5c9bfe0 100644 --- a/cmd/kubeadm/test/BUILD +++ b/cmd/kubeadm/test/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", diff --git a/cmd/kubeadm/test/certs/BUILD b/cmd/kubeadm/test/certs/BUILD index a12d0b2fe19..202238fcbf4 100644 --- a/cmd/kubeadm/test/certs/BUILD +++ b/cmd/kubeadm/test/certs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = ["//cmd/kubeadm/app/phases/certs/pkiutil:go_default_library"], ) diff --git a/cmd/kubeadm/test/cmd/BUILD b/cmd/kubeadm/test/cmd/BUILD index 3a489fa9f50..84523565942 100644 --- a/cmd/kubeadm/test/cmd/BUILD +++ b/cmd/kubeadm/test/cmd/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/spf13/cobra:go_default_library"], ) @@ -28,7 +25,6 @@ go_test( data = ["//cmd/kubeadm"], library = ":go_default_library", tags = [ - "automanaged", "integration", "skip", ], diff --git a/cmd/kubeadm/test/kubeconfig/BUILD b/cmd/kubeadm/test/kubeconfig/BUILD index 972410efdbb..35f088c3654 100644 --- a/cmd/kubeadm/test/kubeconfig/BUILD +++ b/cmd/kubeadm/test/kubeconfig/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/test/certs:go_default_library", "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", diff --git a/cmd/kubectl/BUILD b/cmd/kubectl/BUILD index 3d6c79e184e..da36e7fcb0f 100644 --- a/cmd/kubectl/BUILD +++ b/cmd/kubectl/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -16,7 +14,6 @@ go_binary( "-static", ], library = ":go_default_library", - tags = ["automanaged"], visibility = [ "//build/visible_to:COMMON_release", ], @@ -26,7 +23,7 @@ go_binary( go_library( name = "go_default_library", srcs = ["kubectl.go"], - tags = ["automanaged"], + visibility = ["//visibility:private"], deps = ["//cmd/kubectl/app:go_default_library"], ) diff --git a/cmd/kubectl/app/BUILD b/cmd/kubectl/app/BUILD index 9ed063cbd00..822888d0373 100644 --- a/cmd/kubectl/app/BUILD +++ b/cmd/kubectl/app/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -8,7 +6,6 @@ load( go_library( name = "go_default_library", srcs = ["kubectl.go"], - tags = ["automanaged"], visibility = [ "//build/visible_to:cmd_kubectl_app_CONSUMERS", ], @@ -16,7 +13,7 @@ go_library( "//pkg/client/metrics/prometheus:go_default_library", "//pkg/kubectl/cmd:go_default_library", "//pkg/kubectl/cmd/util:go_default_library", - "//pkg/util/logs:go_default_library", + "//pkg/kubectl/util/logs:go_default_library", "//pkg/version/prometheus:go_default_library", "//vendor/k8s.io/client-go/plugin/pkg/client/auth:go_default_library", ], diff --git a/cmd/kubectl/app/kubectl.go b/cmd/kubectl/app/kubectl.go index 536aa57b959..7d39fd7ec72 100644 --- a/cmd/kubectl/app/kubectl.go +++ b/cmd/kubectl/app/kubectl.go @@ -23,7 +23,7 @@ import ( _ "k8s.io/kubernetes/pkg/client/metrics/prometheus" // for client metric registration "k8s.io/kubernetes/pkg/kubectl/cmd" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/util/logs" + "k8s.io/kubernetes/pkg/kubectl/util/logs" _ "k8s.io/kubernetes/pkg/version/prometheus" // for version metric registration ) diff --git a/cmd/kubelet/BUILD b/cmd/kubelet/BUILD index 6995ac589d4..c3b673cace8 100644 --- a/cmd/kubelet/BUILD +++ b/cmd/kubelet/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -12,21 +10,23 @@ load("//pkg/version:def.bzl", "version_x_defs") go_binary( name = "kubelet", library = ":go_default_library", - tags = ["automanaged"], x_defs = version_x_defs(), ) go_library( name = "go_default_library", srcs = ["kubelet.go"], - tags = ["automanaged"], deps = [ "//cmd/kubelet/app:go_default_library", "//cmd/kubelet/app/options:go_default_library", + "//pkg/apis/componentconfig:go_default_library", "//pkg/client/metrics/prometheus:go_default_library", + "//pkg/features:go_default_library", + "//pkg/kubelet/kubeletconfig:go_default_library", "//pkg/version/prometheus:go_default_library", "//pkg/version/verflag:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", + "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/logs:go_default_library", ], diff --git a/cmd/kubelet/app/BUILD b/cmd/kubelet/app/BUILD index 550d8cb7b43..2dd32666b89 100644 --- a/cmd/kubelet/app/BUILD +++ b/cmd/kubelet/app/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["server_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//pkg/apis/componentconfig:go_default_library"], ) @@ -22,9 +19,13 @@ go_library( "auth.go", "plugins.go", "server.go", - "server_linux.go", - ], - tags = ["automanaged"], + "server_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "server_linux.go", + ], + "//conditions:default": [], + }), deps = [ "//cmd/kubelet/app/options:go_default_library", "//pkg/api:go_default_library", @@ -52,6 +53,7 @@ go_library( "//pkg/kubelet/dockershim/remote:go_default_library", "//pkg/kubelet/eviction:go_default_library", "//pkg/kubelet/eviction/api:go_default_library", + "//pkg/kubelet/kubeletconfig:go_default_library", "//pkg/kubelet/network:go_default_library", "//pkg/kubelet/network/cni:go_default_library", "//pkg/kubelet/network/kubenet:go_default_library", @@ -97,11 +99,8 @@ go_library( "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/cobra:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/golang.org/x/exp/inotify:go_default_library", "//vendor/k8s.io/api/core/v1: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", @@ -120,7 +119,12 @@ go_library( "//vendor/k8s.io/client-go/tools/clientcmd:go_default_library", "//vendor/k8s.io/client-go/tools/record:go_default_library", "//vendor/k8s.io/client-go/util/cert:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/golang.org/x/exp/inotify:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/cmd/kubelet/app/options/BUILD b/cmd/kubelet/app/options/BUILD index 7a94cb918ce..11c4da90b0a 100644 --- a/cmd/kubelet/app/options/BUILD +++ b/cmd/kubelet/app/options/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,12 +11,13 @@ go_library( "container_runtime.go", "options.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/componentconfig:go_default_library", "//pkg/apis/componentconfig/install:go_default_library", "//pkg/apis/componentconfig/v1alpha1:go_default_library", + "//pkg/apis/componentconfig/validation:go_default_library", + "//pkg/features:go_default_library", "//pkg/util/taints:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/cmd/kubelet/app/options/options.go b/cmd/kubelet/app/options/options.go index e43f07147f7..f5e428a5296 100644 --- a/cmd/kubelet/app/options/options.go +++ b/cmd/kubelet/app/options/options.go @@ -18,6 +18,7 @@ limitations under the License. package options import ( + "fmt" _ "net/http/pprof" "strings" @@ -26,9 +27,10 @@ import ( utilflag "k8s.io/apiserver/pkg/util/flag" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/componentconfig" - // Need to make sure the componentconfig api is installed so defaulting funcs work - _ "k8s.io/kubernetes/pkg/apis/componentconfig/install" + _ "k8s.io/kubernetes/pkg/apis/componentconfig/install" // Need to make sure the componentconfig api is installed so defaulting funcs work "k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1" + componentconfigvalidation "k8s.io/kubernetes/pkg/apis/componentconfig/validation" + "k8s.io/kubernetes/pkg/features" utiltaints "k8s.io/kubernetes/pkg/util/taints" "github.com/spf13/pflag" @@ -79,6 +81,72 @@ type KubeletFlags struct { // Container-runtime-specific options. ContainerRuntimeOptions + + // certDirectory is the directory where the TLS certs are located (by + // default /var/run/kubernetes). If tlsCertFile and tlsPrivateKeyFile + // are provided, this flag will be ignored. + CertDirectory string + + // cloudProvider is the provider for cloud services. + // +optional + CloudProvider string + + // cloudConfigFile is the path to the cloud provider configuration file. + // +optional + CloudConfigFile string + + // rootDirectory is the directory path to place kubelet files (volume + // mounts,etc). + RootDirectory string + + // The Kubelet will use this directory for checkpointing downloaded configurations and tracking configuration health. + // The Kubelet will create this directory if it does not already exist. + // The path may be absolute or relative; relative paths are under the Kubelet's current working directory. + // Providing this flag enables dynamic kubelet configuration. + // To use this flag, the DynamicKubeletConfig feature gate must be enabled. + DynamicConfigDir flag.StringFlag + + // The Kubelet will look in this directory for an init configuration. + // The path may be absolute or relative; relative paths are under the Kubelet's current working directory. + // Omit this flag to use the combination of built-in default configuration values and flags. + // To use this flag, the DynamicKubeletConfig feature gate must be enabled. + InitConfigDir flag.StringFlag +} + +// NewKubeletFlags will create a new KubeletFlags with default values +func NewKubeletFlags() *KubeletFlags { + return &KubeletFlags{ + // TODO(#41161:v1.10.0): Remove the default kubeconfig path and --require-kubeconfig. + RequireKubeConfig: false, + KubeConfig: flag.NewStringFlag("/var/lib/kubelet/kubeconfig"), + ContainerRuntimeOptions: *NewContainerRuntimeOptions(), + CertDirectory: "/var/run/kubernetes", + CloudProvider: v1alpha1.AutoDetectCloudProvider, + RootDirectory: v1alpha1.DefaultRootDir, + } +} + +func ValidateKubeletFlags(f *KubeletFlags) error { + // ensure that nobody sets DynamicConfigDir if the dynamic config feature gate is turned off + if f.DynamicConfigDir.Provided() && !utilfeature.DefaultFeatureGate.Enabled(features.DynamicKubeletConfig) { + return fmt.Errorf("the DynamicKubeletConfig feature gate must be enabled in order to use the --dynamic-config-dir flag") + } + // ensure that nobody sets InitConfigDir if the dynamic config feature gate is turned off + if f.InitConfigDir.Provided() && !utilfeature.DefaultFeatureGate.Enabled(features.DynamicKubeletConfig) { + return fmt.Errorf("the DynamicKubeletConfig feature gate must be enabled in order to use the --init-config-dir flag") + } + return nil +} + +// NewKubeletConfiguration will create a new KubeletConfiguration with default values +func NewKubeletConfiguration() (*componentconfig.KubeletConfiguration, error) { + versioned := &v1alpha1.KubeletConfiguration{} + api.Scheme.Default(versioned) + config := &componentconfig.KubeletConfiguration{} + if err := api.Scheme.Convert(versioned, config, nil); err != nil { + return nil, err + } + return config, nil } // KubeletServer encapsulates all of the parameters necessary for starting up @@ -89,29 +157,33 @@ type KubeletServer struct { } // NewKubeletServer will create a new KubeletServer with default values. -func NewKubeletServer() *KubeletServer { - versioned := &v1alpha1.KubeletConfiguration{} - api.Scheme.Default(versioned) - config := componentconfig.KubeletConfiguration{} - api.Scheme.Convert(versioned, &config, nil) - return &KubeletServer{ - KubeletFlags: KubeletFlags{ - // TODO(#41161:v1.10.0): Remove the default kubeconfig path and --require-kubeconfig. - RequireKubeConfig: false, - KubeConfig: flag.NewStringFlag("/var/lib/kubelet/kubeconfig"), - ContainerRuntimeOptions: *NewContainerRuntimeOptions(), - }, - KubeletConfiguration: config, +func NewKubeletServer() (*KubeletServer, error) { + config, err := NewKubeletConfiguration() + if err != nil { + return nil, err } + return &KubeletServer{ + KubeletFlags: *NewKubeletFlags(), + KubeletConfiguration: *config, + }, nil } -type kubeletConfiguration componentconfig.KubeletConfiguration +// validateKubeletServer validates configuration of KubeletServer and returns an error if the input configuration is invalid +func ValidateKubeletServer(s *KubeletServer) error { + // please add any KubeletConfiguration validation to the componentconfigvalidation.ValidateKubeletConfiguration function + if err := componentconfigvalidation.ValidateKubeletConfiguration(&s.KubeletConfiguration); err != nil { + return err + } + if err := ValidateKubeletFlags(&s.KubeletFlags); err != nil { + return err + } + return nil +} // AddFlags adds flags for a specific KubeletServer to the specified FlagSet func (s *KubeletServer) AddFlags(fs *pflag.FlagSet) { - var kc *kubeletConfiguration = (*kubeletConfiguration)(&s.KubeletConfiguration) s.KubeletFlags.AddFlags(fs) - kc.addFlags(fs) + AddKubeletConfigFlags(fs, &s.KubeletConfiguration) } // AddFlags adds flags for a specific KubeletFlags to the specified FlagSet @@ -140,10 +212,21 @@ func (f *KubeletFlags) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&f.NodeIP, "node-ip", f.NodeIP, "IP address of the node. If set, kubelet will use this IP address for the node") fs.StringVar(&f.ProviderID, "provider-id", f.ProviderID, "Unique identifier for identifying the node in a machine database, i.e cloudprovider") + + fs.StringVar(&f.CertDirectory, "cert-dir", f.CertDirectory, "The directory where the TLS certs are located. "+ + "If --tls-cert-file and --tls-private-key-file are provided, this flag will be ignored.") + + fs.StringVar(&f.CloudProvider, "cloud-provider", f.CloudProvider, "The provider for cloud services. By default, kubelet will attempt to auto-detect the cloud provider. Specify empty string for running with no cloud provider.") + fs.StringVar(&f.CloudConfigFile, "cloud-config", f.CloudConfigFile, "The path to the cloud provider configuration file. Empty string for no configuration file.") + + fs.StringVar(&f.RootDirectory, "root-dir", f.RootDirectory, "Directory path for managing kubelet files (volume mounts,etc).") + + fs.Var(&f.DynamicConfigDir, "dynamic-config-dir", "The Kubelet will use this directory for checkpointing downloaded configurations and tracking configuration health. The Kubelet will create this directory if it does not already exist. The path may be absolute or relative; relative paths start at the Kubelet's current working directory. Providing this flag enables dynamic Kubelet configuration. Presently, you must also enable the DynamicKubeletConfig feature gate to pass this flag.") + fs.Var(&f.InitConfigDir, "init-config-dir", "The Kubelet will look in this directory for the init configuration. The path may be absolute or relative; relative paths start at the Kubelet's current working directory. Omit this argument to use the built-in default configuration values. Presently, you must also enable the DynamicKubeletConfig feature gate to pass this flag.") } -// addFlags adds flags for a specific componentconfig.KubeletConfiguration to the specified FlagSet -func (c *kubeletConfiguration) addFlags(fs *pflag.FlagSet) { +// AddKubeletConfigFlags adds flags for a specific componentconfig.KubeletConfiguration to the specified FlagSet +func AddKubeletConfigFlags(fs *pflag.FlagSet, c *componentconfig.KubeletConfiguration) { fs.BoolVar(&c.FailSwapOn, "fail-swap-on", true, "Makes the Kubelet fail to start if swap is enabled on the node. ") fs.BoolVar(&c.FailSwapOn, "experimental-fail-swap-on", true, "DEPRECATED: please use --fail-swap-on instead.") fs.MarkDeprecated("experimental-fail-swap-on", "This flag is deprecated and will be removed in future releases. please use --fail-swap-on instead.") @@ -186,10 +269,7 @@ func (c *kubeletConfiguration) addFlags(fs *pflag.FlagSet) { "If --tls-cert-file and --tls-private-key-file are not provided, a self-signed certificate and key "+ "are generated for the public address and saved to the directory passed to --cert-dir.") fs.StringVar(&c.TLSPrivateKeyFile, "tls-private-key-file", c.TLSPrivateKeyFile, "File containing x509 private key matching --tls-cert-file.") - fs.StringVar(&c.CertDirectory, "cert-dir", c.CertDirectory, "The directory where the TLS certs are located. "+ - "If --tls-cert-file and --tls-private-key-file are provided, this flag will be ignored.") - fs.StringVar(&c.RootDirectory, "root-dir", c.RootDirectory, "Directory path for managing kubelet files (volume mounts,etc).") fs.StringVar(&c.SeccompProfileRoot, "seccomp-profile-root", c.SeccompProfileRoot, "Directory path for seccomp profiles.") fs.BoolVar(&c.AllowPrivileged, "allow-privileged", c.AllowPrivileged, "If true, allow containers to request privileged mode.") fs.StringSliceVar(&c.HostNetworkSources, "host-network-sources", c.HostNetworkSources, "Comma-separated list of sources from which the Kubelet allows pods to use of host network.") @@ -227,8 +307,6 @@ func (c *kubeletConfiguration) addFlags(fs *pflag.FlagSet) { fs.Int32Var(&c.ImageGCLowThresholdPercent, "image-gc-low-threshold", c.ImageGCLowThresholdPercent, "The percent of disk usage before which image garbage collection is never run. Lowest disk usage to garbage collect to.") fs.DurationVar(&c.VolumeStatsAggPeriod.Duration, "volume-stats-agg-period", c.VolumeStatsAggPeriod.Duration, "Specifies interval for kubelet to calculate and cache the volume disk usage for all pods and volumes. To disable volume calculations, set to 0.") fs.StringVar(&c.VolumePluginDir, "volume-plugin-dir", c.VolumePluginDir, " The full path of the directory in which to search for additional third party volume plugins") - fs.StringVar(&c.CloudProvider, "cloud-provider", c.CloudProvider, "The provider for cloud services. By default, kubelet will attempt to auto-detect the cloud provider. Specify empty string for running with no cloud provider.") - fs.StringVar(&c.CloudConfigFile, "cloud-config", c.CloudConfigFile, "The path to the cloud provider configuration file. Empty string for no configuration file.") fs.StringVar(&c.FeatureGates, "feature-gates", c.FeatureGates, "A set of key=value pairs that describe feature gates for alpha/experimental features. "+ "Options are:\n"+strings.Join(utilfeature.DefaultFeatureGate.KnownFeatures(), "\n")) diff --git a/cmd/kubelet/app/server.go b/cmd/kubelet/app/server.go index 77cf0c37e7e..84f221346cb 100644 --- a/cmd/kubelet/app/server.go +++ b/cmd/kubelet/app/server.go @@ -28,6 +28,7 @@ import ( "net/url" "os" "path" + "path/filepath" "strconv" "time" @@ -37,8 +38,6 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/sets" @@ -73,6 +72,7 @@ import ( dockerremote "k8s.io/kubernetes/pkg/kubelet/dockershim/remote" "k8s.io/kubernetes/pkg/kubelet/eviction" evictionapi "k8s.io/kubernetes/pkg/kubelet/eviction/api" + "k8s.io/kubernetes/pkg/kubelet/kubeletconfig" "k8s.io/kubernetes/pkg/kubelet/server" "k8s.io/kubernetes/pkg/kubelet/server/streaming" kubetypes "k8s.io/kubernetes/pkg/kubelet/types" @@ -93,7 +93,8 @@ const ( // NewKubeletCommand creates a *cobra.Command object with default parameters func NewKubeletCommand() *cobra.Command { - s := options.NewKubeletServer() + // ignore the error, as this is just for generating docs and the like + s, _ := options.NewKubeletServer() s.AddFlags(pflag.CommandLine) cmd := &cobra.Command{ Use: componentKubelet, @@ -167,119 +168,7 @@ func UnsecuredDependencies(s *options.KubeletServer) (*kubelet.Dependencies, err }, nil } -func getKubeClient(s *options.KubeletServer) (*clientset.Clientset, error) { - clientConfig, err := CreateAPIServerClientConfig(s) - if err == nil { - kubeClient, err := clientset.NewForConfig(clientConfig) - if err != nil { - return nil, err - } - return kubeClient, nil - } - return nil, err -} - -// Tries to download the kubelet- configmap from "kube-system" namespace via the API server and returns a JSON string or error -func getRemoteKubeletConfig(s *options.KubeletServer, kubeDeps *kubelet.Dependencies) (string, error) { - // TODO(mtaufen): should probably cache clientset and pass into this function rather than regenerate on every request - kubeClient, err := getKubeClient(s) - if err != nil { - return "", err - } - - configmap, err := func() (*v1.ConfigMap, error) { - var nodename types.NodeName - hostname := nodeutil.GetHostname(s.HostnameOverride) - - if kubeDeps != nil && kubeDeps.Cloud != nil { - instances, ok := kubeDeps.Cloud.Instances() - if !ok { - err = fmt.Errorf("failed to get instances from cloud provider, can't determine nodename") - return nil, err - } - nodename, err = instances.CurrentNodeName(hostname) - if err != nil { - err = fmt.Errorf("error fetching current instance name from cloud provider: %v", err) - return nil, err - } - // look for kubelet- configmap from "kube-system" - configmap, err := kubeClient.CoreV1().ConfigMaps("kube-system").Get(fmt.Sprintf("kubelet-%s", nodename), metav1.GetOptions{}) - if err != nil { - return nil, err - } - return configmap, nil - } - // No cloud provider yet, so can't get the nodename via Cloud.Instances().CurrentNodeName(hostname), try just using the hostname - configmap, err := kubeClient.CoreV1().ConfigMaps("kube-system").Get(fmt.Sprintf("kubelet-%s", hostname), metav1.GetOptions{}) - if err != nil { - return nil, fmt.Errorf("cloud provider was nil, and attempt to use hostname to find config resulted in: %v", err) - } - return configmap, nil - }() - if err != nil { - return "", err - } - - // When we create the KubeletConfiguration configmap, we put a json string - // representation of the config in a `kubelet.config` key. - jsonstr, ok := configmap.Data["kubelet.config"] - if !ok { - return "", fmt.Errorf("KubeletConfiguration configmap did not contain a value with key `kubelet.config`") - } - - return jsonstr, nil -} - -func startKubeletConfigSyncLoop(s *options.KubeletServer, currentKC string) { - glog.Infof("Starting Kubelet configuration sync loop") - go func() { - wait.PollInfinite(30*time.Second, func() (bool, error) { - glog.Infof("Checking API server for new Kubelet configuration.") - remoteKC, err := getRemoteKubeletConfig(s, nil) - if err == nil { - // Detect new config by comparing with the last JSON string we extracted. - if remoteKC != currentKC { - glog.Info("Found new Kubelet configuration via API server, restarting!") - os.Exit(0) - } - } else { - glog.Infof("Did not find a configuration for this Kubelet via API server: %v", err) - } - return false, nil // Always return (false, nil) so we poll forever. - }) - }() -} - -// Try to check for config on the API server, return that config if we get it, and start -// a background thread that checks for updates to configs. -func initKubeletConfigSync(s *options.KubeletServer) (*componentconfig.KubeletConfiguration, error) { - jsonstr, err := getRemoteKubeletConfig(s, nil) - if err == nil { - // We will compare future API server config against the config we just got (jsonstr): - startKubeletConfigSyncLoop(s, jsonstr) - - // Convert json from API server to external type struct, and convert that to internal type struct - extKC := componentconfigv1alpha1.KubeletConfiguration{} - err := runtime.DecodeInto(api.Codecs.UniversalDecoder(), []byte(jsonstr), &extKC) - if err != nil { - return nil, err - } - api.Scheme.Default(&extKC) - kc := componentconfig.KubeletConfiguration{} - err = api.Scheme.Convert(&extKC, &kc, nil) - if err != nil { - return nil, err - } - return &kc, nil - } else { - // Couldn't get a configuration from the API server yet. - // Restart as soon as anything comes back from the API server. - startKubeletConfigSyncLoop(s, "") - return nil, err - } -} - -// Run runs the specified KubeletServer with the given Dependencies. This should never exit. +// Run runs the specified KubeletServer with the given Dependencies. This should never exit. // The kubeDeps argument may be nil - if so, it is initialized from the settings on KubeletServer. // Otherwise, the caller is assumed to have set up the Dependencies object and a default one will // not be generated. @@ -315,27 +204,6 @@ func initConfigz(kc *componentconfig.KubeletConfiguration) (*configz.Config, err return cz, err } -// validateConfig validates configuration of Kubelet and returns an error if the input configuration is invalid. -func validateConfig(s *options.KubeletServer) error { - if !s.CgroupsPerQOS && len(s.EnforceNodeAllocatable) > 0 { - return fmt.Errorf("Node Allocatable enforcement is not supported unless Cgroups Per QOS feature is turned on") - } - if s.SystemCgroups != "" && s.CgroupRoot == "" { - return fmt.Errorf("invalid configuration: system container was specified and cgroup root was not specified") - } - for _, val := range s.EnforceNodeAllocatable { - switch val { - case cm.NodeAllocatableEnforcementKey: - case cm.SystemReservedEnforcementKey: - case cm.KubeReservedEnforcementKey: - continue - default: - return fmt.Errorf("invalid option %q specified for EnforceNodeAllocatable setting. Valid options are %q, %q or %q", val, cm.NodeAllocatableEnforcementKey, cm.SystemReservedEnforcementKey, cm.KubeReservedEnforcementKey) - } - } - return nil -} - // makeEventRecorder sets up kubeDeps.Recorder if its nil. Its a no-op otherwise. func makeEventRecorder(s *componentconfig.KubeletConfiguration, kubeDeps *kubelet.Dependencies, nodeName types.NodeName) { if kubeDeps.Recorder != nil { @@ -353,20 +221,20 @@ func makeEventRecorder(s *componentconfig.KubeletConfiguration, kubeDeps *kubele } func run(s *options.KubeletServer, kubeDeps *kubelet.Dependencies) (err error) { - - standaloneMode := true - switch { - case s.RequireKubeConfig == true: - standaloneMode = false - glog.Warningf("--require-kubeconfig is deprecated. Set --kubeconfig without using --require-kubeconfig.") - case s.KubeConfig.Provided(): - standaloneMode = false + // Set global feature gates based on the value on the initial KubeletServer + err = utilfeature.DefaultFeatureGate.Set(s.KubeletConfiguration.FeatureGates) + if err != nil { + return err + } + // validate the initial KubeletServer (we set feature gates first, because this validation depends on feature gates) + if err := options.ValidateKubeletServer(s); err != nil { + return err } + // Obtain Kubelet Lock File if s.ExitOnLockContention && s.LockFilePath == "" { return errors.New("cannot exit on lock file contention: no lock file specified") } - done := make(chan struct{}) if s.LockFilePath != "" { glog.Infof("acquiring file lock on %q", s.LockFilePath) @@ -381,44 +249,20 @@ func run(s *options.KubeletServer, kubeDeps *kubelet.Dependencies) (err error) { } } - // Set feature gates based on the value in KubeletConfiguration - err = utilfeature.DefaultFeatureGate.Set(s.KubeletConfiguration.FeatureGates) - if err != nil { - return err - } - // Register current configuration with /configz endpoint - cfgz, cfgzErr := initConfigz(&s.KubeletConfiguration) - if utilfeature.DefaultFeatureGate.Enabled(features.DynamicKubeletConfig) { - // Look for config on the API server. If it exists, replace s.KubeletConfiguration - // with it and continue. initKubeletConfigSync also starts the background thread that checks for new config. - - // Don't do dynamic Kubelet configuration in runonce mode - if s.RunOnce == false { - remoteKC, err := initKubeletConfigSync(s) - if err == nil { - // Update s (KubeletServer) with new config from API server - s.KubeletConfiguration = *remoteKC - // Ensure that /configz is up to date with the new config - if cfgzErr != nil { - glog.Errorf("was unable to register configz before due to %s, will not be able to set now", cfgzErr) - } else { - setConfigz(cfgz, &s.KubeletConfiguration) - } - // Update feature gates from the new config - err = utilfeature.DefaultFeatureGate.Set(s.KubeletConfiguration.FeatureGates) - if err != nil { - return err - } - } else { - glog.Errorf("failed to init dynamic Kubelet configuration sync: %v", err) - } - } + _, err = initConfigz(&s.KubeletConfiguration) + if err != nil { + glog.Errorf("unable to register KubeletConfiguration with configz, error: %v", err) } - // Validate configuration. - if err := validateConfig(s); err != nil { - return err + // About to get clients and such, detect standaloneMode + standaloneMode := true + switch { + case s.RequireKubeConfig == true: + standaloneMode = false + glog.Warningf("--require-kubeconfig is deprecated. Set --kubeconfig without using --require-kubeconfig.") + case s.KubeConfig.Provided(): + standaloneMode = false } if kubeDeps == nil { @@ -518,6 +362,12 @@ func run(s *options.KubeletServer, kubeDeps *kubelet.Dependencies) (err error) { } } + // Alpha Dynamic Configuration Implementation; + // if the kubelet config controller is available, inject the latest to start the config and status sync loops + if utilfeature.DefaultFeatureGate.Enabled(features.DynamicKubeletConfig) && kubeDeps.KubeletConfigController != nil && !standaloneMode && !s.RunOnce { + kubeDeps.KubeletConfigController.StartSync(kubeDeps.KubeClient, string(nodeName)) + } + if kubeDeps.Auth == nil { auth, err := BuildAuth(nodeName, kubeDeps.ExternalKubeClient, s.KubeletConfiguration) if err != nil { @@ -653,8 +503,8 @@ func getNodeName(cloud cloudprovider.Interface, hostname string) (types.NodeName // certificate and key file are generated. Returns a configured server.TLSOptions object. func InitializeTLS(kf *options.KubeletFlags, kc *componentconfig.KubeletConfiguration) (*server.TLSOptions, error) { if !utilfeature.DefaultFeatureGate.Enabled(features.RotateKubeletServerCertificate) && kc.TLSCertFile == "" && kc.TLSPrivateKeyFile == "" { - kc.TLSCertFile = path.Join(kc.CertDirectory, "kubelet.crt") - kc.TLSPrivateKeyFile = path.Join(kc.CertDirectory, "kubelet.key") + kc.TLSCertFile = path.Join(kf.CertDirectory, "kubelet.crt") + kc.TLSPrivateKeyFile = path.Join(kf.CertDirectory, "kubelet.key") canReadCertAndKey, err := certutil.CanReadCertAndKey(kc.TLSCertFile, kc.TLSPrivateKeyFile) if err != nil { @@ -795,8 +645,8 @@ func RunKubelet(kubeFlags *options.KubeletFlags, kubeCfg *componentconfig.Kubele } capabilities.Setup(kubeCfg.AllowPrivileged, privilegedSources, 0) - credentialprovider.SetPreferredDockercfgPath(kubeCfg.RootDirectory) - glog.V(2).Infof("Using root directory: %v", kubeCfg.RootDirectory) + credentialprovider.SetPreferredDockercfgPath(kubeFlags.RootDirectory) + glog.V(2).Infof("Using root directory: %v", kubeFlags.RootDirectory) builder := kubeDeps.Builder if builder == nil { @@ -805,7 +655,8 @@ func RunKubelet(kubeFlags *options.KubeletFlags, kubeCfg *componentconfig.Kubele if kubeDeps.OSInterface == nil { kubeDeps.OSInterface = kubecontainer.RealOS{} } - k, err := builder(kubeCfg, kubeDeps, &kubeFlags.ContainerRuntimeOptions, kubeFlags.HostnameOverride, kubeFlags.NodeIP, kubeFlags.ProviderID) + + k, err := builder(kubeCfg, kubeDeps, &kubeFlags.ContainerRuntimeOptions, kubeFlags.HostnameOverride, kubeFlags.NodeIP, kubeFlags.ProviderID, kubeFlags.CloudProvider, kubeFlags.CertDirectory, kubeFlags.RootDirectory) if err != nil { return fmt.Errorf("failed to create kubelet: %v", err) } @@ -849,11 +700,20 @@ func startKubelet(k kubelet.Bootstrap, podCfg *config.PodConfig, kubeCfg *compon } } -func CreateAndInitKubelet(kubeCfg *componentconfig.KubeletConfiguration, kubeDeps *kubelet.Dependencies, crOptions *options.ContainerRuntimeOptions, hostnameOverride, nodeIP, providerID string) (k kubelet.Bootstrap, err error) { +func CreateAndInitKubelet(kubeCfg *componentconfig.KubeletConfiguration, + kubeDeps *kubelet.Dependencies, + crOptions *options.ContainerRuntimeOptions, + hostnameOverride, + nodeIP, + providerID, + cloudProvider, + certDirectory, + rootDirectory string) (k kubelet.Bootstrap, err error) { + // TODO: block until all sources have delivered at least one update to the channel, or break the sync loop // up into "per source" synchronizations - k, err = kubelet.NewMainKubelet(kubeCfg, kubeDeps, crOptions, hostnameOverride, nodeIP, providerID) + k, err = kubelet.NewMainKubelet(kubeCfg, kubeDeps, crOptions, hostnameOverride, nodeIP, providerID, cloudProvider, certDirectory, rootDirectory) if err != nil { return nil, err } @@ -896,6 +756,36 @@ func parseResourceList(m componentconfig.ConfigurationMap) (v1.ResourceList, err return rl, nil } +// BootstrapKubeletConfigController constructs and bootstrap a configuration controller +func BootstrapKubeletConfigController(flags *options.KubeletFlags, + defaultConfig *componentconfig.KubeletConfiguration) (*componentconfig.KubeletConfiguration, *kubeletconfig.Controller, error) { + var err error + // Alpha Dynamic Configuration Implementation; this section only loads config from disk, it does not contact the API server + // compute absolute paths based on current working dir + initConfigDir := "" + if flags.InitConfigDir.Provided() { + initConfigDir, err = filepath.Abs(flags.InitConfigDir.Value()) + if err != nil { + return nil, nil, fmt.Errorf("failed to get absolute path for --init-config-dir") + } + } + dynamicConfigDir := "" + if flags.DynamicConfigDir.Provided() { + dynamicConfigDir, err = filepath.Abs(flags.DynamicConfigDir.Value()) + if err != nil { + return nil, nil, fmt.Errorf("failed to get absolute path for --dynamic-config-dir") + } + } + + // get the latest KubeletConfiguration checkpoint from disk, or load the init or default config if no valid checkpoints exist + kubeletConfigController := kubeletconfig.NewController(initConfigDir, dynamicConfigDir, defaultConfig) + kubeletConfig, err := kubeletConfigController.Bootstrap() + if err != nil { + return nil, nil, fmt.Errorf("failed to determine a valid configuration, error: %v", err) + } + return kubeletConfig, kubeletConfigController, nil +} + // RunDockershim only starts the dockershim in current process. This is only used for cri validate testing purpose // TODO(random-liu): Move this to a separate binary. func RunDockershim(c *componentconfig.KubeletConfiguration, r *options.ContainerRuntimeOptions) error { diff --git a/cmd/kubelet/kubelet.go b/cmd/kubelet/kubelet.go index b9f1b5fc177..a55f9c68e22 100644 --- a/cmd/kubelet/kubelet.go +++ b/cmd/kubelet/kubelet.go @@ -24,36 +24,88 @@ import ( "fmt" "os" + "github.com/spf13/pflag" + + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/apiserver/pkg/util/flag" "k8s.io/apiserver/pkg/util/logs" "k8s.io/kubernetes/cmd/kubelet/app" "k8s.io/kubernetes/cmd/kubelet/app/options" + "k8s.io/kubernetes/pkg/apis/componentconfig" _ "k8s.io/kubernetes/pkg/client/metrics/prometheus" // for client metric registration - _ "k8s.io/kubernetes/pkg/version/prometheus" // for version metric registration + "k8s.io/kubernetes/pkg/features" + "k8s.io/kubernetes/pkg/kubelet/kubeletconfig" + _ "k8s.io/kubernetes/pkg/version/prometheus" // for version metric registration "k8s.io/kubernetes/pkg/version/verflag" - - "github.com/spf13/pflag" ) -func main() { - s := options.NewKubeletServer() - s.AddFlags(pflag.CommandLine) +func die(err error) { + fmt.Fprintf(os.Stderr, "error: %v\n", err) + os.Exit(1) +} +func main() { + // construct KubeletFlags object and register command line flags mapping + kubeletFlags := options.NewKubeletFlags() + kubeletFlags.AddFlags(pflag.CommandLine) + + // construct KubeletConfiguration object and register command line flags mapping + defaultConfig, err := options.NewKubeletConfiguration() + if err != nil { + die(err) + } + options.AddKubeletConfigFlags(pflag.CommandLine, defaultConfig) + + // parse the command line flags into the respective objects flag.InitFlags() + + // initialize logging and defer flush logs.InitLogs() defer logs.FlushLogs() + // short-circuit on verflag verflag.PrintAndExitIfRequested() - if s.ExperimentalDockershim { - if err := app.RunDockershim(&s.KubeletConfiguration, &s.ContainerRuntimeOptions); err != nil { - fmt.Fprintf(os.Stderr, "error: %v\n", err) - os.Exit(1) + // TODO(mtaufen): won't need this this once dynamic config is GA + // set feature gates so we can check if dynamic config is enabled + if err := utilfeature.DefaultFeatureGate.Set(defaultConfig.FeatureGates); err != nil { + die(err) + } + // validate the initial KubeletFlags, to make sure the dynamic-config-related flags aren't used unless the feature gate is on + if err := options.ValidateKubeletFlags(kubeletFlags); err != nil { + die(err) + } + // if dynamic kubelet config is enabled, bootstrap the kubelet config controller + var kubeletConfig *componentconfig.KubeletConfiguration + var kubeletConfigController *kubeletconfig.Controller + if utilfeature.DefaultFeatureGate.Enabled(features.DynamicKubeletConfig) { + var err error + kubeletConfig, kubeletConfigController, err = app.BootstrapKubeletConfigController(kubeletFlags, defaultConfig) + if err != nil { + die(err) + } + } else if kubeletConfig == nil { + kubeletConfig = defaultConfig + } + + // construct a KubeletServer from kubeletFlags and kubeletConfig + kubeletServer := &options.KubeletServer{KubeletFlags: *kubeletFlags, KubeletConfiguration: *kubeletConfig} + + // use kubeletServer to construct the default KubeletDeps + kubeletDeps, err := app.UnsecuredDependencies(kubeletServer) + + // add the kubelet config controller to kubeletDeps + kubeletDeps.KubeletConfigController = kubeletConfigController + + // start the experimental docker shim, if enabled + if kubeletFlags.ExperimentalDockershim { + if err := app.RunDockershim(kubeletConfig, &kubeletFlags.ContainerRuntimeOptions); err != nil { + die(err) } } - if err := app.Run(s, nil); err != nil { - fmt.Fprintf(os.Stderr, "error: %v\n", err) - os.Exit(1) + // run the kubelet + if err := app.Run(kubeletServer, kubeletDeps); err != nil { + die(err) } } diff --git a/cmd/kubemark/BUILD b/cmd/kubemark/BUILD index 63364f941e8..be8c611911e 100644 --- a/cmd/kubemark/BUILD +++ b/cmd/kubemark/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "kubemark", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["hollow-node.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/cmd/linkcheck/BUILD b/cmd/linkcheck/BUILD index d968ab82b19..05c134af03c 100644 --- a/cmd/linkcheck/BUILD +++ b/cmd/linkcheck/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "linkcheck", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["links.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/mvdan/xurls:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/cmd/mungedocs/BUILD b/cmd/mungedocs/BUILD index fc68999b0c6..1cc809f4159 100644 --- a/cmd/mungedocs/BUILD +++ b/cmd/mungedocs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -12,7 +10,6 @@ load( go_binary( name = "mungedocs", library = ":go_default_library", - tags = ["automanaged"], ) go_test( @@ -34,7 +31,6 @@ go_test( "//docs:srcs", ], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], ) @@ -52,7 +48,6 @@ go_library( "util.go", "whitespace.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/spf13/pflag:go_default_library"], ) diff --git a/docs/BUILD b/docs/BUILD index c05bcaa5563..df3da658611 100644 --- a/docs/BUILD +++ b/docs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - filegroup( name = "srcs", srcs = glob(["**/*"]), diff --git a/docs/api-reference/apps/v1beta1/definitions.html b/docs/api-reference/apps/v1beta1/definitions.html index e28807b9ddc..af1f8e3447d 100755 --- a/docs/api-reference/apps/v1beta1/definitions.html +++ b/docs/api-reference/apps/v1beta1/definitions.html @@ -2274,7 +2274,7 @@ When an object is created, the system will populate this list with the current s

requiredDuringSchedulingIgnoredDuringExecution

-

NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm json:"requiredDuringSchedulingRequiredDuringExecution,omitempty" If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

+

If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

false

v1.PodAffinityTerm array

@@ -2463,6 +2463,9 @@ When an object is created, the system will populate this list with the current s

v1beta1.RollbackConfig

+
+

DEPRECATED.

+
@@ -3490,7 +3493,7 @@ The StatefulSet guarantees that a given network identity will always map to the - + @@ -4857,7 +4860,7 @@ Examples:

v1beta1.DeploymentRollback

-

DeploymentRollback stores the information required to rollback a deployment.

+

DEPRECATED. DeploymentRollback stores the information required to rollback a deployment.

rollbackTo

The config this deployment is rolling back to. Will be cleared after rollback is done.

DEPRECATED. The config this deployment is rolling back to. Will be cleared after rollback is done.

false

v1beta1.RollbackConfig

@@ -4982,15 +4985,15 @@ Examples:
- - + + - - + + @@ -5008,6 +5011,13 @@ Examples:
+ + + + + + +

targetWWNs

Required: FC target worldwide names (WWNs)

true

Optional: FC target worldwide names (WWNs)

false

string array

lun

Required: FC target lun number

true

Optional: FC target lun number

false

integer (int32)

boolean

false

wwids

Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.

false

string array

@@ -5037,7 +5047,7 @@ Examples:

requiredDuringSchedulingIgnoredDuringExecution

-

NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm json:"requiredDuringSchedulingRequiredDuringExecution,omitempty" If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

+

If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

false

v1.PodAffinityTerm array

@@ -5125,6 +5135,13 @@ Examples:

string

+ +

collisionCount

+

collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.

+

false

+

integer (int64)

+ + diff --git a/docs/api-reference/apps/v1beta1/operations.html b/docs/api-reference/apps/v1beta1/operations.html index 42ce7aeb673..fee327b7d07 100755 --- a/docs/api-reference/apps/v1beta1/operations.html +++ b/docs/api-reference/apps/v1beta1/operations.html @@ -4609,6 +4609,385 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
+

read scale of the specified StatefulSet

+
+
+
GET /apis/apps/v1beta1/namespaces/{namespace}/statefulsets/{name}/scale
+
+
+
+

Parameters

+ ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeNameDescriptionRequiredSchemaDefault

QueryParameter

pretty

If true, then the output is pretty printed.

false

string

PathParameter

namespace

object name and auth scope, such as for teams and projects

true

string

PathParameter

name

name of the Scale

true

string

+ +
+
+

Responses

+ +++++ + + + + + + + + + + + + + + +
HTTP CodeDescriptionSchema

200

success

v1beta1.Scale

+ +
+
+

Consumes

+
+
    +
  • +

    /

    +
  • +
+
+
+
+

Produces

+
+
    +
  • +

    application/json

    +
  • +
  • +

    application/yaml

    +
  • +
  • +

    application/vnd.kubernetes.protobuf

    +
  • +
+
+
+
+

Tags

+
+
    +
  • +

    apisappsv1beta1

    +
  • +
+
+
+
+
+

replace scale of the specified StatefulSet

+
+
+
PUT /apis/apps/v1beta1/namespaces/{namespace}/statefulsets/{name}/scale
+
+
+
+

Parameters

+ ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeNameDescriptionRequiredSchemaDefault

QueryParameter

pretty

If true, then the output is pretty printed.

false

string

BodyParameter

body

true

v1beta1.Scale

PathParameter

namespace

object name and auth scope, such as for teams and projects

true

string

PathParameter

name

name of the Scale

true

string

+ +
+
+

Responses

+ +++++ + + + + + + + + + + + + + + +
HTTP CodeDescriptionSchema

200

success

v1beta1.Scale

+ +
+
+

Consumes

+
+
    +
  • +

    /

    +
  • +
+
+
+
+

Produces

+
+
    +
  • +

    application/json

    +
  • +
  • +

    application/yaml

    +
  • +
  • +

    application/vnd.kubernetes.protobuf

    +
  • +
+
+
+
+

Tags

+
+
    +
  • +

    apisappsv1beta1

    +
  • +
+
+
+
+
+

partially update scale of the specified StatefulSet

+
+
+
PATCH /apis/apps/v1beta1/namespaces/{namespace}/statefulsets/{name}/scale
+
+
+
+

Parameters

+ ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeNameDescriptionRequiredSchemaDefault

QueryParameter

pretty

If true, then the output is pretty printed.

false

string

BodyParameter

body

true

v1.Patch

PathParameter

namespace

object name and auth scope, such as for teams and projects

true

string

PathParameter

name

name of the Scale

true

string

+ +
+
+

Responses

+ +++++ + + + + + + + + + + + + + + +
HTTP CodeDescriptionSchema

200

success

v1beta1.Scale

+ +
+
+

Consumes

+
+
    +
  • +

    application/json-patch+json

    +
  • +
  • +

    application/merge-patch+json

    +
  • +
  • +

    application/strategic-merge-patch+json

    +
  • +
+
+
+
+

Produces

+
+
    +
  • +

    application/json

    +
  • +
  • +

    application/yaml

    +
  • +
  • +

    application/vnd.kubernetes.protobuf

    +
  • +
+
+
+
+

Tags

+
+
    +
  • +

    apisappsv1beta1

    +
  • +
+
+
+
+

read status of the specified StatefulSet

@@ -4616,7 +4995,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Parameters

+

Parameters

@@ -4666,7 +5045,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Responses

+

Responses

@@ -4691,7 +5070,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Consumes

+

Consumes

  • @@ -4701,7 +5080,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Produces

+

Produces

  • @@ -4717,7 +5096,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Tags

+

Tags

  • @@ -4735,7 +5114,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Parameters

+

Parameters

@@ -4793,7 +5172,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Responses

+

Responses

@@ -4818,7 +5197,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Consumes

+

Consumes

  • @@ -4828,7 +5207,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Produces

+

Produces

  • @@ -4844,7 +5223,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Tags

+

Tags

  • @@ -4862,7 +5241,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Parameters

+

Parameters

@@ -4920,7 +5299,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Responses

+

Responses

@@ -4945,7 +5324,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Consumes

+

Consumes

  • @@ -4961,471 +5340,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Produces

-
-
    -
  • -

    application/json

    -
  • -
  • -

    application/yaml

    -
  • -
  • -

    application/vnd.kubernetes.protobuf

    -
  • -
-
-
-
-

Tags

-
-
    -
  • -

    apisappsv1beta1

    -
  • -
-
-
- -
-

list or watch objects of kind StatefulSet

-
-
-
GET /apis/apps/v1beta1/statefulsets
-
-
-
-

Parameters

-
-------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeNameDescriptionRequiredSchemaDefault

QueryParameter

pretty

If true, then the output is pretty printed.

false

string

QueryParameter

labelSelector

A selector to restrict the list of returned objects by their labels. Defaults to everything.

false

string

QueryParameter

fieldSelector

A selector to restrict the list of returned objects by their fields. Defaults to everything.

false

string

QueryParameter

includeUninitialized

If true, partially initialized resources are included in the response.

false

boolean

QueryParameter

watch

Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

false

boolean

QueryParameter

resourceVersion

When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

false

string

QueryParameter

timeoutSeconds

Timeout for the list/watch call.

false

integer (int32)

- -
-
-

Responses

- ----- - - - - - - - - - - - - - - -
HTTP CodeDescriptionSchema

200

success

v1beta1.StatefulSetList

- -
-
-

Consumes

-
-
    -
  • -

    /

    -
  • -
-
-
-
-

Produces

-
-
    -
  • -

    application/json

    -
  • -
  • -

    application/yaml

    -
  • -
  • -

    application/vnd.kubernetes.protobuf

    -
  • -
  • -

    application/json;stream=watch

    -
  • -
  • -

    application/vnd.kubernetes.protobuf;stream=watch

    -
  • -
-
-
-
-

Tags

-
-
    -
  • -

    apisappsv1beta1

    -
  • -
-
-
-
-
-

watch individual changes to a list of ControllerRevision

-
-
-
GET /apis/apps/v1beta1/watch/controllerrevisions
-
-
-
-

Parameters

- -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeNameDescriptionRequiredSchemaDefault

QueryParameter

pretty

If true, then the output is pretty printed.

false

string

QueryParameter

labelSelector

A selector to restrict the list of returned objects by their labels. Defaults to everything.

false

string

QueryParameter

fieldSelector

A selector to restrict the list of returned objects by their fields. Defaults to everything.

false

string

QueryParameter

includeUninitialized

If true, partially initialized resources are included in the response.

false

boolean

QueryParameter

watch

Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

false

boolean

QueryParameter

resourceVersion

When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

false

string

QueryParameter

timeoutSeconds

Timeout for the list/watch call.

false

integer (int32)

- -
-
-

Responses

- ----- - - - - - - - - - - - - - - -
HTTP CodeDescriptionSchema

200

success

v1.WatchEvent

- -
-
-

Consumes

-
-
    -
  • -

    /

    -
  • -
-
-
-
-

Produces

-
-
    -
  • -

    application/json

    -
  • -
  • -

    application/yaml

    -
  • -
  • -

    application/vnd.kubernetes.protobuf

    -
  • -
  • -

    application/json;stream=watch

    -
  • -
  • -

    application/vnd.kubernetes.protobuf;stream=watch

    -
  • -
-
-
-
-

Tags

-
-
    -
  • -

    apisappsv1beta1

    -
  • -
-
-
-
-
-

watch individual changes to a list of Deployment

-
-
-
GET /apis/apps/v1beta1/watch/deployments
-
-
-
-

Parameters

- -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeNameDescriptionRequiredSchemaDefault

QueryParameter

pretty

If true, then the output is pretty printed.

false

string

QueryParameter

labelSelector

A selector to restrict the list of returned objects by their labels. Defaults to everything.

false

string

QueryParameter

fieldSelector

A selector to restrict the list of returned objects by their fields. Defaults to everything.

false

string

QueryParameter

includeUninitialized

If true, partially initialized resources are included in the response.

false

boolean

QueryParameter

watch

Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

false

boolean

QueryParameter

resourceVersion

When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

false

string

QueryParameter

timeoutSeconds

Timeout for the list/watch call.

false

integer (int32)

- -
-
-

Responses

- ----- - - - - - - - - - - - - - - -
HTTP CodeDescriptionSchema

200

success

v1.WatchEvent

- -
-
-

Consumes

-
-
    -
  • -

    /

    -
  • -
-
-
-

Produces

    @@ -5438,12 +5352,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
  • application/vnd.kubernetes.protobuf

  • -
  • -

    application/json;stream=watch

    -
  • -
  • -

    application/vnd.kubernetes.protobuf;stream=watch

    -
@@ -5459,10 +5367,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

watch individual changes to a list of ControllerRevision

+

list or watch objects of kind StatefulSet

-
GET /apis/apps/v1beta1/watch/namespaces/{namespace}/controllerrevisions
+
GET /apis/apps/v1beta1/statefulsets
@@ -5543,14 +5451,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

integer (int32)

- -

PathParameter

-

namespace

-

object name and auth scope, such as for teams and projects

-

true

-

string

- - @@ -5574,7 +5474,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

200

success

-

v1.WatchEvent

+

v1beta1.StatefulSetList

@@ -5624,6 +5524,485 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
+

watch individual changes to a list of ControllerRevision

+
+
+
GET /apis/apps/v1beta1/watch/controllerrevisions
+
+
+
+

Parameters

+ ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeNameDescriptionRequiredSchemaDefault

QueryParameter

pretty

If true, then the output is pretty printed.

false

string

QueryParameter

labelSelector

A selector to restrict the list of returned objects by their labels. Defaults to everything.

false

string

QueryParameter

fieldSelector

A selector to restrict the list of returned objects by their fields. Defaults to everything.

false

string

QueryParameter

includeUninitialized

If true, partially initialized resources are included in the response.

false

boolean

QueryParameter

watch

Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

false

boolean

QueryParameter

resourceVersion

When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

false

string

QueryParameter

timeoutSeconds

Timeout for the list/watch call.

false

integer (int32)

+ +
+
+

Responses

+ +++++ + + + + + + + + + + + + + + +
HTTP CodeDescriptionSchema

200

success

v1.WatchEvent

+ +
+
+

Consumes

+
+
    +
  • +

    /

    +
  • +
+
+
+
+

Produces

+
+
    +
  • +

    application/json

    +
  • +
  • +

    application/yaml

    +
  • +
  • +

    application/vnd.kubernetes.protobuf

    +
  • +
  • +

    application/json;stream=watch

    +
  • +
  • +

    application/vnd.kubernetes.protobuf;stream=watch

    +
  • +
+
+
+
+

Tags

+
+
    +
  • +

    apisappsv1beta1

    +
  • +
+
+
+
+
+

watch individual changes to a list of Deployment

+
+
+
GET /apis/apps/v1beta1/watch/deployments
+
+
+
+

Parameters

+ ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeNameDescriptionRequiredSchemaDefault

QueryParameter

pretty

If true, then the output is pretty printed.

false

string

QueryParameter

labelSelector

A selector to restrict the list of returned objects by their labels. Defaults to everything.

false

string

QueryParameter

fieldSelector

A selector to restrict the list of returned objects by their fields. Defaults to everything.

false

string

QueryParameter

includeUninitialized

If true, partially initialized resources are included in the response.

false

boolean

QueryParameter

watch

Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

false

boolean

QueryParameter

resourceVersion

When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

false

string

QueryParameter

timeoutSeconds

Timeout for the list/watch call.

false

integer (int32)

+ +
+
+

Responses

+ +++++ + + + + + + + + + + + + + + +
HTTP CodeDescriptionSchema

200

success

v1.WatchEvent

+ +
+
+

Consumes

+
+
    +
  • +

    /

    +
  • +
+
+
+
+

Produces

+
+
    +
  • +

    application/json

    +
  • +
  • +

    application/yaml

    +
  • +
  • +

    application/vnd.kubernetes.protobuf

    +
  • +
  • +

    application/json;stream=watch

    +
  • +
  • +

    application/vnd.kubernetes.protobuf;stream=watch

    +
  • +
+
+
+
+

Tags

+
+
    +
  • +

    apisappsv1beta1

    +
  • +
+
+
+
+
+

watch individual changes to a list of ControllerRevision

+
+
+
GET /apis/apps/v1beta1/watch/namespaces/{namespace}/controllerrevisions
+
+
+
+

Parameters

+ ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeNameDescriptionRequiredSchemaDefault

QueryParameter

pretty

If true, then the output is pretty printed.

false

string

QueryParameter

labelSelector

A selector to restrict the list of returned objects by their labels. Defaults to everything.

false

string

QueryParameter

fieldSelector

A selector to restrict the list of returned objects by their fields. Defaults to everything.

false

string

QueryParameter

includeUninitialized

If true, partially initialized resources are included in the response.

false

boolean

QueryParameter

watch

Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

false

boolean

QueryParameter

resourceVersion

When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

false

string

QueryParameter

timeoutSeconds

Timeout for the list/watch call.

false

integer (int32)

PathParameter

namespace

object name and auth scope, such as for teams and projects

true

string

+ +
+
+

Responses

+ +++++ + + + + + + + + + + + + + + +
HTTP CodeDescriptionSchema

200

success

v1.WatchEvent

+ +
+
+

Consumes

+
+
    +
  • +

    /

    +
  • +
+
+
+
+

Produces

+
+
    +
  • +

    application/json

    +
  • +
  • +

    application/yaml

    +
  • +
  • +

    application/vnd.kubernetes.protobuf

    +
  • +
  • +

    application/json;stream=watch

    +
  • +
  • +

    application/vnd.kubernetes.protobuf;stream=watch

    +
  • +
+
+
+
+

Tags

+
+
    +
  • +

    apisappsv1beta1

    +
  • +
+
+
+
+

watch changes to an object of kind ControllerRevision

@@ -5631,7 +6010,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Parameters

+

Parameters

@@ -5729,7 +6108,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Responses

+

Responses

@@ -5754,7 +6133,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Consumes

+

Consumes

  • @@ -5764,7 +6143,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Produces

+

Produces

  • @@ -5786,7 +6165,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Tags

+

Tags

  • @@ -5804,7 +6183,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Parameters

+

Parameters

@@ -5894,7 +6273,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Responses

+

Responses

@@ -5919,7 +6298,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Consumes

+

Consumes

  • @@ -5929,7 +6308,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Produces

+

Produces

  • @@ -5951,7 +6330,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Tags

+

Tags

  • @@ -5969,7 +6348,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Parameters

+

Parameters

@@ -6067,7 +6446,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Responses

+

Responses

@@ -6092,7 +6471,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Consumes

+

Consumes

  • @@ -6102,7 +6481,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Produces

+

Produces

  • @@ -6124,7 +6503,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Tags

+

Tags

  • @@ -6142,7 +6521,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Parameters

+

Parameters

@@ -6232,7 +6611,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Responses

+

Responses

@@ -6257,7 +6636,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Consumes

+

Consumes

  • @@ -6267,7 +6646,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Produces

+

Produces

  • @@ -6289,7 +6668,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Tags

+

Tags

  • @@ -6307,7 +6686,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Parameters

+

Parameters

@@ -6405,7 +6784,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Responses

+

Responses

@@ -6430,7 +6809,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Consumes

+

Consumes

  • @@ -6440,7 +6819,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Produces

+

Produces

  • @@ -6462,7 +6841,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Tags

+

Tags

  • @@ -6480,7 +6859,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Parameters

+

Parameters

@@ -6562,7 +6941,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Responses

+

Responses

@@ -6587,7 +6966,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Consumes

+

Consumes

  • @@ -6597,7 +6976,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Produces

+

Produces

  • @@ -6619,7 +6998,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Tags

+

Tags

  • diff --git a/docs/api-reference/apps/v1beta2/definitions.html b/docs/api-reference/apps/v1beta2/definitions.html index e358e64569d..3bd30a3a3d7 100755 --- a/docs/api-reference/apps/v1beta2/definitions.html +++ b/docs/api-reference/apps/v1beta2/definitions.html @@ -376,9 +376,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    v1beta2.DeploymentList

  • -

    v1beta2.DeploymentRollback

    -
  • -
  • v1beta2.Scale

  • @@ -1584,6 +1581,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
+ + + + + + +

string

collisionCount

collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.

false

integer (int64)

@@ -2191,7 +2195,7 @@ When an object is created, the system will populate this list with the current s

partition

-

Partition indicates the ordinal at which the StatefulSet should be partitioned.

+

Partition indicates the ordinal at which the StatefulSet should be partitioned. Default value is 0.

false

integer (int32)

@@ -2473,7 +2477,7 @@ When an object is created, the system will populate this list with the current s

requiredDuringSchedulingIgnoredDuringExecution

-

NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm json:"requiredDuringSchedulingRequiredDuringExecution,omitempty" If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

+

If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

false

v1.PodAffinityTerm array

@@ -2880,68 +2884,6 @@ When an object is created, the system will populate this list with the current s -
-
-

v1beta2.DeploymentRollback

-
-

WIP: This is not ready to be used and we plan to make breaking changes to it. DeploymentRollback stores the information required to rollback a deployment.

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

kind

Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

false

string

apiVersion

APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

false

string

name

Required: This must match the Name of a deployment.

true

string

updatedAnnotations

The annotations to be updated to a deployment

false

object

rollbackTo

The config of this deployment rollback.

true

v1beta2.RollbackConfig

-

v1beta2.DaemonSet

@@ -4877,40 +4819,6 @@ Examples:
-
-
-

v1beta2.RollbackConfig

-
-

WIP: This is not ready to be used and we plan to make breaking changes to it.

-
- ------- - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

revision

The revision to rollback to. If set to 0, rollback to the last revision.

false

integer (int64)

-

v1beta2.ReplicaSet

@@ -5267,13 +5175,6 @@ Examples:

false

-

rollbackTo

-

The config this deployment is rolling back to. Will be cleared after rollback is done.

-

false

-

v1beta2.RollbackConfig

- - -

progressDeadlineSeconds

The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Once autoRollback is implemented, the deployment controller will automatically rollback failed deployments. Note that progress will not be estimated during the time a deployment is paused. Defaults to 600s.

false

@@ -5350,15 +5251,15 @@ Examples:

targetWWNs

-

Required: FC target worldwide names (WWNs)

-

true

+

Optional: FC target worldwide names (WWNs)

+

false

string array

lun

-

Required: FC target lun number

-

true

+

Optional: FC target lun number

+

false

integer (int32)

@@ -5376,6 +5277,13 @@ Examples:

boolean

false

+ +

wwids

+

Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.

+

false

+

string array

+ + @@ -5405,7 +5313,7 @@ Examples:

requiredDuringSchedulingIgnoredDuringExecution

-

NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm json:"requiredDuringSchedulingRequiredDuringExecution,omitempty" If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

+

If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

false

v1.PodAffinityTerm array

@@ -7105,7 +7013,7 @@ Examples:

type

-

Type of daemon set update. Can be "RollingUpdate" or "OnDelete". Default is OnDelete.

+

Type of daemon set update. Can be "RollingUpdate" or "OnDelete". Default is RollingUpdate.

false

string

@@ -7335,7 +7243,7 @@ Examples:

type

-

Type indicates the type of the StatefulSetUpdateStrategy.

+

Type indicates the type of the StatefulSetUpdateStrategy. Default is RollingUpdate.

false

string

diff --git a/docs/api-reference/apps/v1beta2/operations.html b/docs/api-reference/apps/v1beta2/operations.html index ef9f89c69f1..72c3a90c1d6 100755 --- a/docs/api-reference/apps/v1beta2/operations.html +++ b/docs/api-reference/apps/v1beta2/operations.html @@ -3114,10 +3114,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

create rollback of a Deployment

+

read scale of the specified Deployment

-
POST /apis/apps/v1beta2/namespaces/{namespace}/deployments/{name}/rollback
+
GET /apis/apps/v1beta2/namespaces/{namespace}/deployments/{name}/scale
@@ -3151,14 +3151,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } -

BodyParameter

-

body

- -

true

-

v1beta2.DeploymentRollback

- - -

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -3169,7 +3161,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

PathParameter

name

-

name of the DeploymentRollback

+

name of the Scale

true

string

@@ -3197,7 +3189,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

200

success

-

v1beta2.DeploymentRollback

+

v1beta2.Scale

@@ -3241,10 +3233,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

read scale of the specified Deployment

+

replace scale of the specified Deployment

-
GET /apis/apps/v1beta2/namespaces/{namespace}/deployments/{name}/scale
+
PUT /apis/apps/v1beta2/namespaces/{namespace}/deployments/{name}/scale
@@ -3278,6 +3270,14 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } +

BodyParameter

+

body

+ +

true

+

v1beta2.Scale

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -3360,133 +3360,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

replace scale of the specified Deployment

-
-
-
PUT /apis/apps/v1beta2/namespaces/{namespace}/deployments/{name}/scale
-
-
-
-

Parameters

- -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeNameDescriptionRequiredSchemaDefault

QueryParameter

pretty

If true, then the output is pretty printed.

false

string

BodyParameter

body

true

v1beta2.Scale

PathParameter

namespace

object name and auth scope, such as for teams and projects

true

string

PathParameter

name

name of the Scale

true

string

- -
-
-

Responses

- ----- - - - - - - - - - - - - - - -
HTTP CodeDescriptionSchema

200

success

v1beta2.Scale

- -
-
-

Consumes

-
-
    -
  • -

    /

    -
  • -
-
-
-
-

Produces

-
-
    -
  • -

    application/json

    -
  • -
  • -

    application/yaml

    -
  • -
  • -

    application/vnd.kubernetes.protobuf

    -
  • -
-
-
-
-

Tags

-
-
    -
  • -

    apisappsv1beta2

    -
  • -
-
-
-
-

partially update scale of the specified Deployment

@@ -3494,7 +3367,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Parameters

+

Parameters

@@ -3552,7 +3425,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Responses

+

Responses

@@ -3577,7 +3450,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Consumes

+

Consumes

  • @@ -3593,6 +3466,125 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
+

Produces

+
+
    +
  • +

    application/json

    +
  • +
  • +

    application/yaml

    +
  • +
  • +

    application/vnd.kubernetes.protobuf

    +
  • +
+
+
+
+

Tags

+
+
    +
  • +

    apisappsv1beta2

    +
  • +
+
+
+ +
+

read status of the specified Deployment

+
+
+
GET /apis/apps/v1beta2/namespaces/{namespace}/deployments/{name}/status
+
+
+
+

Parameters

+
++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeNameDescriptionRequiredSchemaDefault

QueryParameter

pretty

If true, then the output is pretty printed.

false

string

PathParameter

namespace

object name and auth scope, such as for teams and projects

true

string

PathParameter

name

name of the Deployment

true

string

+ +
+
+

Responses

+ +++++ + + + + + + + + + + + + + + +
HTTP CodeDescriptionSchema

200

success

v1beta2.Deployment

+ +
+
+

Consumes

+
+
    +
  • +

    /

    +
  • +
+
+
+

Produces

    @@ -3620,10 +3612,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

read status of the specified Deployment

+

replace status of the specified Deployment

-
GET /apis/apps/v1beta2/namespaces/{namespace}/deployments/{name}/status
+
PUT /apis/apps/v1beta2/namespaces/{namespace}/deployments/{name}/status
@@ -3657,6 +3649,14 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } +

BodyParameter

+

body

+ +

true

+

v1beta2.Deployment

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -3739,133 +3739,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

replace status of the specified Deployment

-
-
-
PUT /apis/apps/v1beta2/namespaces/{namespace}/deployments/{name}/status
-
-
-
-

Parameters

- -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeNameDescriptionRequiredSchemaDefault

QueryParameter

pretty

If true, then the output is pretty printed.

false

string

BodyParameter

body

true

v1beta2.Deployment

PathParameter

namespace

object name and auth scope, such as for teams and projects

true

string

PathParameter

name

name of the Deployment

true

string

- -
-
-

Responses

- ----- - - - - - - - - - - - - - - -
HTTP CodeDescriptionSchema

200

success

v1beta2.Deployment

- -
-
-

Consumes

-
-
    -
  • -

    /

    -
  • -
-
-
-
-

Produces

-
-
    -
  • -

    application/json

    -
  • -
  • -

    application/yaml

    -
  • -
  • -

    application/vnd.kubernetes.protobuf

    -
  • -
-
-
-
-

Tags

-
-
    -
  • -

    apisappsv1beta2

    -
  • -
-
-
-
-

partially update status of the specified Deployment

@@ -3873,7 +3746,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Parameters

+

Parameters

@@ -3931,7 +3804,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Responses

+

Responses

@@ -3956,7 +3829,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

Consumes

+

Consumes

  • @@ -3972,6 +3845,165 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
+

Produces

+
+
    +
  • +

    application/json

    +
  • +
  • +

    application/yaml

    +
  • +
  • +

    application/vnd.kubernetes.protobuf

    +
  • +
+
+
+
+

Tags

+
+
    +
  • +

    apisappsv1beta2

    +
  • +
+
+
+ +
+

list or watch objects of kind ReplicaSet

+
+
+
GET /apis/apps/v1beta2/namespaces/{namespace}/replicasets
+
+
+
+

Parameters

+
++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeNameDescriptionRequiredSchemaDefault

QueryParameter

pretty

If true, then the output is pretty printed.

false

string

QueryParameter

labelSelector

A selector to restrict the list of returned objects by their labels. Defaults to everything.

false

string

QueryParameter

fieldSelector

A selector to restrict the list of returned objects by their fields. Defaults to everything.

false

string

QueryParameter

includeUninitialized

If true, partially initialized resources are included in the response.

false

boolean

QueryParameter

watch

Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

false

boolean

QueryParameter

resourceVersion

When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

false

string

QueryParameter

timeoutSeconds

Timeout for the list/watch call.

false

integer (int32)

PathParameter

namespace

object name and auth scope, such as for teams and projects

true

string

+ +
+
+

Responses

+ +++++ + + + + + + + + + + + + + + +
HTTP CodeDescriptionSchema

200

success

v1beta2.ReplicaSetList

+ +
+
+

Consumes

+
+
    +
  • +

    /

    +
  • +
+
+
+

Produces

    @@ -3984,6 +4016,12 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
  • application/vnd.kubernetes.protobuf

  • +
  • +

    application/json;stream=watch

    +
  • +
  • +

    application/vnd.kubernetes.protobuf;stream=watch

    +
@@ -3999,10 +4037,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

list or watch objects of kind ReplicaSet

+

delete collection of ReplicaSet

-
GET /apis/apps/v1beta2/namespaces/{namespace}/replicasets
+
DELETE /apis/apps/v1beta2/namespaces/{namespace}/replicasets
@@ -4114,7 +4152,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

200

success

-

v1beta2.ReplicaSetList

+

v1.Status

@@ -4143,12 +4181,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
  • application/vnd.kubernetes.protobuf

  • -
  • -

    application/json;stream=watch

    -
  • -
  • -

    application/vnd.kubernetes.protobuf;stream=watch

    -
  • @@ -4164,10 +4196,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    delete collection of ReplicaSet

    +

    create a ReplicaSet

    -
    DELETE /apis/apps/v1beta2/namespaces/{namespace}/replicasets
    +
    POST /apis/apps/v1beta2/namespaces/{namespace}/replicasets
    @@ -4201,6 +4233,1429 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } +

    BodyParameter

    +

    body

    + +

    true

    +

    v1beta2.ReplicaSet

    + + + +

    PathParameter

    +

    namespace

    +

    object name and auth scope, such as for teams and projects

    +

    true

    +

    string

    + + + + + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.ReplicaSet

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisappsv1beta2

      +
    • +
    +
    +
    +
    +
    +

    read the specified ReplicaSet

    +
    +
    +
    GET /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    export

    Should this value be exported. Export strips fields that a user can not specify.

    false

    boolean

    QueryParameter

    exact

    Should the export be exact. Exact export maintains cluster-specific fields like Namespace.

    false

    boolean

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ReplicaSet

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.ReplicaSet

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisappsv1beta2

      +
    • +
    +
    +
    +
    +
    +

    replace the specified ReplicaSet

    +
    +
    +
    PUT /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1beta2.ReplicaSet

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ReplicaSet

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.ReplicaSet

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisappsv1beta2

      +
    • +
    +
    +
    +
    +
    +

    delete a ReplicaSet

    +
    +
    +
    DELETE /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.DeleteOptions

    QueryParameter

    gracePeriodSeconds

    The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.

    false

    integer (int32)

    QueryParameter

    orphanDependents

    Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

    false

    boolean

    QueryParameter

    propagationPolicy

    Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.

    false

    string

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ReplicaSet

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.Status

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisappsv1beta2

      +
    • +
    +
    +
    +
    +
    +

    partially update the specified ReplicaSet

    +
    +
    +
    PATCH /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.Patch

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ReplicaSet

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.ReplicaSet

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      application/json-patch+json

      +
    • +
    • +

      application/merge-patch+json

      +
    • +
    • +

      application/strategic-merge-patch+json

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisappsv1beta2

      +
    • +
    +
    +
    +
    +
    +

    read scale of the specified ReplicaSet

    +
    +
    +
    GET /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}/scale
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the Scale

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.Scale

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisappsv1beta2

      +
    • +
    +
    +
    +
    +
    +

    replace scale of the specified ReplicaSet

    +
    +
    +
    PUT /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}/scale
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1beta2.Scale

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the Scale

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.Scale

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisappsv1beta2

      +
    • +
    +
    +
    +
    +
    +

    partially update scale of the specified ReplicaSet

    +
    +
    +
    PATCH /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}/scale
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.Patch

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the Scale

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.Scale

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      application/json-patch+json

      +
    • +
    • +

      application/merge-patch+json

      +
    • +
    • +

      application/strategic-merge-patch+json

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisappsv1beta2

      +
    • +
    +
    +
    +
    +
    +

    read status of the specified ReplicaSet

    +
    +
    +
    GET /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}/status
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ReplicaSet

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.ReplicaSet

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisappsv1beta2

      +
    • +
    +
    +
    +
    +
    +

    replace status of the specified ReplicaSet

    +
    +
    +
    PUT /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}/status
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1beta2.ReplicaSet

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ReplicaSet

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.ReplicaSet

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisappsv1beta2

      +
    • +
    +
    +
    +
    +
    +

    partially update status of the specified ReplicaSet

    +
    +
    +
    PATCH /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}/status
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.Patch

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ReplicaSet

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.ReplicaSet

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      application/json-patch+json

      +
    • +
    • +

      application/merge-patch+json

      +
    • +
    • +

      application/strategic-merge-patch+json

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisappsv1beta2

      +
    • +
    +
    +
    +
    +
    +

    list or watch objects of kind StatefulSet

    +
    +
    +
    GET /apis/apps/v1beta2/namespaces/{namespace}/statefulsets
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + @@ -4259,1423 +5714,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1.Status

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisappsv1beta2

      -
    • -
    -
    -
    -
    -
    -

    create a ReplicaSet

    -
    -
    -
    POST /apis/apps/v1beta2/namespaces/{namespace}/replicasets
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1beta2.ReplicaSet

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.ReplicaSet

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisappsv1beta2

      -
    • -
    -
    -
    -
    -
    -

    read the specified ReplicaSet

    -
    -
    -
    GET /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    export

    Should this value be exported. Export strips fields that a user can not specify.

    false

    boolean

    QueryParameter

    exact

    Should the export be exact. Exact export maintains cluster-specific fields like Namespace.

    false

    boolean

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ReplicaSet

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.ReplicaSet

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisappsv1beta2

      -
    • -
    -
    -
    -
    -
    -

    replace the specified ReplicaSet

    -
    -
    -
    PUT /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1beta2.ReplicaSet

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ReplicaSet

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.ReplicaSet

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisappsv1beta2

      -
    • -
    -
    -
    -
    -
    -

    delete a ReplicaSet

    -
    -
    -
    DELETE /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.DeleteOptions

    QueryParameter

    gracePeriodSeconds

    The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.

    false

    integer (int32)

    QueryParameter

    orphanDependents

    Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

    false

    boolean

    QueryParameter

    propagationPolicy

    Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.

    false

    string

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ReplicaSet

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1.Status

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisappsv1beta2

      -
    • -
    -
    -
    -
    -
    -

    partially update the specified ReplicaSet

    -
    -
    -
    PATCH /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.Patch

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ReplicaSet

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.ReplicaSet

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      application/json-patch+json

      -
    • -
    • -

      application/merge-patch+json

      -
    • -
    • -

      application/strategic-merge-patch+json

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisappsv1beta2

      -
    • -
    -
    -
    -
    -
    -

    read scale of the specified ReplicaSet

    -
    -
    -
    GET /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}/scale
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the Scale

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.Scale

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisappsv1beta2

      -
    • -
    -
    -
    -
    -
    -

    replace scale of the specified ReplicaSet

    -
    -
    -
    PUT /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}/scale
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1beta2.Scale

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the Scale

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.Scale

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisappsv1beta2

      -
    • -
    -
    -
    -
    -
    -

    partially update scale of the specified ReplicaSet

    -
    -
    -
    PATCH /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}/scale
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.Patch

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the Scale

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.Scale

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      application/json-patch+json

      -
    • -
    • -

      application/merge-patch+json

      -
    • -
    • -

      application/strategic-merge-patch+json

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisappsv1beta2

      -
    • -
    -
    -
    -
    -
    -

    read status of the specified ReplicaSet

    -
    -
    -
    GET /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}/status
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ReplicaSet

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.ReplicaSet

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisappsv1beta2

      -
    • -
    -
    -
    -
    -
    -

    replace status of the specified ReplicaSet

    -
    -
    -
    PUT /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}/status
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1beta2.ReplicaSet

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ReplicaSet

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.ReplicaSet

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisappsv1beta2

      -
    • -
    -
    -
    -
    -
    -

    partially update status of the specified ReplicaSet

    -
    -
    -
    PATCH /apis/apps/v1beta2/namespaces/{namespace}/replicasets/{name}/status
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.Patch

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ReplicaSet

    true

    string

    -

    Responses

    @@ -5696,7 +5734,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    200

    success

    -

    v1beta2.ReplicaSet

    +

    v1beta2.StatefulSetList

    @@ -5707,13 +5745,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    • -

      application/json-patch+json

      -
    • -
    • -

      application/merge-patch+json

      -
    • -
    • -

      application/strategic-merge-patch+json

      +

      /

    @@ -5731,6 +5763,12 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
  • application/vnd.kubernetes.protobuf

  • +
  • +

    application/json;stream=watch

    +
  • +
  • +

    application/vnd.kubernetes.protobuf;stream=watch

    +
  • @@ -5746,10 +5784,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    list or watch objects of kind StatefulSet

    +

    delete collection of StatefulSet

    -
    GET /apis/apps/v1beta2/namespaces/{namespace}/statefulsets
    +
    DELETE /apis/apps/v1beta2/namespaces/{namespace}/statefulsets
    @@ -5861,7 +5899,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    200

    success

    -

    v1beta2.StatefulSetList

    +

    v1.Status

    @@ -5890,12 +5928,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
  • application/vnd.kubernetes.protobuf

  • -
  • -

    application/json;stream=watch

    -
  • -
  • -

    application/vnd.kubernetes.protobuf;stream=watch

    -
  • @@ -5911,10 +5943,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    delete collection of StatefulSet

    +

    create a StatefulSet

    -
    DELETE /apis/apps/v1beta2/namespaces/{namespace}/statefulsets
    +
    POST /apis/apps/v1beta2/namespaces/{namespace}/statefulsets
    @@ -5948,51 +5980,11 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } -

    QueryParameter

    -

    labelSelector

    -

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    -

    false

    -

    string

    +

    BodyParameter

    +

    body

    - - -

    QueryParameter

    -

    fieldSelector

    -

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    -

    false

    -

    string

    - - - -

    QueryParameter

    -

    includeUninitialized

    -

    If true, partially initialized resources are included in the response.

    -

    false

    -

    boolean

    - - - -

    QueryParameter

    -

    watch

    -

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    -

    false

    -

    boolean

    - - - -

    QueryParameter

    -

    resourceVersion

    -

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    -

    false

    -

    string

    - - - -

    QueryParameter

    -

    timeoutSeconds

    -

    Timeout for the list/watch call.

    -

    false

    -

    integer (int32)

    +

    true

    +

    v1beta2.StatefulSet

    @@ -6026,7 +6018,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    200

    success

    -

    v1.Status

    +

    v1beta2.StatefulSet

    @@ -6070,10 +6062,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    create a StatefulSet

    +

    read the specified StatefulSet

    -
    POST /apis/apps/v1beta2/namespaces/{namespace}/statefulsets
    +
    GET /apis/apps/v1beta2/namespaces/{namespace}/statefulsets/{name}
    @@ -6107,11 +6099,19 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } -

    BodyParameter

    -

    body

    +

    QueryParameter

    +

    export

    +

    Should this value be exported. Export strips fields that a user can not specify.

    +

    false

    +

    boolean

    -

    true

    -

    v1beta2.StatefulSet

    + + +

    QueryParameter

    +

    exact

    +

    Should the export be exact. Exact export maintains cluster-specific fields like Namespace.

    +

    false

    +

    boolean

    @@ -6122,6 +6122,14 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    string

    + +

    PathParameter

    +

    name

    +

    name of the StatefulSet

    +

    true

    +

    string

    + + @@ -6189,10 +6197,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    read the specified StatefulSet

    +

    replace the specified StatefulSet

    -
    GET /apis/apps/v1beta2/namespaces/{namespace}/statefulsets/{name}
    +
    PUT /apis/apps/v1beta2/namespaces/{namespace}/statefulsets/{name}
    @@ -6226,19 +6234,11 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } -

    QueryParameter

    -

    export

    -

    Should this value be exported. Export strips fields that a user can not specify.

    -

    false

    -

    boolean

    +

    BodyParameter

    +

    body

    - - -

    QueryParameter

    -

    exact

    -

    Should the export be exact. Exact export maintains cluster-specific fields like Namespace.

    -

    false

    -

    boolean

    +

    true

    +

    v1beta2.StatefulSet

    @@ -6324,133 +6324,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    replace the specified StatefulSet

    -
    -
    -
    PUT /apis/apps/v1beta2/namespaces/{namespace}/statefulsets/{name}
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1beta2.StatefulSet

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the StatefulSet

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.StatefulSet

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisappsv1beta2

      -
    • -
    -
    -
    -
    -

    delete a StatefulSet

    @@ -6458,7 +6331,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    Parameters

    +

    Parameters

    @@ -6540,7 +6413,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    Responses

    +

    Responses

    @@ -6565,7 +6438,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    Consumes

    +

    Consumes

    • @@ -6575,7 +6448,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    Produces

    +

    Produces

    • @@ -6591,7 +6464,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    Tags

    +

    Tags

    • @@ -6609,7 +6482,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    Parameters

    +

    Parameters

    @@ -6667,7 +6540,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    Responses

    +

    Responses

    @@ -6692,7 +6565,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    Consumes

    +

    Consumes

    • @@ -6708,7 +6581,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    Produces

    +

    Produces

    • @@ -6724,7 +6597,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    Tags

    +

    Tags

    • @@ -6735,14 +6608,14 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    read status of the specified StatefulSet

    +

    read scale of the specified StatefulSet

    -
    GET /apis/apps/v1beta2/namespaces/{namespace}/statefulsets/{name}/status
    +
    GET /apis/apps/v1beta2/namespaces/{namespace}/statefulsets/{name}/scale
    -

    Parameters

    +

    Parameters

    @@ -6782,7 +6655,134 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } - + + + + + + +

    PathParameter

    name

    name of the StatefulSet

    name of the Scale

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1beta2.Scale

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisappsv1beta2

      +
    • +
    +
    +
    +
    +
    +

    replace scale of the specified StatefulSet

    +
    +
    +
    PUT /apis/apps/v1beta2/namespaces/{namespace}/statefulsets/{name}/scale
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -6810,7 +6810,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } - +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1beta2.Scale

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the Scale

    true

    string

    200

    success

    v1beta2.StatefulSet

    v1beta2.Scale

    @@ -6854,10 +6854,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    replace status of the specified StatefulSet

    +

    partially update scale of the specified StatefulSet

    -
    PUT /apis/apps/v1beta2/namespaces/{namespace}/statefulsets/{name}/status
    +
    PATCH /apis/apps/v1beta2/namespaces/{namespace}/statefulsets/{name}/scale
    @@ -6895,7 +6895,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    body

    true

    -

    v1beta2.StatefulSet

    +

    v1.Patch

    @@ -6909,7 +6909,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    PathParameter

    name

    -

    name of the StatefulSet

    +

    name of the Scale

    true

    string

    @@ -6937,7 +6937,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    200

    success

    -

    v1beta2.StatefulSet

    +

    v1beta2.Scale

    @@ -6948,7 +6948,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    • -

      /

      +

      application/json-patch+json

      +
    • +
    • +

      application/merge-patch+json

      +
    • +
    • +

      application/strategic-merge-patch+json

    @@ -6981,10 +6987,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    partially update status of the specified StatefulSet

    +

    read status of the specified StatefulSet

    -
    PATCH /apis/apps/v1beta2/namespaces/{namespace}/statefulsets/{name}/status
    +
    GET /apis/apps/v1beta2/namespaces/{namespace}/statefulsets/{name}/status
    @@ -7018,14 +7024,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } -

    BodyParameter

    -

    body

    - -

    true

    -

    v1.Patch

    - - -

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    @@ -7075,13 +7073,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    • -

      application/json-patch+json

      -
    • -
    • -

      application/merge-patch+json

      -
    • -
    • -

      application/strategic-merge-patch+json

      +

      /

    @@ -7114,10 +7106,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    list or watch objects of kind ReplicaSet

    +

    replace status of the specified StatefulSet

    -
    GET /apis/apps/v1beta2/replicasets
    +
    PUT /apis/apps/v1beta2/namespaces/{namespace}/statefulsets/{name}/status
    @@ -7151,53 +7143,29 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } -

    QueryParameter

    -

    labelSelector

    -

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    -

    false

    +

    BodyParameter

    +

    body

    + +

    true

    +

    v1beta2.StatefulSet

    + + + +

    PathParameter

    +

    namespace

    +

    object name and auth scope, such as for teams and projects

    +

    true

    string

    -

    QueryParameter

    -

    fieldSelector

    -

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    -

    false

    +

    PathParameter

    +

    name

    +

    name of the StatefulSet

    +

    true

    string

    - -

    QueryParameter

    -

    includeUninitialized

    -

    If true, partially initialized resources are included in the response.

    -

    false

    -

    boolean

    - - - -

    QueryParameter

    -

    watch

    -

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    -

    false

    -

    boolean

    - - - -

    QueryParameter

    -

    resourceVersion

    -

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    -

    false

    -

    string

    - - - -

    QueryParameter

    -

    timeoutSeconds

    -

    Timeout for the list/watch call.

    -

    false

    -

    integer (int32)

    - - @@ -7221,7 +7189,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    200

    success

    -

    v1beta2.ReplicaSetList

    +

    v1beta2.StatefulSet

    @@ -7250,12 +7218,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
  • application/vnd.kubernetes.protobuf

  • -
  • -

    application/json;stream=watch

    -
  • -
  • -

    application/vnd.kubernetes.protobuf;stream=watch

    -
  • @@ -7271,10 +7233,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    list or watch objects of kind StatefulSet

    +

    partially update status of the specified StatefulSet

    -
    GET /apis/apps/v1beta2/statefulsets
    +
    PATCH /apis/apps/v1beta2/namespaces/{namespace}/statefulsets/{name}/status
    @@ -7308,53 +7270,29 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } -

    QueryParameter

    -

    labelSelector

    -

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    -

    false

    +

    BodyParameter

    +

    body

    + +

    true

    +

    v1.Patch

    + + + +

    PathParameter

    +

    namespace

    +

    object name and auth scope, such as for teams and projects

    +

    true

    string

    -

    QueryParameter

    -

    fieldSelector

    -

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    -

    false

    +

    PathParameter

    +

    name

    +

    name of the StatefulSet

    +

    true

    string

    - -

    QueryParameter

    -

    includeUninitialized

    -

    If true, partially initialized resources are included in the response.

    -

    false

    -

    boolean

    - - - -

    QueryParameter

    -

    watch

    -

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    -

    false

    -

    boolean

    - - - -

    QueryParameter

    -

    resourceVersion

    -

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    -

    false

    -

    string

    - - - -

    QueryParameter

    -

    timeoutSeconds

    -

    Timeout for the list/watch call.

    -

    false

    -

    integer (int32)

    - - @@ -7378,7 +7316,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    200

    success

    -

    v1beta2.StatefulSetList

    +

    v1beta2.StatefulSet

    @@ -7389,7 +7327,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    • -

      /

      +

      application/json-patch+json

      +
    • +
    • +

      application/merge-patch+json

      +
    • +
    • +

      application/strategic-merge-patch+json

    @@ -7407,12 +7351,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
  • application/vnd.kubernetes.protobuf

  • -
  • -

    application/json;stream=watch

    -
  • -
  • -

    application/vnd.kubernetes.protobuf;stream=watch

    -
  • @@ -7428,10 +7366,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    watch individual changes to a list of DaemonSet

    +

    list or watch objects of kind ReplicaSet

    -
    GET /apis/apps/v1beta2/watch/daemonsets
    +
    GET /apis/apps/v1beta2/replicasets
    @@ -7535,7 +7473,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    200

    success

    -

    v1.WatchEvent

    +

    v1beta2.ReplicaSetList

    @@ -7585,10 +7523,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    watch individual changes to a list of Deployment

    +

    list or watch objects of kind StatefulSet

    -
    GET /apis/apps/v1beta2/watch/deployments
    +
    GET /apis/apps/v1beta2/statefulsets
    @@ -7692,7 +7630,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    200

    success

    -

    v1.WatchEvent

    +

    v1beta2.StatefulSetList

    @@ -7742,10 +7680,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    watch individual changes to a list of DaemonSet

    +

    watch individual changes to a list of DaemonSet

    -
    GET /apis/apps/v1beta2/watch/namespaces/{namespace}/daemonsets
    +
    GET /apis/apps/v1beta2/watch/daemonsets
    @@ -7826,14 +7764,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    integer (int32)

    - -

    PathParameter

    -

    namespace

    -

    object name and auth scope, such as for teams and projects

    -

    true

    -

    string

    - - @@ -7907,10 +7837,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    watch changes to an object of kind DaemonSet

    +

    watch individual changes to a list of Deployment

    -
    GET /apis/apps/v1beta2/watch/namespaces/{namespace}/daemonsets/{name}
    +
    GET /apis/apps/v1beta2/watch/deployments
    @@ -7991,22 +7921,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    integer (int32)

    - -

    PathParameter

    -

    namespace

    -

    object name and auth scope, such as for teams and projects

    -

    true

    -

    string

    - - - -

    PathParameter

    -

    name

    -

    name of the DaemonSet

    -

    true

    -

    string

    - - @@ -8080,10 +7994,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    watch individual changes to a list of Deployment

    +

    watch individual changes to a list of DaemonSet

    -
    GET /apis/apps/v1beta2/watch/namespaces/{namespace}/deployments
    +
    GET /apis/apps/v1beta2/watch/namespaces/{namespace}/daemonsets
    @@ -8245,10 +8159,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    watch changes to an object of kind Deployment

    +

    watch changes to an object of kind DaemonSet

    -
    GET /apis/apps/v1beta2/watch/namespaces/{namespace}/deployments/{name}
    +
    GET /apis/apps/v1beta2/watch/namespaces/{namespace}/daemonsets/{name}
    @@ -8340,7 +8254,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    PathParameter

    name

    -

    name of the Deployment

    +

    name of the DaemonSet

    true

    string

    @@ -8418,10 +8332,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    watch individual changes to a list of ReplicaSet

    +

    watch individual changes to a list of Deployment

    -
    GET /apis/apps/v1beta2/watch/namespaces/{namespace}/replicasets
    +
    GET /apis/apps/v1beta2/watch/namespaces/{namespace}/deployments
    @@ -8583,10 +8497,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    watch changes to an object of kind ReplicaSet

    +

    watch changes to an object of kind Deployment

    -
    GET /apis/apps/v1beta2/watch/namespaces/{namespace}/replicasets/{name}
    +
    GET /apis/apps/v1beta2/watch/namespaces/{namespace}/deployments/{name}
    @@ -8678,7 +8592,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    PathParameter

    name

    -

    name of the ReplicaSet

    +

    name of the Deployment

    true

    string

    @@ -8756,10 +8670,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    watch individual changes to a list of StatefulSet

    +

    watch individual changes to a list of ReplicaSet

    -
    GET /apis/apps/v1beta2/watch/namespaces/{namespace}/statefulsets
    +
    GET /apis/apps/v1beta2/watch/namespaces/{namespace}/replicasets
    @@ -8921,6 +8835,344 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    +

    watch changes to an object of kind ReplicaSet

    +
    +
    +
    GET /apis/apps/v1beta2/watch/namespaces/{namespace}/replicasets/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ReplicaSet

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisappsv1beta2

      +
    • +
    +
    +
    +
    +
    +

    watch individual changes to a list of StatefulSet

    +
    +
    +
    GET /apis/apps/v1beta2/watch/namespaces/{namespace}/statefulsets
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisappsv1beta2

      +
    • +
    +
    +
    +
    +

    watch changes to an object of kind StatefulSet

    @@ -8928,7 +9180,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    Parameters

    +

    Parameters

    @@ -9024,320 +9276,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    • -

      application/json;stream=watch

      -
    • -
    • -

      application/vnd.kubernetes.protobuf;stream=watch

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisappsv1beta2

      -
    • -
    -
    -
    -
    -
    -

    watch individual changes to a list of ReplicaSet

    -
    -
    -
    GET /apis/apps/v1beta2/watch/replicasets
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    • -

      application/json;stream=watch

      -
    • -
    • -

      application/vnd.kubernetes.protobuf;stream=watch

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisappsv1beta2

      -
    • -
    -
    -
    -
    -
    -

    watch individual changes to a list of StatefulSet

    -
    -
    -
    GET /apis/apps/v1beta2/watch/statefulsets
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    -

    Responses

    @@ -9407,6 +9345,320 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    +
    +

    watch individual changes to a list of ReplicaSet

    +
    +
    +
    GET /apis/apps/v1beta2/watch/replicasets
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisappsv1beta2

      +
    • +
    +
    +
    +
    +
    +

    watch individual changes to a list of StatefulSet

    +
    +
    +
    GET /apis/apps/v1beta2/watch/statefulsets
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisappsv1beta2

      +
    • +
    +
    +
    +
    diff --git a/docs/api-reference/batch/v1/definitions.html b/docs/api-reference/batch/v1/definitions.html index 41f42054280..cd8379d48ed 100755 --- a/docs/api-reference/batch/v1/definitions.html +++ b/docs/api-reference/batch/v1/definitions.html @@ -1795,7 +1795,7 @@ When an object is created, the system will populate this list with the current s

    requiredDuringSchedulingIgnoredDuringExecution

    -

    NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm json:"requiredDuringSchedulingRequiredDuringExecution,omitempty" If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    +

    If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    false

    v1.PodAffinityTerm array

    @@ -4063,15 +4063,15 @@ Examples:

    targetWWNs

    -

    Required: FC target worldwide names (WWNs)

    -

    true

    +

    Optional: FC target worldwide names (WWNs)

    +

    false

    string array

    lun

    -

    Required: FC target lun number

    -

    true

    +

    Optional: FC target lun number

    +

    false

    integer (int32)

    @@ -4089,6 +4089,13 @@ Examples:

    boolean

    false

    + +

    wwids

    +

    Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.

    +

    false

    +

    string array

    + + @@ -4118,7 +4125,7 @@ Examples:

    requiredDuringSchedulingIgnoredDuringExecution

    -

    NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm json:"requiredDuringSchedulingRequiredDuringExecution,omitempty" If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    +

    If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    false

    v1.PodAffinityTerm array

    diff --git a/docs/api-reference/batch/v2alpha1/definitions.html b/docs/api-reference/batch/v2alpha1/definitions.html index cf7bb70303e..35debe1686c 100755 --- a/docs/api-reference/batch/v2alpha1/definitions.html +++ b/docs/api-reference/batch/v2alpha1/definitions.html @@ -1795,7 +1795,7 @@ When an object is created, the system will populate this list with the current s

    requiredDuringSchedulingIgnoredDuringExecution

    -

    NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm json:"requiredDuringSchedulingRequiredDuringExecution,omitempty" If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    +

    If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    false

    v1.PodAffinityTerm array

    @@ -4070,15 +4070,15 @@ Examples:

    targetWWNs

    -

    Required: FC target worldwide names (WWNs)

    -

    true

    +

    Optional: FC target worldwide names (WWNs)

    +

    false

    string array

    lun

    -

    Required: FC target lun number

    -

    true

    +

    Optional: FC target lun number

    +

    false

    integer (int32)

    @@ -4096,6 +4096,13 @@ Examples:

    boolean

    false

    + +

    wwids

    +

    Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.

    +

    false

    +

    string array

    + + @@ -4125,7 +4132,7 @@ Examples:

    requiredDuringSchedulingIgnoredDuringExecution

    -

    NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm json:"requiredDuringSchedulingRequiredDuringExecution,omitempty" If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    +

    If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    false

    v1.PodAffinityTerm array

    diff --git a/docs/api-reference/batch/v2alpha1/operations.html b/docs/api-reference/batch/v2alpha1/operations.html index 686480d8174..9d569a8c5c9 100755 --- a/docs/api-reference/batch/v2alpha1/operations.html +++ b/docs/api-reference/batch/v2alpha1/operations.html @@ -1968,10 +1968,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    list or watch objects of kind ScheduledJob

    +

    watch individual changes to a list of CronJob

    -
    GET /apis/batch/v2alpha1/namespaces/{namespace}/scheduledjobs
    +
    GET /apis/batch/v2alpha1/watch/cronjobs
    @@ -2052,14 +2052,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    integer (int32)

    - -

    PathParameter

    -

    namespace

    -

    object name and auth scope, such as for teams and projects

    -

    true

    -

    string

    - - @@ -2083,7 +2075,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    200

    success

    -

    v2alpha1.CronJobList

    +

    v1.WatchEvent

    @@ -2133,10 +2125,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    delete collection of ScheduledJob

    +

    watch individual changes to a list of CronJob

    -
    DELETE /apis/batch/v2alpha1/namespaces/{namespace}/scheduledjobs
    +
    GET /apis/batch/v2alpha1/watch/namespaces/{namespace}/cronjobs
    @@ -2248,7 +2240,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    200

    success

    -

    v1.Status

    +

    v1.WatchEvent

    @@ -2277,6 +2269,12 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
  • application/vnd.kubernetes.protobuf

  • +
  • +

    application/json;stream=watch

    +
  • +
  • +

    application/vnd.kubernetes.protobuf;stream=watch

    +
  • @@ -2292,1529 +2290,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    create a ScheduledJob

    -
    -
    -
    POST /apis/batch/v2alpha1/namespaces/{namespace}/scheduledjobs
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v2alpha1.CronJob

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v2alpha1.CronJob

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisbatchv2alpha1

      -
    • -
    -
    -
    -
    -
    -

    read the specified ScheduledJob

    -
    -
    -
    GET /apis/batch/v2alpha1/namespaces/{namespace}/scheduledjobs/{name}
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    export

    Should this value be exported. Export strips fields that a user can not specify.

    false

    boolean

    QueryParameter

    exact

    Should the export be exact. Exact export maintains cluster-specific fields like Namespace.

    false

    boolean

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ScheduledJob

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v2alpha1.CronJob

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisbatchv2alpha1

      -
    • -
    -
    -
    -
    -
    -

    replace the specified ScheduledJob

    -
    -
    -
    PUT /apis/batch/v2alpha1/namespaces/{namespace}/scheduledjobs/{name}
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v2alpha1.CronJob

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ScheduledJob

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v2alpha1.CronJob

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisbatchv2alpha1

      -
    • -
    -
    -
    -
    -
    -

    delete a ScheduledJob

    -
    -
    -
    DELETE /apis/batch/v2alpha1/namespaces/{namespace}/scheduledjobs/{name}
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.DeleteOptions

    QueryParameter

    gracePeriodSeconds

    The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.

    false

    integer (int32)

    QueryParameter

    orphanDependents

    Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

    false

    boolean

    QueryParameter

    propagationPolicy

    Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.

    false

    string

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ScheduledJob

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1.Status

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisbatchv2alpha1

      -
    • -
    -
    -
    -
    -
    -

    partially update the specified ScheduledJob

    -
    -
    -
    PATCH /apis/batch/v2alpha1/namespaces/{namespace}/scheduledjobs/{name}
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.Patch

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ScheduledJob

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v2alpha1.CronJob

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      application/json-patch+json

      -
    • -
    • -

      application/merge-patch+json

      -
    • -
    • -

      application/strategic-merge-patch+json

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisbatchv2alpha1

      -
    • -
    -
    -
    -
    -
    -

    read status of the specified ScheduledJob

    -
    -
    -
    GET /apis/batch/v2alpha1/namespaces/{namespace}/scheduledjobs/{name}/status
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ScheduledJob

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v2alpha1.CronJob

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisbatchv2alpha1

      -
    • -
    -
    -
    -
    -
    -

    replace status of the specified ScheduledJob

    -
    -
    -
    PUT /apis/batch/v2alpha1/namespaces/{namespace}/scheduledjobs/{name}/status
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v2alpha1.CronJob

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ScheduledJob

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v2alpha1.CronJob

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisbatchv2alpha1

      -
    • -
    -
    -
    -
    -
    -

    partially update status of the specified ScheduledJob

    -
    -
    -
    PATCH /apis/batch/v2alpha1/namespaces/{namespace}/scheduledjobs/{name}/status
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.Patch

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ScheduledJob

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v2alpha1.CronJob

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      application/json-patch+json

      -
    • -
    • -

      application/merge-patch+json

      -
    • -
    • -

      application/strategic-merge-patch+json

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisbatchv2alpha1

      -
    • -
    -
    -
    -
    -
    -

    list or watch objects of kind ScheduledJob

    -
    -
    -
    GET /apis/batch/v2alpha1/scheduledjobs
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v2alpha1.CronJobList

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    • -

      application/json;stream=watch

      -
    • -
    • -

      application/vnd.kubernetes.protobuf;stream=watch

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisbatchv2alpha1

      -
    • -
    -
    -
    -
    -
    -

    watch individual changes to a list of CronJob

    -
    -
    -
    GET /apis/batch/v2alpha1/watch/cronjobs
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    • -

      application/json;stream=watch

      -
    • -
    • -

      application/vnd.kubernetes.protobuf;stream=watch

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisbatchv2alpha1

      -
    • -
    -
    -
    -
    -
    -

    watch individual changes to a list of CronJob

    -
    -
    -
    GET /apis/batch/v2alpha1/watch/namespaces/{namespace}/cronjobs
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    • -

      application/json;stream=watch

      -
    • -
    • -

      application/vnd.kubernetes.protobuf;stream=watch

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisbatchv2alpha1

      -
    • -
    -
    -
    -
    -

    watch changes to an object of kind CronJob

    @@ -3822,7 +2297,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    Parameters

    +

    Parameters

    @@ -3920,7 +2395,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    Responses

    +

    Responses

    @@ -3945,7 +2420,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    Consumes

    +

    Consumes

    • @@ -3955,7 +2430,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    Produces

    +

    Produces

    • @@ -3977,502 +2452,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
    -

    Tags

    -
    -
      -
    • -

      apisbatchv2alpha1

      -
    • -
    -
    -
    - -
    -

    watch individual changes to a list of ScheduledJob

    -
    -
    -
    GET /apis/batch/v2alpha1/watch/namespaces/{namespace}/scheduledjobs
    -
    -
    -
    -

    Parameters

    -
    -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    • -

      application/json;stream=watch

      -
    • -
    • -

      application/vnd.kubernetes.protobuf;stream=watch

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisbatchv2alpha1

      -
    • -
    -
    -
    -
    -
    -

    watch changes to an object of kind ScheduledJob

    -
    -
    -
    GET /apis/batch/v2alpha1/watch/namespaces/{namespace}/scheduledjobs/{name}
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the ScheduledJob

    true

    string

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    • -

      application/json;stream=watch

      -
    • -
    • -

      application/vnd.kubernetes.protobuf;stream=watch

      -
    • -
    -
    -
    -
    -

    Tags

    -
    -
      -
    • -

      apisbatchv2alpha1

      -
    • -
    -
    -
    -
    -
    -

    watch individual changes to a list of ScheduledJob

    -
    -
    -
    GET /apis/batch/v2alpha1/watch/scheduledjobs
    -
    -
    -
    -

    Parameters

    - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    - -
    -
    -

    Responses

    - ----- - - - - - - - - - - - - - - -
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    - -
    -
    -

    Consumes

    -
    -
      -
    • -

      /

      -
    • -
    -
    -
    -
    -

    Produces

    -
    -
      -
    • -

      application/json

      -
    • -
    • -

      application/yaml

      -
    • -
    • -

      application/vnd.kubernetes.protobuf

      -
    • -
    • -

      application/json;stream=watch

      -
    • -
    • -

      application/vnd.kubernetes.protobuf;stream=watch

      -
    • -
    -
    -
    -
    -

    Tags

    +

    Tags

    • diff --git a/docs/api-reference/extensions/v1beta1/definitions.html b/docs/api-reference/extensions/v1beta1/definitions.html index 40a6afd78f3..f3cd2f322ae 100755 --- a/docs/api-reference/extensions/v1beta1/definitions.html +++ b/docs/api-reference/extensions/v1beta1/definitions.html @@ -2779,7 +2779,7 @@ When an object is created, the system will populate this list with the current s

      requiredDuringSchedulingIgnoredDuringExecution

      -

      NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm json:"requiredDuringSchedulingRequiredDuringExecution,omitempty" If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

      +

      If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

      false

      v1.PodAffinityTerm array

      @@ -3002,6 +3002,9 @@ When an object is created, the system will populate this list with the current s

    v1beta1.RollbackConfig

    +
    +

    DEPRECATED.

    +
    @@ -4139,7 +4142,7 @@ When an object is created, the system will populate this list with the current s - + @@ -5582,7 +5585,7 @@ Examples:

    v1beta1.DeploymentRollback

    -

    DeploymentRollback stores the information required to rollback a deployment.

    +

    DEPRECATED. DeploymentRollback stores the information required to rollback a deployment.

    rollbackTo

    The config this deployment is rolling back to. Will be cleared after rollback is done.

    DEPRECATED. The config this deployment is rolling back to. Will be cleared after rollback is done.

    false

    v1beta1.RollbackConfig

    @@ -5707,15 +5710,15 @@ Examples:
    - - + + - - + + @@ -5733,6 +5736,13 @@ Examples:
    + + + + + + +

    targetWWNs

    Required: FC target worldwide names (WWNs)

    true

    Optional: FC target worldwide names (WWNs)

    false

    string array

    lun

    Required: FC target lun number

    true

    Optional: FC target lun number

    false

    integer (int32)

    boolean

    false

    wwids

    Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.

    false

    string array

    @@ -5762,7 +5772,7 @@ Examples:

    requiredDuringSchedulingIgnoredDuringExecution

    -

    NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm json:"requiredDuringSchedulingRequiredDuringExecution,omitempty" If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    +

    If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    false

    v1.PodAffinityTerm array

    diff --git a/docs/api-reference/rbac.authorization.k8s.io/v1/definitions.html b/docs/api-reference/rbac.authorization.k8s.io/v1/definitions.html new file mode 100755 index 00000000000..a24d8879625 --- /dev/null +++ b/docs/api-reference/rbac.authorization.k8s.io/v1/definitions.html @@ -0,0 +1,1867 @@ + + + + + + +Top Level API Objects + + + + +
    + +
    +

    Definitions

    +
    +
    +

    v1.APIResourceList

    +
    +

    APIResourceList is a list of APIResource, it is used to expose the name of the resources supported in a specific group and version, and if the resource is namespaced.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    kind

    Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

    false

    string

    apiVersion

    APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

    false

    string

    groupVersion

    groupVersion is the group and version this APIResourceList is for.

    true

    string

    resources

    resources contains the name of the resources and if they are namespaced.

    true

    v1.APIResource array

    + +
    +
    +

    v1.Patch

    +
    +

    Patch is provided to give a concrete name and type to the Kubernetes PATCH request body.

    +
    +
    +
    +

    v1.ClusterRoleBinding

    +
    +

    ClusterRoleBinding references a ClusterRole, but not contain it. It can reference a ClusterRole in the global namespace, and adds who information via Subject.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    kind

    Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

    false

    string

    apiVersion

    APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

    false

    string

    metadata

    Standard object’s metadata.

    false

    v1.ObjectMeta

    subjects

    Subjects holds references to the objects the role applies to.

    true

    v1.Subject array

    roleRef

    RoleRef can only reference a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error.

    true

    v1.RoleRef

    + +
    +
    +

    v1.DeleteOptions

    +
    +

    DeleteOptions may be provided when deleting an API object.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    kind

    Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

    false

    string

    apiVersion

    APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

    false

    string

    gracePeriodSeconds

    The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.

    false

    integer (int64)

    preconditions

    Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned.

    false

    v1.Preconditions

    orphanDependents

    Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

    false

    boolean

    false

    propagationPolicy

    Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.

    false

    v1.DeletionPropagation

    + +
    +
    +

    v1.ListMeta

    +
    +

    ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    selfLink

    SelfLink is a URL representing this object. Populated by the system. Read-only.

    false

    string

    resourceVersion

    String that identifies the server’s internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency

    false

    string

    + +
    +
    +

    v1.StatusDetails

    +
    +

    StatusDetails is a set of additional properties that MAY be set by the server to provide additional information about a response. The Reason field of a Status object defines what attributes will be set. Clients must ignore fields that do not match the defined type of each attribute, and should assume that any attribute may be empty, invalid, or under defined.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    name

    The name attribute of the resource associated with the status StatusReason (when there is a single name which can be described).

    false

    string

    group

    The group attribute of the resource associated with the status StatusReason.

    false

    string

    kind

    The kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

    false

    string

    uid

    UID of the resource. (when there is a single resource which can be described). More info: http://kubernetes.io/docs/user-guide/identifiers#uids

    false

    string

    causes

    The Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes.

    false

    v1.StatusCause array

    retryAfterSeconds

    If specified, the time in seconds before the operation should be retried. Some errors may indicate the client must take an alternate action - for those errors this field may indicate how long to wait before taking the alternate action.

    false

    integer (int32)

    + +
    +
    +

    v1.RoleRef

    +
    +

    RoleRef contains information that points to the role being used

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    apiGroup

    APIGroup is the group for the resource being referenced

    true

    string

    kind

    Kind is the type of resource being referenced

    true

    string

    name

    Name is the name of resource being referenced

    true

    string

    + +
    +
    +

    v1.RoleBindingList

    +
    +

    RoleBindingList is a collection of RoleBindings

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    kind

    Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

    false

    string

    apiVersion

    APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

    false

    string

    metadata

    Standard object’s metadata.

    false

    v1.ListMeta

    items

    Items is a list of RoleBindings

    true

    v1.RoleBinding array

    + +
    +
    +

    v1.Preconditions

    +
    +

    Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    uid

    Specifies the target UID.

    false

    types.UID

    + +
    +
    +

    v1.Initializers

    +
    +

    Initializers tracks the progress of initialization.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    pending

    Pending is a list of initializers that must execute in order before this object is visible. When the last pending initializer is removed, and no failing result is set, the initializers struct will be set to nil and the object is considered as initialized and visible to all clients.

    true

    v1.Initializer array

    result

    If result is set with the Failure field, the object will be persisted to storage and then deleted, ensuring that other clients can observe the deletion.

    false

    v1.Status

    + +
    +
    +

    v1.Initializer

    +
    +

    Initializer is information about an initializer that has not yet completed.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    name

    name of the process that is responsible for initializing this object.

    true

    string

    + +
    +
    +

    v1.ClusterRole

    +
    +

    ClusterRole is a cluster level, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding or ClusterRoleBinding.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    kind

    Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

    false

    string

    apiVersion

    APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

    false

    string

    metadata

    Standard object’s metadata.

    false

    v1.ObjectMeta

    rules

    Rules holds all the PolicyRules for this ClusterRole

    true

    v1.PolicyRule array

    + +
    +
    +

    v1.Status

    +
    +

    Status is a return value for calls that don’t return other objects.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    kind

    Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

    false

    string

    apiVersion

    APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

    false

    string

    metadata

    Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

    false

    v1.ListMeta

    status

    Status of the operation. One of: "Success" or "Failure". More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status

    false

    string

    message

    A human-readable description of the status of this operation.

    false

    string

    reason

    A machine-readable description of why this operation is in the "Failure" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.

    false

    string

    details

    Extended data associated with the reason. Each reason may define its own extended details. This field is optional and the data returned is not guaranteed to conform to any schema except that defined by the reason type.

    false

    v1.StatusDetails

    code

    Suggested HTTP return code for this status, 0 if not set.

    false

    integer (int32)

    + +
    +
    +

    v1.Subject

    +
    +

    Subject contains a reference to the object or user identities a role binding applies to. This can either hold a direct API object reference, or a value for non-objects such as user and group names.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    kind

    Kind of object being referenced. Values defined by this API group are "User", "Group", and "ServiceAccount". If the Authorizer does not recognized the kind value, the Authorizer should report an error.

    true

    string

    apiGroup

    APIGroup holds the API group of the referenced subject. Defaults to "" for ServiceAccount subjects. Defaults to "rbac.authorization.k8s.io" for User and Group subjects.

    false

    string

    name

    Name of the object being referenced.

    true

    string

    namespace

    Namespace of the referenced object. If the object kind is non-namespace, such as "User" or "Group", and this value is not empty the Authorizer should report an error.

    false

    string

    + +
    +
    +

    v1.WatchEvent

    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    type

    true

    string

    object

    true

    string

    + +
    +
    +

    v1.RoleBinding

    +
    +

    RoleBinding references a role, but does not contain it. It can reference a Role in the same namespace or a ClusterRole in the global namespace. It adds who information via Subjects and namespace information by which namespace it exists in. RoleBindings in a given namespace only have effect in that namespace.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    kind

    Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

    false

    string

    apiVersion

    APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

    false

    string

    metadata

    Standard object’s metadata.

    false

    v1.ObjectMeta

    subjects

    Subjects holds references to the objects the role applies to.

    true

    v1.Subject array

    roleRef

    RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error.

    true

    v1.RoleRef

    + +
    +
    +

    v1.ObjectMeta

    +
    +

    ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    name

    Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names

    false

    string

    generateName

    GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.
    +
    +If this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header).
    +
    +Applied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency

    false

    string

    namespace

    Namespace defines the space within each name must be unique. An empty namespace is equivalent to the "default" namespace, but "default" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty.
    +
    +Must be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces

    false

    string

    selfLink

    SelfLink is a URL representing this object. Populated by the system. Read-only.

    false

    string

    uid

    UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations.
    +
    +Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids

    false

    string

    resourceVersion

    An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.
    +
    +Populated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency

    false

    string

    generation

    A sequence number representing a specific generation of the desired state. Populated by the system. Read-only.

    false

    integer (int64)

    creationTimestamp

    CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC.
    +
    +Populated by the system. Read-only. Null for lists. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata

    false

    string

    deletionTimestamp

    DeletionTimestamp is RFC 3339 date and time at which this resource will be deleted. This field is set by the server when a graceful deletion is requested by the user, and is not directly settable by a client. The resource is expected to be deleted (no longer visible from resource lists, and not reachable by name) after the time in this field. Once set, this value may not be unset or be set further into the future, although it may be shortened or the resource may be deleted prior to this time. For example, a user may request that a pod is deleted in 30 seconds. The Kubelet will react by sending a graceful termination signal to the containers in the pod. After that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL) to the container and after cleanup, remove the pod from the API. In the presence of network partitions, this object may still exist after this timestamp, until an administrator or automated process can determine the resource is fully terminated. If not set, graceful deletion of the object has not been requested.
    +
    +Populated by the system when a graceful deletion is requested. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata

    false

    string

    deletionGracePeriodSeconds

    Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only.

    false

    integer (int64)

    labels

    Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels

    false

    object

    annotations

    Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations

    false

    object

    ownerReferences

    List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller.

    false

    v1.OwnerReference array

    initializers

    An initializer is a controller which enforces some system invariant at object creation time. This field is a list of initializers that have not yet acted on this object. If nil or empty, this object has been completely initialized. Otherwise, the object is considered uninitialized and is hidden (in list/watch and get calls) from clients that haven’t explicitly asked to observe uninitialized objects.
    +
    +When an object is created, the system will populate this list with the current set of initializers. Only privileged users may set or modify this list. Once it is empty, it may not be modified further by any user.

    false

    v1.Initializers

    finalizers

    Must be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed.

    false

    string array

    clusterName

    The name of the cluster which the object belongs to. This is used to distinguish resources with same name and namespace in different clusters. This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request.

    false

    string

    + +
    +
    +

    v1.OwnerReference

    +
    +

    OwnerReference contains enough information to let you identify an owning object. Currently, an owning object must be in the same namespace, so there is no namespace field.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    apiVersion

    API version of the referent.

    true

    string

    kind

    Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

    true

    string

    name

    Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names

    true

    string

    uid

    UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids

    true

    string

    controller

    If true, this reference points to the managing controller.

    false

    boolean

    false

    blockOwnerDeletion

    If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.

    false

    boolean

    false

    + +
    +
    +

    v1.ClusterRoleBindingList

    +
    +

    ClusterRoleBindingList is a collection of ClusterRoleBindings

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    kind

    Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

    false

    string

    apiVersion

    APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

    false

    string

    metadata

    Standard object’s metadata.

    false

    v1.ListMeta

    items

    Items is a list of ClusterRoleBindings

    true

    v1.ClusterRoleBinding array

    + +
    +
    +

    v1.Role

    +
    +

    Role is a namespaced, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    kind

    Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

    false

    string

    apiVersion

    APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

    false

    string

    metadata

    Standard object’s metadata.

    false

    v1.ObjectMeta

    rules

    Rules holds all the PolicyRules for this Role

    true

    v1.PolicyRule array

    + +
    +
    +

    v1.APIResource

    +
    +

    APIResource specifies the name of a resource and whether it is namespaced.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    name

    name is the plural name of the resource.

    true

    string

    singularName

    singularName is the singular name of the resource. This allows clients to handle plural and singular opaquely. The singularName is more correct for reporting status on a single item and both singular and plural are allowed from the kubectl CLI interface.

    true

    string

    namespaced

    namespaced indicates if a resource is namespaced or not.

    true

    boolean

    false

    kind

    kind is the kind for the resource (e.g. Foo is the kind for a resource foo)

    true

    string

    verbs

    verbs is a list of supported kube verbs (this includes get, list, watch, create, update, patch, delete, deletecollection, and proxy)

    true

    string array

    shortNames

    shortNames is a list of suggested short names of the resource.

    false

    string array

    categories

    categories is a list of the grouped resources this resource belongs to (e.g. all)

    false

    string array

    + +
    +
    +

    v1.ClusterRoleList

    +
    +

    ClusterRoleList is a collection of ClusterRoles

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    kind

    Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

    false

    string

    apiVersion

    APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

    false

    string

    metadata

    Standard object’s metadata.

    false

    v1.ListMeta

    items

    Items is a list of ClusterRoles

    true

    v1.ClusterRole array

    + +
    +
    +

    types.UID

    + +
    +
    +

    v1.RoleList

    +
    +

    RoleList is a collection of Roles

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    kind

    Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

    false

    string

    apiVersion

    APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

    false

    string

    metadata

    Standard object’s metadata.

    false

    v1.ListMeta

    items

    Items is a list of Roles

    true

    v1.Role array

    + +
    +
    +

    v1.StatusCause

    +
    +

    StatusCause provides more information about an api.Status failure, including cases when multiple errors are encountered.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    reason

    A machine-readable description of the cause of the error. If this value is empty there is no information available.

    false

    string

    message

    A human-readable description of the cause of the error. This field may be presented as-is to a reader.

    false

    string

    field

    The field of the resource that has caused this error, as named by its JSON serialization. May include dot and postfix notation for nested attributes. Arrays are zero-indexed. Fields may appear more than once in an array of causes due to fields having multiple errors. Optional.
    +
    +Examples:
    + "name" - the field "name" on the current resource
    + "items[0].name" - the field "name" on the first array entry in "items"

    false

    string

    + +
    +
    +

    v1.DeletionPropagation

    + +
    +
    +

    v1.PolicyRule

    +
    +

    PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    verbs

    Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds.

    true

    string array

    apiGroups

    APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed.

    false

    string array

    resources

    Resources is a list of resources this rule applies to. ResourceAll represents all resources.

    false

    string array

    resourceNames

    ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed.

    false

    string array

    nonResourceURLs

    NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both.

    false

    string array

    + +
    +
    +

    any

    +
    +

    Represents an untyped JSON map - see the description of the field for more info about the structure of this object.

    +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/docs/api-reference/rbac.authorization.k8s.io/v1/operations.html b/docs/api-reference/rbac.authorization.k8s.io/v1/operations.html new file mode 100755 index 00000000000..4832546ae3a --- /dev/null +++ b/docs/api-reference/rbac.authorization.k8s.io/v1/operations.html @@ -0,0 +1,6182 @@ + + + + + + +Operations + + + + +
    +
    +

    Operations

    +
    +
    +

    get available resources

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1
    +
    +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    default

    success

    v1.APIResourceList

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    list or watch objects of kind ClusterRoleBinding

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/clusterrolebindings
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.ClusterRoleBindingList

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    delete collection of ClusterRoleBinding

    +
    +
    +
    DELETE /apis/rbac.authorization.k8s.io/v1/clusterrolebindings
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.Status

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    create a ClusterRoleBinding

    +
    +
    +
    POST /apis/rbac.authorization.k8s.io/v1/clusterrolebindings
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.ClusterRoleBinding

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.ClusterRoleBinding

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    read the specified ClusterRoleBinding

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/clusterrolebindings/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    PathParameter

    name

    name of the ClusterRoleBinding

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.ClusterRoleBinding

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    replace the specified ClusterRoleBinding

    +
    +
    +
    PUT /apis/rbac.authorization.k8s.io/v1/clusterrolebindings/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.ClusterRoleBinding

    PathParameter

    name

    name of the ClusterRoleBinding

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.ClusterRoleBinding

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    delete a ClusterRoleBinding

    +
    +
    +
    DELETE /apis/rbac.authorization.k8s.io/v1/clusterrolebindings/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.DeleteOptions

    QueryParameter

    gracePeriodSeconds

    The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.

    false

    integer (int32)

    QueryParameter

    orphanDependents

    Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

    false

    boolean

    QueryParameter

    propagationPolicy

    Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.

    false

    string

    PathParameter

    name

    name of the ClusterRoleBinding

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.Status

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    partially update the specified ClusterRoleBinding

    +
    +
    +
    PATCH /apis/rbac.authorization.k8s.io/v1/clusterrolebindings/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.Patch

    PathParameter

    name

    name of the ClusterRoleBinding

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.ClusterRoleBinding

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      application/json-patch+json

      +
    • +
    • +

      application/merge-patch+json

      +
    • +
    • +

      application/strategic-merge-patch+json

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    list or watch objects of kind ClusterRole

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/clusterroles
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.ClusterRoleList

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    delete collection of ClusterRole

    +
    +
    +
    DELETE /apis/rbac.authorization.k8s.io/v1/clusterroles
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.Status

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    create a ClusterRole

    +
    +
    +
    POST /apis/rbac.authorization.k8s.io/v1/clusterroles
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.ClusterRole

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.ClusterRole

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    read the specified ClusterRole

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/clusterroles/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    PathParameter

    name

    name of the ClusterRole

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.ClusterRole

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    replace the specified ClusterRole

    +
    +
    +
    PUT /apis/rbac.authorization.k8s.io/v1/clusterroles/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.ClusterRole

    PathParameter

    name

    name of the ClusterRole

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.ClusterRole

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    delete a ClusterRole

    +
    +
    +
    DELETE /apis/rbac.authorization.k8s.io/v1/clusterroles/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.DeleteOptions

    QueryParameter

    gracePeriodSeconds

    The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.

    false

    integer (int32)

    QueryParameter

    orphanDependents

    Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

    false

    boolean

    QueryParameter

    propagationPolicy

    Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.

    false

    string

    PathParameter

    name

    name of the ClusterRole

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.Status

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    partially update the specified ClusterRole

    +
    +
    +
    PATCH /apis/rbac.authorization.k8s.io/v1/clusterroles/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.Patch

    PathParameter

    name

    name of the ClusterRole

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.ClusterRole

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      application/json-patch+json

      +
    • +
    • +

      application/merge-patch+json

      +
    • +
    • +

      application/strategic-merge-patch+json

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    list or watch objects of kind RoleBinding

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolebindings
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.RoleBindingList

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    delete collection of RoleBinding

    +
    +
    +
    DELETE /apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolebindings
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.Status

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    create a RoleBinding

    +
    +
    +
    POST /apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolebindings
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.RoleBinding

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.RoleBinding

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    read the specified RoleBinding

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolebindings/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the RoleBinding

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.RoleBinding

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    replace the specified RoleBinding

    +
    +
    +
    PUT /apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolebindings/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.RoleBinding

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the RoleBinding

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.RoleBinding

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    delete a RoleBinding

    +
    +
    +
    DELETE /apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolebindings/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.DeleteOptions

    QueryParameter

    gracePeriodSeconds

    The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.

    false

    integer (int32)

    QueryParameter

    orphanDependents

    Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

    false

    boolean

    QueryParameter

    propagationPolicy

    Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.

    false

    string

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the RoleBinding

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.Status

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    partially update the specified RoleBinding

    +
    +
    +
    PATCH /apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolebindings/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.Patch

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the RoleBinding

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.RoleBinding

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      application/json-patch+json

      +
    • +
    • +

      application/merge-patch+json

      +
    • +
    • +

      application/strategic-merge-patch+json

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    list or watch objects of kind Role

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/roles
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.RoleList

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    delete collection of Role

    +
    +
    +
    DELETE /apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/roles
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.Status

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    create a Role

    +
    +
    +
    POST /apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/roles
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.Role

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.Role

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    read the specified Role

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/roles/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the Role

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.Role

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    replace the specified Role

    +
    +
    +
    PUT /apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/roles/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.Role

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the Role

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.Role

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    delete a Role

    +
    +
    +
    DELETE /apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/roles/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.DeleteOptions

    QueryParameter

    gracePeriodSeconds

    The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.

    false

    integer (int32)

    QueryParameter

    orphanDependents

    Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

    false

    boolean

    QueryParameter

    propagationPolicy

    Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy.

    false

    string

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the Role

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.Status

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    partially update the specified Role

    +
    +
    +
    PATCH /apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/roles/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    BodyParameter

    body

    true

    v1.Patch

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the Role

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.Role

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      application/json-patch+json

      +
    • +
    • +

      application/merge-patch+json

      +
    • +
    • +

      application/strategic-merge-patch+json

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    list or watch objects of kind RoleBinding

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/rolebindings
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.RoleBindingList

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    list or watch objects of kind Role

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/roles
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.RoleList

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    watch individual changes to a list of ClusterRoleBinding

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/watch/clusterrolebindings
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    watch changes to an object of kind ClusterRoleBinding

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/watch/clusterrolebindings/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    PathParameter

    name

    name of the ClusterRoleBinding

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    watch individual changes to a list of ClusterRole

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/watch/clusterroles
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    watch changes to an object of kind ClusterRole

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/watch/clusterroles/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    PathParameter

    name

    name of the ClusterRole

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    watch individual changes to a list of RoleBinding

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/rolebindings
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    watch changes to an object of kind RoleBinding

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/rolebindings/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the RoleBinding

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    watch individual changes to a list of Role

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/roles
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    watch changes to an object of kind Role

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/roles/{name}
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    PathParameter

    namespace

    object name and auth scope, such as for teams and projects

    true

    string

    PathParameter

    name

    name of the Role

    true

    string

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    watch individual changes to a list of RoleBinding

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/watch/rolebindings
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +

    watch individual changes to a list of Role

    +
    +
    +
    GET /apis/rbac.authorization.k8s.io/v1/watch/roles
    +
    +
    +
    +

    Parameters

    + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescriptionRequiredSchemaDefault

    QueryParameter

    pretty

    If true, then the output is pretty printed.

    false

    string

    QueryParameter

    labelSelector

    A selector to restrict the list of returned objects by their labels. Defaults to everything.

    false

    string

    QueryParameter

    fieldSelector

    A selector to restrict the list of returned objects by their fields. Defaults to everything.

    false

    string

    QueryParameter

    includeUninitialized

    If true, partially initialized resources are included in the response.

    false

    boolean

    QueryParameter

    watch

    Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.

    false

    boolean

    QueryParameter

    resourceVersion

    When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it’s 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.

    false

    string

    QueryParameter

    timeoutSeconds

    Timeout for the list/watch call.

    false

    integer (int32)

    + +
    +
    +

    Responses

    + +++++ + + + + + + + + + + + + + + +
    HTTP CodeDescriptionSchema

    200

    success

    v1.WatchEvent

    + +
    +
    +

    Consumes

    +
    +
      +
    • +

      /

      +
    • +
    +
    +
    +
    +

    Produces

    +
    +
      +
    • +

      application/json

      +
    • +
    • +

      application/yaml

      +
    • +
    • +

      application/vnd.kubernetes.protobuf

      +
    • +
    • +

      application/json;stream=watch

      +
    • +
    • +

      application/vnd.kubernetes.protobuf;stream=watch

      +
    • +
    +
    +
    +
    +

    Tags

    +
    +
      +
    • +

      apisrbac.authorization.k8s.iov1

      +
    • +
    +
    +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/docs/api-reference/settings.k8s.io/v1alpha1/definitions.html b/docs/api-reference/settings.k8s.io/v1alpha1/definitions.html index 9b59e8f261a..15684ebcd0f 100755 --- a/docs/api-reference/settings.k8s.io/v1alpha1/definitions.html +++ b/docs/api-reference/settings.k8s.io/v1alpha1/definitions.html @@ -1152,15 +1152,15 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    targetWWNs

    -

    Required: FC target worldwide names (WWNs)

    -

    true

    +

    Optional: FC target worldwide names (WWNs)

    +

    false

    string array

    lun

    -

    Required: FC target lun number

    -

    true

    +

    Optional: FC target lun number

    +

    false

    integer (int32)

    @@ -1178,6 +1178,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    boolean

    false

    + +

    wwids

    +

    Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.

    +

    false

    +

    string array

    + + diff --git a/docs/api-reference/v1/definitions.html b/docs/api-reference/v1/definitions.html index 9f1866413d2..2279a9fbe9a 100755 --- a/docs/api-reference/v1/definitions.html +++ b/docs/api-reference/v1/definitions.html @@ -403,6 +403,9 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

    v1.Node

  • +

    v1.NodeConfigSource

    +
  • +
  • v1.NodeList

  • @@ -3103,7 +3106,7 @@ When an object is created, the system will populate this list with the current s

    requiredDuringSchedulingIgnoredDuringExecution

    -

    NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm json:"requiredDuringSchedulingRequiredDuringExecution,omitempty" If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    +

    If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    false

    v1.PodAffinityTerm array

    @@ -3187,6 +3190,47 @@ When an object is created, the system will populate this list with the current s +
  • +
    +

    v1.PersistentVolumeClaimVolumeSource

    +
    +

    PersistentVolumeClaimVolumeSource references the user’s PVC in the same namespace. This volume finds the bound PV and mounts that volume for the pod. A PersistentVolumeClaimVolumeSource is, essentially, a wrapper around another type of volume that is owned by someone else (the system).

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    claimName

    ClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims

    true

    string

    readOnly

    Will force the ReadOnly setting in VolumeMounts. Default false.

    false

    boolean

    false

    +

    v1.NodeAddress

    @@ -3372,47 +3416,6 @@ When an object is created, the system will populate this list with the current s -
    -
    -

    v1.PersistentVolumeClaimVolumeSource

    -
    -

    PersistentVolumeClaimVolumeSource references the user’s PVC in the same namespace. This volume finds the bound PV and mounts that volume for the pod. A PersistentVolumeClaimVolumeSource is, essentially, a wrapper around another type of volume that is owned by someone else (the system).

    -
    - ------- - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameDescriptionRequiredSchemaDefault

    claimName

    ClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims

    true

    string

    readOnly

    Will force the ReadOnly setting in VolumeMounts. Default false.

    false

    boolean

    false

    -

    v1.ResourceQuotaList

    @@ -6693,15 +6696,15 @@ Examples:

    targetWWNs

    -

    Required: FC target worldwide names (WWNs)

    -

    true

    +

    Optional: FC target worldwide names (WWNs)

    +

    false

    string array

    lun

    -

    Required: FC target lun number

    -

    true

    +

    Optional: FC target lun number

    +

    false

    integer (int32)

    @@ -6719,6 +6722,13 @@ Examples:

    boolean

    false

    + +

    wwids

    +

    Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.

    +

    false

    +

    string array

    + + @@ -6748,7 +6758,7 @@ Examples:

    requiredDuringSchedulingIgnoredDuringExecution

    -

    NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm json:"requiredDuringSchedulingRequiredDuringExecution,omitempty" If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    +

    If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    false

    v1.PodAffinityTerm array

    @@ -9785,6 +9795,54 @@ Examples:

    v1.AzureDataDiskKind

    +
    +
    +

    v1.NodeConfigSource

    +
    +

    NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.

    +
    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionRequiredSchemaDefault

    kind

    Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

    false

    string

    apiVersion

    APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

    false

    string

    configMapRef

    false

    v1.ObjectReference

    +

    v1.ConfigMapKeySelector

    @@ -10031,6 +10089,13 @@ Examples:

    integer (int32)

    + +

    publishNotReadyAddresses

    +

    publishNotReadyAddresses, when set to true, indicates that DNS implementations must publish the notReadyAddresses of subsets for the Endpoints associated with the Service. The default value is false. The primary use case for setting this field is to use a StatefulSet’s Headless Service to propagate SRV records for its Pods without respect to their readiness for purpose of peer discovery. This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints when that annotation is deprecated and all clients have been converted to use this field.

    +

    false

    +

    boolean

    +

    false

    + @@ -10155,6 +10220,13 @@ Examples:

    v1.Taint array

    + +

    configSource

    +

    If specified, the source to get node configuration from The DynamicKubeletConfig feature gate must be enabled for the Kubelet to use this field

    +

    false

    +

    v1.NodeConfigSource

    + + diff --git a/examples/BUILD b/examples/BUILD index 2ce21e40872..0f28a3505d5 100644 --- a/examples/BUILD +++ b/examples/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -29,13 +27,11 @@ filegroup( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) go_test( name = "go_default_xtest", srcs = ["examples_test.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", diff --git a/examples/explorer/BUILD b/examples/explorer/BUILD index 562838d55ce..b41545907ab 100644 --- a/examples/explorer/BUILD +++ b/examples/explorer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "explorer", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["explorer.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/davecgh/go-spew/spew:go_default_library"], ) diff --git a/examples/guestbook-go/BUILD b/examples/guestbook-go/BUILD index c24a6d7bb4f..57c14be5b4e 100644 --- a/examples/guestbook-go/BUILD +++ b/examples/guestbook-go/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "guestbook-go", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/codegangsta/negroni:go_default_library", "//vendor/github.com/gorilla/mux:go_default_library", diff --git a/examples/https-nginx/BUILD b/examples/https-nginx/BUILD index b8cd0357b5d..c90e914c53b 100644 --- a/examples/https-nginx/BUILD +++ b/examples/https-nginx/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "https-nginx", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["make_secret.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", diff --git a/examples/sharing-clusters/BUILD b/examples/sharing-clusters/BUILD index 4405a0ab4ca..9ad1b2d305b 100644 --- a/examples/sharing-clusters/BUILD +++ b/examples/sharing-clusters/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "sharing-clusters", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["make_secret.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/federation/BUILD b/federation/BUILD index 329a757f39e..74eff0ad0b2 100644 --- a/federation/BUILD +++ b/federation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load("@io_bazel//tools/build_defs/pkg:pkg.bzl", "pkg_tar") filegroup( diff --git a/federation/apis/core/BUILD b/federation/apis/core/BUILD index 2aca7242cd0..61f05058408 100644 --- a/federation/apis/core/BUILD +++ b/federation/apis/core/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["register.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", diff --git a/federation/apis/core/install/BUILD b/federation/apis/core/install/BUILD index af13fc7f14b..f85439351a3 100644 --- a/federation/apis/core/install/BUILD +++ b/federation/apis/core/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//federation/apis/core:go_default_library", "//federation/apis/core/v1:go_default_library", diff --git a/federation/apis/core/v1/BUILD b/federation/apis/core/v1/BUILD index 41a1c35583b..b17cfd854f8 100644 --- a/federation/apis/core/v1/BUILD +++ b/federation/apis/core/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "register.go", "zz_generated.conversion.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/federation/apis/federation/BUILD b/federation/apis/federation/BUILD index f3be811bd45..0afb2d90b77 100644 --- a/federation/apis/federation/BUILD +++ b/federation/apis/federation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/federation/apis/federation/install/BUILD b/federation/apis/federation/install/BUILD index b8260f07026..c00f6011194 100644 --- a/federation/apis/federation/install/BUILD +++ b/federation/apis/federation/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//federation/apis/federation/v1beta1:go_default_library", @@ -27,7 +24,6 @@ go_test( name = "go_default_test", srcs = ["install_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//federation/apis/federation/v1beta1:go_default_library", diff --git a/federation/apis/federation/v1beta1/BUILD b/federation/apis/federation/v1beta1/BUILD index 1044467c914..9db2ea32cf7 100644 --- a/federation/apis/federation/v1beta1/BUILD +++ b/federation/apis/federation/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -22,7 +20,6 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//pkg/api:go_default_library", @@ -49,3 +46,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/federation/apis/federation/v1beta1/types.go b/federation/apis/federation/v1beta1/types.go index 7451438a7dc..b8c9cca3fdb 100644 --- a/federation/apis/federation/v1beta1/types.go +++ b/federation/apis/federation/v1beta1/types.go @@ -154,4 +154,8 @@ const ( // FederationClusterSelectorAnnotation is used to determine placement of objects on federated clusters FederationClusterSelectorAnnotation string = "federation.alpha.kubernetes.io/cluster-selector" + + // FederationOnlyClusterSelector is the cluster selector to indicate any object in + // federation having this annotation should not be synced to federated clusters. + FederationOnlyClusterSelector string = "federation.kubernetes.io/federation-control-plane=true" ) diff --git a/federation/apis/federation/validation/BUILD b/federation/apis/federation/validation/BUILD index 572f6be517c..58ba2b9ff0f 100644 --- a/federation/apis/federation/validation/BUILD +++ b/federation/apis/federation/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//pkg/api/validation:go_default_library", @@ -23,7 +20,6 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//pkg/api:go_default_library", diff --git a/federation/apis/openapi-spec/swagger.json b/federation/apis/openapi-spec/swagger.json index 3348e64685e..6991d095ace 100644 --- a/federation/apis/openapi-spec/swagger.json +++ b/federation/apis/openapi-spec/swagger.json @@ -10377,17 +10377,13 @@ }, "io.k8s.api.core.v1.FCVolumeSource": { "description": "Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write once. Fibre Channel volumes support ownership management and SELinux relabeling.", - "required": [ - "targetWWNs", - "lun" - ], "properties": { "fsType": { "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", "type": "string" }, "lun": { - "description": "Required: FC target lun number", + "description": "Optional: FC target lun number", "type": "integer", "format": "int32" }, @@ -10396,7 +10392,14 @@ "type": "boolean" }, "targetWWNs": { - "description": "Required: FC target worldwide names (WWNs)", + "description": "Optional: FC target worldwide names (WWNs)", + "type": "array", + "items": { + "type": "string" + } + }, + "wwids": { + "description": "Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.", "type": "array", "items": { "type": "string" @@ -11002,7 +11005,7 @@ } }, "requiredDuringSchedulingIgnoredDuringExecution": { - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", + "description": "If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", "type": "array", "items": { "$ref": "#/definitions/io.k8s.api.core.v1.PodAffinityTerm" @@ -11041,7 +11044,7 @@ } }, "requiredDuringSchedulingIgnoredDuringExecution": { - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", + "description": "If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", "type": "array", "items": { "$ref": "#/definitions/io.k8s.api.core.v1.PodAffinityTerm" @@ -11850,6 +11853,10 @@ "x-kubernetes-patch-merge-key": "port", "x-kubernetes-patch-strategy": "merge" }, + "publishNotReadyAddresses": { + "description": "publishNotReadyAddresses, when set to true, indicates that DNS implementations must publish the notReadyAddresses of subsets for the Endpoints associated with the Service. The default value is false. The primary use case for setting this field is to use a StatefulSet's Headless Service to propagate SRV records for its Pods without respect to their readiness for purpose of peer discovery. This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints when that annotation is deprecated and all clients have been converted to use this field.", + "type": "boolean" + }, "selector": { "description": "Route service traffic to pods with label keys and values matching this selector. If empty or not present, the service is assumed to have an external process managing its endpoints, which Kubernetes will not modify. Only applies to types ClusterIP, NodePort, and LoadBalancer. Ignored if type is ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/", "type": "object", @@ -12418,7 +12425,7 @@ ] }, "io.k8s.api.extensions.v1beta1.DeploymentRollback": { - "description": "DeploymentRollback stores the information required to rollback a deployment.", + "description": "DEPRECATED. DeploymentRollback stores the information required to rollback a deployment.", "required": [ "name", "rollbackTo" @@ -12487,7 +12494,7 @@ "format": "int32" }, "rollbackTo": { - "description": "The config this deployment is rolling back to. Will be cleared after rollback is done.", + "description": "DEPRECATED. The config this deployment is rolling back to. Will be cleared after rollback is done.", "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.RollbackConfig" }, "selector": { @@ -12901,6 +12908,7 @@ } }, "io.k8s.api.extensions.v1beta1.RollbackConfig": { + "description": "DEPRECATED.", "properties": { "revision": { "description": "The revision to rollback to. If set to 0, rollback to the last revision.", @@ -13324,6 +13332,11 @@ "version": "v1beta1", "kind": "DeleteOptions" }, + { + "group": "rbac.authorization.k8s.io", + "version": "v1", + "kind": "DeleteOptions" + }, { "group": "rbac.authorization.k8s.io", "version": "v1alpha1", @@ -13822,6 +13835,11 @@ "version": "v1beta1", "kind": "WatchEvent" }, + { + "group": "rbac.authorization.k8s.io", + "version": "v1", + "kind": "WatchEvent" + }, { "group": "rbac.authorization.k8s.io", "version": "v1alpha1", diff --git a/federation/apis/swagger-spec/extensions_v1beta1.json b/federation/apis/swagger-spec/extensions_v1beta1.json index 6eac8ab38f1..07185c5cd8e 100644 --- a/federation/apis/swagger-spec/extensions_v1beta1.json +++ b/federation/apis/swagger-spec/extensions_v1beta1.json @@ -5682,22 +5682,18 @@ "v1.FCVolumeSource": { "id": "v1.FCVolumeSource", "description": "Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write once. Fibre Channel volumes support ownership management and SELinux relabeling.", - "required": [ - "targetWWNs", - "lun" - ], "properties": { "targetWWNs": { "type": "array", "items": { "type": "string" }, - "description": "Required: FC target worldwide names (WWNs)" + "description": "Optional: FC target worldwide names (WWNs)" }, "lun": { "type": "integer", "format": "int32", - "description": "Required: FC target lun number" + "description": "Optional: FC target lun number" }, "fsType": { "type": "string", @@ -5706,6 +5702,13 @@ "readOnly": { "type": "boolean", "description": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts." + }, + "wwids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously." } } }, @@ -6760,7 +6763,7 @@ "items": { "$ref": "v1.PodAffinityTerm" }, - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." + "description": "If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." }, "preferredDuringSchedulingIgnoredDuringExecution": { "type": "array", @@ -6820,7 +6823,7 @@ "items": { "$ref": "v1.PodAffinityTerm" }, - "description": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." + "description": "If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied." }, "preferredDuringSchedulingIgnoredDuringExecution": { "type": "array", @@ -7118,7 +7121,7 @@ }, "rollbackTo": { "$ref": "v1beta1.RollbackConfig", - "description": "The config this deployment is rolling back to. Will be cleared after rollback is done." + "description": "DEPRECATED. The config this deployment is rolling back to. Will be cleared after rollback is done." }, "progressDeadlineSeconds": { "type": "integer", @@ -7157,6 +7160,7 @@ }, "v1beta1.RollbackConfig": { "id": "v1beta1.RollbackConfig", + "description": "DEPRECATED.", "properties": { "revision": { "type": "integer", @@ -7249,7 +7253,7 @@ }, "v1beta1.DeploymentRollback": { "id": "v1beta1.DeploymentRollback", - "description": "DeploymentRollback stores the information required to rollback a deployment.", + "description": "DEPRECATED. DeploymentRollback stores the information required to rollback a deployment.", "required": [ "name", "rollbackTo" diff --git a/federation/apis/swagger-spec/v1.json b/federation/apis/swagger-spec/v1.json index ecff7047267..de5cbc562de 100644 --- a/federation/apis/swagger-spec/v1.json +++ b/federation/apis/swagger-spec/v1.json @@ -5124,6 +5124,10 @@ "type": "integer", "format": "int32", "description": "healthCheckNodePort specifies the healthcheck nodePort for the service. If not specified, HealthCheckNodePort is created by the service api backend with the allocated nodePort. Will use user-specified nodePort value if specified by the client. Only effects when Type is set to LoadBalancer and ExternalTrafficPolicy is set to Local." + }, + "publishNotReadyAddresses": { + "type": "boolean", + "description": "publishNotReadyAddresses, when set to true, indicates that DNS implementations must publish the notReadyAddresses of subsets for the Endpoints associated with the Service. The default value is false. The primary use case for setting this field is to use a StatefulSet's Headless Service to propagate SRV records for its Pods without respect to their readiness for purpose of peer discovery. This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints when that annotation is deprecated and all clients have been converted to use this field." } } }, diff --git a/federation/client/cache/BUILD b/federation/client/cache/BUILD index d35f6605d59..6f8fce803af 100644 --- a/federation/client/cache/BUILD +++ b/federation/client/cache/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["cluster_cache.go"], - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", diff --git a/federation/client/clientset_generated/federation_clientset/BUILD b/federation/client/clientset_generated/federation_clientset/BUILD index e0794d84c1c..751c58a7618 100644 --- a/federation/client/clientset_generated/federation_clientset/BUILD +++ b/federation/client/clientset_generated/federation_clientset/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "import_known_versions.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/federation/install:go_default_library", "//federation/client/clientset_generated/federation_clientset/typed/autoscaling/v1:go_default_library", diff --git a/federation/client/clientset_generated/federation_clientset/fake/BUILD b/federation/client/clientset_generated/federation_clientset/fake/BUILD index ee5b31c9db5..8f772613130 100644 --- a/federation/client/clientset_generated/federation_clientset/fake/BUILD +++ b/federation/client/clientset_generated/federation_clientset/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/client/clientset_generated/federation_clientset:go_default_library", diff --git a/federation/client/clientset_generated/federation_clientset/scheme/BUILD b/federation/client/clientset_generated/federation_clientset/scheme/BUILD index dc01170f591..dd6f3c565f5 100644 --- a/federation/client/clientset_generated/federation_clientset/scheme/BUILD +++ b/federation/client/clientset_generated/federation_clientset/scheme/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//vendor/k8s.io/api/autoscaling/v1:go_default_library", diff --git a/federation/client/clientset_generated/federation_clientset/typed/autoscaling/v1/BUILD b/federation/client/clientset_generated/federation_clientset/typed/autoscaling/v1/BUILD index b1ef5ecb675..35da55d20af 100644 --- a/federation/client/clientset_generated/federation_clientset/typed/autoscaling/v1/BUILD +++ b/federation/client/clientset_generated/federation_clientset/typed/autoscaling/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "generated_expansion.go", "horizontalpodautoscaler.go", ], - tags = ["automanaged"], deps = [ "//federation/client/clientset_generated/federation_clientset/scheme:go_default_library", "//vendor/k8s.io/api/autoscaling/v1:go_default_library", diff --git a/federation/client/clientset_generated/federation_clientset/typed/autoscaling/v1/fake/BUILD b/federation/client/clientset_generated/federation_clientset/typed/autoscaling/v1/fake/BUILD index cb275da37c2..2a6400d7f43 100644 --- a/federation/client/clientset_generated/federation_clientset/typed/autoscaling/v1/fake/BUILD +++ b/federation/client/clientset_generated/federation_clientset/typed/autoscaling/v1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_autoscaling_client.go", "fake_horizontalpodautoscaler.go", ], - tags = ["automanaged"], deps = [ "//federation/client/clientset_generated/federation_clientset/typed/autoscaling/v1:go_default_library", "//vendor/k8s.io/api/autoscaling/v1:go_default_library", diff --git a/federation/client/clientset_generated/federation_clientset/typed/batch/v1/BUILD b/federation/client/clientset_generated/federation_clientset/typed/batch/v1/BUILD index 75facd2c6a5..d878e764d72 100644 --- a/federation/client/clientset_generated/federation_clientset/typed/batch/v1/BUILD +++ b/federation/client/clientset_generated/federation_clientset/typed/batch/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "generated_expansion.go", "job.go", ], - tags = ["automanaged"], deps = [ "//federation/client/clientset_generated/federation_clientset/scheme:go_default_library", "//vendor/k8s.io/api/batch/v1:go_default_library", diff --git a/federation/client/clientset_generated/federation_clientset/typed/batch/v1/fake/BUILD b/federation/client/clientset_generated/federation_clientset/typed/batch/v1/fake/BUILD index 534a2173406..b81962b8c8e 100644 --- a/federation/client/clientset_generated/federation_clientset/typed/batch/v1/fake/BUILD +++ b/federation/client/clientset_generated/federation_clientset/typed/batch/v1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_batch_client.go", "fake_job.go", ], - tags = ["automanaged"], deps = [ "//federation/client/clientset_generated/federation_clientset/typed/batch/v1:go_default_library", "//vendor/k8s.io/api/batch/v1:go_default_library", diff --git a/federation/client/clientset_generated/federation_clientset/typed/core/v1/BUILD b/federation/client/clientset_generated/federation_clientset/typed/core/v1/BUILD index 6d3dd67fa8c..078c54b2784 100644 --- a/federation/client/clientset_generated/federation_clientset/typed/core/v1/BUILD +++ b/federation/client/clientset_generated/federation_clientset/typed/core/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -20,7 +18,6 @@ go_library( "secret.go", "service.go", ], - tags = ["automanaged"], deps = [ "//federation/client/clientset_generated/federation_clientset/scheme:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/federation/client/clientset_generated/federation_clientset/typed/core/v1/fake/BUILD b/federation/client/clientset_generated/federation_clientset/typed/core/v1/fake/BUILD index 11de9111975..9c4eb404c0a 100644 --- a/federation/client/clientset_generated/federation_clientset/typed/core/v1/fake/BUILD +++ b/federation/client/clientset_generated/federation_clientset/typed/core/v1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "fake_secret.go", "fake_service.go", ], - tags = ["automanaged"], deps = [ "//federation/client/clientset_generated/federation_clientset/typed/core/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/federation/client/clientset_generated/federation_clientset/typed/extensions/v1beta1/BUILD b/federation/client/clientset_generated/federation_clientset/typed/extensions/v1beta1/BUILD index 1291403aedd..b2a7fd93db4 100644 --- a/federation/client/clientset_generated/federation_clientset/typed/extensions/v1beta1/BUILD +++ b/federation/client/clientset_generated/federation_clientset/typed/extensions/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "ingress.go", "replicaset.go", ], - tags = ["automanaged"], deps = [ "//federation/client/clientset_generated/federation_clientset/scheme:go_default_library", "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", diff --git a/federation/client/clientset_generated/federation_clientset/typed/extensions/v1beta1/fake/BUILD b/federation/client/clientset_generated/federation_clientset/typed/extensions/v1beta1/fake/BUILD index 607c9232d8f..255ed3e15f1 100644 --- a/federation/client/clientset_generated/federation_clientset/typed/extensions/v1beta1/fake/BUILD +++ b/federation/client/clientset_generated/federation_clientset/typed/extensions/v1beta1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "fake_ingress.go", "fake_replicaset.go", ], - tags = ["automanaged"], deps = [ "//federation/client/clientset_generated/federation_clientset/typed/extensions/v1beta1:go_default_library", "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", diff --git a/federation/client/clientset_generated/federation_clientset/typed/federation/v1beta1/BUILD b/federation/client/clientset_generated/federation_clientset/typed/federation/v1beta1/BUILD index 3baed06fad0..b8e9c1b2134 100644 --- a/federation/client/clientset_generated/federation_clientset/typed/federation/v1beta1/BUILD +++ b/federation/client/clientset_generated/federation_clientset/typed/federation/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "federation_client.go", "generated_expansion.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/client/clientset_generated/federation_clientset/scheme:go_default_library", diff --git a/federation/client/clientset_generated/federation_clientset/typed/federation/v1beta1/fake/BUILD b/federation/client/clientset_generated/federation_clientset/typed/federation/v1beta1/fake/BUILD index 6d2c900c4b8..650fae697f2 100644 --- a/federation/client/clientset_generated/federation_clientset/typed/federation/v1beta1/fake/BUILD +++ b/federation/client/clientset_generated/federation_clientset/typed/federation/v1beta1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_cluster.go", "fake_federation_client.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/client/clientset_generated/federation_clientset/typed/federation/v1beta1:go_default_library", diff --git a/federation/cluster/BUILD b/federation/cluster/BUILD index 6cc62052baf..7e76248ad95 100644 --- a/federation/cluster/BUILD +++ b/federation/cluster/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/federation/cmd/federation-apiserver/BUILD b/federation/cmd/federation-apiserver/BUILD index 29599ad5ee1..fe32ed5be1b 100644 --- a/federation/cmd/federation-apiserver/BUILD +++ b/federation/cmd/federation-apiserver/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "federation-apiserver", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["apiserver.go"], - tags = ["automanaged"], deps = [ "//federation/cmd/federation-apiserver/app:go_default_library", "//federation/cmd/federation-apiserver/app/options:go_default_library", diff --git a/federation/cmd/federation-apiserver/app/BUILD b/federation/cmd/federation-apiserver/app/BUILD index 74a51a155ec..1b7fd40efb3 100644 --- a/federation/cmd/federation-apiserver/app/BUILD +++ b/federation/cmd/federation-apiserver/app/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "plugins.go", "server.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/core:go_default_library", "//federation/apis/core/install:go_default_library", diff --git a/federation/cmd/federation-apiserver/app/options/BUILD b/federation/cmd/federation-apiserver/app/options/BUILD index 798ac00ca7c..088621c2b1a 100644 --- a/federation/cmd/federation-apiserver/app/options/BUILD +++ b/federation/cmd/federation-apiserver/app/options/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "options.go", "validation.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/features:go_default_library", diff --git a/federation/cmd/federation-apiserver/app/options/validation.go b/federation/cmd/federation-apiserver/app/options/validation.go index a2044377e61..453372346ea 100644 --- a/federation/cmd/federation-apiserver/app/options/validation.go +++ b/federation/cmd/federation-apiserver/app/options/validation.go @@ -16,6 +16,8 @@ limitations under the License. package options +import "fmt" + func (options *ServerRunOptions) Validate() []error { var errors []error if errs := options.Etcd.Validate(); len(errs) > 0 { @@ -27,6 +29,27 @@ func (options *ServerRunOptions) Validate() []error { if errs := options.InsecureServing.Validate("insecure-port"); len(errs) > 0 { errors = append(errors, errs...) } + if errs := options.Audit.Validate(); len(errs) > 0 { + errors = append(errors, errs...) + } + if errs := options.Features.Validate(); len(errs) > 0 { + errors = append(errors, errs...) + } + if errs := options.Admission.Validate(); len(errs) > 0 { + errors = append(errors, errs...) + } + if errs := options.Authentication.Validate(); len(errs) > 0 { + errors = append(errors, errs...) + } + if errs := options.Authorization.Validate(); len(errs) > 0 { + errors = append(errors, errs...) + } + if errs := options.CloudProvider.Validate(); len(errs) > 0 { + errors = append(errors, errs...) + } + if options.EventTTL <= 0 { + errors = append(errors, fmt.Errorf("--event-ttl must be greater than 0")) + } // TODO: add more checks return errors } diff --git a/federation/cmd/federation-controller-manager/BUILD b/federation/cmd/federation-controller-manager/BUILD index 0a610f149c2..04d0e76fed6 100644 --- a/federation/cmd/federation-controller-manager/BUILD +++ b/federation/cmd/federation-controller-manager/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "federation-controller-manager", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["controller-manager.go"], - tags = ["automanaged"], deps = [ "//federation/cmd/federation-controller-manager/app:go_default_library", "//federation/cmd/federation-controller-manager/app/options:go_default_library", diff --git a/federation/cmd/federation-controller-manager/app/BUILD b/federation/cmd/federation-controller-manager/app/BUILD index a4fffac2a2b..4c63fce1e31 100644 --- a/federation/cmd/federation-controller-manager/app/BUILD +++ b/federation/cmd/federation-controller-manager/app/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,8 +12,8 @@ go_library( "controllermanager.go", "plugins.go", ], - tags = ["automanaged"], deps = [ + "//federation/apis/federation/v1beta1:go_default_library", "//federation/client/clientset_generated/federation_clientset:go_default_library", "//federation/cmd/federation-controller-manager/app/options:go_default_library", "//federation/pkg/dnsprovider/providers/aws/route53:go_default_library", @@ -24,23 +22,32 @@ go_library( "//federation/pkg/federatedtypes:go_default_library", "//federation/pkg/federation-controller/cluster:go_default_library", "//federation/pkg/federation-controller/ingress:go_default_library", + "//federation/pkg/federation-controller/job:go_default_library", "//federation/pkg/federation-controller/service:go_default_library", "//federation/pkg/federation-controller/service/dns:go_default_library", "//federation/pkg/federation-controller/sync:go_default_library", + "//federation/pkg/federation-controller/util/eventsink:go_default_library", + "//pkg/api:go_default_library", "//pkg/util/configz:go_default_library", "//pkg/version:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/github.com/spf13/cobra:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/apiserver/pkg/server/healthz:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library", "//vendor/k8s.io/client-go/discovery:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/tools/clientcmd:go_default_library", + "//vendor/k8s.io/client-go/tools/leaderelection:go_default_library", + "//vendor/k8s.io/client-go/tools/leaderelection/resourcelock:go_default_library", + "//vendor/k8s.io/client-go/tools/record:go_default_library", ], ) @@ -48,7 +55,6 @@ go_test( name = "go_default_test", srcs = ["controllermanager_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/pkg/federation-controller/ingress:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/federation/cmd/federation-controller-manager/app/controllermanager.go b/federation/cmd/federation-controller-manager/app/controllermanager.go index 9144eca97f4..19345963061 100644 --- a/federation/cmd/federation-controller-manager/app/controllermanager.go +++ b/federation/cmd/federation-controller-manager/app/controllermanager.go @@ -23,23 +23,35 @@ import ( "net" "net/http" "net/http/pprof" + "os" goruntime "runtime" "strconv" + "time" + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apiserver/pkg/server/healthz" utilflag "k8s.io/apiserver/pkg/util/flag" + "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" + "k8s.io/client-go/tools/leaderelection" + "k8s.io/client-go/tools/leaderelection/resourcelock" + "k8s.io/client-go/tools/record" + federationapi "k8s.io/kubernetes/federation/apis/federation/v1beta1" federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset" "k8s.io/kubernetes/federation/cmd/federation-controller-manager/app/options" "k8s.io/kubernetes/federation/pkg/federatedtypes" clustercontroller "k8s.io/kubernetes/federation/pkg/federation-controller/cluster" ingresscontroller "k8s.io/kubernetes/federation/pkg/federation-controller/ingress" + jobcontroller "k8s.io/kubernetes/federation/pkg/federation-controller/job" servicecontroller "k8s.io/kubernetes/federation/pkg/federation-controller/service" servicednscontroller "k8s.io/kubernetes/federation/pkg/federation-controller/service/dns" synccontroller "k8s.io/kubernetes/federation/pkg/federation-controller/sync" + "k8s.io/kubernetes/federation/pkg/federation-controller/util/eventsink" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/util/configz" "k8s.io/kubernetes/pkg/version" @@ -51,6 +63,11 @@ import ( "k8s.io/client-go/discovery" ) +const ( + apiserverWaitTimeout = 2 * time.Minute + apiserverRetryInterval = 2 * time.Second +) + // NewControllerManagerCommand creates a *cobra.Command object with default parameters func NewControllerManagerCommand() *cobra.Command { s := options.NewCMServer() @@ -111,17 +128,68 @@ func Run(s *options.CMServer) error { glog.Fatal(server.ListenAndServe()) }() - run := func() { - err := StartControllers(s, restClientCfg) + federationClientset, err := federationclientset.NewForConfig(restclient.AddUserAgent(restClientCfg, "federation-controller-manager")) + if err != nil { + glog.Fatalf("Invalid API configuration: %v", err) + } + + run := func(stop <-chan struct{}) { + err := StartControllers(s, restClientCfg, stop) glog.Fatalf("error running controllers: %v", err) panic("unreachable") } - run() + + if !s.LeaderElection.LeaderElect { + run(nil) + // unreachable + } + + if err := ensureFederationNamespace(federationClientset, s.FederationOnlyNamespace); err != nil { + glog.Fatalf("Failed to ensure federation only namespace %s: %v", s.FederationOnlyNamespace, err) + } + + leaderElectionClient := kubernetes.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, "leader-election")) + eventBroadcaster := record.NewBroadcaster() + eventBroadcaster.StartLogging(glog.Infof) + eventBroadcaster.StartRecordingToSink(eventsink.NewFederatedEventSink(federationClientset)) + recorder := eventBroadcaster.NewRecorder(api.Scheme, v1.EventSource{Component: "controller-manager"}) + + id, err := os.Hostname() + if err != nil { + return err + } + + rl := resourcelock.ConfigMapLock{ + ConfigMapMeta: metav1.ObjectMeta{ + Namespace: s.FederationOnlyNamespace, + Name: "federation-controller-manager-leader-election", + Annotations: map[string]string{ + federationapi.FederationClusterSelectorAnnotation: federationapi.FederationOnlyClusterSelector, + }}, + Client: leaderElectionClient.CoreV1(), + LockConfig: resourcelock.ResourceLockConfig{ + Identity: id, + EventRecorder: recorder, + }, + } + + leaderelection.RunOrDie(leaderelection.LeaderElectionConfig{ + Lock: &rl, + LeaseDuration: s.LeaderElection.LeaseDuration.Duration, + RenewDeadline: s.LeaderElection.RenewDeadline.Duration, + RetryPeriod: s.LeaderElection.RetryPeriod.Duration, + Callbacks: leaderelection.LeaderCallbacks{ + OnStartedLeading: run, + OnStoppedLeading: func() { + glog.Fatalf("leaderelection lost") + }, + }, + }) + panic("unreachable") } -func StartControllers(s *options.CMServer, restClientCfg *restclient.Config) error { - stopChan := wait.NeverStop +func StartControllers(s *options.CMServer, restClientCfg *restclient.Config, stopChan <-chan struct{}) error { minimizeLatency := false discoveryClient := discovery.NewDiscoveryClientForConfigOrDie(restClientCfg) @@ -146,21 +214,31 @@ func StartControllers(s *options.CMServer, restClientCfg *restclient.Config) err glog.V(3).Infof("Loading client config for service controller %q", servicecontroller.UserAgentName) scClientset := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, servicecontroller.UserAgentName)) serviceController := servicecontroller.New(scClientset) - go serviceController.Run(s.ConcurrentServiceSyncs, wait.NeverStop) + go serviceController.Run(s.ConcurrentServiceSyncs, stopChan) } + adapterSpecificArgs := make(map[string]interface{}) + adapterSpecificArgs[federatedtypes.HpaKind] = &s.HpaScaleForbiddenWindow for kind, federatedType := range federatedtypes.FederatedTypes() { if controllerEnabled(s.Controllers, serverResources, federatedType.ControllerName, federatedType.RequiredResources, true) { - synccontroller.StartFederationSyncController(kind, federatedType.AdapterFactory, restClientCfg, stopChan, minimizeLatency) + synccontroller.StartFederationSyncController(kind, federatedType.AdapterFactory, restClientCfg, stopChan, minimizeLatency, adapterSpecificArgs) } } + if controllerEnabled(s.Controllers, serverResources, jobcontroller.ControllerName, jobcontroller.RequiredResources, true) { + glog.V(3).Infof("Loading client config for job controller %q", jobcontroller.UserAgentName) + jobClientset := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, jobcontroller.UserAgentName)) + jobController := jobcontroller.NewJobController(jobClientset) + glog.V(3).Infof("Running job controller") + go jobController.Run(s.ConcurrentJobSyncs, wait.NeverStop) + } + if controllerEnabled(s.Controllers, serverResources, ingresscontroller.ControllerName, ingresscontroller.RequiredResources, true) { glog.V(3).Infof("Loading client config for ingress controller %q", ingresscontroller.UserAgentName) ingClientset := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, ingresscontroller.UserAgentName)) ingressController := ingresscontroller.NewIngressController(ingClientset) glog.V(3).Infof("Running ingress controller") - ingressController.Run(wait.NeverStop) + ingressController.Run(stopChan) } select {} @@ -208,3 +286,33 @@ func hasRequiredResources(serverResources []*metav1.APIResourceList, requiredRes } return true } + +func ensureFederationNamespace(clientset *federationclientset.Clientset, namespace string) error { + ns := v1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: namespace, + Annotations: map[string]string{ + federationapi.FederationClusterSelectorAnnotation: federationapi.FederationOnlyClusterSelector, + }, + }, + } + // Probably this is the first operation by controller manager on api server. So retry the operation + // until timeout to handle scenario where api server is not yet ready. + err := wait.PollImmediate(apiserverRetryInterval, apiserverWaitTimeout, func() (bool, error) { + var err error + _, err = clientset.CoreV1().Namespaces().Get(namespace, metav1.GetOptions{}) + if err != nil { + if !errors.IsNotFound(err) { + glog.V(2).Infof("Failed to get namespace %s: %v", namespace, err) + return false, nil + } + _, err := clientset.CoreV1().Namespaces().Create(&ns) + if err != nil { + glog.V(2).Infof("Failed to create namespace %s: %v", namespace, err) + return false, nil + } + } + return true, nil + }) + return err +} diff --git a/federation/cmd/federation-controller-manager/app/options/BUILD b/federation/cmd/federation-controller-manager/app/options/BUILD index 72e4bdfcde4..1fc5b3814dc 100644 --- a/federation/cmd/federation-controller-manager/app/options/BUILD +++ b/federation/cmd/federation-controller-manager/app/options/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["options.go"], - tags = ["automanaged"], deps = [ "//federation/pkg/dnsprovider:go_default_library", "//pkg/apis/componentconfig:go_default_library", diff --git a/federation/cmd/federation-controller-manager/app/options/options.go b/federation/cmd/federation-controller-manager/app/options/options.go index e6659c36977..470d61e6052 100644 --- a/federation/cmd/federation-controller-manager/app/options/options.go +++ b/federation/cmd/federation-controller-manager/app/options/options.go @@ -56,6 +56,10 @@ type ControllerManagerConfiguration struct { // allowed to sync concurrently. Larger number = more responsive service // management, but more CPU (and network) load. ConcurrentReplicaSetSyncs int `json:"concurrentReplicaSetSyncs"` + // concurrentJobSyncs is the number of Jobs that are + // allowed to sync concurrently. Larger number = more responsive service + // management, but more CPU (and network) load. + ConcurrentJobSyncs int `json:"concurrentJobSyncs"` // clusterMonitorPeriod is the period for syncing ClusterStatus in cluster controller. ClusterMonitorPeriod metav1.Duration `json:"clusterMonitorPeriod"` // APIServerQPS is the QPS to use while talking with federation apiserver. @@ -72,6 +76,15 @@ type ControllerManagerConfiguration struct { ContentType string `json:"contentType"` // ConfigurationMap determining which controllers should be enabled or disabled Controllers utilflag.ConfigurationMap `json:"controllers"` + // HpaScaleForbiddenWindow is the duration used by federation hpa controller to + // determine if it can move max and/or min replicas around (or not), of a cluster local + // hpa object, by comparing current time with the last scaled time of that cluster local hpa. + // Lower value will result in faster response to scalibility conditions achieved + // by cluster local hpas on local replicas, but too low a value can result in thrashing. + // Higher values will result in slower response to scalibility conditions on local replicas. + HpaScaleForbiddenWindow metav1.Duration `json:"HpaScaleForbiddenWindow"` + // pre-configured namespace name that would be created only in federation control plane + FederationOnlyNamespace string `json:"federationOnlyNamespaceName"` } // CMServer is the main context object for the controller manager. @@ -96,10 +109,13 @@ func NewCMServer() *CMServer { ConcurrentServiceSyncs: 10, ConcurrentReplicaSetSyncs: 10, ClusterMonitorPeriod: metav1.Duration{Duration: 40 * time.Second}, + ConcurrentJobSyncs: 10, APIServerQPS: 20.0, APIServerBurst: 30, LeaderElection: leaderelectionconfig.DefaultLeaderElectionConfiguration(), Controllers: make(utilflag.ConfigurationMap), + HpaScaleForbiddenWindow: metav1.Duration{Duration: 2 * time.Minute}, + FederationOnlyNamespace: "federation-only", }, } return &s @@ -115,6 +131,7 @@ func (s *CMServer) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&s.ServiceDnsSuffix, "service-dns-suffix", s.ServiceDnsSuffix, "DNS Suffix to use when publishing federated service names. Defaults to zone-name") fs.IntVar(&s.ConcurrentServiceSyncs, "concurrent-service-syncs", s.ConcurrentServiceSyncs, "The number of service syncing operations that will be done concurrently. Larger number = faster endpoint updating, but more CPU (and network) load") fs.IntVar(&s.ConcurrentReplicaSetSyncs, "concurrent-replicaset-syncs", s.ConcurrentReplicaSetSyncs, "The number of ReplicaSets syncing operations that will be done concurrently. Larger number = faster endpoint updating, but more CPU (and network) load") + fs.IntVar(&s.ConcurrentJobSyncs, "concurrent-job-syncs", s.ConcurrentJobSyncs, "The number of Jobs syncing operations that will be done concurrently. Larger number = faster endpoint updating, but more CPU (and network) load") fs.DurationVar(&s.ClusterMonitorPeriod.Duration, "cluster-monitor-period", s.ClusterMonitorPeriod.Duration, "The period for syncing ClusterStatus in ClusterController.") fs.BoolVar(&s.EnableProfiling, "profiling", true, "Enable profiling via web interface host:port/debug/pprof/") fs.BoolVar(&s.EnableContentionProfiling, "contention-profiling", false, "Enable lock contention profiling, if profiling is enabled") @@ -125,9 +142,11 @@ func (s *CMServer) AddFlags(fs *pflag.FlagSet) { fs.IntVar(&s.APIServerBurst, "federated-api-burst", s.APIServerBurst, "Burst to use while talking with federation apiserver") fs.StringVar(&s.DnsProvider, "dns-provider", s.DnsProvider, "DNS provider. Valid values are: "+fmt.Sprintf("%q", dnsprovider.RegisteredDnsProviders())) fs.StringVar(&s.DnsConfigFile, "dns-provider-config", s.DnsConfigFile, "Path to config file for configuring DNS provider.") + fs.DurationVar(&s.HpaScaleForbiddenWindow.Duration, "hpa-scale-forbidden-window", s.HpaScaleForbiddenWindow.Duration, "The time window wrt cluster local hpa lastscale time, during which federated hpa would not move the hpa max/min replicas around") fs.Var(&s.Controllers, "controllers", ""+ "A set of key=value pairs that describe controller configuration "+ "to enable/disable specific controllers. Key should be the resource name (like services) and value should be true or false. "+ "For example: services=false,ingresses=false") + fs.StringVar(&s.FederationOnlyNamespace, "federation-only-namespace", s.FederationOnlyNamespace, "Name of the namespace that would be created only in federation control plane.") leaderelectionconfig.BindFlags(&s.LeaderElection, fs) } diff --git a/federation/cmd/genfeddocs/BUILD b/federation/cmd/genfeddocs/BUILD index 4d97e1359c8..efc2073e074 100644 --- a/federation/cmd/genfeddocs/BUILD +++ b/federation/cmd/genfeddocs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "genfeddocs", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["gen_fed_docs.go"], - tags = ["automanaged"], deps = [ "//cmd/genutils:go_default_library", "//federation/cmd/federation-apiserver/app:go_default_library", diff --git a/federation/cmd/kubefed/BUILD b/federation/cmd/kubefed/BUILD index 27a7bdd81f9..be574b24e22 100644 --- a/federation/cmd/kubefed/BUILD +++ b/federation/cmd/kubefed/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "kubefed", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["kubefed.go"], - tags = ["automanaged"], deps = ["//federation/cmd/kubefed/app:go_default_library"], ) diff --git a/federation/cmd/kubefed/app/BUILD b/federation/cmd/kubefed/app/BUILD index 75ae5bb2c6d..eb4b8dd0deb 100644 --- a/federation/cmd/kubefed/app/BUILD +++ b/federation/cmd/kubefed/app/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,12 +8,11 @@ load( go_library( name = "go_default_library", srcs = ["kubefed.go"], - tags = ["automanaged"], deps = [ "//federation/pkg/kubefed:go_default_library", "//pkg/client/metrics/prometheus:go_default_library", "//pkg/kubectl/cmd/util:go_default_library", - "//pkg/util/logs:go_default_library", + "//pkg/kubectl/util/logs:go_default_library", "//pkg/version:go_default_library", "//pkg/version/prometheus:go_default_library", ], diff --git a/federation/cmd/kubefed/app/kubefed.go b/federation/cmd/kubefed/app/kubefed.go index a08d363fa50..4b481c0bab2 100644 --- a/federation/cmd/kubefed/app/kubefed.go +++ b/federation/cmd/kubefed/app/kubefed.go @@ -23,7 +23,7 @@ import ( "k8s.io/kubernetes/federation/pkg/kubefed" _ "k8s.io/kubernetes/pkg/client/metrics/prometheus" // for client metric registration cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/util/logs" + "k8s.io/kubernetes/pkg/kubectl/util/logs" "k8s.io/kubernetes/pkg/version" _ "k8s.io/kubernetes/pkg/version/prometheus" // for version metric registration ) diff --git a/federation/develop/BUILD b/federation/develop/BUILD index 6cc62052baf..7e76248ad95 100644 --- a/federation/develop/BUILD +++ b/federation/develop/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/federation/docs/api-reference/extensions/v1beta1/definitions.html b/federation/docs/api-reference/extensions/v1beta1/definitions.html index 371167b51e8..63e825ed508 100755 --- a/federation/docs/api-reference/extensions/v1beta1/definitions.html +++ b/federation/docs/api-reference/extensions/v1beta1/definitions.html @@ -2616,7 +2616,7 @@ When an object is created, the system will populate this list with the current s

    requiredDuringSchedulingIgnoredDuringExecution

    -

    NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm json:"requiredDuringSchedulingRequiredDuringExecution,omitempty" If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    +

    If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    false

    v1.PodAffinityTerm array

    @@ -2757,6 +2757,9 @@ When an object is created, the system will populate this list with the current s

    v1beta1.RollbackConfig

    +
    +

    DEPRECATED.

    +
    @@ -3853,7 +3856,7 @@ When an object is created, the system will populate this list with the current s - + @@ -5144,7 +5147,7 @@ Examples:

    v1beta1.DeploymentRollback

    -

    DeploymentRollback stores the information required to rollback a deployment.

    +

    DEPRECATED. DeploymentRollback stores the information required to rollback a deployment.

    rollbackTo

    The config this deployment is rolling back to. Will be cleared after rollback is done.

    DEPRECATED. The config this deployment is rolling back to. Will be cleared after rollback is done.

    false

    v1beta1.RollbackConfig

    @@ -5269,15 +5272,15 @@ Examples:
    - - + + - - + + @@ -5295,6 +5298,13 @@ Examples:
    + + + + + + +

    targetWWNs

    Required: FC target worldwide names (WWNs)

    true

    Optional: FC target worldwide names (WWNs)

    false

    string array

    lun

    Required: FC target lun number

    true

    Optional: FC target lun number

    false

    integer (int32)

    boolean

    false

    wwids

    Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.

    false

    string array

    @@ -5324,7 +5334,7 @@ Examples:

    requiredDuringSchedulingIgnoredDuringExecution

    -

    NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm json:"requiredDuringSchedulingRequiredDuringExecution,omitempty" If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    +

    If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

    false

    v1.PodAffinityTerm array

    diff --git a/federation/docs/api-reference/v1/definitions.html b/federation/docs/api-reference/v1/definitions.html index 155a431941e..b4ba4127bbd 100755 --- a/federation/docs/api-reference/v1/definitions.html +++ b/federation/docs/api-reference/v1/definitions.html @@ -2226,6 +2226,13 @@ When an object is created, the system will populate this list with the current s

    integer (int32)

    + +

    publishNotReadyAddresses

    +

    publishNotReadyAddresses, when set to true, indicates that DNS implementations must publish the notReadyAddresses of subsets for the Endpoints associated with the Service. The default value is false. The primary use case for setting this field is to use a StatefulSet’s Headless Service to propagate SRV records for its Pods without respect to their readiness for purpose of peer discovery. This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints when that annotation is deprecated and all clients have been converted to use this field.

    +

    false

    +

    boolean

    +

    false

    + diff --git a/federation/pkg/dnsprovider/BUILD b/federation/pkg/dnsprovider/BUILD index 4bf94d3b59f..9b9be4d00be 100644 --- a/federation/pkg/dnsprovider/BUILD +++ b/federation/pkg/dnsprovider/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "doc.go", "plugins.go", ], - tags = ["automanaged"], deps = [ "//federation/pkg/dnsprovider/rrstype:go_default_library", "//vendor/github.com/golang/glog:go_default_library", @@ -26,7 +23,6 @@ go_test( name = "go_default_test", srcs = ["dns_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//federation/pkg/dnsprovider/rrstype:go_default_library"], ) diff --git a/federation/pkg/dnsprovider/providers/aws/route53/BUILD b/federation/pkg/dnsprovider/providers/aws/route53/BUILD index cbac8d00753..461cb074e2c 100644 --- a/federation/pkg/dnsprovider/providers/aws/route53/BUILD +++ b/federation/pkg/dnsprovider/providers/aws/route53/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "zone.go", "zones.go", ], - tags = ["automanaged"], deps = [ "//federation/pkg/dnsprovider:go_default_library", "//federation/pkg/dnsprovider/providers/aws/route53/stubs:go_default_library", @@ -37,7 +34,6 @@ go_test( name = "go_default_test", srcs = ["route53_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/pkg/dnsprovider:go_default_library", "//federation/pkg/dnsprovider/providers/aws/route53/stubs:go_default_library", diff --git a/federation/pkg/dnsprovider/providers/aws/route53/stubs/BUILD b/federation/pkg/dnsprovider/providers/aws/route53/stubs/BUILD index 3dd71fc659e..48e5c5a1fbe 100644 --- a/federation/pkg/dnsprovider/providers/aws/route53/stubs/BUILD +++ b/federation/pkg/dnsprovider/providers/aws/route53/stubs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["route53api.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/service/route53:go_default_library", diff --git a/federation/pkg/dnsprovider/providers/coredns/BUILD b/federation/pkg/dnsprovider/providers/coredns/BUILD index f1654143a05..3cf192b88ba 100644 --- a/federation/pkg/dnsprovider/providers/coredns/BUILD +++ b/federation/pkg/dnsprovider/providers/coredns/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "zone.go", "zones.go", ], - tags = ["automanaged"], deps = [ "//federation/pkg/dnsprovider:go_default_library", "//federation/pkg/dnsprovider/providers/coredns/stubs:go_default_library", @@ -36,7 +33,6 @@ go_test( name = "go_default_test", srcs = ["coredns_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/pkg/dnsprovider:go_default_library", "//federation/pkg/dnsprovider/providers/coredns/stubs:go_default_library", diff --git a/federation/pkg/dnsprovider/providers/coredns/stubs/BUILD b/federation/pkg/dnsprovider/providers/coredns/stubs/BUILD index 7c336dd68e8..b976724225b 100644 --- a/federation/pkg/dnsprovider/providers/coredns/stubs/BUILD +++ b/federation/pkg/dnsprovider/providers/coredns/stubs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["corednsapi.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/client:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", diff --git a/federation/pkg/dnsprovider/providers/google/clouddns/BUILD b/federation/pkg/dnsprovider/providers/google/clouddns/BUILD index 9426542654c..8c889aeac20 100644 --- a/federation/pkg/dnsprovider/providers/google/clouddns/BUILD +++ b/federation/pkg/dnsprovider/providers/google/clouddns/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "zone.go", "zones.go", ], - tags = ["automanaged"], deps = [ "//federation/pkg/dnsprovider:go_default_library", "//federation/pkg/dnsprovider/providers/google/clouddns/internal:go_default_library", @@ -41,7 +38,6 @@ go_test( name = "go_default_test", srcs = ["clouddns_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/pkg/dnsprovider:go_default_library", "//federation/pkg/dnsprovider/rrstype:go_default_library", diff --git a/federation/pkg/dnsprovider/providers/google/clouddns/internal/BUILD b/federation/pkg/dnsprovider/providers/google/clouddns/internal/BUILD index eb91807d884..0ca459dff70 100644 --- a/federation/pkg/dnsprovider/providers/google/clouddns/internal/BUILD +++ b/federation/pkg/dnsprovider/providers/google/clouddns/internal/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -27,7 +25,6 @@ go_library( "rrsets_service.go", "service.go", ], - tags = ["automanaged"], deps = [ "//federation/pkg/dnsprovider/providers/google/clouddns/internal/interfaces:go_default_library", "//federation/pkg/dnsprovider/rrstype:go_default_library", diff --git a/federation/pkg/dnsprovider/providers/google/clouddns/internal/interfaces/BUILD b/federation/pkg/dnsprovider/providers/google/clouddns/internal/interfaces/BUILD index 19d071ce222..08c1f124953 100644 --- a/federation/pkg/dnsprovider/providers/google/clouddns/internal/interfaces/BUILD +++ b/federation/pkg/dnsprovider/providers/google/clouddns/internal/interfaces/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interfaces.go"], - tags = ["automanaged"], deps = [ "//federation/pkg/dnsprovider/rrstype:go_default_library", "//vendor/google.golang.org/api/googleapi:go_default_library", diff --git a/federation/pkg/dnsprovider/providers/google/clouddns/internal/stubs/BUILD b/federation/pkg/dnsprovider/providers/google/clouddns/internal/stubs/BUILD index 2e382702340..774b1f439d2 100644 --- a/federation/pkg/dnsprovider/providers/google/clouddns/internal/stubs/BUILD +++ b/federation/pkg/dnsprovider/providers/google/clouddns/internal/stubs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -27,7 +25,6 @@ go_library( "rrsets_service.go", "service.go", ], - tags = ["automanaged"], deps = [ "//federation/pkg/dnsprovider/providers/google/clouddns/internal/interfaces:go_default_library", "//federation/pkg/dnsprovider/rrstype:go_default_library", diff --git a/federation/pkg/dnsprovider/rrstype/BUILD b/federation/pkg/dnsprovider/rrstype/BUILD index c940e961783..7e5e5b26958 100644 --- a/federation/pkg/dnsprovider/rrstype/BUILD +++ b/federation/pkg/dnsprovider/rrstype/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["rrstype.go"], - tags = ["automanaged"], ) filegroup( diff --git a/federation/pkg/dnsprovider/tests/BUILD b/federation/pkg/dnsprovider/tests/BUILD index 7d50c5d28ed..5161161160b 100644 --- a/federation/pkg/dnsprovider/tests/BUILD +++ b/federation/pkg/dnsprovider/tests/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["commontests.go"], - tags = ["automanaged"], deps = [ "//federation/pkg/dnsprovider:go_default_library", "//federation/pkg/dnsprovider/rrstype:go_default_library", diff --git a/federation/pkg/federatedtypes/BUILD b/federation/pkg/federatedtypes/BUILD index faa20fcda88..e290b49d393 100644 --- a/federation/pkg/federatedtypes/BUILD +++ b/federation/pkg/federatedtypes/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,11 +8,15 @@ load( go_test( name = "go_default_test", - srcs = ["scheduling_test.go"], + srcs = [ + "hpa_test.go", + "scheduling_test.go", + ], library = ":go_default_library", - tags = ["automanaged"], deps = [ + "//federation/pkg/federation-controller/util/test:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", + "//vendor/k8s.io/api/autoscaling/v1: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/apis/meta/v1:go_default_library", @@ -29,6 +31,7 @@ go_library( "configmap.go", "daemonset.go", "deployment.go", + "hpa.go", "namespace.go", "qualifiedname.go", "registry.go", @@ -36,7 +39,6 @@ go_library( "scheduling.go", "secret.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//federation/apis/federation/v1beta1:go_default_library", @@ -48,12 +50,14 @@ go_library( "//pkg/api:go_default_library", "//pkg/controller/namespace/deletion:go_default_library", "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/api/autoscaling/v1: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/meta:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/util/sets:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/client-go/dynamic:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", diff --git a/federation/pkg/federatedtypes/adapter.go b/federation/pkg/federatedtypes/adapter.go index 3d26e63c4ca..1dbda2a498e 100644 --- a/federation/pkg/federatedtypes/adapter.go +++ b/federation/pkg/federatedtypes/adapter.go @@ -62,7 +62,7 @@ type FederatedTypeAdapter interface { // that create instances of FederatedTypeAdapter. Such methods should // be registered with RegisterAdapterFactory to ensure the type // adapter is discoverable. -type AdapterFactory func(client federationclientset.Interface, config *restclient.Config) FederatedTypeAdapter +type AdapterFactory func(client federationclientset.Interface, config *restclient.Config, adapterSpecificArgs map[string]interface{}) FederatedTypeAdapter // SetAnnotation sets the given key and value in the given object's ObjectMeta.Annotations map func SetAnnotation(adapter FederatedTypeAdapter, obj pkgruntime.Object, key, value string) { diff --git a/federation/pkg/federatedtypes/configmap.go b/federation/pkg/federatedtypes/configmap.go index 9108c78b9e2..79fdea2caf1 100644 --- a/federation/pkg/federatedtypes/configmap.go +++ b/federation/pkg/federatedtypes/configmap.go @@ -41,7 +41,7 @@ type ConfigMapAdapter struct { client federationclientset.Interface } -func NewConfigMapAdapter(client federationclientset.Interface, config *restclient.Config) FederatedTypeAdapter { +func NewConfigMapAdapter(client federationclientset.Interface, config *restclient.Config, adapterSpecificArgs map[string]interface{}) FederatedTypeAdapter { return &ConfigMapAdapter{client: client} } diff --git a/federation/pkg/federatedtypes/crudtester/BUILD b/federation/pkg/federatedtypes/crudtester/BUILD index 25e5bdd57a5..cdb5f6f3e95 100644 --- a/federation/pkg/federatedtypes/crudtester/BUILD +++ b/federation/pkg/federatedtypes/crudtester/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["crudtester.go"], - tags = ["automanaged"], deps = [ "//federation/pkg/federatedtypes:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/federation/pkg/federatedtypes/daemonset.go b/federation/pkg/federatedtypes/daemonset.go index 3b581b6ddf6..6c5ba82050c 100644 --- a/federation/pkg/federatedtypes/daemonset.go +++ b/federation/pkg/federatedtypes/daemonset.go @@ -44,7 +44,7 @@ type DaemonSetAdapter struct { client federationclientset.Interface } -func NewDaemonSetAdapter(client federationclientset.Interface, config *restclient.Config) FederatedTypeAdapter { +func NewDaemonSetAdapter(client federationclientset.Interface, config *restclient.Config, adapterSpecificArgs map[string]interface{}) FederatedTypeAdapter { return &DaemonSetAdapter{client: client} } diff --git a/federation/pkg/federatedtypes/deployment.go b/federation/pkg/federatedtypes/deployment.go index af61f0f92bc..cc6eccbd70b 100644 --- a/federation/pkg/federatedtypes/deployment.go +++ b/federation/pkg/federatedtypes/deployment.go @@ -40,16 +40,16 @@ func init() { } type DeploymentAdapter struct { - *schedulingAdapter + *replicaSchedulingAdapter client federationclientset.Interface } -func NewDeploymentAdapter(client federationclientset.Interface, config *restclient.Config) FederatedTypeAdapter { - schedulingAdapter := schedulingAdapter{ +func NewDeploymentAdapter(client federationclientset.Interface, config *restclient.Config, adapterSpecificArgs map[string]interface{}) FederatedTypeAdapter { + schedulingAdapter := replicaSchedulingAdapter{ preferencesAnnotationName: FedDeploymentPreferencesAnnotation, - updateStatusFunc: func(obj pkgruntime.Object, status interface{}) error { + updateStatusFunc: func(obj pkgruntime.Object, schedulingInfo interface{}) error { deployment := obj.(*extensionsv1.Deployment) - typedStatus := status.(ReplicaSchedulingStatus) + typedStatus := schedulingInfo.(*ReplicaSchedulingInfo).Status if typedStatus.Replicas != deployment.Status.Replicas || typedStatus.UpdatedReplicas != deployment.Status.UpdatedReplicas || typedStatus.ReadyReplicas != deployment.Status.ReadyReplicas || typedStatus.AvailableReplicas != deployment.Status.AvailableReplicas { deployment.Status = extensionsv1.DeploymentStatus{ diff --git a/federation/pkg/federatedtypes/hpa.go b/federation/pkg/federatedtypes/hpa.go new file mode 100644 index 00000000000..66806b35159 --- /dev/null +++ b/federation/pkg/federatedtypes/hpa.go @@ -0,0 +1,938 @@ +/* +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 federatedtypes + +import ( + "time" + + "fmt" + autoscalingv1 "k8s.io/api/autoscaling/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + pkgruntime "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/watch" + kubeclientset "k8s.io/client-go/kubernetes" + restclient "k8s.io/client-go/rest" + federationapi "k8s.io/kubernetes/federation/apis/federation/v1beta1" + federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset" + fedutil "k8s.io/kubernetes/federation/pkg/federation-controller/util" +) + +const ( + HpaKind = "horizontalpodautoscaler" + HpaControllerName = "horizontalpodautoscalers" + // This is used as the default min for hpa object submitted + // to federation, in a situation where the default is for + // some reason not present (Spec.MinReplicas == nil) + hpaMinReplicaDefault = int32(1) + // This is a tunable which does not change replica nums + // on an existing local hpa, before this timeout, if it + // did scale already (avoids thrashing of replicas around). + ScaleForbiddenWindow = 2 * time.Minute +) + +func init() { + RegisterFederatedType(HpaKind, HpaControllerName, []schema.GroupVersionResource{autoscalingv1.SchemeGroupVersion.WithResource(HpaControllerName)}, NewHpaAdapter) +} + +type HpaAdapter struct { + client federationclientset.Interface + scaleForbiddenWindow time.Duration +} + +func NewHpaAdapter(client federationclientset.Interface, config *restclient.Config, adapterSpecificArgs map[string]interface{}) FederatedTypeAdapter { + var scaleForbiddenWindow time.Duration + if adapterSpecificArgs != nil && adapterSpecificArgs[HpaKind] != nil { + scaleForbiddenWindow = adapterSpecificArgs[HpaKind].(*metav1.Duration).Duration + } else { + scaleForbiddenWindow = ScaleForbiddenWindow + } + + return &HpaAdapter{ + client: client, + scaleForbiddenWindow: scaleForbiddenWindow, + } +} + +func (a *HpaAdapter) Kind() string { + return HpaKind +} + +func (a *HpaAdapter) ObjectType() pkgruntime.Object { + return &autoscalingv1.HorizontalPodAutoscaler{} +} + +func (a *HpaAdapter) IsExpectedType(obj interface{}) bool { + _, ok := obj.(*autoscalingv1.HorizontalPodAutoscaler) + return ok +} + +func (a *HpaAdapter) Copy(obj pkgruntime.Object) pkgruntime.Object { + hpa := obj.(*autoscalingv1.HorizontalPodAutoscaler) + return &autoscalingv1.HorizontalPodAutoscaler{ + ObjectMeta: fedutil.DeepCopyRelevantObjectMeta(hpa.ObjectMeta), + Spec: *fedutil.DeepCopyApiTypeOrPanic(&hpa.Spec).(*autoscalingv1.HorizontalPodAutoscalerSpec), + } +} + +func (a *HpaAdapter) Equivalent(obj1, obj2 pkgruntime.Object) bool { + return fedutil.ObjectMetaAndSpecEquivalent(obj1, obj2) +} + +func (a *HpaAdapter) QualifiedName(obj pkgruntime.Object) QualifiedName { + hpa := obj.(*autoscalingv1.HorizontalPodAutoscaler) + return QualifiedName{Namespace: hpa.Namespace, Name: hpa.Name} +} + +func (a *HpaAdapter) ObjectMeta(obj pkgruntime.Object) *metav1.ObjectMeta { + return &obj.(*autoscalingv1.HorizontalPodAutoscaler).ObjectMeta +} + +func (a *HpaAdapter) FedCreate(obj pkgruntime.Object) (pkgruntime.Object, error) { + hpa := obj.(*autoscalingv1.HorizontalPodAutoscaler) + return a.client.AutoscalingV1().HorizontalPodAutoscalers(hpa.Namespace).Create(hpa) +} + +func (a *HpaAdapter) FedDelete(qualifiedName QualifiedName, options *metav1.DeleteOptions) error { + return a.client.AutoscalingV1().HorizontalPodAutoscalers(qualifiedName.Namespace).Delete(qualifiedName.Name, options) +} + +func (a *HpaAdapter) FedGet(qualifiedName QualifiedName) (pkgruntime.Object, error) { + return a.client.AutoscalingV1().HorizontalPodAutoscalers(qualifiedName.Namespace).Get(qualifiedName.Name, metav1.GetOptions{}) +} + +func (a *HpaAdapter) FedList(namespace string, options metav1.ListOptions) (pkgruntime.Object, error) { + return a.client.AutoscalingV1().HorizontalPodAutoscalers(namespace).List(options) +} + +func (a *HpaAdapter) FedUpdate(obj pkgruntime.Object) (pkgruntime.Object, error) { + hpa := obj.(*autoscalingv1.HorizontalPodAutoscaler) + return a.client.AutoscalingV1().HorizontalPodAutoscalers(hpa.Namespace).Update(hpa) +} + +func (a *HpaAdapter) FedWatch(namespace string, options metav1.ListOptions) (watch.Interface, error) { + return a.client.AutoscalingV1().HorizontalPodAutoscalers(namespace).Watch(options) +} + +func (a *HpaAdapter) ClusterCreate(client kubeclientset.Interface, obj pkgruntime.Object) (pkgruntime.Object, error) { + hpa := obj.(*autoscalingv1.HorizontalPodAutoscaler) + return client.AutoscalingV1().HorizontalPodAutoscalers(hpa.Namespace).Create(hpa) +} + +func (a *HpaAdapter) ClusterDelete(client kubeclientset.Interface, qualifiedName QualifiedName, options *metav1.DeleteOptions) error { + return client.AutoscalingV1().HorizontalPodAutoscalers(qualifiedName.Namespace).Delete(qualifiedName.Name, options) +} + +func (a *HpaAdapter) ClusterGet(client kubeclientset.Interface, qualifiedName QualifiedName) (pkgruntime.Object, error) { + return client.AutoscalingV1().HorizontalPodAutoscalers(qualifiedName.Namespace).Get(qualifiedName.Name, metav1.GetOptions{}) +} + +func (a *HpaAdapter) ClusterList(client kubeclientset.Interface, namespace string, options metav1.ListOptions) (pkgruntime.Object, error) { + return client.AutoscalingV1().HorizontalPodAutoscalers(namespace).List(options) +} + +func (a *HpaAdapter) ClusterUpdate(client kubeclientset.Interface, obj pkgruntime.Object) (pkgruntime.Object, error) { + hpa := obj.(*autoscalingv1.HorizontalPodAutoscaler) + return client.AutoscalingV1().HorizontalPodAutoscalers(hpa.Namespace).Update(hpa) +} + +func (a *HpaAdapter) ClusterWatch(client kubeclientset.Interface, namespace string, options metav1.ListOptions) (watch.Interface, error) { + return client.AutoscalingV1().HorizontalPodAutoscalers(namespace).Watch(options) +} + +func (a *HpaAdapter) NewTestObject(namespace string) pkgruntime.Object { + var min int32 = 4 + var targetCPU int32 = 70 + return &autoscalingv1.HorizontalPodAutoscaler{ + ObjectMeta: metav1.ObjectMeta{ + GenerateName: "test-hpa-", + Namespace: namespace, + }, + Spec: autoscalingv1.HorizontalPodAutoscalerSpec{ + ScaleTargetRef: autoscalingv1.CrossVersionObjectReference{ + Kind: "replicaset", + Name: "myrs", + }, + MinReplicas: &min, + MaxReplicas: int32(10), + TargetCPUUtilizationPercentage: &targetCPU, + }, + } +} + +func (a *HpaAdapter) IsSchedulingAdapter() bool { + return true +} + +func (a *HpaAdapter) EquivalentIgnoringSchedule(obj1, obj2 pkgruntime.Object) bool { + hpa1 := obj1.(*autoscalingv1.HorizontalPodAutoscaler) + hpa2 := a.Copy(obj2).(*autoscalingv1.HorizontalPodAutoscaler) + if hpa1.Spec.MinReplicas == nil { + hpa2.Spec.MinReplicas = nil + } else if hpa2.Spec.MinReplicas == nil { + var r int32 = *hpa1.Spec.MinReplicas + hpa2.Spec.MinReplicas = &r + } else { + *hpa2.Spec.MinReplicas = *hpa1.Spec.MinReplicas + } + hpa2.Spec.MaxReplicas = hpa1.Spec.MaxReplicas + return fedutil.ObjectMetaAndSpecEquivalent(hpa1, hpa2) +} + +type replicaNums struct { + min int32 + max int32 +} + +type hpaFederatedStatus struct { + lastScaleTime *metav1.Time + // Indicates how many clusters have hpa/replicas. + // Used to average the cpu utilization which is + // reflected to the federation user. + count int32 + aggregateCPUUtilizationPercentage *int32 + currentReplicas int32 + desiredReplicas int32 +} + +type hpaSchedulingInfo struct { + scheduleState map[string]*replicaNums + fedStatus hpaFederatedStatus +} + +// List of cluster names. +type hpaLists struct { + // Stores names of those clusters which can offer min. + availableMin sets.String + // Stores names of those clusters which can offer max. + availableMax sets.String + // Stores names of those clusters which do not have hpa yet. + noHpa sets.String +} + +func (a *HpaAdapter) GetSchedule(obj pkgruntime.Object, key string, clusters []*federationapi.Cluster, informer fedutil.FederatedInformer) (interface{}, error) { + currentClusterObjs, err := getCurrentClusterObjs(informer, key, clusters) + if err != nil { + return nil, err + } + + // Initialise averaged cpu utilisation for this reconcile. + var ccup int32 = 0 + fedStatus := hpaFederatedStatus{ + aggregateCPUUtilizationPercentage: &ccup, + count: int32(0), + desiredReplicas: int32(0), + currentReplicas: int32(0), + } + fedHpa := obj.(*autoscalingv1.HorizontalPodAutoscaler) + // We assign the last known scale time here, which we update with + // the latest time from among all clusters in ScheduleObject() + if fedHpa.Status.LastScaleTime != nil { + t := metav1.NewTime(fedHpa.Status.LastScaleTime.Time) + fedStatus.lastScaleTime = &t + } + + return &hpaSchedulingInfo{ + scheduleState: a.getHpaScheduleState(obj, currentClusterObjs), + fedStatus: fedStatus, + }, nil +} + +func getCurrentClusterObjs(informer fedutil.FederatedInformer, key string, clusters []*federationapi.Cluster) (map[string]pkgruntime.Object, error) { + currentClusterObjs := make(map[string]pkgruntime.Object) + for _, cluster := range clusters { + clusterName := cluster.Name + clusterObj, found, err := informer.GetTargetStore().GetByKey(clusterName, key) + if err != nil { + return nil, err + } + currentClusterObjs[clusterName] = nil + if found { + currentClusterObjs[clusterName] = clusterObj.(pkgruntime.Object) + } + } + return currentClusterObjs, nil +} + +// The algorithm used for scheduling is briefed as below: +// +// 1. Find clusters which can offer max and min, if any (lists.availableMax and +// lists.availableMin) in one pass on all clusters. +// +// 2. Reduce the replicas (both min and max) if needed (situation when fedHpa +// has lesser replicas then all cluster local hpa replicas totalled together). +// In this step reduce first from those hpas which already have max (and min) +// reducible. Once such clusters are over and reduction still needed, reduce +// one at a time from all clusters, randomly. This step will ensure that the +// exceeding replicas in local hpas are reduced to match the fedHpa. +// This step would ideally be a noop in most cases because its rare that fedHpa +// would have lesser replicas then the cluster local total (probably when user +// forces update if fedHpa). +// +// 3. Distribute the replicas. In this step we have replicas to distribute (which +// are fed replicas exceeding the sum total of local cluster replicas). If clusters +// already have replicas, one replica from each cluster which can offer replicas +// (both for max and min) are also added to this replicas to distribute numbers (min +// and max). +// 3a. We first do a sub-pass to distribute to clusters which need replicas, considering +// those as clusters in crucial need of replicas. +// 3b. After previous sub-pass, if we still have replicas remaining, in the sub-pass +// we distribute to those clusters which do not yet have any hpa. +// 3c. After previous if we still have more to distribute, then we distribute to all +// clusters randomly, giving replica distribution count (rdc=total-fed-replicas/no-of-clusters) +// to each at a time. +// +// The above algorithm is run to first distribute max and then distribute min to those clusters +// which get max. +func (a *HpaAdapter) getHpaScheduleState(fedObj pkgruntime.Object, currentObjs map[string]pkgruntime.Object) map[string]*replicaNums { + fedHpa := fedObj.(*autoscalingv1.HorizontalPodAutoscaler) + requestedMin := hpaMinReplicaDefault + if fedHpa.Spec.MinReplicas != nil { + requestedMin = *fedHpa.Spec.MinReplicas + } + requestedReplicas := replicaNums{ + min: requestedMin, + max: fedHpa.Spec.MaxReplicas, + } + // replica distribution count, per cluster + rdc := replicaNums{ + min: requestedReplicas.min / int32(len(currentObjs)), + max: requestedReplicas.max / int32(len(currentObjs)), + } + if rdc.min < 1 { + rdc.min = 1 + } + // TODO: Is there a better way? + // We need to cap the lowest limit of Max to 2, because in a + // situation like both min and max become 1 (same) for all clusters, + // no rebalancing would happen. + if rdc.max < 2 { + rdc.max = 2 + } + + // Pass 1: Analyse existing local hpa's if any. + // clusterLists holds the list of those clusters which can offer + // min and max replicas, to those which want them. + // For example new clusters joining the federation and/or + // those clusters which need to increase or reduce replicas + // beyond min/max limits. + // schedStatus currently have status of existing hpas. + // It will eventually have desired status for this reconcile. + clusterLists, currentReplicas, scheduleState := a.prepareForScheduling(currentObjs) + + remainingReplicas := replicaNums{ + min: requestedReplicas.min - currentReplicas.min, + max: requestedReplicas.max - currentReplicas.max, + } + + // Pass 2: reduction of replicas if needed ( situation that fedHpa updated replicas + // to lesser then existing). + // In this pass, we remain pessimistic and reduce one replica per cluster at a time. + if remainingReplicas.min < 0 { + excessMin := (remainingReplicas.min * int32(-1)) + remainingReplicas.min = reduceMinReplicas(excessMin, clusterLists.availableMin, scheduleState) + } + if remainingReplicas.max < 0 { + excessMax := (remainingReplicas.max * int32(-1)) + remainingReplicas.max = reduceMaxReplicas(excessMax, clusterLists.availableMax, scheduleState) + } + + toDistribute := replicaNums{ + min: remainingReplicas.min + int32(clusterLists.availableMin.Len()), + max: remainingReplicas.max + int32(clusterLists.availableMax.Len()), + } + + // Pass 3: Distribute Max and then Min. + // Here we first distribute max and then (in the next loop) + // distribute min into those clusters which already get the + // max fixed. + // In this process we might not meet the min limit and total of + // min limits might remain more then the requested federated min. + // This is partially because a min per cluster cannot be lesser + // then 1, but min could be requested as 1 at federation. + // Additionally we first increase replicas into those clusters + // which already have hpa's and are in a condition to increase. + // This will save cluster related resources for the user, such that + // if an already existing cluster can satisfy users request why send + // the workload to another. + // We then go ahead to give the replicas to those which do not + // have any hpa. In this pass however we try to ensure that all + // our Max are consumed in this reconcile. + a.distributeMaxReplicas(toDistribute.max, clusterLists, rdc, currentObjs, scheduleState) + + // We distribute min to those clusters which: + // 1 - can adjust min (our increase step would be only 1) + // 2 - which do not have this hpa and got max(increase step rdcMin) + // We might exhaust all min replicas here, with + // some clusters still needing them. We adjust this in finalise by + // assigning min replicas to 1 into those clusters which got max + // but min remains 0. + a.distributeMinReplicas(toDistribute.min, clusterLists, rdc, currentObjs, scheduleState) + + return finaliseScheduleState(scheduleState) +} + +func (a *HpaAdapter) ScheduleObject(cluster *federationapi.Cluster, clusterObj pkgruntime.Object, federationObjCopy pkgruntime.Object, schedulingInfo interface{}) (pkgruntime.Object, ScheduleAction, error) { + // Update federated status info + typedInfo := schedulingInfo.(*hpaSchedulingInfo) + if clusterObj != nil { + clusterHpa := clusterObj.(*autoscalingv1.HorizontalPodAutoscaler) + if clusterHpa.Status.CurrentCPUUtilizationPercentage != nil { + *typedInfo.fedStatus.aggregateCPUUtilizationPercentage += + (*clusterHpa.Status.CurrentCPUUtilizationPercentage * clusterHpa.Status.CurrentReplicas) + typedInfo.fedStatus.count += clusterHpa.Status.CurrentReplicas + } + if clusterHpa.Status.LastScaleTime != nil { + t := metav1.NewTime(clusterHpa.Status.LastScaleTime.Time) + if typedInfo.fedStatus.lastScaleTime != nil && + t.After(typedInfo.fedStatus.lastScaleTime.Time) { + typedInfo.fedStatus.lastScaleTime = &t + } + } + + typedInfo.fedStatus.currentReplicas += clusterHpa.Status.CurrentReplicas + typedInfo.fedStatus.desiredReplicas += clusterHpa.Status.DesiredReplicas + } + + // Update the cluster obj and the needed action on the cluster + clusterHpaState := typedInfo.scheduleState[cluster.Name] + desiredHpa := federationObjCopy.(*autoscalingv1.HorizontalPodAutoscaler) + if clusterHpaState != nil { + desiredHpa.Spec.MaxReplicas = clusterHpaState.max + if desiredHpa.Spec.MinReplicas == nil { + min := int32(0) + desiredHpa.Spec.MinReplicas = &min + } + *desiredHpa.Spec.MinReplicas = clusterHpaState.min + } + + var defaultAction ScheduleAction = "" + switch { + case clusterHpaState != nil && clusterObj != nil: + return desiredHpa, defaultAction, nil + case clusterHpaState != nil && clusterObj == nil: + return desiredHpa, ActionAdd, nil + case clusterHpaState == nil && clusterObj != nil: + return nil, ActionDelete, nil + } + return nil, defaultAction, nil +} + +func (a *HpaAdapter) UpdateFederatedStatus(obj pkgruntime.Object, schedulingInfo interface{}) error { + fedHpa := obj.(*autoscalingv1.HorizontalPodAutoscaler) + needUpdate, newFedHpaStatus := updateStatus(fedHpa, schedulingInfo.(*hpaSchedulingInfo).fedStatus) + if needUpdate { + fedHpa.Status = newFedHpaStatus + _, err := a.client.AutoscalingV1().HorizontalPodAutoscalers(fedHpa.Namespace).UpdateStatus(fedHpa) + if err != nil { + return fmt.Errorf("Error updating hpa: %s status in federation: %v", fedHpa.Name, err) + } + } + return nil +} + +func updateStatus(fedHpa *autoscalingv1.HorizontalPodAutoscaler, newStatus hpaFederatedStatus) (bool, autoscalingv1.HorizontalPodAutoscalerStatus) { + averageCPUUtilizationPercentage := int32(0) + // Average out the available current utilisation + if *newStatus.aggregateCPUUtilizationPercentage != 0 && newStatus.count != 0 { + averageCPUUtilizationPercentage = *newStatus.aggregateCPUUtilizationPercentage / newStatus.count + } + gen := fedHpa.Generation + newFedHpaStatus := autoscalingv1.HorizontalPodAutoscalerStatus{ObservedGeneration: &gen} + needUpdate := false + if (fedHpa.Status.CurrentCPUUtilizationPercentage == nil && + averageCPUUtilizationPercentage != 0) || + (fedHpa.Status.CurrentCPUUtilizationPercentage != nil && + averageCPUUtilizationPercentage != + *fedHpa.Status.CurrentCPUUtilizationPercentage) { + needUpdate = true + newFedHpaStatus.CurrentCPUUtilizationPercentage = &averageCPUUtilizationPercentage + } + if (fedHpa.Status.LastScaleTime == nil && newStatus.lastScaleTime != nil) || + (fedHpa.Status.LastScaleTime != nil && newStatus.lastScaleTime == nil) || + ((fedHpa.Status.LastScaleTime != nil && newStatus.lastScaleTime != nil) && + newStatus.lastScaleTime.After(fedHpa.Status.LastScaleTime.Time)) { + needUpdate = true + newFedHpaStatus.LastScaleTime = newStatus.lastScaleTime + } + if fedHpa.Status.DesiredReplicas != newStatus.desiredReplicas { + needUpdate = true + newFedHpaStatus.CurrentReplicas = newStatus.currentReplicas + } + if fedHpa.Status.CurrentReplicas != newStatus.currentReplicas { + needUpdate = true + newFedHpaStatus.DesiredReplicas = newStatus.desiredReplicas + } + return needUpdate, newFedHpaStatus +} + +// prepareForScheduling prepares the lists and totals from the +// existing objs. +// currentObjs has the list of all clusters, with obj as nil +// for those clusters which do not have hpa yet. +func (a *HpaAdapter) prepareForScheduling(currentObjs map[string]pkgruntime.Object) (hpaLists, replicaNums, map[string]*replicaNums) { + lists := hpaLists{ + availableMax: sets.NewString(), + availableMin: sets.NewString(), + noHpa: sets.NewString(), + } + existingTotal := replicaNums{ + min: int32(0), + max: int32(0), + } + + scheduleState := make(map[string]*replicaNums) + for cluster, obj := range currentObjs { + if obj == nil { + lists.noHpa.Insert(cluster) + scheduleState[cluster] = nil + continue + } + + if a.maxReplicasReducible(obj) { + lists.availableMax.Insert(cluster) + } + if a.minReplicasReducible(obj) { + lists.availableMin.Insert(cluster) + } + + replicas := replicaNums{min: 0, max: 0} + scheduleState[cluster] = &replicas + if obj.(*autoscalingv1.HorizontalPodAutoscaler).Spec.MinReplicas != nil { + existingTotal.min += *obj.(*autoscalingv1.HorizontalPodAutoscaler).Spec.MinReplicas + replicas.min = *obj.(*autoscalingv1.HorizontalPodAutoscaler).Spec.MinReplicas + } + existingTotal.max += obj.(*autoscalingv1.HorizontalPodAutoscaler).Spec.MaxReplicas + replicas.max = obj.(*autoscalingv1.HorizontalPodAutoscaler).Spec.MaxReplicas + } + + return lists, existingTotal, scheduleState +} + +// Note: reduceMinReplicas and reduceMaxReplicas, look quite similar in flow +// and code, however there are subtle differences. They together can be made +// into 1 function with an arg governing the functionality difference and +// additional args (superset of args in both) as needed. Doing so however +// makes the logical flow quite less readable. They are thus left as 2 for +// readability. + +// reduceMinReplicas reduces the min replicas from existing clusters. +// At the end of the function excessMin should be 0 and the MinList +// and the scheduledReplicas properly updated in place. +func reduceMinReplicas(excessMin int32, availableMinList sets.String, scheduled map[string]*replicaNums) int32 { + if excessMin > 0 { + // first we try reducing from those clusters which already offer min + if availableMinList.Len() > 0 { + for _, cluster := range availableMinList.List() { + replicas := scheduled[cluster] + if replicas.min > 1 { + replicas.min-- + availableMinList.Delete(cluster) + excessMin-- + if excessMin <= 0 { + break + } + } + } + } + } + + // If we could not get needed replicas from already offered min above + // we abruptly start removing replicas from some/all clusters. + // Here we might make some min to 0 signalling that this hpa might be a + // candidate to be removed from this cluster altogether. + for excessMin > 0 { + for _, replicas := range scheduled { + if replicas != nil && + replicas.min > 0 { + replicas.min-- + excessMin-- + if excessMin <= 0 { + break + } + } + } + } + + return excessMin +} + +// reduceMaxReplicas reduces the max replicas from existing clusters. +// At the end of the function excessMax should be 0 and the MaxList +// and the scheduledReplicas properly updated in place. +func reduceMaxReplicas(excessMax int32, availableMaxList sets.String, scheduled map[string]*replicaNums) int32 { + if excessMax > 0 { + // first we try reducing from those clusters which already offer max + if availableMaxList.Len() > 0 { + for _, cluster := range availableMaxList.List() { + replicas := scheduled[cluster] + if replicas != nil && !((replicas.max - replicas.min) < 0) { + replicas.max-- + availableMaxList.Delete(cluster) + excessMax-- + if excessMax <= 0 { + break + } + } + } + } + } + // If we could not get needed replicas to reduce from already offered + // max above we abruptly start removing replicas from some/all clusters. + // Here we might make some max and min to 0, signalling that this hpa be + // removed from this cluster altogether + for excessMax > 0 { + for _, replicas := range scheduled { + if replicas != nil && + !((replicas.max - replicas.min) < 0) { + replicas.max-- + excessMax-- + if excessMax <= 0 { + break + } + } + } + } + + return excessMax +} + +// distributeMaxReplicas +// Takes input: +// toDistributeMax: number of replicas to distribute. +// lists: cluster name lists, which have clusters with available max, +// available min and those with no hpas yet. +// rdc: replicadistributioncount for max and min. +// currentObjs: list of current cluster hpas. +// scheduled: schedule state which will be updated in place. +func (a *HpaAdapter) distributeMaxReplicas(toDistributeMax int32, lists hpaLists, rdc replicaNums, + currentObjs map[string]pkgruntime.Object, scheduled map[string]*replicaNums) int32 { + for cluster, replicas := range scheduled { + if toDistributeMax == 0 { + break + } + if replicas == nil { + continue + } + if a.maxReplicasNeeded(currentObjs[cluster]) { + replicas.max++ + if lists.availableMax.Len() > 0 { + popped, notEmpty := lists.availableMax.PopAny() + if notEmpty { + // Boundary checks have happened earlier in + // minReplicasReducible(). + scheduled[popped].max-- + } + } + // Any which ways utilise available map replicas + toDistributeMax-- + } + } + + // If we have new clusters where we can give our replicas, + // then give away all our replicas to the new clusters first. + if lists.noHpa.Len() > 0 { + for toDistributeMax > 0 { + for _, cluster := range lists.noHpa.UnsortedList() { + if scheduled[cluster] == nil { + scheduled[cluster] = &replicaNums{min: 0, max: 0} + } + replicas := scheduled[cluster] + // first give away max from clusters offering them + // this case especially helps getting hpa into newly joining + // clusters. + if lists.availableMax.Len() > 0 { + popped, notEmpty := lists.availableMax.PopAny() + if notEmpty { + // Boundary checks to reduce max have happened earlier in + // minReplicasReducible(). + replicas.max++ + scheduled[popped].max-- + toDistributeMax-- + continue + } + } + if toDistributeMax < rdc.max { + replicas.max += toDistributeMax + toDistributeMax = 0 + break + } + replicas.max += rdc.max + toDistributeMax -= rdc.max + } + } + } else { // we have no new clusters but if still have max replicas to distribute; + // just distribute all in current clusters. + for toDistributeMax > 0 { + for cluster, replicas := range scheduled { + if replicas == nil { + replicas = &replicaNums{min: 0, max: 0} + scheduled[cluster] = replicas + } + // First give away max from clusters offering them. + // This case especially helps getting hpa into newly joining + // clusters. + if lists.availableMax.Len() > 0 { + popped, notEmpty := lists.availableMax.PopAny() + if notEmpty { + // Boundary checks have happened earlier in + // minReplicasReducible(). + replicas.max++ + scheduled[popped].max-- + toDistributeMax-- + continue + } + } + if toDistributeMax < rdc.max { + replicas.max += toDistributeMax + toDistributeMax = 0 + break + } + replicas.max += rdc.max + toDistributeMax -= rdc.max + } + } + } + return toDistributeMax +} + +// distributeMinReplicas +// Takes input: +// toDistributeMin: number of replicas to distribute. +// lists: cluster name lists, which have clusters with available max, +// available min and those with no hpas yet. +// rdc: replicadistributioncount for max and min. +// currentObjs: list of current cluster hpas. +// scheduled: schedule state which will be updated in place. +func (a *HpaAdapter) distributeMinReplicas(toDistributeMin int32, lists hpaLists, rdc replicaNums, + currentObjs map[string]pkgruntime.Object, scheduled map[string]*replicaNums) int32 { + for cluster, replicas := range scheduled { + if toDistributeMin == 0 { + break + } + // We have distriubted Max and thus scheduled might not be nil + // but probably current (what we got originally) is nil(no hpa) + if replicas == nil || currentObjs[cluster] == nil { + continue + } + if a.minReplicasIncreasable(currentObjs[cluster]) { + if lists.availableMin.Len() > 0 { + popped, notEmpty := lists.availableMin.PopAny() + if notEmpty { + // Boundary checks have happened earlier. + scheduled[popped].min-- + replicas.min++ + toDistributeMin-- + } + } + } + } + + if lists.noHpa.Len() > 0 { + // TODO: can this become an infinite loop? + for toDistributeMin > 0 { + for _, cluster := range lists.noHpa.UnsortedList() { + replicas := scheduled[cluster] + if replicas == nil { + // We did not get max here so this cluster + // remains without hpa + continue + } + var replicaNum int32 = 0 + if toDistributeMin < rdc.min { + replicaNum = toDistributeMin + } else { + replicaNum = rdc.min + } + if (replicas.max - replicaNum) < replicas.min { + // Cannot increase the min in this cluster + // as it will go beyond max + continue + } + if lists.availableMin.Len() > 0 { + popped, notEmpty := lists.availableMin.PopAny() + if notEmpty { + // Boundary checks have happened earlier. + scheduled[popped].min-- + replicas.min++ + toDistributeMin-- + continue + } + } + replicas.min += replicaNum + toDistributeMin -= replicaNum + } + } + } else { // we have no new clusters but if still have min replicas to distribute; + // just distribute all in current clusters. + for toDistributeMin > 0 { + for _, replicas := range scheduled { + if replicas == nil { + // We did not get max here so this cluster + // remains without hpa + continue + } + var replicaNum int32 = 0 + if toDistributeMin < rdc.min { + replicaNum = toDistributeMin + } else { + replicaNum = rdc.min + } + if (replicas.max - replicaNum) < replicas.min { + // Cannot increase the min in this cluster + // as it will go beyond max + continue + } + if lists.availableMin.Len() > 0 { + popped, notEmpty := lists.availableMin.PopAny() + if notEmpty { + // Boundary checks have happened earlier. + scheduled[popped].min-- + replicas.min++ + toDistributeMin-- + continue + } + } + replicas.min += replicaNum + toDistributeMin -= replicaNum + } + } + } + return toDistributeMin +} + +// finaliseScheduleState ensures that the minReplica count is made to 1 +// for those clusters which got max, but did not get min. This is because +// k8s hpa does not accept hpas with 0 min replicas. +// The replica num distribution can thus have more mins then fedHpa requested +// but its better then having all replicas go into one cluster (if fedHpa +// requested min=1 (which is the most usual case). +func finaliseScheduleState(scheduled map[string]*replicaNums) map[string]*replicaNums { + for _, replicas := range scheduled { + if (replicas != nil) && (replicas.min <= 0) && (replicas.max > 0) { + // Min total does not necessarily meet the federated min limit. + replicas.min = 1 + } + } + return scheduled +} + +// isPristine is used to determine if so far local controller has been +// able to really determine, what should be the desired replica number for +// this cluster. +// This is used to get hpas into those clusters which might join fresh, +// and so far other cluster hpas haven't really reached anywhere. +// TODO: There is a flaw here, that a just born object would also offer its +// replicas which can also lead to fast thrashing. +// The only better way is to either ensure that object creation time stamp is set +// and can be used authoritatively; or have another field on the local object +// which is mandatorily set on creation and can be used authoritatively. +// Should we abuse annotations again for this, or this can be a proper requirement? +func isPristine(hpa *autoscalingv1.HorizontalPodAutoscaler) bool { + if hpa.Status.LastScaleTime == nil && + hpa.Status.DesiredReplicas == 0 { + return true + } + return false +} + +// isScaleable tells if it already has been a reasonable amount of +// time since this hpa scaled. Its used to avoid fast thrashing. +func (a *HpaAdapter) isScaleable(hpa *autoscalingv1.HorizontalPodAutoscaler) bool { + if hpa.Status.LastScaleTime == nil { + return false + } + t := hpa.Status.LastScaleTime.Add(a.scaleForbiddenWindow) + if t.After(time.Now()) { + return false + } + return true +} + +func (a *HpaAdapter) maxReplicasReducible(obj pkgruntime.Object) bool { + hpa := obj.(*autoscalingv1.HorizontalPodAutoscaler) + if (hpa.Spec.MinReplicas != nil) && + (((hpa.Spec.MaxReplicas - 1) - *hpa.Spec.MinReplicas) < 0) { + return false + } + if isPristine(hpa) { + return true + } + if !a.isScaleable(hpa) { + return false + } + if (hpa.Status.DesiredReplicas < hpa.Status.CurrentReplicas) || + ((hpa.Status.DesiredReplicas == hpa.Status.CurrentReplicas) && + (hpa.Status.DesiredReplicas < hpa.Spec.MaxReplicas)) { + return true + } + return false +} + +// minReplicasReducible checks if this cluster (hpa) can offer replicas which are +// stuck here because of min limit. +// Its noteworthy, that min and max are adjusted separately, but if the replicas +// are not being used here, the max adjustment will lead it to become equal to min, +// but will not be able to scale down further and offer max to some other cluster +// which needs replicas. +func (a *HpaAdapter) minReplicasReducible(obj pkgruntime.Object) bool { + hpa := obj.(*autoscalingv1.HorizontalPodAutoscaler) + if isPristine(hpa) && (hpa.Spec.MinReplicas != nil) && + (*hpa.Spec.MinReplicas > 1) && + (*hpa.Spec.MinReplicas <= hpa.Spec.MaxReplicas) { + return true + } + if !a.isScaleable(hpa) { + return false + } + if (hpa.Spec.MinReplicas != nil) && + (*hpa.Spec.MinReplicas > 1) && + (hpa.Status.DesiredReplicas == hpa.Status.CurrentReplicas) && + (hpa.Status.CurrentReplicas == *hpa.Spec.MinReplicas) { + return true + } + return false +} + +func (a *HpaAdapter) maxReplicasNeeded(obj pkgruntime.Object) bool { + hpa := obj.(*autoscalingv1.HorizontalPodAutoscaler) + if !a.isScaleable(hpa) { + return false + } + + if (hpa.Status.CurrentReplicas == hpa.Status.DesiredReplicas) && + (hpa.Status.CurrentReplicas == hpa.Spec.MaxReplicas) { + return true + } + return false +} + +func (a *HpaAdapter) minReplicasIncreasable(obj pkgruntime.Object) bool { + hpa := obj.(*autoscalingv1.HorizontalPodAutoscaler) + if !a.isScaleable(hpa) || + ((hpa.Spec.MinReplicas != nil) && + (*hpa.Spec.MinReplicas) >= hpa.Spec.MaxReplicas) { + return false + } + + if (hpa.Spec.MinReplicas != nil) && + (hpa.Status.DesiredReplicas > *hpa.Spec.MinReplicas) { + return true + } + return false +} diff --git a/federation/pkg/federatedtypes/hpa_test.go b/federation/pkg/federatedtypes/hpa_test.go new file mode 100644 index 00000000000..95447b18d54 --- /dev/null +++ b/federation/pkg/federatedtypes/hpa_test.go @@ -0,0 +1,264 @@ +/* +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 federatedtypes + +import ( + "testing" + + autoscalingv1 "k8s.io/api/autoscaling/v1" + apiv1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + pkgruntime "k8s.io/apimachinery/pkg/runtime" + . "k8s.io/kubernetes/federation/pkg/federation-controller/util/test" + + "github.com/stretchr/testify/assert" +) + +type replicas struct { + min int32 + max int32 +} + +func TestGetHpaScheduleState(t *testing.T) { + defaultFedHpa := newHpaWithReplicas(NewInt32(1), NewInt32(70), 10) + testCases := map[string]struct { + fedHpa *autoscalingv1.HorizontalPodAutoscaler + localHpas map[string]pkgruntime.Object + expectedReplicas map[string]*replicas + }{ + "Distribiutes replicas randomly if no existing hpa in any local cluster": { + localHpas: func() map[string]pkgruntime.Object { + hpas := make(map[string]pkgruntime.Object) + hpas["c1"] = nil + hpas["c2"] = nil + return hpas + }(), + }, + "Cluster with no hpa gets replicas if other clusters have replicas": { + localHpas: func() map[string]pkgruntime.Object { + hpas := make(map[string]pkgruntime.Object) + hpas["c1"] = newHpaWithReplicas(NewInt32(1), NewInt32(70), 10) + hpas["c2"] = nil + return hpas + }(), + expectedReplicas: map[string]*replicas{ + "c1": { + min: int32(1), + max: int32(9), + }, + "c2": { + min: int32(1), + max: int32(1), + }, + }, + }, + "Cluster needing max replicas gets it if there is another cluster to offer max": { + localHpas: func() map[string]pkgruntime.Object { + hpa1 := newHpaWithReplicas(NewInt32(1), NewInt32(70), 7) + hpa1 = updateHpaStatus(hpa1, NewInt32(50), 5, 5, true) + hpa2 := newHpaWithReplicas(NewInt32(1), NewInt32(70), 1) + hpa2 = updateHpaStatus(hpa2, NewInt32(70), 1, 1, true) + // include third object to ensure, it does not break the test + hpa3 := newHpaWithReplicas(NewInt32(1), NewInt32(70), 2) + hpa3 = updateHpaStatus(hpa3, NewInt32(70), 1, 1, false) + hpas := make(map[string]pkgruntime.Object) + hpas["c1"] = hpa1 + hpas["c2"] = hpa2 + hpas["c3"] = hpa3 + return hpas + }(), + expectedReplicas: map[string]*replicas{ + "c1": { + min: int32(1), + max: int32(6), + }, + "c2": { + min: int32(1), + max: int32(2), + }, + "c3": { + min: int32(1), + max: int32(2), + }, + }, + }, + "Cluster needing max replicas does not get it if there is no cluster offerring max": { + localHpas: func() map[string]pkgruntime.Object { + hpa1 := newHpaWithReplicas(NewInt32(1), NewInt32(70), 9) + hpa1 = updateHpaStatus(hpa1, NewInt32(70), 9, 9, false) + hpa2 := newHpaWithReplicas(NewInt32(1), NewInt32(70), 1) + hpa2 = updateHpaStatus(hpa2, NewInt32(70), 1, 1, true) + hpas := make(map[string]pkgruntime.Object) + hpas["c1"] = hpa1 + hpas["c2"] = hpa2 + return hpas + }(), + expectedReplicas: map[string]*replicas{ + "c1": { + min: int32(1), + max: int32(9), + }, + "c2": { + min: int32(1), + max: int32(1), + }, + }, + }, + "Cluster which can increase min replicas gets to increase min if there is a cluster offering min": { + fedHpa: newHpaWithReplicas(NewInt32(4), NewInt32(70), 10), + localHpas: func() map[string]pkgruntime.Object { + hpa1 := newHpaWithReplicas(NewInt32(3), NewInt32(70), 6) + hpa1 = updateHpaStatus(hpa1, NewInt32(50), 3, 3, true) + hpa2 := newHpaWithReplicas(NewInt32(1), NewInt32(70), 4) + hpa2 = updateHpaStatus(hpa2, NewInt32(50), 3, 3, true) + hpas := make(map[string]pkgruntime.Object) + hpas["c1"] = hpa1 + hpas["c2"] = hpa2 + return hpas + }(), + expectedReplicas: map[string]*replicas{ + "c1": { + min: int32(2), + max: int32(6), + }, + "c2": { + min: int32(2), + max: int32(4), + }, + }, + }, + "Cluster which can increase min replicas does not increase if there are no clusters offering min": { + fedHpa: newHpaWithReplicas(NewInt32(4), NewInt32(70), 10), + localHpas: func() map[string]pkgruntime.Object { + hpa1 := newHpaWithReplicas(NewInt32(3), NewInt32(70), 6) + hpa1 = updateHpaStatus(hpa1, NewInt32(50), 4, 4, true) + hpa2 := newHpaWithReplicas(NewInt32(1), NewInt32(70), 4) + hpa2 = updateHpaStatus(hpa2, NewInt32(50), 3, 3, true) + hpas := make(map[string]pkgruntime.Object) + hpas["c1"] = hpa1 + hpas["c2"] = hpa2 + return hpas + }(), + expectedReplicas: map[string]*replicas{ + "c1": { + min: int32(3), + max: int32(6), + }, + "c2": { + min: int32(1), + max: int32(4), + }, + }, + }, + "Increasing replicas on fed object increases the same on clusters": { + // Existing total of local min, max = 1+1, 5+5 decreasing to below + fedHpa: newHpaWithReplicas(NewInt32(4), NewInt32(70), 14), + localHpas: func() map[string]pkgruntime.Object { + // does not matter if scaleability is true + hpas := make(map[string]pkgruntime.Object) + hpas["c1"] = newHpaWithReplicas(NewInt32(1), NewInt32(70), 5) + hpas["c2"] = newHpaWithReplicas(NewInt32(1), NewInt32(70), 5) + return hpas + }(), + // We dont know which cluster gets how many, but the resultant total should match + }, + "Decreasing replicas on fed object decreases the same on clusters": { + // Existing total of local min, max = 2+2, 8+8 decreasing to below + fedHpa: newHpaWithReplicas(NewInt32(3), NewInt32(70), 8), + localHpas: func() map[string]pkgruntime.Object { + // does not matter if scaleability is true + hpas := make(map[string]pkgruntime.Object) + hpas["c1"] = newHpaWithReplicas(NewInt32(2), NewInt32(70), 8) + hpas["c2"] = newHpaWithReplicas(NewInt32(2), NewInt32(70), 8) + return hpas + }(), + // We dont know which cluster gets how many, but the resultant total should match + }, + } + + adapter := &HpaAdapter{ + scaleForbiddenWindow: ScaleForbiddenWindow, + } + for testName, testCase := range testCases { + t.Run(testName, func(t *testing.T) { + if testCase.fedHpa == nil { + testCase.fedHpa = defaultFedHpa + } + scheduledState := adapter.getHpaScheduleState(testCase.fedHpa, testCase.localHpas) + checkClusterConditions(t, testCase.fedHpa, scheduledState) + if testCase.expectedReplicas != nil { + for cluster, replicas := range testCase.expectedReplicas { + scheduledReplicas := scheduledState[cluster] + assert.Equal(t, replicas.min, scheduledReplicas.min) + assert.Equal(t, replicas.max, scheduledReplicas.max) + } + } + }) + } +} + +func updateHpaStatus(hpa *autoscalingv1.HorizontalPodAutoscaler, currentUtilisation *int32, current, desired int32, scaleable bool) *autoscalingv1.HorizontalPodAutoscaler { + hpa.Status.CurrentReplicas = current + hpa.Status.DesiredReplicas = desired + hpa.Status.CurrentCPUUtilizationPercentage = currentUtilisation + now := metav1.Now() + scaledTime := now + if scaleable { + // definitely more then ScaleForbiddenWindow time ago + scaledTime = metav1.NewTime(now.Time.Add(-2 * ScaleForbiddenWindow)) + } + hpa.Status.LastScaleTime = &scaledTime + return hpa +} + +func checkClusterConditions(t *testing.T, fedHpa *autoscalingv1.HorizontalPodAutoscaler, scheduled map[string]*replicaNums) { + minTotal := int32(0) + maxTotal := int32(0) + for _, replicas := range scheduled { + minTotal += replicas.min + maxTotal += replicas.max + } + + // - Total of max matches the fed max + assert.Equal(t, fedHpa.Spec.MaxReplicas, maxTotal) + // - Total of min is not less then fed min + assert.Condition(t, func() bool { + if *fedHpa.Spec.MinReplicas <= minTotal { + return true + } + return false + }) +} + +func newHpaWithReplicas(min, targetUtilisation *int32, max int32) *autoscalingv1.HorizontalPodAutoscaler { + return &autoscalingv1.HorizontalPodAutoscaler{ + ObjectMeta: metav1.ObjectMeta{ + Name: "myhpa", + Namespace: apiv1.NamespaceDefault, + SelfLink: "/api/mylink", + }, + Spec: autoscalingv1.HorizontalPodAutoscalerSpec{ + ScaleTargetRef: autoscalingv1.CrossVersionObjectReference{ + Kind: "HorizontalPodAutoscaler", + Name: "target-", + }, + MinReplicas: min, + MaxReplicas: max, + TargetCPUUtilizationPercentage: targetUtilisation, + }, + } +} diff --git a/federation/pkg/federatedtypes/namespace.go b/federation/pkg/federatedtypes/namespace.go index 210338872cc..3caf1a2f679 100644 --- a/federation/pkg/federatedtypes/namespace.go +++ b/federation/pkg/federatedtypes/namespace.go @@ -50,7 +50,7 @@ type NamespaceAdapter struct { deleter deletion.NamespacedResourcesDeleterInterface } -func NewNamespaceAdapter(client federationclientset.Interface, config *restclient.Config) FederatedTypeAdapter { +func NewNamespaceAdapter(client federationclientset.Interface, config *restclient.Config, adapterSpecificArgs map[string]interface{}) FederatedTypeAdapter { dynamicClientPool := dynamic.NewDynamicClientPool(config) discoverResourcesFunc := client.Discovery().ServerPreferredNamespacedResources deleter := deletion.NewNamespacedResourcesDeleter( diff --git a/federation/pkg/federatedtypes/replicaset.go b/federation/pkg/federatedtypes/replicaset.go index d439c7a361a..f854679bb06 100644 --- a/federation/pkg/federatedtypes/replicaset.go +++ b/federation/pkg/federatedtypes/replicaset.go @@ -40,16 +40,16 @@ func init() { } type ReplicaSetAdapter struct { - *schedulingAdapter + *replicaSchedulingAdapter client federationclientset.Interface } -func NewReplicaSetAdapter(client federationclientset.Interface, config *restclient.Config) FederatedTypeAdapter { - schedulingAdapter := schedulingAdapter{ +func NewReplicaSetAdapter(client federationclientset.Interface, config *restclient.Config, adapterSpecificArgs map[string]interface{}) FederatedTypeAdapter { + replicaSchedulingAdapter := replicaSchedulingAdapter{ preferencesAnnotationName: FedReplicaSetPreferencesAnnotation, - updateStatusFunc: func(obj pkgruntime.Object, status interface{}) error { + updateStatusFunc: func(obj pkgruntime.Object, schedulingInfo interface{}) error { rs := obj.(*extensionsv1.ReplicaSet) - typedStatus := status.(ReplicaSchedulingStatus) + typedStatus := schedulingInfo.(*ReplicaSchedulingInfo).Status if typedStatus.Replicas != rs.Status.Replicas || typedStatus.FullyLabeledReplicas != rs.Status.FullyLabeledReplicas || typedStatus.ReadyReplicas != rs.Status.ReadyReplicas || typedStatus.AvailableReplicas != rs.Status.AvailableReplicas { rs.Status = extensionsv1.ReplicaSetStatus{ @@ -64,7 +64,7 @@ func NewReplicaSetAdapter(client federationclientset.Interface, config *restclie return nil }, } - return &ReplicaSetAdapter{&schedulingAdapter, client} + return &ReplicaSetAdapter{&replicaSchedulingAdapter, client} } func (a *ReplicaSetAdapter) Kind() string { diff --git a/federation/pkg/federatedtypes/scheduling.go b/federation/pkg/federatedtypes/scheduling.go index a6f9bcc9905..3cad44bd59e 100644 --- a/federation/pkg/federatedtypes/scheduling.go +++ b/federation/pkg/federatedtypes/scheduling.go @@ -37,6 +37,16 @@ import ( "github.com/golang/glog" ) +// ScheduleAction is used by the interface ScheduleObject of SchedulingAdapter +// to sync controller reconcile to convey the action type needed for the +// particular cluster local object in ScheduleObject +type ScheduleAction string + +const ( + ActionAdd = "add" + ActionDelete = "delete" +) + // ReplicaSchedulingStatus contains the status of the replica type objects (rs or deployment) // that are being scheduled into joined clusters. type ReplicaSchedulingStatus struct { @@ -58,26 +68,26 @@ type ReplicaSchedulingInfo struct { // federated type that requires more complex synchronization logic. type SchedulingAdapter interface { GetSchedule(obj pkgruntime.Object, key string, clusters []*federationapi.Cluster, informer fedutil.FederatedInformer) (interface{}, error) - ScheduleObject(cluster *federationapi.Cluster, clusterObj pkgruntime.Object, federationObjCopy pkgruntime.Object, schedulingInfo interface{}) (pkgruntime.Object, bool, error) - UpdateFederatedStatus(obj pkgruntime.Object, status interface{}) error + ScheduleObject(cluster *federationapi.Cluster, clusterObj pkgruntime.Object, federationObjCopy pkgruntime.Object, schedulingInfo interface{}) (pkgruntime.Object, ScheduleAction, error) + UpdateFederatedStatus(obj pkgruntime.Object, schedulingInfo interface{}) error // EquivalentIgnoringSchedule returns whether obj1 and obj2 are // equivalent ignoring differences due to scheduling. EquivalentIgnoringSchedule(obj1, obj2 pkgruntime.Object) bool } -// schedulingAdapter is meant to be embedded in other type adapters that require -// workload scheduling. -type schedulingAdapter struct { +// replicaSchedulingAdapter is meant to be embedded in other type adapters that require +// workload scheduling with actual pod replicas. +type replicaSchedulingAdapter struct { preferencesAnnotationName string updateStatusFunc func(pkgruntime.Object, interface{}) error } -func (a *schedulingAdapter) IsSchedulingAdapter() bool { +func (a *replicaSchedulingAdapter) IsSchedulingAdapter() bool { return true } -func (a *schedulingAdapter) GetSchedule(obj pkgruntime.Object, key string, clusters []*federationapi.Cluster, informer fedutil.FederatedInformer) (interface{}, error) { +func (a *replicaSchedulingAdapter) GetSchedule(obj pkgruntime.Object, key string, clusters []*federationapi.Cluster, informer fedutil.FederatedInformer) (interface{}, error) { var clusterNames []string for _, cluster := range clusters { clusterNames = append(clusterNames, cluster.Name) @@ -128,7 +138,7 @@ func (a *schedulingAdapter) GetSchedule(obj pkgruntime.Object, key string, clust }, nil } -func (a *schedulingAdapter) ScheduleObject(cluster *federationapi.Cluster, clusterObj pkgruntime.Object, federationObjCopy pkgruntime.Object, schedulingInfo interface{}) (pkgruntime.Object, bool, error) { +func (a *replicaSchedulingAdapter) ScheduleObject(cluster *federationapi.Cluster, clusterObj pkgruntime.Object, federationObjCopy pkgruntime.Object, schedulingInfo interface{}) (pkgruntime.Object, ScheduleAction, error) { typedSchedulingInfo := schedulingInfo.(*ReplicaSchedulingInfo) replicas, ok := typedSchedulingInfo.Schedule[cluster.Name] if !ok { @@ -152,11 +162,15 @@ func (a *schedulingAdapter) ScheduleObject(cluster *federationapi.Cluster, clust } } } - return federationObjCopy, replicas > 0, nil + var action ScheduleAction = "" + if replicas > 0 { + action = ActionAdd + } + return federationObjCopy, action, nil } -func (a *schedulingAdapter) UpdateFederatedStatus(obj pkgruntime.Object, status interface{}) error { - return a.updateStatusFunc(obj, status) +func (a *replicaSchedulingAdapter) UpdateFederatedStatus(obj pkgruntime.Object, schedulingInfo interface{}) error { + return a.updateStatusFunc(obj, schedulingInfo) } func schedule(planner *planner.Planner, obj pkgruntime.Object, key string, clusterNames []string, currentReplicasPerCluster map[string]int64, estimatedCapacity map[string]int64) map[string]int64 { diff --git a/federation/pkg/federatedtypes/secret.go b/federation/pkg/federatedtypes/secret.go index 535e9faffec..09548ca62a1 100644 --- a/federation/pkg/federatedtypes/secret.go +++ b/federation/pkg/federatedtypes/secret.go @@ -41,7 +41,7 @@ type SecretAdapter struct { client federationclientset.Interface } -func NewSecretAdapter(client federationclientset.Interface, config *restclient.Config) FederatedTypeAdapter { +func NewSecretAdapter(client federationclientset.Interface, config *restclient.Config, adapterSpecificArgs map[string]interface{}) FederatedTypeAdapter { return &SecretAdapter{client: client} } diff --git a/federation/pkg/federation-controller/BUILD b/federation/pkg/federation-controller/BUILD index 28057fc52ea..1c543143ad8 100644 --- a/federation/pkg/federation-controller/BUILD +++ b/federation/pkg/federation-controller/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( @@ -26,6 +23,7 @@ filegroup( ":package-srcs", "//federation/pkg/federation-controller/cluster:all-srcs", "//federation/pkg/federation-controller/ingress:all-srcs", + "//federation/pkg/federation-controller/job:all-srcs", "//federation/pkg/federation-controller/service:all-srcs", "//federation/pkg/federation-controller/sync:all-srcs", "//federation/pkg/federation-controller/util:all-srcs", diff --git a/federation/pkg/federation-controller/cluster/BUILD b/federation/pkg/federation-controller/cluster/BUILD index a0128b969ce..c31d1cf63d3 100644 --- a/federation/pkg/federation-controller/cluster/BUILD +++ b/federation/pkg/federation-controller/cluster/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["clustercontroller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/client/clientset_generated/federation_clientset:go_default_library", @@ -35,7 +32,6 @@ go_library( "clustercontroller.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/client/cache:go_default_library", diff --git a/federation/pkg/federation-controller/ingress/BUILD b/federation/pkg/federation-controller/ingress/BUILD index 53b295eaac3..445871b3a6e 100644 --- a/federation/pkg/federation-controller/ingress/BUILD +++ b/federation/pkg/federation-controller/ingress/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["ingress_controller.go"], - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/client/clientset_generated/federation_clientset:go_default_library", @@ -41,7 +38,6 @@ go_test( name = "go_default_test", srcs = ["ingress_controller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/client/clientset_generated/federation_clientset/fake:go_default_library", diff --git a/federation/pkg/federation-controller/job/BUILD b/federation/pkg/federation-controller/job/BUILD new file mode 100644 index 00000000000..f999e5b1f9d --- /dev/null +++ b/federation/pkg/federation-controller/job/BUILD @@ -0,0 +1,76 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_library( + name = "go_default_library", + srcs = ["jobcontroller.go"], + deps = [ + "//federation/apis/federation:go_default_library", + "//federation/apis/federation/v1beta1:go_default_library", + "//federation/client/clientset_generated/federation_clientset:go_default_library", + "//federation/pkg/federation-controller/util:go_default_library", + "//federation/pkg/federation-controller/util/deletionhelper:go_default_library", + "//federation/pkg/federation-controller/util/eventsink:go_default_library", + "//federation/pkg/federation-controller/util/planner:go_default_library", + "//federation/pkg/federation-controller/util/replicapreferences:go_default_library", + "//pkg/api:go_default_library", + "//pkg/controller:go_default_library", + "//vendor/github.com/davecgh/go-spew/spew:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/api/batch/v1:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/util/wait:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", + "//vendor/k8s.io/client-go/kubernetes: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/util/flowcontrol:go_default_library", + "//vendor/k8s.io/client-go/util/workqueue:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = ["jobcontroller_test.go"], + library = ":go_default_library", + deps = [ + "//federation/apis/federation/v1beta1:go_default_library", + "//federation/client/clientset_generated/federation_clientset/fake:go_default_library", + "//federation/pkg/federation-controller/util:go_default_library", + "//federation/pkg/federation-controller/util/finalizers:go_default_library", + "//federation/pkg/federation-controller/util/test:go_default_library", + "//pkg/apis/batch/v1:go_default_library", + "//vendor/github.com/stretchr/testify/assert:go_default_library", + "//vendor/k8s.io/api/batch/v1:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", + "//vendor/k8s.io/client-go/testing:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/federation/pkg/federation-controller/job/jobcontroller.go b/federation/pkg/federation-controller/job/jobcontroller.go new file mode 100644 index 00000000000..d3977182fc1 --- /dev/null +++ b/federation/pkg/federation-controller/job/jobcontroller.go @@ -0,0 +1,561 @@ +/* +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 job + +import ( + "fmt" + "reflect" + "time" + + "github.com/davecgh/go-spew/spew" + "github.com/golang/glog" + + batchv1 "k8s.io/api/batch/v1" + clientv1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apimachinery/pkg/watch" + kubeclientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/cache" + "k8s.io/client-go/tools/record" + "k8s.io/client-go/util/flowcontrol" + "k8s.io/client-go/util/workqueue" + fed "k8s.io/kubernetes/federation/apis/federation" + fedv1 "k8s.io/kubernetes/federation/apis/federation/v1beta1" + fedclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset" + fedutil "k8s.io/kubernetes/federation/pkg/federation-controller/util" + "k8s.io/kubernetes/federation/pkg/federation-controller/util/deletionhelper" + "k8s.io/kubernetes/federation/pkg/federation-controller/util/eventsink" + "k8s.io/kubernetes/federation/pkg/federation-controller/util/planner" + "k8s.io/kubernetes/federation/pkg/federation-controller/util/replicapreferences" + "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/controller" +) + +const ( + fedJobPreferencesAnnotation = "federation.kubernetes.io/job-preferences" + allClustersKey = "THE_ALL_CLUSTER_KEY" + // UserAgentName is the user agent used in the federation client + UserAgentName = "Federation-Job-Controller" + // ControllerName is name of this controller + ControllerName = "jobs" +) + +var ( + // RequiredResources is the resource group version of the type this controller manages + RequiredResources = []schema.GroupVersionResource{batchv1.SchemeGroupVersion.WithResource("jobs")} + jobReviewDelay = 10 * time.Second + clusterAvailableDelay = 20 * time.Second + clusterUnavailableDelay = 60 * time.Second + updateTimeout = 30 * time.Second + backoffInitial = 5 * time.Second + backoffMax = 1 * time.Minute +) + +// FederationJobController synchronizes the state of a federated job object +// to clusters that are members of the federation. +type FederationJobController struct { + fedClient fedclientset.Interface + + jobController cache.Controller + jobStore cache.Store + + fedJobInformer fedutil.FederatedInformer + + jobDeliverer *fedutil.DelayingDeliverer + clusterDeliverer *fedutil.DelayingDeliverer + jobWorkQueue workqueue.Interface + // For updating members of federation. + fedUpdater fedutil.FederatedUpdater + + jobBackoff *flowcontrol.Backoff + // For events + eventRecorder record.EventRecorder + + defaultPlanner *planner.Planner + deletionHelper *deletionhelper.DeletionHelper +} + +// NewJobController creates a new federation job controller +func NewJobController(fedClient fedclientset.Interface) *FederationJobController { + broadcaster := record.NewBroadcaster() + broadcaster.StartRecordingToSink(eventsink.NewFederatedEventSink(fedClient)) + recorder := broadcaster.NewRecorder(api.Scheme, clientv1.EventSource{Component: "federated-job-controller"}) + fjc := &FederationJobController{ + fedClient: fedClient, + jobDeliverer: fedutil.NewDelayingDeliverer(), + clusterDeliverer: fedutil.NewDelayingDeliverer(), + jobWorkQueue: workqueue.New(), + jobBackoff: flowcontrol.NewBackOff(backoffInitial, backoffMax), + defaultPlanner: planner.NewPlanner(&fed.ReplicaAllocationPreferences{ + Clusters: map[string]fed.ClusterPreferences{ + "*": {Weight: 1}, + }, + }), + eventRecorder: recorder, + } + + jobFedInformerFactory := func(cluster *fedv1.Cluster, clientset kubeclientset.Interface) (cache.Store, cache.Controller) { + return cache.NewInformer( + &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + return clientset.BatchV1().Jobs(metav1.NamespaceAll).List(options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + return clientset.BatchV1().Jobs(metav1.NamespaceAll).Watch(options) + }, + }, + &batchv1.Job{}, + controller.NoResyncPeriodFunc(), + fedutil.NewTriggerOnAllChanges( + func(obj runtime.Object) { fjc.deliverLocalJob(obj, jobReviewDelay) }, + ), + ) + } + clusterLifecycle := fedutil.ClusterLifecycleHandlerFuncs{ + ClusterAvailable: func(cluster *fedv1.Cluster) { + fjc.clusterDeliverer.DeliverAfter(allClustersKey, nil, clusterAvailableDelay) + }, + ClusterUnavailable: func(cluster *fedv1.Cluster, _ []interface{}) { + fjc.clusterDeliverer.DeliverAfter(allClustersKey, nil, clusterUnavailableDelay) + }, + } + fjc.fedJobInformer = fedutil.NewFederatedInformer(fedClient, jobFedInformerFactory, &clusterLifecycle) + + fjc.jobStore, fjc.jobController = cache.NewInformer( + &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + return fjc.fedClient.BatchV1().Jobs(metav1.NamespaceAll).List(options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + return fjc.fedClient.BatchV1().Jobs(metav1.NamespaceAll).Watch(options) + }, + }, + &batchv1.Job{}, + controller.NoResyncPeriodFunc(), + fedutil.NewTriggerOnMetaAndSpecChanges( + func(obj runtime.Object) { fjc.deliverFedJobObj(obj, 0) }, + ), + ) + + fjc.fedUpdater = fedutil.NewFederatedUpdater(fjc.fedJobInformer, "job", updateTimeout, fjc.eventRecorder, + func(client kubeclientset.Interface, obj runtime.Object) error { + rs := obj.(*batchv1.Job) + _, err := client.BatchV1().Jobs(rs.Namespace).Create(rs) + return err + }, + func(client kubeclientset.Interface, obj runtime.Object) error { + rs := obj.(*batchv1.Job) + _, err := client.BatchV1().Jobs(rs.Namespace).Update(rs) + return err + }, + func(client kubeclientset.Interface, obj runtime.Object) error { + rs := obj.(*batchv1.Job) + err := client.BatchV1().Jobs(rs.Namespace).Delete(rs.Name, &metav1.DeleteOptions{}) + return err + }) + + fjc.deletionHelper = deletionhelper.NewDeletionHelper( + fjc.updateJob, + // objNameFunc + func(obj runtime.Object) string { + job := obj.(*batchv1.Job) + return job.Name + }, + fjc.fedJobInformer, + fjc.fedUpdater, + ) + + return fjc +} + +// Sends the given updated object to apiserver. +// Assumes that the given object is a job. +func (fjc *FederationJobController) updateJob(obj runtime.Object) (runtime.Object, error) { + job := obj.(*batchv1.Job) + return fjc.fedClient.BatchV1().Jobs(job.Namespace).Update(job) +} + +// Run starts the syncing of federation jobs to the clusters. +func (fjc *FederationJobController) Run(workers int, stopCh <-chan struct{}) { + go fjc.jobController.Run(stopCh) + fjc.fedJobInformer.Start() + + fjc.jobDeliverer.StartWithHandler(func(item *fedutil.DelayingDelivererItem) { + fjc.jobWorkQueue.Add(item.Key) + }) + fjc.clusterDeliverer.StartWithHandler(func(_ *fedutil.DelayingDelivererItem) { + fjc.reconcileJobsOnClusterChange() + }) + + for !fjc.isSynced() { + time.Sleep(5 * time.Millisecond) + } + + for i := 0; i < workers; i++ { + go wait.Until(fjc.worker, time.Second, stopCh) + } + + fedutil.StartBackoffGC(fjc.jobBackoff, stopCh) + + <-stopCh + glog.Infof("Shutting down FederationJobController") + fjc.jobDeliverer.Stop() + fjc.clusterDeliverer.Stop() + fjc.jobWorkQueue.ShutDown() + fjc.fedJobInformer.Stop() +} + +func (fjc *FederationJobController) isSynced() bool { + if !fjc.fedJobInformer.ClustersSynced() { + glog.V(3).Infof("Cluster list not synced") + return false + } + clusters, err := fjc.fedJobInformer.GetReadyClusters() + if err != nil { + glog.Errorf("Failed to get ready clusters: %v", err) + return false + } + if !fjc.fedJobInformer.GetTargetStore().ClustersSynced(clusters) { + glog.V(2).Infof("cluster job list not synced") + return false + } + + if !fjc.jobController.HasSynced() { + glog.V(2).Infof("federation job list not synced") + return false + } + return true +} + +func (fjc *FederationJobController) deliverLocalJob(obj interface{}, duration time.Duration) { + key, err := controller.KeyFunc(obj) + if err != nil { + glog.Errorf("Couldn't get key for object %v: %v", obj, err) + return + } + _, exists, err := fjc.jobStore.GetByKey(key) + if err != nil { + glog.Errorf("Couldn't get federated job %v: %v", key, err) + return + } + if exists { // ignore jobs exists only in local k8s + fjc.deliverJobByKey(key, duration, false) + } +} + +func (fjc *FederationJobController) deliverFedJobObj(obj interface{}, delay time.Duration) { + key, err := controller.KeyFunc(obj) + if err != nil { + glog.Errorf("Couldn't get key for object %+v: %v", obj, err) + return + } + fjc.deliverJobByKey(key, delay, false) +} + +func (fjc *FederationJobController) deliverJobByKey(key string, delay time.Duration, failed bool) { + if failed { + fjc.jobBackoff.Next(key, time.Now()) + delay = delay + fjc.jobBackoff.Get(key) + } else { + fjc.jobBackoff.Reset(key) + } + fjc.jobDeliverer.DeliverAfter(key, nil, delay) +} + +type reconciliationStatus string + +const ( + statusAllOk = reconciliationStatus("ALL_OK") + statusNeedRecheck = reconciliationStatus("RECHECK") + statusError = reconciliationStatus("ERROR") + statusNotSynced = reconciliationStatus("NOSYNC") +) + +func (fjc *FederationJobController) worker() { + for { + item, quit := fjc.jobWorkQueue.Get() + if quit { + return + } + key := item.(string) + status, err := fjc.reconcileJob(key) + fjc.jobWorkQueue.Done(item) + if err != nil { + glog.Errorf("Error syncing job controller: %v", err) + fjc.deliverJobByKey(key, 0, true) + } else { + switch status { + case statusAllOk: + break + case statusError: + fjc.deliverJobByKey(key, 0, true) + case statusNeedRecheck: + fjc.deliverJobByKey(key, jobReviewDelay, false) + case statusNotSynced: + fjc.deliverJobByKey(key, clusterAvailableDelay, false) + default: + glog.Errorf("Unhandled reconciliation status: %s", status) + fjc.deliverJobByKey(key, jobReviewDelay, false) + } + } + } +} + +type scheduleResult struct { + Parallelism *int32 + Completions *int32 +} + +func (fjc *FederationJobController) schedule(fjob *batchv1.Job, clusters []*fedv1.Cluster) map[string]scheduleResult { + plnr := fjc.defaultPlanner + frsPref, err := replicapreferences.GetAllocationPreferences(fjob, fedJobPreferencesAnnotation) + if err != nil { + glog.Warningf("Invalid job specific preference, use default. rs: %v, err: %v", fjob, err) + } + if frsPref != nil { // create a new planner if user specified a preference + plnr = planner.NewPlanner(frsPref) + } + + parallelism := int64(*fjob.Spec.Parallelism) + var clusterNames []string + for _, cluster := range clusters { + clusterNames = append(clusterNames, cluster.Name) + } + parallelismResult, _ := plnr.Plan(parallelism, clusterNames, nil, nil, fjob.Namespace+"/"+fjob.Name) + + if frsPref != nil { + for _, clusterPref := range frsPref.Clusters { + clusterPref.MinReplicas = 0 + clusterPref.MaxReplicas = nil + } + plnr = planner.NewPlanner(frsPref) + } + clusterNames = nil + for clusterName := range parallelismResult { + clusterNames = append(clusterNames, clusterName) + } + completionsResult := make(map[string]int64) + if fjob.Spec.Completions != nil { + completionsResult, _ = plnr.Plan(int64(*fjob.Spec.Completions), clusterNames, nil, nil, fjob.Namespace+"/"+fjob.Name) + } + + results := make(map[string]scheduleResult) + for _, clusterName := range clusterNames { + paralle := int32(parallelismResult[clusterName]) + complet := int32(completionsResult[clusterName]) + result := scheduleResult{ + Parallelism: ¶lle, + } + if fjob.Spec.Completions != nil { + result.Completions = &complet + } + results[clusterName] = result + } + + return results +} + +func (fjc *FederationJobController) reconcileJob(key string) (reconciliationStatus, error) { + if !fjc.isSynced() { + return statusNotSynced, nil + } + + glog.V(4).Infof("Start reconcile job %q", key) + startTime := time.Now() + defer glog.V(4).Infof("Finished reconcile job %q (%v)", key, time.Now().Sub(startTime)) + + objFromStore, exists, err := fjc.jobStore.GetByKey(key) + if err != nil { + return statusError, err + } + if !exists { + // deleted federated job, nothing need to do + return statusAllOk, nil + } + + // Create a copy before modifying the obj to prevent race condition with other readers of obj from store. + obj, err := api.Scheme.DeepCopy(objFromStore) + fjob, ok := obj.(*batchv1.Job) + if err != nil || !ok { + return statusError, err + } + + // delete job + if fjob.DeletionTimestamp != nil { + if err := fjc.delete(fjob); err != nil { + fjc.eventRecorder.Eventf(fjob, api.EventTypeNormal, "DeleteFailed", "Job delete failed: %v", err) + return statusError, err + } + return statusAllOk, nil + } + + glog.V(3).Infof("Ensuring delete object from underlying clusters finalizer for job: %s\n", key) + // Add the required finalizers before creating a job in underlying clusters. + updatedJobObj, err := fjc.deletionHelper.EnsureFinalizers(fjob) + if err != nil { + return statusError, err + } + fjob = updatedJobObj.(*batchv1.Job) + + clusters, err := fjc.fedJobInformer.GetReadyClusters() + if err != nil { + return statusError, err + } + + scheduleResult := fjc.schedule(fjob, clusters) + glog.V(3).Infof("Start syncing local job %s: %s\n", key, spew.Sprintf("%v", scheduleResult)) + + fedStatus := batchv1.JobStatus{} + var fedStatusFailedCondition *batchv1.JobCondition + var fedStatusCompleteCondition *batchv1.JobCondition + var operations []fedutil.FederatedOperation + for clusterName, result := range scheduleResult { + ljobObj, exists, err := fjc.fedJobInformer.GetTargetStore().GetByKey(clusterName, key) + if err != nil { + return statusError, err + } + ljob := &batchv1.Job{ + ObjectMeta: fedutil.DeepCopyRelevantObjectMeta(fjob.ObjectMeta), + Spec: *fedutil.DeepCopyApiTypeOrPanic(&fjob.Spec).(*batchv1.JobSpec), + } + // use selector generated at federation level, or user specified value + manualSelector := true + ljob.Spec.ManualSelector = &manualSelector + ljob.Spec.Parallelism = result.Parallelism + ljob.Spec.Completions = result.Completions + + if !exists { + if *ljob.Spec.Parallelism > 0 { + fjc.eventRecorder.Eventf(fjob, api.EventTypeNormal, "CreateInCluster", "Creating job in cluster %s", clusterName) + operations = append(operations, fedutil.FederatedOperation{ + Type: fedutil.OperationTypeAdd, + Obj: ljob, + ClusterName: clusterName, + }) + } + } else { + currentLjob := ljobObj.(*batchv1.Job) + + // Update existing job, if needed. + if !fedutil.ObjectMetaAndSpecEquivalent(ljob, currentLjob) { + fjc.eventRecorder.Eventf(fjob, api.EventTypeNormal, "UpdateInCluster", "Updating job in cluster %s", clusterName) + operations = append(operations, fedutil.FederatedOperation{ + Type: fedutil.OperationTypeUpdate, + Obj: ljob, + ClusterName: clusterName, + }) + } + + // collect local job status + for _, condition := range currentLjob.Status.Conditions { + if condition.Type == batchv1.JobComplete { + if fedStatusCompleteCondition == nil || + fedStatusCompleteCondition.LastTransitionTime.Before(condition.LastTransitionTime) { + fedStatusCompleteCondition = &condition + } + } else if condition.Type == batchv1.JobFailed { + if fedStatusFailedCondition == nil || + fedStatusFailedCondition.LastTransitionTime.Before(condition.LastTransitionTime) { + fedStatusFailedCondition = &condition + } + } + } + if currentLjob.Status.StartTime != nil { + if fedStatus.StartTime == nil || fedStatus.StartTime.After(currentLjob.Status.StartTime.Time) { + fedStatus.StartTime = currentLjob.Status.StartTime + } + } + if currentLjob.Status.CompletionTime != nil { + if fedStatus.CompletionTime == nil || fedStatus.CompletionTime.Before(*currentLjob.Status.CompletionTime) { + fedStatus.CompletionTime = currentLjob.Status.CompletionTime + } + } + fedStatus.Active += currentLjob.Status.Active + fedStatus.Succeeded += currentLjob.Status.Succeeded + fedStatus.Failed += currentLjob.Status.Failed + } + } + + // federated job fails if any local job failes + if fedStatusFailedCondition != nil { + fedStatus.Conditions = append(fedStatus.Conditions, *fedStatusFailedCondition) + } else if fedStatusCompleteCondition != nil { + fedStatus.Conditions = append(fedStatus.Conditions, *fedStatusCompleteCondition) + } + if !reflect.DeepEqual(fedStatus, fjob.Status) { + fjob.Status = fedStatus + _, err = fjc.fedClient.BatchV1().Jobs(fjob.Namespace).UpdateStatus(fjob) + if err != nil { + return statusError, err + } + } + + if len(operations) == 0 { + // Everything is in order + return statusAllOk, nil + } + + if glog.V(4) { + for i, op := range operations { + job := op.Obj.(*batchv1.Job) + glog.V(4).Infof("operation[%d]: %s, %s/%s/%s, %d", i, op.Type, op.ClusterName, job.Namespace, job.Name, *job.Spec.Parallelism) + } + } + err = fjc.fedUpdater.Update(operations) + if err != nil { + return statusError, err + } + + // Some operations were made, reconcile after a while. + return statusNeedRecheck, nil + +} + +func (fjc *FederationJobController) reconcileJobsOnClusterChange() { + if !fjc.isSynced() { + fjc.clusterDeliverer.DeliverAfter(allClustersKey, nil, clusterAvailableDelay) + } + jobs := fjc.jobStore.List() + for _, job := range jobs { + key, _ := controller.KeyFunc(job) + fjc.deliverJobByKey(key, 0, false) + } +} + +// delete deletes the given job or returns error if the deletion was not complete. +func (fjc *FederationJobController) delete(job *batchv1.Job) error { + glog.V(3).Infof("Handling deletion of job: %s/%s\n", job.Namespace, job.Name) + _, err := fjc.deletionHelper.HandleObjectInUnderlyingClusters(job) + if err != nil { + return err + } + + err = fjc.fedClient.BatchV1().Jobs(job.Namespace).Delete(job.Name, nil) + if err != nil { + // Its all good if the error is not found error. That means it is deleted already and we do not have to do anything. + // This is expected when we are processing an update as a result of job finalizer deletion. + // The process that deleted the last finalizer is also going to delete the job and we do not have to do anything. + if !errors.IsNotFound(err) { + return fmt.Errorf("failed to delete job: %s/%s, %v", job.Namespace, job.Name, err) + } + } + return nil +} diff --git a/federation/pkg/federation-controller/job/jobcontroller_test.go b/federation/pkg/federation-controller/job/jobcontroller_test.go new file mode 100644 index 00000000000..65a869baa4a --- /dev/null +++ b/federation/pkg/federation-controller/job/jobcontroller_test.go @@ -0,0 +1,282 @@ +/* +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 job + +import ( + "flag" + "fmt" + "testing" + "time" + + batchv1 "k8s.io/api/batch/v1" + apiv1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/watch" + kubeclientset "k8s.io/client-go/kubernetes" + kubeclientfake "k8s.io/client-go/kubernetes/fake" + core "k8s.io/client-go/testing" + fedv1 "k8s.io/kubernetes/federation/apis/federation/v1beta1" + fedclientfake "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset/fake" + fedutil "k8s.io/kubernetes/federation/pkg/federation-controller/util" + finalizersutil "k8s.io/kubernetes/federation/pkg/federation-controller/util/finalizers" + testutil "k8s.io/kubernetes/federation/pkg/federation-controller/util/test" + batchv1internal "k8s.io/kubernetes/pkg/apis/batch/v1" + + "github.com/stretchr/testify/assert" + "k8s.io/apimachinery/pkg/util/sets" + "reflect" + "strings" +) + +func installWatchReactor(fakeClien *core.Fake, resource string) chan runtime.Object { + objChan := make(chan runtime.Object, 100) + + fakeWatch := watch.NewRaceFreeFake() + fakeClien.PrependWatchReactor(resource, core.DefaultWatchReactor(fakeWatch, nil)) + fakeClien.PrependReactor("create", resource, func(action core.Action) (handled bool, ret runtime.Object, err error) { + obj := action.(core.CreateAction).GetObject() + batchv1internal.SetDefaults_Job(obj.(*batchv1.Job)) + fakeWatch.Add(obj) + objChan <- obj + return false, nil, nil + }) + fakeClien.PrependReactor("update", resource, func(action core.Action) (handled bool, ret runtime.Object, err error) { + obj := action.(core.UpdateAction).GetObject() + fakeWatch.Modify(obj) + objChan <- obj + return false, nil, nil + }) + fakeClien.PrependReactor("delete", resource, func(action core.Action) (handled bool, ret runtime.Object, err error) { + obj := &batchv1.Job{ + ObjectMeta: metav1.ObjectMeta{ + Name: action.(core.DeleteAction).GetName(), + Namespace: action.GetNamespace(), + }, + } + fakeWatch.Delete(obj) + objChan <- obj + return false, nil, nil + }) + + return objChan +} + +func TestJobController(t *testing.T) { + flag.Set("logtostderr", "true") + flag.Set("v", "5") + flag.Parse() + + jobReviewDelay = 50 * time.Millisecond + clusterAvailableDelay = 200 * time.Millisecond + clusterUnavailableDelay = 200 * time.Millisecond + + fedclientset := fedclientfake.NewSimpleClientset() + fedChan := installWatchReactor(&fedclientset.Fake, "jobs") + + fedclientset.Federation().Clusters().Create(testutil.NewCluster("k8s-1", apiv1.ConditionTrue)) + fedclientset.Federation().Clusters().Create(testutil.NewCluster("k8s-2", apiv1.ConditionTrue)) + + kube1clientset := kubeclientfake.NewSimpleClientset() + kube1Chan := installWatchReactor(&kube1clientset.Fake, "jobs") + kube2clientset := kubeclientfake.NewSimpleClientset() + kube2Chan := installWatchReactor(&kube2clientset.Fake, "jobs") + + fedInformerClientFactory := func(cluster *fedv1.Cluster) (kubeclientset.Interface, error) { + switch cluster.Name { + case "k8s-1": + return kube1clientset, nil + case "k8s-2": + return kube2clientset, nil + default: + return nil, fmt.Errorf("Unknown cluster: %v", cluster.Name) + } + } + jobController := NewJobController(fedclientset) + fedjobinformer := testutil.ToFederatedInformerForTestOnly(jobController.fedJobInformer) + fedjobinformer.SetClientFactory(fedInformerClientFactory) + + stopChan := make(chan struct{}) + defer close(stopChan) + go jobController.Run(5, stopChan) + + test := func(job *batchv1.Job, parallelism1, parallelism2, completions1, completions2 int32) { + job, _ = fedclientset.Batch().Jobs(metav1.NamespaceDefault).Create(job) + + joinErrors := func(errors []error) error { + if len(errors) == 0 { + return nil + } + errorStrings := []string{} + for _, err := range errors { + errorStrings = append(errorStrings, err.Error()) + } + return fmt.Errorf("%s", strings.Join(errorStrings, "\n")) + } + + // check local jobs are created with correct spec + checkLocalJob := func(parallelism, completions int32) testutil.CheckingFunction { + return func(obj runtime.Object) error { + errors := []error{} + ljob := obj.(*batchv1.Job) + if !fedutil.ObjectMetaEquivalent(job.ObjectMeta, ljob.ObjectMeta) { + errors = append(errors, fmt.Errorf("Job meta un-equivalent: %#v (expected) != %#v (actual)", job.ObjectMeta, ljob.ObjectMeta)) + } + if err := checkEqual(t, *ljob.Spec.Parallelism, parallelism, "Spec.Parallelism"); err != nil { + errors = append(errors, err) + } + if ljob.Spec.Completions != nil { + if err := checkEqual(t, *ljob.Spec.Completions, completions, "Spec.Completions"); err != nil { + errors = append(errors, err) + } + } + return joinErrors(errors) + } + } + checkFedJob := func(obj runtime.Object) error { + errors := []error{} + return joinErrors(errors) + } + assert.NoError(t, testutil.CheckObjectFromChan(kube1Chan, checkLocalJob(parallelism1, completions1))) + assert.NoError(t, testutil.CheckObjectFromChan(kube2Chan, checkLocalJob(parallelism2, completions2))) + assert.NoError(t, testutil.CheckObjectFromChan(fedChan, checkFedJob)) + + // finish local jobs + job1, _ := kube1clientset.Batch().Jobs(metav1.NamespaceDefault).Get(job.Name, metav1.GetOptions{}) + finishJob(job1, 100*time.Millisecond) + job1, _ = kube1clientset.Batch().Jobs(metav1.NamespaceDefault).UpdateStatus(job1) + job2, _ := kube2clientset.Batch().Jobs(metav1.NamespaceDefault).Get(job.Name, metav1.GetOptions{}) + finishJob(job2, 100*time.Millisecond) + job2, _ = kube2clientset.Batch().Jobs(metav1.NamespaceDefault).UpdateStatus(job2) + + // check fed job status updated + assert.NoError(t, testutil.CheckObjectFromChan(fedChan, func(obj runtime.Object) error { + errors := []error{} + job := obj.(*batchv1.Job) + if err := checkEqual(t, *job.Spec.Parallelism, *job1.Spec.Parallelism+*job2.Spec.Parallelism, "Spec.Parallelism"); err != nil { + errors = append(errors, err) + } + if job.Spec.Completions != nil { + if err := checkEqual(t, *job.Spec.Completions, *job1.Spec.Completions+*job2.Spec.Completions, "Spec.Completions"); err != nil { + errors = append(errors, err) + } + } + if err := checkEqual(t, job.Status.Succeeded, job1.Status.Succeeded+job2.Status.Succeeded, "Status.Succeeded"); err != nil { + errors = append(errors, err) + } + return joinErrors(errors) + })) + + // delete fed job by set deletion time, and remove orphan finalizer + job, _ = fedclientset.Batch().Jobs(metav1.NamespaceDefault).Get(job.Name, metav1.GetOptions{}) + deletionTimestamp := metav1.Now() + job.DeletionTimestamp = &deletionTimestamp + finalizersutil.RemoveFinalizers(job, sets.NewString(metav1.FinalizerOrphanDependents)) + fedclientset.Batch().Jobs(metav1.NamespaceDefault).Update(job) + + // check jobs are deleted + checkDeleted := func(obj runtime.Object) error { + djob := obj.(*batchv1.Job) + deletedJob := &batchv1.Job{ + ObjectMeta: metav1.ObjectMeta{ + Name: djob.Name, + Namespace: djob.Namespace, + }, + } + if !reflect.DeepEqual(djob, deletedJob) { + return fmt.Errorf("%s/%s should be deleted", djob.Namespace, djob.Name) + } + return nil + } + assert.NoError(t, testutil.CheckObjectFromChan(kube1Chan, checkDeleted)) + assert.NoError(t, testutil.CheckObjectFromChan(kube2Chan, checkDeleted)) + assert.NoError(t, testutil.CheckObjectFromChan(fedChan, checkDeleted)) + } + + test(newJob("job1", 2, 7), 1, 1, 4, 3) + test(newJob("job2", 2, -1), 1, 1, -1, -1) + test(newJob("job3", 7, 2), 4, 3, 1, 1) + test(newJob("job4", 7, 1), 4, 3, 1, 0) +} + +func checkEqual(_ *testing.T, expected, actual interface{}, msg string) error { + if !assert.ObjectsAreEqual(expected, actual) { + return fmt.Errorf("%s not equal: %#v (expected) != %#v (actual)", msg, expected, actual) + } + return nil +} + +func newJob(name string, parallelism int32, completions int32) *batchv1.Job { + job := batchv1.Job{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: metav1.NamespaceDefault, + SelfLink: "/api/v1/namespaces/default/jobs/name", + }, + Spec: batchv1.JobSpec{ + Parallelism: ¶llelism, + Completions: &completions, + Template: apiv1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "foo": name, + }, + }, + Spec: apiv1.PodSpec{ + Containers: []apiv1.Container{ + {Image: "foo/bar"}, + }, + RestartPolicy: apiv1.RestartPolicyNever, + }, + }, + }, + } + if parallelism < 0 { + job.Spec.Parallelism = nil + } + if completions < 0 { + job.Spec.Completions = nil + } + + batchv1internal.SetDefaults_Job(&job) + return &job +} + +func newCondition(conditionType batchv1.JobConditionType, reason, message string) batchv1.JobCondition { + return batchv1.JobCondition{ + Type: conditionType, + Status: apiv1.ConditionTrue, + LastProbeTime: metav1.Now(), + LastTransitionTime: metav1.Now(), + Reason: reason, + Message: message, + } +} + +func finishJob(job *batchv1.Job, duration time.Duration) { + job.Status.Conditions = append(job.Status.Conditions, newCondition(batchv1.JobComplete, "", "")) + if job.Spec.Completions == nil { + job.Status.Succeeded = 1 + } else { + job.Status.Succeeded = *job.Spec.Completions + } + now := metav1.Now() + job.Status.StartTime = &now + time.Sleep(duration) + now = metav1.Now() + job.Status.CompletionTime = &now +} diff --git a/federation/pkg/federation-controller/service/BUILD b/federation/pkg/federation-controller/service/BUILD index 7782fde50c1..22cad994853 100644 --- a/federation/pkg/federation-controller/service/BUILD +++ b/federation/pkg/federation-controller/service/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["servicecontroller.go"], - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//federation/apis/federation/v1beta1:go_default_library", @@ -47,7 +44,6 @@ go_test( name = "go_default_test", srcs = ["servicecontroller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/client/clientset_generated/federation_clientset/fake:go_default_library", diff --git a/federation/pkg/federation-controller/service/dns/BUILD b/federation/pkg/federation-controller/service/dns/BUILD index a31a2c9a6e7..454ffaff247 100644 --- a/federation/pkg/federation-controller/service/dns/BUILD +++ b/federation/pkg/federation-controller/service/dns/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["dns_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/client/clientset_generated/federation_clientset/fake:go_default_library", @@ -27,7 +24,6 @@ go_test( go_library( name = "go_default_library", srcs = ["dns.go"], - tags = ["automanaged"], deps = [ "//federation/client/clientset_generated/federation_clientset:go_default_library", "//federation/pkg/dnsprovider:go_default_library", diff --git a/federation/pkg/federation-controller/service/ingress/BUILD b/federation/pkg/federation-controller/service/ingress/BUILD index d582cfde30b..eff405b86fb 100644 --- a/federation/pkg/federation-controller/service/ingress/BUILD +++ b/federation/pkg/federation-controller/service/ingress/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["ingress.go"], - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/federation/pkg/federation-controller/sync/BUILD b/federation/pkg/federation-controller/sync/BUILD index 9b3de98d23b..79ed02a4aea 100644 --- a/federation/pkg/federation-controller/sync/BUILD +++ b/federation/pkg/federation-controller/sync/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["controller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/pkg/federatedtypes:go_default_library", @@ -28,7 +25,6 @@ go_test( go_library( name = "go_default_library", srcs = ["controller.go"], - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/client/clientset_generated/federation_clientset:go_default_library", diff --git a/federation/pkg/federation-controller/sync/controller.go b/federation/pkg/federation-controller/sync/controller.go index 800a1484f8a..649d3b23621 100644 --- a/federation/pkg/federation-controller/sync/controller.go +++ b/federation/pkg/federation-controller/sync/controller.go @@ -93,10 +93,10 @@ type FederationSyncController struct { } // StartFederationSyncController starts a new sync controller for a type adapter -func StartFederationSyncController(kind string, adapterFactory federatedtypes.AdapterFactory, config *restclient.Config, stopChan <-chan struct{}, minimizeLatency bool) { +func StartFederationSyncController(kind string, adapterFactory federatedtypes.AdapterFactory, config *restclient.Config, stopChan <-chan struct{}, minimizeLatency bool, adapterSpecificArgs map[string]interface{}) { restclient.AddUserAgent(config, fmt.Sprintf("federation-%s-controller", kind)) client := federationclientset.NewForConfigOrDie(config) - adapter := adapterFactory(client, config) + adapter := adapterFactory(client, config, adapterSpecificArgs) controller := newFederationSyncController(client, adapter) if minimizeLatency { controller.minimizeLatency() @@ -490,8 +490,7 @@ func syncToClusters(clustersAccessor clustersAccessorFunc, operationsAccessor op if !ok { glog.Fatalf("Adapter for kind %q does not properly implement SchedulingAdapter.", kind) } - typedScheduleInfo := schedulingInfo.(*federatedtypes.ReplicaSchedulingInfo) - err = schedulingAdapter.UpdateFederatedStatus(obj, typedScheduleInfo.Status) + err = schedulingAdapter.UpdateFederatedStatus(obj, schedulingInfo) if err != nil { runtime.HandleError(fmt.Errorf("adapter.UpdateFinished() failed on adapter for %s %q: %v", kind, key, err)) return statusError @@ -548,7 +547,7 @@ func clusterOperations(adapter federatedtypes.FederatedTypeAdapter, selectedClus return nil, wrappedErr } - shouldCreateIfNeeded := true + var scheduleAction federatedtypes.ScheduleAction = federatedtypes.ActionAdd if adapter.IsSchedulingAdapter() { schedulingAdapter, ok := adapter.(federatedtypes.SchedulingAdapter) if !ok { @@ -559,7 +558,7 @@ func clusterOperations(adapter federatedtypes.FederatedTypeAdapter, selectedClus if clusterObj != nil { clusterTypedObj = clusterObj.(pkgruntime.Object) } - desiredObj, shouldCreateIfNeeded, err = schedulingAdapter.ScheduleObject(cluster, clusterTypedObj, desiredObj, schedulingInfo) + desiredObj, scheduleAction, err = schedulingAdapter.ScheduleObject(cluster, clusterTypedObj, desiredObj, schedulingInfo) if err != nil { runtime.HandleError(err) return nil, err @@ -568,11 +567,15 @@ func clusterOperations(adapter federatedtypes.FederatedTypeAdapter, selectedClus var operationType util.FederatedOperationType = "" if found { - clusterObj := clusterObj.(pkgruntime.Object) - if !adapter.Equivalent(desiredObj, clusterObj) { - operationType = util.OperationTypeUpdate + if scheduleAction == federatedtypes.ActionDelete { + operationType = util.OperationTypeDelete + } else { + clusterObj := clusterObj.(pkgruntime.Object) + if !adapter.Equivalent(desiredObj, clusterObj) { + operationType = util.OperationTypeUpdate + } } - } else if shouldCreateIfNeeded { + } else if scheduleAction == federatedtypes.ActionAdd { operationType = util.OperationTypeAdd } diff --git a/federation/pkg/federation-controller/util/BUILD b/federation/pkg/federation-controller/util/BUILD index bfe43ee7f80..cadca3e593c 100644 --- a/federation/pkg/federation-controller/util/BUILD +++ b/federation/pkg/federation-controller/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -22,7 +20,6 @@ go_library( "meta.go", "secret.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/client/clientset_generated/federation_clientset:go_default_library", @@ -59,7 +56,6 @@ go_test( "meta_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/client/clientset_generated/federation_clientset/fake:go_default_library", diff --git a/federation/pkg/federation-controller/util/clusterselector/BUILD b/federation/pkg/federation-controller/util/clusterselector/BUILD index 05d9d8cda90..d7e1631260f 100644 --- a/federation/pkg/federation-controller/util/clusterselector/BUILD +++ b/federation/pkg/federation-controller/util/clusterselector/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["clusterselector_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", @@ -22,7 +19,6 @@ go_test( go_library( name = "go_default_library", srcs = ["clusterselector.go"], - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", diff --git a/federation/pkg/federation-controller/util/deletionhelper/BUILD b/federation/pkg/federation-controller/util/deletionhelper/BUILD index 6565c0c7de8..b6d98d3986e 100644 --- a/federation/pkg/federation-controller/util/deletionhelper/BUILD +++ b/federation/pkg/federation-controller/util/deletionhelper/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["deletion_helper.go"], - tags = ["automanaged"], deps = [ "//federation/pkg/federation-controller/util:go_default_library", "//federation/pkg/federation-controller/util/finalizers:go_default_library", diff --git a/federation/pkg/federation-controller/util/eventsink/BUILD b/federation/pkg/federation-controller/util/eventsink/BUILD index 9095029e7b6..0b3b98abb7c 100644 --- a/federation/pkg/federation-controller/util/eventsink/BUILD +++ b/federation/pkg/federation-controller/util/eventsink/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["eventsink.go"], - tags = ["automanaged"], deps = [ "//federation/client/clientset_generated/federation_clientset:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -28,7 +25,6 @@ go_test( name = "go_default_test", srcs = ["eventsink_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/client/clientset_generated/federation_clientset/fake:go_default_library", "//federation/pkg/federation-controller/util/test:go_default_library", diff --git a/federation/pkg/federation-controller/util/eventsink/eventsink.go b/federation/pkg/federation-controller/util/eventsink/eventsink.go index 8a7ca0a72e9..343fef5df73 100644 --- a/federation/pkg/federation-controller/util/eventsink/eventsink.go +++ b/federation/pkg/federation-controller/util/eventsink/eventsink.go @@ -72,12 +72,7 @@ func init() { } func (fes *FederatedEventSink) Create(event *v1.Event) (*v1.Event, error) { - kubeEvent := &v1.Event{} - if err := scheme.Convert(event, kubeEvent, nil); err != nil { - return nil, err - } - - ret, err := fes.clientset.Core().Events(kubeEvent.Namespace).Create(kubeEvent) + ret, err := fes.clientset.Core().Events(event.Namespace).Create(event) if err != nil { return nil, err } @@ -90,12 +85,7 @@ func (fes *FederatedEventSink) Create(event *v1.Event) (*v1.Event, error) { } func (fes *FederatedEventSink) Update(event *v1.Event) (*v1.Event, error) { - kubeEvent := &v1.Event{} - if err := scheme.Convert(event, kubeEvent, nil); err != nil { - return nil, err - } - - ret, err := fes.clientset.Core().Events(kubeEvent.Namespace).Update(kubeEvent) + ret, err := fes.clientset.Core().Events(event.Namespace).Update(event) if err != nil { return nil, err } @@ -108,12 +98,7 @@ func (fes *FederatedEventSink) Update(event *v1.Event) (*v1.Event, error) { } func (fes *FederatedEventSink) Patch(event *v1.Event, data []byte) (*v1.Event, error) { - kubeEvent := &v1.Event{} - if err := scheme.Convert(event, kubeEvent, nil); err != nil { - return nil, err - } - - ret, err := fes.clientset.Core().Events(kubeEvent.Namespace).Patch(kubeEvent.Name, types.StrategicMergePatchType, data) + ret, err := fes.clientset.Core().Events(event.Namespace).Patch(event.Name, types.StrategicMergePatchType, data) if err != nil { return nil, err } diff --git a/federation/pkg/federation-controller/util/finalizers/BUILD b/federation/pkg/federation-controller/util/finalizers/BUILD index afeb7ed27f5..b014094ba97 100644 --- a/federation/pkg/federation-controller/util/finalizers/BUILD +++ b/federation/pkg/federation-controller/util/finalizers/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["finalizers.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", @@ -36,7 +33,6 @@ go_test( name = "go_default_test", srcs = ["finalizers_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/federation/pkg/federation-controller/util/handlers.go b/federation/pkg/federation-controller/util/handlers.go index 0e2dec5bf58..406d5ca3161 100644 --- a/federation/pkg/federation-controller/util/handlers.go +++ b/federation/pkg/federation-controller/util/handlers.go @@ -71,6 +71,7 @@ func NewTriggerOnMetaAndSpecChanges(triggerFunc func(pkgruntime.Object)) *cache. oldMeta := getFieldOrPanic(old, "ObjectMeta").(metav1.ObjectMeta) curMeta := getFieldOrPanic(cur, "ObjectMeta").(metav1.ObjectMeta) if !ObjectMetaEquivalent(oldMeta, curMeta) || + !reflect.DeepEqual(oldMeta.DeletionTimestamp, curMeta.DeletionTimestamp) || !reflect.DeepEqual(getFieldOrPanic(old, "Spec"), getFieldOrPanic(cur, "Spec")) { triggerFunc(curObj) } diff --git a/federation/pkg/federation-controller/util/planner/BUILD b/federation/pkg/federation-controller/util/planner/BUILD index 768db370af6..e29e57b7031 100644 --- a/federation/pkg/federation-controller/util/planner/BUILD +++ b/federation/pkg/federation-controller/util/planner/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["planner.go"], - tags = ["automanaged"], deps = ["//federation/apis/federation:go_default_library"], ) @@ -19,7 +16,6 @@ go_test( name = "go_default_test", srcs = ["planner_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", diff --git a/federation/pkg/federation-controller/util/podanalyzer/BUILD b/federation/pkg/federation-controller/util/podanalyzer/BUILD index 3e7b1b9da9f..b23e00a8e32 100644 --- a/federation/pkg/federation-controller/util/podanalyzer/BUILD +++ b/federation/pkg/federation-controller/util/podanalyzer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["pod_helper.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/api/core/v1:go_default_library"], ) @@ -19,7 +16,6 @@ go_test( name = "go_default_test", srcs = ["pod_helper_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/federation/pkg/federation-controller/util/replicapreferences/BUILD b/federation/pkg/federation-controller/util/replicapreferences/BUILD index b1e0cc8f94c..8f6b0f28046 100644 --- a/federation/pkg/federation-controller/util/replicapreferences/BUILD +++ b/federation/pkg/federation-controller/util/replicapreferences/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["preferences.go"], - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", @@ -36,7 +33,6 @@ go_test( name = "go_default_test", srcs = ["preferences_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", diff --git a/federation/pkg/federation-controller/util/test/BUILD b/federation/pkg/federation-controller/util/test/BUILD index 5f8ff0a96ee..c5e094da8a5 100644 --- a/federation/pkg/federation-controller/util/test/BUILD +++ b/federation/pkg/federation-controller/util/test/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["test_helper.go"], - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/pkg/federation-controller/util:go_default_library", diff --git a/federation/pkg/federation-controller/util/test/test_helper.go b/federation/pkg/federation-controller/util/test/test_helper.go index de6307b80e4..534111d7424 100644 --- a/federation/pkg/federation-controller/util/test/test_helper.go +++ b/federation/pkg/federation-controller/util/test/test_helper.go @@ -446,3 +446,9 @@ func AssertHasFinalizer(t *testing.T, obj runtime.Object, finalizer string) { require.Nil(t, err) assert.True(t, hasFinalizer) } + +func NewInt32(val int32) *int32 { + p := new(int32) + *p = val + return p +} diff --git a/federation/pkg/kubefed/BUILD b/federation/pkg/kubefed/BUILD index b333603ac72..5d77c81f772 100644 --- a/federation/pkg/kubefed/BUILD +++ b/federation/pkg/kubefed/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "kubefed.go", "unjoin.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//federation/apis/federation/v1beta1:go_default_library", @@ -52,7 +49,6 @@ go_test( "unjoin_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//federation/apis/federation/v1beta1:go_default_library", diff --git a/federation/pkg/kubefed/init/BUILD b/federation/pkg/kubefed/init/BUILD index 6af03754b3a..39742ac0669 100644 --- a/federation/pkg/kubefed/init/BUILD +++ b/federation/pkg/kubefed/init/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["init.go"], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/util/kubeconfig:go_default_library", "//federation/apis/federation:go_default_library", @@ -44,7 +41,6 @@ go_test( name = "go_default_test", srcs = ["init_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//federation/pkg/dnsprovider/providers/coredns:go_default_library", diff --git a/federation/pkg/kubefed/init/init_test.go b/federation/pkg/kubefed/init/init_test.go index 7fc902a1cf5..c6d5b1ea65e 100644 --- a/federation/pkg/kubefed/init/init_test.go +++ b/federation/pkg/kubefed/init/init_test.go @@ -783,7 +783,7 @@ func fakeInitHostFactory(apiserverServiceType v1.ServiceType, federationName, na role := rbacv1beta1.Role{ TypeMeta: metav1.TypeMeta{ Kind: "Role", - APIVersion: testapi.Rbac.GroupVersion().String(), + APIVersion: rbacv1beta1.SchemeGroupVersion.String(), }, ObjectMeta: metav1.ObjectMeta{ Name: "federation-system:federation-controller-manager", @@ -805,7 +805,7 @@ func fakeInitHostFactory(apiserverServiceType v1.ServiceType, federationName, na rolebinding := rbacv1beta1.RoleBinding{ TypeMeta: metav1.TypeMeta{ Kind: "RoleBinding", - APIVersion: testapi.Rbac.GroupVersion().String(), + APIVersion: rbacv1beta1.SchemeGroupVersion.String(), }, ObjectMeta: metav1.ObjectMeta{ Name: "federation-system:federation-controller-manager", diff --git a/federation/pkg/kubefed/testing/BUILD b/federation/pkg/kubefed/testing/BUILD index d02149a6f7e..cc3184e1b9b 100644 --- a/federation/pkg/kubefed/testing/BUILD +++ b/federation/pkg/kubefed/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["testing.go"], - tags = ["automanaged"], deps = [ "//federation/client/clientset_generated/federation_clientset:go_default_library", "//federation/pkg/kubefed/util:go_default_library", diff --git a/federation/pkg/kubefed/util/BUILD b/federation/pkg/kubefed/util/BUILD index ed0b412500b..bfbd5aacb07 100644 --- a/federation/pkg/kubefed/util/BUILD +++ b/federation/pkg/kubefed/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//federation/apis/federation/v1beta1:go_default_library", diff --git a/federation/plugin/pkg/admission/schedulingpolicy/BUILD b/federation/plugin/pkg/admission/schedulingpolicy/BUILD index 688556af8b6..34fc1d5467d 100644 --- a/federation/plugin/pkg/admission/schedulingpolicy/BUILD +++ b/federation/plugin/pkg/admission/schedulingpolicy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "merge_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset/fake:go_default_library", @@ -36,7 +33,6 @@ go_library( "merge.go", "query.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/ref:go_default_library", diff --git a/federation/registry/cluster/BUILD b/federation/registry/cluster/BUILD index e9461311a18..ed2a0ec6f38 100644 --- a/federation/registry/cluster/BUILD +++ b/federation/registry/cluster/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//federation/apis/federation/validation:go_default_library", @@ -38,10 +35,10 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//pkg/api:go_default_library", + "//pkg/api/testapi:go_default_library", "//pkg/api/testing:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", diff --git a/federation/registry/cluster/etcd/BUILD b/federation/registry/cluster/etcd/BUILD index 959eb281cf9..307765530e9 100644 --- a/federation/registry/cluster/etcd/BUILD +++ b/federation/registry/cluster/etcd/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["etcd.go"], - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//federation/registry/cluster:go_default_library", @@ -29,7 +26,6 @@ go_test( name = "go_default_test", srcs = ["etcd_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//pkg/api:go_default_library", diff --git a/federation/registry/cluster/etcd/etcd.go b/federation/registry/cluster/etcd/etcd.go index 180ce8ca934..8f8c3be28c1 100644 --- a/federation/registry/cluster/etcd/etcd.go +++ b/federation/registry/cluster/etcd/etcd.go @@ -48,12 +48,12 @@ func (r *StatusREST) Update(ctx genericapirequest.Context, name string, objInfo // NewREST returns a RESTStorage object that will work against clusters. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &federation.Cluster{} }, - NewListFunc: func() runtime.Object { return &federation.ClusterList{} }, - PredicateFunc: cluster.MatchCluster, - QualifiedResource: federation.Resource("clusters"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("clusters"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &federation.Cluster{} }, + NewListFunc: func() runtime.Object { return &federation.ClusterList{} }, + PredicateFunc: cluster.MatchCluster, + DefaultQualifiedResource: federation.Resource("clusters"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("clusters"), CreateStrategy: cluster.Strategy, UpdateStrategy: cluster.Strategy, diff --git a/federation/registry/cluster/strategy_test.go b/federation/registry/cluster/strategy_test.go index f01a82976d4..8a53ad3f292 100644 --- a/federation/registry/cluster/strategy_test.go +++ b/federation/registry/cluster/strategy_test.go @@ -28,6 +28,9 @@ import ( "k8s.io/kubernetes/federation/apis/federation" "k8s.io/kubernetes/pkg/api" apitesting "k8s.io/kubernetes/pkg/api/testing" + + // install all api groups for testing + _ "k8s.io/kubernetes/pkg/api/testapi" ) func validNewCluster() *federation.Cluster { diff --git a/hack/.golint_failures b/hack/.golint_failures index 6f06c2e926d..7cd80fc02a2 100644 --- a/hack/.golint_failures +++ b/hack/.golint_failures @@ -20,7 +20,6 @@ cmd/kubeadm/app/discovery/token cmd/kubeadm/app/images cmd/kubeadm/app/phases/addons cmd/kubeadm/app/phases/certs/pkiutil -cmd/kubeadm/app/phases/token cmd/kubeadm/app/preflight cmd/kubeadm/app/util cmd/kubeadm/app/util/config @@ -133,6 +132,7 @@ pkg/apis/policy/v1alpha1 pkg/apis/policy/v1beta1 pkg/apis/policy/validation pkg/apis/rbac +pkg/apis/rbac/v1 pkg/apis/rbac/v1beta1 pkg/apis/rbac/validation pkg/apis/scheduling @@ -182,7 +182,6 @@ pkg/controller/job pkg/controller/namespace pkg/controller/namespace/deletion pkg/controller/node -pkg/controller/node/testutil pkg/controller/podautoscaler pkg/controller/podautoscaler/metrics pkg/controller/podgc @@ -309,12 +308,9 @@ pkg/proxy/util pkg/proxy/winuserspace pkg/quota/evaluator/core pkg/quota/generic -pkg/registry/admissionregistration/externaladmissionhookconfiguration pkg/registry/admissionregistration/externaladmissionhookconfiguration/storage -pkg/registry/admissionregistration/initializerconfiguration pkg/registry/admissionregistration/initializerconfiguration/storage pkg/registry/admissionregistration/rest -pkg/registry/apps/controllerrevision pkg/registry/apps/rest pkg/registry/apps/statefulset pkg/registry/apps/statefulset/storage @@ -337,11 +333,9 @@ pkg/registry/certificates/certificates pkg/registry/certificates/certificates/storage pkg/registry/certificates/rest pkg/registry/core/componentstatus -pkg/registry/core/configmap pkg/registry/core/endpoint/storage pkg/registry/core/event pkg/registry/core/event/storage -pkg/registry/core/limitrange pkg/registry/core/limitrange/storage pkg/registry/core/namespace pkg/registry/core/namespace/storage @@ -353,7 +347,6 @@ pkg/registry/core/persistentvolumeclaim pkg/registry/core/persistentvolumeclaim/storage pkg/registry/core/pod pkg/registry/core/pod/rest -pkg/registry/core/podtemplate pkg/registry/core/podtemplate/storage pkg/registry/core/replicationcontroller pkg/registry/core/replicationcontroller/storage @@ -377,13 +370,10 @@ pkg/registry/extensions/deployment pkg/registry/extensions/deployment/storage pkg/registry/extensions/ingress pkg/registry/extensions/ingress/storage -pkg/registry/extensions/networkpolicy pkg/registry/extensions/networkpolicy/storage -pkg/registry/extensions/podsecuritypolicy pkg/registry/extensions/replicaset pkg/registry/extensions/replicaset/storage pkg/registry/extensions/rest -pkg/registry/networking/networkpolicy pkg/registry/networking/networkpolicy/storage pkg/registry/networking/rest pkg/registry/policy/poddisruptionbudget @@ -404,7 +394,6 @@ pkg/registry/rbac/validation pkg/registry/registrytest pkg/registry/scheduling/priorityclass/storage pkg/registry/scheduling/rest -pkg/registry/settings/podpreset pkg/registry/settings/podpreset/storage pkg/registry/settings/rest pkg/registry/storage/rest @@ -534,6 +523,7 @@ staging/src/k8s.io/api/extensions/v1beta1 staging/src/k8s.io/api/imagepolicy/v1alpha1 staging/src/k8s.io/api/networking/v1 staging/src/k8s.io/api/policy/v1beta1 +staging/src/k8s.io/api/rbac/v1 staging/src/k8s.io/api/rbac/v1alpha1 staging/src/k8s.io/api/rbac/v1beta1 staging/src/k8s.io/api/scheduling/v1alpha1 @@ -723,6 +713,8 @@ staging/src/k8s.io/client-go/kubernetes/typed/networking/v1 staging/src/k8s.io/client-go/kubernetes/typed/networking/v1/fake staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1 staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake +staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1 +staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1 staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1 @@ -803,7 +795,6 @@ staging/src/k8s.io/sample-apiserver/pkg/apiserver staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces staging/src/k8s.io/sample-apiserver/pkg/cmd/server -staging/src/k8s.io/sample-apiserver/pkg/registry staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/fischer staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/flunder test/e2e @@ -813,13 +804,13 @@ test/e2e/autoscaling test/e2e/chaosmonkey test/e2e/common test/e2e/framework +test/e2e/framework/metrics test/e2e/instrumentation test/e2e/instrumentation/logging test/e2e/instrumentation/monitoring test/e2e/kubectl test/e2e/lifecycle test/e2e/lifecycle/bootstrap -test/e2e/metrics test/e2e/network test/e2e/node test/e2e/scalability diff --git a/hack/BUILD b/hack/BUILD index a4c14ab7e8f..d6c48907976 100644 --- a/hack/BUILD +++ b/hack/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -59,18 +57,16 @@ test_suite( go_binary( name = "hack", library = ":go_default_library", - tags = ["automanaged"], ) go_test( name = "go_default_test", srcs = ["e2e_test.go"], + data = glob(["testdata/**"]), library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["e2e.go"], - tags = ["automanaged"], ) diff --git a/hack/boilerplate/test/BUILD b/hack/boilerplate/test/BUILD index 7ba4a5a541b..f37b2de2e44 100644 --- a/hack/boilerplate/test/BUILD +++ b/hack/boilerplate/test/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "fail.go", "pass.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/hack/cmd/teststale/BUILD b/hack/cmd/teststale/BUILD index 592e6a65137..fe6ea15fc20 100644 --- a/hack/cmd/teststale/BUILD +++ b/hack/cmd/teststale/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -12,20 +10,17 @@ load( go_binary( name = "teststale", library = ":go_default_library", - tags = ["automanaged"], ) go_test( name = "go_default_test", srcs = ["teststale_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["teststale.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/glog:go_default_library"], ) diff --git a/hack/e2e-internal/BUILD b/hack/e2e-internal/BUILD index 6cc62052baf..7e76248ad95 100644 --- a/hack/e2e-internal/BUILD +++ b/hack/e2e-internal/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/hack/lib/BUILD b/hack/lib/BUILD index 6cc62052baf..7e76248ad95 100644 --- a/hack/lib/BUILD +++ b/hack/lib/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/hack/lib/init.sh b/hack/lib/init.sh index 324fcfcf9fc..a0c71b5d3de 100755 --- a/hack/lib/init.sh +++ b/hack/lib/init.sh @@ -69,6 +69,7 @@ extensions/v1beta1 \ imagepolicy.k8s.io/v1alpha1 \ networking.k8s.io/v1 \ policy/v1beta1 \ +rbac.authorization.k8s.io/v1 \ rbac.authorization.k8s.io/v1beta1 \ rbac.authorization.k8s.io/v1alpha1 \ scheduling.k8s.io/v1alpha1 \ diff --git a/hack/make-rules/test-cmd-util.sh b/hack/make-rules/test-cmd-util.sh index 7490b6525f3..35fb3622d11 100644 --- a/hack/make-rules/test-cmd-util.sh +++ b/hack/make-rules/test-cmd-util.sh @@ -3921,6 +3921,26 @@ run_kubectl_sort_by_tests() { kubectl get pods --sort-by="{metadata.name}" kubectl get pods --sort-by="{metadata.creationTimestamp}" + ### sort-by should works if pod exists + # Create POD + # Pre-condition: no POD exists + kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" '' + # Command + kubectl create "${kube_flags[@]}" -f test/fixtures/doc-yaml/admin/limitrange/valid-pod.yaml + # Post-condition: valid-pod is created + kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" 'valid-pod:' + # Check output of sort-by + output_message=$(kubectl get pods --sort-by="{metadata.name}") + kube::test::if_has_string "${output_message}" "valid-pod" + ### Clean up + # Pre-condition: valid-pod exists + kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" 'valid-pod:' + # Command + kubectl delete "${kube_flags[@]}" pod valid-pod --grace-period=0 --force + # Post-condition: valid-pod doesn't exist + kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" '' + + set +o nounset set +o errexit } diff --git a/hack/staging-import-restrictions.json b/hack/staging-import-restrictions.json new file mode 100644 index 00000000000..3d421f24495 --- /dev/null +++ b/hack/staging-import-restrictions.json @@ -0,0 +1,102 @@ +[ + { + "baseImportPath": "./vendor/k8s.io/apimachinery/", + "allowedImports": [ + "k8s.io/apimachinery", + "k8s.io/kube-openapi" + ] + }, + { + "baseImportPath": "./vendor/k8s.io/api/", + "allowedImports": [ + "k8s.io/api", + "k8s.io/apimachinery" + ] + }, + { + "baseImportPath": "./vendor/k8s.io/kube-gen/", + "ignoredSubTrees": [ + "./vendor/k8s.io/kube-gen/test" + ], + "allowedImports": [ + "k8s.io/gengo", + "k8s.io/kube-gen", + "k8s.io/kube-openapi" + ] + }, + { + "baseImportPath": "./vendor/k8s.io/kube-gen/test/", + "allowedImports": [ + "k8s.io/apimachinery", + "k8s.io/client-go", + "k8s.io/gengo", + "k8s.io/kube-gen/test", + "k8s.io/kube-openapi" + ] + }, + { + "baseImportPath": "./vendor/k8s.io/client-go/", + "allowedImports": [ + "k8s.io/api", + "k8s.io/apimachinery", + "k8s.io/client-go" + ] + }, + { + "baseImportPath": "./vendor/k8s.io/apiserver/", + "allowedImports": [ + "k8s.io/api", + "k8s.io/apimachinery", + "k8s.io/apiserver", + "k8s.io/client-go", + "k8s.io/kube-openapi" + ] + }, + { + "baseImportPath": "./vendor/k8s.io/metrics/", + "allowedImports": [ + "k8s.io/api", + "k8s.io/apimachinery", + "k8s.io/client-go", + "k8s.io/metrics" + ] + }, + { + "baseImportPath": "./vendor/k8s.io/kube-aggregator/", + "allowedImports": [ + "k8s.io/api", + "k8s.io/apimachinery", + "k8s.io/apiserver", + "k8s.io/client-go", + "k8s.io/kube-aggregator", + "k8s.io/kube-openapi" + ] + }, + { + "baseImportPath": "./vendor/k8s.io/sample-apiserver/", + "allowedImports": [ + "k8s.io/api", + "k8s.io/apimachinery", + "k8s.io/apiserver", + "k8s.io/client-go", + "k8s.io/sample-apiserver" + ] + }, + { + "baseImportPath": "./vendor/k8s.io/apiextensions-apiserver/", + "allowedImports": [ + "k8s.io/api", + "k8s.io/apiextensions-apiserver", + "k8s.io/apimachinery", + "k8s.io/apiserver", + "k8s.io/client-go" + ] + }, + { + "baseImportPath": "./vendor/k8s.io/kube-openapi/", + "allowedImports": [ + "k8s.io/kube-openapi", + "k8s.io/gengo" + ] + } +] \ No newline at end of file diff --git a/hack/update-bazel.sh b/hack/update-bazel.sh index 9a138ca10bb..bf841685b79 100755 --- a/hack/update-bazel.sh +++ b/hack/update-bazel.sh @@ -24,6 +24,9 @@ source "${KUBE_ROOT}/hack/lib/init.sh" # TODO(spxtr): Remove this line once Bazel is the only way to build. rm -f "${KUBE_ROOT}/pkg/generated/openapi/zz_generated.openapi.go" -kube::util::go_install_from_commit github.com/kubernetes/repo-infra/kazel d651a70c51ec9a450135ff08ea045d857a6be014 +# The git commit sha1s here should match the values in $KUBE_ROOT/WORKSPACE. +kube::util::go_install_from_commit github.com/kubernetes/repo-infra/kazel e9d1a126ef355ff5d38e20612c889b07728225a4 +kube::util::go_install_from_commit github.com/bazelbuild/rules_go/go/tools/gazelle/gazelle 82483596ec203eb9c1849937636f4cbed83733eb +gazelle fix -build_file_name=BUILD,BUILD.bazel -external=vendored -mode=fix -repo_root="$(kube::realpath ${KUBE_ROOT})" kazel -root="$(kube::realpath ${KUBE_ROOT})" diff --git a/hack/verify-api-groups.sh b/hack/verify-api-groups.sh index 51dd09e2f79..bbfcb0f0200 100755 --- a/hack/verify-api-groups.sh +++ b/hack/verify-api-groups.sh @@ -81,7 +81,7 @@ for group_dirname in "${group_dirnames[@]}"; do found=1 fi done - if [ "${found}" -ne "1" ] ; then + if [[ "${found}" -ne "1" && -f "${group_dirname}/types.go" ]] ; then echo "need to add ${group_dirname}/ to ${client_gen_file}" exit 1 fi diff --git a/hack/verify-bazel.sh b/hack/verify-bazel.sh index 4757a1eaf8e..07a3bd7ecab 100755 --- a/hack/verify-bazel.sh +++ b/hack/verify-bazel.sh @@ -24,9 +24,16 @@ source "${KUBE_ROOT}/hack/lib/init.sh" # TODO(spxtr): Remove this line once Bazel is the only way to build. rm -f "${KUBE_ROOT}/pkg/generated/openapi/zz_generated.openapi.go" -kube::util::go_install_from_commit github.com/kubernetes/repo-infra/kazel d651a70c51ec9a450135ff08ea045d857a6be014 +# The git commit sha1s here should match the values in $KUBE_ROOT/WORKSPACE. +kube::util::go_install_from_commit github.com/kubernetes/repo-infra/kazel e9d1a126ef355ff5d38e20612c889b07728225a4 +kube::util::go_install_from_commit github.com/bazelbuild/rules_go/go/tools/gazelle/gazelle 82483596ec203eb9c1849937636f4cbed83733eb -if ! kazel -validate -print-diff -root="$(kube::realpath ${KUBE_ROOT})" ; then +gazelle_diff=$(gazelle fix -build_file_name=BUILD,BUILD.bazel -external=vendored -mode=diff -repo_root="$(kube::realpath ${KUBE_ROOT})") +kazel_diff=$(kazel -dry-run -print-diff -root="$(kube::realpath ${KUBE_ROOT})") + +if [[ -n "${gazelle_diff}" || -n "${kazel_diff}" ]]; then + echo "${gazelle_diff}" + echo "${kazel_diff}" echo echo "Run ./hack/update-bazel.sh" exit 1 diff --git a/hack/verify-flags-underscore.py b/hack/verify-flags-underscore.py index 073864b25f1..de9aa65699e 100755 --- a/hack/verify-flags-underscore.py +++ b/hack/verify-flags-underscore.py @@ -25,7 +25,6 @@ import argparse parser = argparse.ArgumentParser() parser.add_argument("filenames", help="list of files to check, all files if unspecified", nargs='*') -parser.add_argument("-e", "--skip-exceptions", help="ignore hack/verify-flags/exceptions.txt and print all output", action="store_true") args = parser.parse_args() # Cargo culted from http://stackoverflow.com/questions/898669/how-can-i-detect-if-a-file-is-binary-non-text-in-python @@ -81,77 +80,10 @@ def get_all_files(rootdir): all_files.append(pathname) return all_files -def normalize_files(rootdir, files): - newfiles = [] - a = ['Godeps', '_gopath', 'third_party', '.git', 'exceptions.txt', 'known-flags.txt'] - for f in files: - if any(x in f for x in a): - continue - if f.endswith(".svg"): - continue - if f.endswith(".gliffy"): - continue - if f.endswith(".md"): - continue - if f.endswith(".yaml"): - continue - newfiles.append(f) - for i, f in enumerate(newfiles): - if not os.path.isabs(f): - newfiles[i] = os.path.join(rootdir, f) - return newfiles - -def line_has_bad_flag(line, flagre): - results = flagre.findall(line) - for result in results: - if not "_" in result: - return False - # this should exclude many cases where jinja2 templates use kube flags - # as variables, except it uses _ for the variable name - if "{% set" + result + "= \"" in line: - return False - if "pillar[" + result + "]" in line: - return False - if "grains" + result in line: - return False - # something common in juju variables... - if "template_data[" + result + "]" in line: - return False - return True - return False - -def check_known_flags(rootdir): - pathname = os.path.join(rootdir, "hack/verify-flags/known-flags.txt") - f = open(pathname, 'r') - flags = set(f.read().splitlines()) - f.close() - - illegal_known_flags = set() - for flag in flags: - if len(flag) > 0: - if not "-" in flag: - illegal_known_flags.add(flag) - - if len(illegal_known_flags) != 0: - print("All flags in hack/verify-flags/known-flags.txt should contain character -, found these flags without -") - l = list(illegal_known_flags) - l.sort() - print("%s" % "\n".join(l)) - sys.exit(1) - - -# The list of files might not be the whole repo. If someone only changed a -# couple of files we don't want to run all of the golang files looking for -# flags. Instead load the list of flags from hack/verify-flags/known-flags.txt -# If running the golang files finds a new flag not in that file, return an -# error and tell the user to add the flag to the flag list. -def get_flags(rootdir, files): - # preload the 'known' flags - pathname = os.path.join(rootdir, "hack/verify-flags/known-flags.txt") - f = open(pathname, 'r') - flags = set(f.read().splitlines()) - f.close() - +# Collects all the flags used in golang files and verifies the flags do +# not contain underscore. If any flag needs to be excluded from this check, +# need to add that flag in hack/verify-flags/excluded-flags.txt. +def check_underscore_in_flags(rootdir, files): # preload the 'known' flags which don't follow the - standard pathname = os.path.join(rootdir, "hack/verify-flags/excluded-flags.txt") f = open(pathname, 'r') @@ -165,7 +97,6 @@ def get_flags(rootdir, files): re.compile('.Duration[P]?\("([^"]*)",[^,]+,[^)]+\)'), re.compile('.StringSlice[P]?\("([^"]*)",[^,]+,[^)]+\)') ] - new_flags = set() new_excluded_flags = set() # walk all the files looking for any flags being declared for pathname in files: @@ -182,10 +113,6 @@ def get_flags(rootdir, files): continue if "_" in flag: new_excluded_flags.add(flag) - if not "-" in flag: - continue - if flag not in flags: - new_flags.add(flag) if len(new_excluded_flags) != 0: print("Found a flag declared with an _ but which is not explicitly listed as a valid flag name in hack/verify-flags/excluded-flags.txt") print("Are you certain this flag should not have been declared with an - instead?") @@ -193,79 +120,17 @@ def get_flags(rootdir, files): l.sort() print("%s" % "\n".join(l)) sys.exit(1) - if len(new_flags) != 0: - print("Found flags with character - in golang files not in the list of known flags. Please add these to hack/verify-flags/known-flags.txt") - l = list(new_flags) - l.sort() - print("%s" % "\n".join(l)) - sys.exit(1) - return list(flags) - -def flags_to_re(flags): - """turn the list of all flags we found into a regex find both - and _ versions""" - dashRE = re.compile('[-_]') - flagREs = [] - for flag in flags: - # turn all flag names into regexs which will find both types - newre = dashRE.sub('[-_]', flag) - # only match if there is not a leading or trailing alphanumeric character - flagREs.append("[^\w${]" + newre + "[^\w]") - # turn that list of regex strings into a single large RE - flagRE = "|".join(flagREs) - flagRE = re.compile(flagRE) - return flagRE - -def load_exceptions(rootdir): - exceptions = set() - if args.skip_exceptions: - return exceptions - exception_filename = os.path.join(rootdir, "hack/verify-flags/exceptions.txt") - exception_file = open(exception_filename, 'r') - for exception in exception_file.read().splitlines(): - out = exception.split(":", 1) - if len(out) != 2: - print("Invalid line in exceptions file: %s" % exception) - continue - filename = out[0] - line = out[1] - exceptions.add((filename, line)) - return exceptions def main(): rootdir = os.path.dirname(__file__) + "/../" rootdir = os.path.abspath(rootdir) - exceptions = load_exceptions(rootdir) - if len(args.filenames) > 0: files = args.filenames else: files = get_all_files(rootdir) - files = normalize_files(rootdir, files) - check_known_flags(rootdir) - - flags = get_flags(rootdir, files) - flagRE = flags_to_re(flags) - - bad_lines = [] - # walk all the file looking for any flag that was declared and now has an _ - for pathname in files: - relname = os.path.relpath(pathname, rootdir) - f = open(pathname, 'r') - for line in f.read().splitlines(): - if line_has_bad_flag(line, flagRE): - if (relname, line) not in exceptions: - bad_lines.append((relname, line)) - f.close() - - if len(bad_lines) != 0: - if not args.skip_exceptions: - print("Found illegal 'flag' usage. If these are false negatives you should run `hack/verify-flags-underscore.py -e > hack/verify-flags/exceptions.txt` to update the list.") - bad_lines.sort() - for (relname, line) in bad_lines: - print("%s:%s" % (relname, line)) - return 1 + check_underscore_in_flags(rootdir, files) if __name__ == "__main__": sys.exit(main()) diff --git a/hack/verify-flags/exceptions.txt b/hack/verify-flags/exceptions.txt deleted file mode 100644 index 18b60054c16..00000000000 --- a/hack/verify-flags/exceptions.txt +++ /dev/null @@ -1,175 +0,0 @@ -Vagrantfile: node_ip = $node_ips[n] -cluster/addons/addon-manager/kube-addons.sh:# Create admission_control objects if defined before any other addon services. If the limits -cluster/aws/templates/configure-vm-aws.sh: # We set the hostname_override to the full EC2 private dns name -cluster/aws/templates/configure-vm-aws.sh: api_servers: '${API_SERVERS}' -cluster/aws/templates/configure-vm-aws.sh: env-to-grains "hostname_override" -cluster/aws/templates/configure-vm-aws.sh: env-to-grains "runtime_config" -cluster/aws/templates/configure-vm-aws.sh: kubelet_api_servers: '${KUBELET_APISERVER}' -cluster/centos/config-default.sh: etcd_servers="${prefix}http://${master_ip}:2379" -cluster/centos/config-default.sh: local etcd_servers="" -cluster/centos/util.sh: local node_ip=${node#*@} -cluster/gce/configure-vm.sh: advertise_address: '${EXTERNAL_IP}' -cluster/gce/configure-vm.sh: api_servers: '${KUBERNETES_MASTER_NAME}' -cluster/gce/configure-vm.sh: cloud_config: ${CLOUD_CONFIG} -cluster/gce/configure-vm.sh: env-to-grains "feature_gates" -cluster/gce/configure-vm.sh: env-to-grains "runtime_config" -cluster/gce/configure-vm.sh: kubelet_api_servers: '${KUBELET_APISERVER}' -cluster/gce/container-linux/configure-helper.sh: authorization_mode+=",ABAC" -cluster/gce/container-linux/configure-helper.sh: authorization_mode+=",Webhook" -cluster/gce/container-linux/configure-helper.sh: grep -o "{{ *pillar\.get('storage_backend', '\(.*\)') *}}" | \ -cluster/gce/container-linux/configure-helper.sh: sed -e "s@{{ *pillar\.get('storage_backend', '\(.*\)') *}}@\1@g") -cluster/gce/container-linux/configure-helper.sh: sed -i -e "s@{{ *pillar\.get('storage_backend', '\(.*\)') *}}@${STORAGE_BACKEND}@g" "${temp_file}" -cluster/gce/container-linux/configure-helper.sh: sed -i -e "s@{{ *pillar\.get('storage_backend', '\(.*\)') *}}@\1@g" "${temp_file}" -cluster/gce/container-linux/configure-helper.sh: local api_servers="--master=https://${KUBERNETES_MASTER_NAME}" -cluster/gce/container-linux/configure-helper.sh: local authorization_mode="RBAC" -cluster/gce/container-linux/configure-helper.sh: sed -i -e "s@{{pillar\['allow_privileged'\]}}@true@g" "${src_file}" -cluster/gce/gci/configure-helper.sh: authorization_mode+=",ABAC" -cluster/gce/gci/configure-helper.sh: authorization_mode+=",Webhook" -cluster/gce/gci/configure-helper.sh: grep -o "{{ *pillar\.get('storage_backend', '\(.*\)') *}}" | \ -cluster/gce/gci/configure-helper.sh: sed -e "s@{{ *pillar\.get('storage_backend', '\(.*\)') *}}@\1@g") -cluster/gce/gci/configure-helper.sh: sed -i -e "s@{{ *pillar\.get('storage_backend', '\(.*\)') *}}@${STORAGE_BACKEND}@g" "${temp_file}" -cluster/gce/gci/configure-helper.sh: sed -i -e "s@{{ *pillar\.get('storage_backend', '\(.*\)') *}}@\1@g" "${temp_file}" -cluster/gce/gci/configure-helper.sh: local api_servers="--master=https://${KUBERNETES_MASTER_NAME}" -cluster/gce/gci/configure-helper.sh: local authorization_mode="RBAC" -cluster/gce/gci/configure-helper.sh: sed -i -e "s@{{pillar\['allow_privileged'\]}}@true@g" "${src_file}" -cluster/gce/trusty/configure-helper.sh: grep -o "{{ *pillar\.get('storage_backend', '\(.*\)') *}}" | \ -cluster/gce/trusty/configure-helper.sh: sed -e "s@{{ *pillar\.get('storage_backend', '\(.*\)') *}}@\1@g") -cluster/gce/trusty/configure-helper.sh: sed -i -e "s@{{ *pillar\.get('storage_backend', '\(.*\)') *}}@${STORAGE_BACKEND}@g" "${temp_file}" -cluster/gce/trusty/configure-helper.sh: sed -i -e "s@{{ *pillar\.get('storage_backend', '\(.*\)') *}}@\1@g" "${temp_file}" -cluster/gce/trusty/configure-helper.sh: sed -i -e "s@{{pillar\['allow_privileged'\]}}@true@g" "${src_file}" -cluster/gce/util.sh: local node_ip=$(gcloud compute instances describe --project "${PROJECT}" --zone "${ZONE}" \ -cluster/juju/layers/kubernetes-master/reactive/kubernetes_master.py: context['pillar'] = {'num_nodes': get_node_count()} -cluster/juju/layers/kubernetes-master/reactive/kubernetes_master.py: ca_cert_path = layer_options.get('ca_certificate_path') -cluster/juju/layers/kubernetes-master/reactive/kubernetes_master.py: cluster_dns.set_dns_info(53, hookenv.config('dns_domain'), dns_ip) -cluster/juju/layers/kubernetes-master/reactive/kubernetes_master.py: ip = service_cidr().split('/')[0] -cluster/juju/layers/kubernetes-master/reactive/kubernetes_master.py: ip = service_cidr().split('/')[0] -cluster/juju/layers/kubernetes-master/reactive/kubernetes_master.py:def send_cluster_dns_detail(cluster_dns): -cluster/juju/layers/kubernetes-master/reactive/kubernetes_master.py:def service_cidr(): -cluster/juju/layers/kubernetes-worker/reactive/kubernetes_worker.py: context.update({'kube_api_endpoint': ','.join(api_servers), -cluster/juju/layers/kubernetes-worker/reactive/kubernetes_worker.py: ca_cert_path = layer_options.get('ca_certificate_path') -cluster/juju/layers/kubernetes-worker/reactive/kubernetes_worker.py:def configure_worker_services(api_servers, dns, cluster_cidr): -cluster/lib/logging.sh: local source_file=${BASH_SOURCE[$frame_no]} -cluster/lib/logging.sh: local source_file=${BASH_SOURCE[$stack_skip]} -cluster/log-dump/log-dump.sh:readonly report_dir="${1:-_artifacts}" -cluster/photon-controller/templates/salt-master.sh: api_servers: $MASTER_NAME -cluster/photon-controller/templates/salt-minion.sh: hostname_override: $(ip route get 1.1.1.1 | awk '{print $7}') -cluster/photon-controller/util.sh: node_ip=$(${PHOTON} vm networks "${node_id}" | grep -i $'\t'"00:0C:29" | grep -E '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | head -1 | awk -F'\t' '{print $3}') -cluster/photon-controller/util.sh: local cert_dir="/srv/kubernetes" -cluster/photon-controller/util.sh: node_name=${1} -cluster/photon-controller/util.sh: ssh_key=$(ssh-add -L | head -1) -cluster/rackspace/util.sh: local node_ip=$(nova show --minimal ${NODE_NAMES[$i]} \ -cluster/saltbase/salt/cluster-autoscaler/cluster-autoscaler.manifest:{% set params = pillar['autoscaler_mig_config'] + " " + cloud_config -%} -cluster/saltbase/salt/etcd/etcd.manifest: "value": "{{ pillar.get('storage_backend', 'etcd3') }}" -cluster/saltbase/salt/etcd/etcd.manifest:{% if pillar.get('storage_backend', 'etcd3') == 'etcd3' -%} -cluster/saltbase/salt/kube-admission-controls/init.sls:{% if 'LimitRanger' in pillar.get('admission_control', '') %} -cluster/saltbase/salt/kube-apiserver/kube-apiserver.manifest:{% set params = address + " " + storage_backend + " " + storage_media_type + " " + etcd_servers + " " + etcd_servers_overrides + " " + cloud_provider + " " + cloud_config + " " + runtime_config + " " + feature_gates + " " + admission_control + " " + max_requests_inflight + " " + target_ram_mb + " " + service_cluster_ip_range + " " + client_ca_file + basic_auth_file + " " + min_request_timeout + " " + enable_garbage_collector + " " + etcd_quorum_read + " " + audit_log -%} -cluster/saltbase/salt/kube-controller-manager/kube-controller-manager.manifest:{% if pillar.get('enable_hostpath_provisioner', '').lower() == 'true' -%} -cluster/saltbase/salt/kube-controller-manager/kube-controller-manager.manifest:{% set params = "--master=127.0.0.1:8080" + " " + cluster_name + " " + cluster_cidr + " " + allocate_node_cidrs + " " + service_cluster_ip_range + " " + terminated_pod_gc + " " + enable_garbage_collector + " " + cloud_provider + " " + cloud_config + " " + service_account_key + " " + log_level + " " + root_ca_file -%} -cluster/saltbase/salt/kube-controller-manager/kube-controller-manager.manifest:{% set params = params + " " + feature_gates -%} -cluster/saltbase/salt/kube-proxy/kube-proxy.manifest: - echo -998 > /proc/$$$/oom_score_adj && kube-proxy {{api_servers_with_port}} {{kubeconfig}} {{cluster_cidr}} --resource-container="" {{params}} 1>>/var/log/kube-proxy.log 2>&1 -cluster/saltbase/salt/kube-proxy/kube-proxy.manifest: {% set api_servers_with_port = api_servers + ":6443" -%} -cluster/saltbase/salt/kube-proxy/kube-proxy.manifest: {% set api_servers_with_port = api_servers -%} -cluster/saltbase/salt/kube-proxy/kube-proxy.manifest: {% set cluster_cidr=" --cluster-cidr=" + pillar['cluster_cidr'] %} -cluster/saltbase/salt/kube-proxy/kube-proxy.manifest:{% set params = log_level + " " + feature_gates + " " + test_args -%} -cluster/saltbase/salt/kube-scheduler/kube-scheduler.manifest:{% set params = params + log_level + " " + feature_gates + " " + scheduling_algorithm_provider -%} -cluster/saltbase/salt/kubelet/default: {% set api_servers_with_port = api_servers + ":6443" -%} -cluster/saltbase/salt/kubelet/default: {% set api_servers_with_port = api_servers -%} -cluster/saltbase/salt/kubelet/default: {% set enable_custom_metrics="--enable-custom-metrics=" + pillar['enable_custom_metrics'] %} -cluster/saltbase/salt/kubelet/default: {% set eviction_hard="--eviction-hard=" + pillar['eviction_hard'] %} -cluster/saltbase/salt/kubelet/default: {% set kubelet_port="--port=" + pillar['kubelet_port'] %} -cluster/saltbase/salt/kubelet/default: {% set node_labels="--node-labels=" + pillar['node_labels'] %} -cluster/saltbase/salt/kubelet/default:{% if grains['feature_gates'] is defined -%} -cluster/saltbase/salt/kubelet/default:{% if pillar.get('non_masquerade_cidr','') -%} -cluster/saltbase/salt/opencontrail-networking-master/init.sls: - 'SERVICE_CLUSTER_IP_RANGE': '{{ pillar.get('service_cluster_ip_range') }}' -cluster/saltbase/salt/opencontrail-networking-minion/init.sls: - 'SERVICE_CLUSTER_IP_RANGE': '{{ pillar.get('service_cluster_ip_range') }}' -cluster/saltbase/salt/supervisor/supervisor_watcher.sh:# Apply oom_score_adj: -901 to processes -cluster/ubuntu/util.sh: local node_ip=${1} -cluster/vagrant/provision-utils.sh: api_servers: '$(echo "$MASTER_IP" | sed -e "s/'/''/g")' -cluster/vagrant/provision-utils.sh: node_ip: '$(echo "$MASTER_IP" | sed -e "s/'/''/g")' -cluster/vagrant/provision-utils.sh: runtime_config: '$(echo "$RUNTIME_CONFIG" | sed -e "s/'/''/g")' -examples/cluster-dns/images/frontend/client.py: service_address = socket.gethostbyname(hostname) -examples/storage/cassandra/image/files/jvm.options:# information in cassandra.yaml (such as listen_address). -examples/storage/cassandra/image/files/jvm.options:#-Dcassandra.replace_address=listen_address or broadcast_address of dead node -examples/storage/cassandra/image/files/run.sh: cluster_name \ -examples/storage/cassandra/image/files/run.sh: listen_address \ -examples/storage/vitess/env.sh: node_ip=$(get_node_ip) -federation/cluster/common.sh: local cert_dir="${kube_temp}/easy-rsa-master/easyrsa3" -federation/deploy/config.json.sample: "cloud_provider": "gce", -federation/deploy/config.json.sample: "cloud_provider": "gce", -federation/deploy/config.json.sample: "cloud_provider": "gce", -federation/deploy/config.json.sample: "cluster_cidr": "10.180.0.0/14", -federation/deploy/config.json.sample: "cluster_cidr": "10.184.0.0/14", -federation/deploy/config.json.sample: "cluster_cidr": "10.188.0.0/14", -federation/deploy/config.json.sample: "cluster_name": "cluster1-kubernetes", -federation/deploy/config.json.sample: "cluster_name": "cluster2-kubernetes", -federation/deploy/config.json.sample: "cluster_name": "cluster3-kubernetes", -federation/deploy/config.json.sample: "kubernetes_version": "v1.4.0" -federation/deploy/config.json.sample: "kubernetes_version": "v1.4.0" -federation/deploy/config.json.sample: "kubernetes_version": "v1.4.0" -federation/deploy/config.json.sample: "num_nodes": 3, -federation/deploy/config.json.sample: "num_nodes": 3, -federation/deploy/config.json.sample: "num_nodes": 3, -hack/lib/util.sh: local api_port=$5 -hack/local-up-cluster.sh: advertise_address="--advertise_address=${API_HOST_IP}" -hack/local-up-cluster.sh: runtime_config="--runtime-config=${RUNTIME_CONFIG}" -hack/local-up-cluster.sh: advertise_address="" -hack/local-up-cluster.sh: runtime_config="" -hack/make-rules/test-e2e-node.sh: image_project=${IMAGE_PROJECT:-"google-containers"} -hack/make-rules/test-e2e-node.sh: delete_instances=${DELETE_INSTANCES:-"false"} -hack/make-rules/test-e2e-node.sh: image_project=${IMAGE_PROJECT:-"kubernetes-node-e2e-images"} -hack/test-update-storage-objects.sh: local storage_backend=${1:-"${STORAGE_BACKEND_ETCD2}"} -hack/test-update-storage-objects.sh: local storage_media_type=${3:-""} -hack/test-update-storage-objects.sh: local storage_versions=${2:-""} -hack/test-update-storage-objects.sh: source_file=${test_data[0]} -hack/test-update-storage-objects.sh:# source_file,resource,namespace,name,old_version,new_version -pkg/kubelet/apis/cri/v1alpha1/runtime/api.pb.go: ContainerPort int32 `protobuf:"varint,2,opt,name=container_port,json=containerPort,proto3" json:"container_port,omitempty"` -pkg/kubelet/apis/cri/v1alpha1/runtime/api.pb.go: OomScoreAdj int64 `protobuf:"varint,5,opt,name=oom_score_adj,json=oomScoreAdj,proto3" json:"oom_score_adj,omitempty"` -pkg/kubelet/apis/cri/v1alpha1/runtime/api.pb.go: PodCidr string `protobuf:"bytes,1,opt,name=pod_cidr,json=podCidr,proto3" json:"pod_cidr,omitempty"` -pkg/kubelet/apis/cri/v1alpha1/runtime/api.pb.go: RuntimeConfig *RuntimeConfig `protobuf:"bytes,1,opt,name=runtime_config,json=runtimeConfig" json:"runtime_config,omitempty"` -pkg/kubelet/apis/cri/v1alpha1/runtime/api.proto: RuntimeConfig runtime_config = 1; -pkg/kubelet/apis/cri/v1alpha1/runtime/api.proto: int32 container_port = 2; -pkg/kubelet/apis/cri/v1alpha1/runtime/api.proto: int64 oom_score_adj = 5; -pkg/kubelet/apis/cri/v1alpha1/runtime/api.proto: string pod_cidr = 1; -pkg/kubelet/cm/container_manager_linux.go: glog.V(3).Infof("Failed to apply oom_score_adj %d for pid %d: %v", oomScoreAdj, pid, err) -pkg/kubelet/cm/container_manager_linux.go: glog.V(5).Infof("attempting to apply oom_score_adj of %d to pid %d", oomScoreAdj, pid) -pkg/kubelet/dockershim/docker_checkpoint.go: ContainerPort *int32 `json:"container_port,omitempty"` -pkg/kubelet/network/hairpin/hairpin.go: hairpinModeRelativePath = "hairpin_mode" -pkg/kubelet/qos/policy_test.go: t.Errorf("oom_score_adj should be between %d and %d, but was %d", test.lowOOMScoreAdj, test.highOOMScoreAdj, oomScoreAdj) -pkg/kubelet/qos/policy_test.go: highOOMScoreAdj int // The min oom_score_adj score the container should be assigned. -pkg/kubelet/qos/policy_test.go: lowOOMScoreAdj int // The max oom_score_adj score the container should be assigned. -pkg/util/oom/oom_linux.go: return fmt.Errorf("invalid PID %d specified for oom_score_adj", pid) -pkg/util/oom/oom_linux.go: oomScoreAdjPath := path.Join("/proc", pidStr, "oom_score_adj") -pkg/util/oom/oom_linux.go:// Writes 'value' to /proc//oom_score_adj for all processes in cgroup cgroupName. -pkg/util/oom/oom_linux.go:// Writes 'value' to /proc//oom_score_adj. PID = 0 means self -test/e2e/common/configmap.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/configmap-volume/data-1"}, -test/e2e/common/configmap.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/configmap-volumes/create/data-1"}, -test/e2e/common/configmap.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/configmap-volumes/delete/data-1"}, -test/e2e/common/configmap.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/configmap-volumes/update/data-3"}, -test/e2e/common/downwardapi_volume.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=" + filePath}, -test/e2e/common/host_path.go: fmt.Sprintf("--file_content_in_loop=%v", filePath), -test/e2e/common/host_path.go: fmt.Sprintf("--file_content_in_loop=%v", filePathInReader), -test/e2e/common/host_path.go: fmt.Sprintf("--retry_time=%d", retryDuration), -test/e2e/common/host_path.go: fmt.Sprintf("--retry_time=%d", retryDuration), -test/e2e/common/projected.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-configmap-volume/data-1"}, -test/e2e/common/projected.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-configmap-volumes/create/data-1"}, -test/e2e/common/projected.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-configmap-volumes/delete/data-1"}, -test/e2e/common/projected.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-configmap-volumes/update/data-3"}, -test/e2e/common/projected.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-secret-volumes/create/data-1"}, -test/e2e/common/projected.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-secret-volumes/delete/data-1"}, -test/e2e/common/projected.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/projected-secret-volumes/update/data-3"}, -test/e2e/common/projected.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=" + filePath}, -test/e2e/common/secrets.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/secret-volumes/create/data-1"}, -test/e2e/common/secrets.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/secret-volumes/delete/data-1"}, -test/e2e/common/secrets.go: Command: []string{"/mt", "--break_on_expected_content=false", "--retry_time=120", "--file_content_in_loop=/etc/secret-volumes/update/data-3"}, -test/e2e/network/no_snat.go: node_ip := v1.EnvVar{ -test/e2e_node/container_manager_test.go: return fmt.Errorf("expected pid %d's oom_score_adj to be %d; found %d", pid, expectedOOMScoreAdj, oomScore) -test/e2e_node/container_manager_test.go: return fmt.Errorf("expected pid %d's oom_score_adj to be < %d; found %d", pid, expectedMaxOOMScoreAdj, oomScore) -test/e2e_node/container_manager_test.go: return fmt.Errorf("expected pid %d's oom_score_adj to be >= %d; found %d", pid, expectedMinOOMScoreAdj, oomScore) -test/e2e_node/container_manager_test.go: return fmt.Errorf("failed to get oom_score_adj for %d", pid) -test/e2e_node/container_manager_test.go: return fmt.Errorf("failed to get oom_score_adj for %d: %v", pid, err) -test/e2e_node/container_manager_test.go: procfsPath := path.Join("/proc", strconv.Itoa(pid), "oom_score_adj") -test/e2e_node/node_container_manager_test.go: kubeReservedCgroup = "/kube_reserved" -test/e2e_node/node_container_manager_test.go: systemReservedCgroup = "/system_reserved" -test/images/mount-tester/mt.go: flag.BoolVar(&breakOnExpectedContent, "break_on_expected_content", true, "Break out of loop on expected content, (use with --file_content_in_loop flag only)") -test/images/mount-tester/mt.go: flag.IntVar(&retryDuration, "retry_time", 180, "Retry time during the loop") -test/images/mount-tester/mt.go: flag.StringVar(&readFileContentInLoopPath, "file_content_in_loop", "", "Path to read the file content in loop from") diff --git a/hack/verify-flags/known-flags.txt b/hack/verify-flags/known-flags.txt deleted file mode 100644 index a3d243b78bd..00000000000 --- a/hack/verify-flags/known-flags.txt +++ /dev/null @@ -1,735 +0,0 @@ -accept-hosts -accept-paths -admission-control -admission-control-config-file -advertise-address -advertised-address -algorithm-provider -all-namespaces -allocate-node-cidrs -allowed-not-ready-nodes -allow-missing-template-keys -allow-privileged -anonymous-auth -api-burst -api-external-dns-names -api-prefix -api-rate -api-server-advertise-address -apiserver-advertise-address -apiserver-arg-overrides -apiserver-arg-overrides -apiserver-bind-port -apiserver-cert-extra-sans -apiserver-count -apiserver-count -apiserver-count -apiserver-count -api-server-port -api-server-port -api-servers -api-servers -apiserver-count -apiserver-count -api-server-port -api-servers -api-server-service-type -api-token -api-version -apiserver-arg-overrides -apiserver-count -apiserver-count -apiserver-enable-basic-auth -apiserver-enable-token-auth -attach-detach-reconcile-sync-period -audit-log-maxage -audit-log-maxbackup -audit-log-maxsize -audit-log-path -audit-policy-file -audit-webhook-config-file -audit-webhook-mode -authentication-kubeconfig -authentication-token-webhook -authentication-token-webhook-cache-ttl -authentication-token-webhook-config-file -authorization-kubeconfig -authorization-mode -authorization-policy-file -authorization-rbac-super-user -authorization-webhook-cache-authorized-ttl -authorization-webhook-cache-unauthorized-ttl -authorization-webhook-config-file -auth-provider -auth-provider -auth-provider-arg -auth-provider-arg -azure-container-registry-config -basic-auth-file -bench-pods -bench-quiet -bench-tasks -bench-workers -bind-address -bind-pods-burst -bind-pods-qps -bounding-dirs -build-dependencies -build-only -build-tag -ca-cert-path -cadvisor-port -cert-altnames -cert-dir -certificate-authority -cgroup-driver -cgroup-root -cgroups-per-qos -chaos-chance -cidr-allocator-type -clean-start -cleanup-iptables -client-ca-file -client-certificate -client-key -client-name -clientset-api-path -clientset-name -clientset-only -clientset-path -cloud-config -cloud-config-file -cloud-provider -cloud-provider-gce-lb-src-cidrs -cluster-cidr -cluster-context -cluster-dns -cluster-domain -cluster-ip -cluster-ip-range -cluster-monitor-period -cluster-name -cluster-signing-cert-file -cluster-signing-gke-kubeconfig -cluster-signing-gke-retry-backoff -cluster-signing-key-file -cluster-tag -cni-bin-dir -cni-conf-dir -concurrent-deployment-syncs -concurrent-endpoint-syncs -concurrent-gc-syncs -concurrent-namespace-syncs -concurrent-replicaset-syncs -concurrent-resource-quota-syncs -concurrent-serviceaccount-token-syncs -concurrent-service-syncs -config-map -config-map-namespace -config-sync-period -configure-cloud-routes -conntrack-max -conntrack-max-per-core -conntrack-min -conntrack-tcp-timeout-close-wait -conntrack-tcp-timeout-established -consumer-port -consumer-service-name -consumer-service-namespace -container-port -container-runtime -container-runtime-endpoint -contain-pod-resources -contention-profiling -controllermanager-arg-overrides -controller-start-interval -core-kubeconfig -cors-allowed-origins -cpu-cfs-quota -cpu-percent -create-annotation -current-release-pr -current-replicas -daemonset-lookup-cache-size -data-dir -default-container-cpu-limit -default-container-mem-limit -delay-shutdown -delete-collection-workers -delete-instances -delete-local-data -delete-namespace -delete-namespace-on-failure -deleting-pods-burst -deleting-pods-qps -deployment-controller-sync-period -deployment-label-key -deserialization-cache-size -dest-file -disable-attach-detach-reconcile-sync -disable-filter -disable-kubenet -disable-log-dump -discovery-file -discovery-port -discovery-token -dns-bind-address -dns-domain -dns-port -dns-provider -dns-provider-config -dns-zone-name -dockercfg-path -docker-disable-shared-pid -docker-email -docker-endpoint -docker-exec-handler -docker-password -docker-server -docker-username -dockershim-checkpoint-dir -driver-port -drop-embedded-fields -dry-run -dump-logs-on-failure -duration-sec -e2e-output-dir -e2e-verify-service-account -enable-aggregator-routing -enable-controller-attach-detach -enable-custom-metrics -enable-debugging-handlers -enable-dynamic-provisioning -enable-garbage-collector -enable-garbage-collector -enable-garbage-collector -enable-hostpath-provisioner -enable-logs-handler -enable-server -enable-swagger-ui -enable-taint-manager -enforce-node-allocatable -etcd-address -etcd-cafile -etcd-certfile -etcd-config -etcd-keyfile -etcd-image -etcd-metrics-scrape-uri -etcd-metrics-scrape-uri -etcd-mutation-timeout -etcd-persistent-storage -etcd-prefix -etcd-pv-capacity -etcd-pv-storage-class -etcd-quorum-read -etcd-server -etcd-servers -etcd-servers-overrides -etcd-upgrade-storage -etcd-upgrade-version -etcd-version-scrape-uri -etcd-version-scrape-uri -event-burst -event-qps -event-ttl -eviction-hard -eviction-max-pod-grace-period -eviction-minimum-reclaim -eviction-pressure-transition-period -eviction-soft -eviction-soft-grace-period -executor-bindall -executor-logv -executor-path -executor-suicide-timeout -exit-on-lock-contention -experimental-allocatable-ignore-eviction -experimental-allowed-unsafe-sysctls -experimental-bootstrap-kubeconfig -bootstrap-kubeconfig -experimental-bootstrap-token-auth -experimental-check-node-capabilities-before-mount -experimental-cluster-signing-duration -experimental-cri -experimental-dockershim -experimental-dockershim-root-directory -experimental-fail-swap-on -experimental-kernel-memcg-notification -experimental-keystone-ca-file -experimental-keystone-url -experimental-keystone-url -experimental-mounter-path -experimental-nvidia-gpus -experimental-prefix -experimental-qos-reserved -external-etcd-cafile -external-etcd-certfile -external-etcd-endpoints -external-etcd-keyfile -external-hostname -external-ip -external-name -extra-peer-dirs -fail-swap-on -failover-timeout -failure-domains -fake-clientset -feature-gates -federated-api-burst -federated-api-qps -federated-kube-context -federation-config-from-cluster -federation-name -federation-system-namespace -federation-upgrade-target -file-check-frequency -file-suffix -flex-volume-plugin-dir -forward-services -framework-name -framework-store-uri -framework-weburi -from-env-file -from-file -from-literal -func-dest -fuzz-iters -garbage-collector-enabled -garbage-collector-enabled -gather-logs-sizes -gather-metrics-at-teardown -gather-resource-usage -gather-suite-metrics-at-teardown -gce-api-endpoint -gce-multizone -gce-project -gce-region -gce-service-account -gce-upgrade-script -gce-zone -ginkgo-flags -gke-cluster -go-header-file -google-json-key -grace-period -ha-domain -hairpin-mode -hard-pod-affinity-symmetric-weight -healthz-bind-address -healthz-port -heapster-namespace -heapster-port -heapster-scheme -heapster-service -horizontal-pod-autoscaler-sync-period -horizontal-pod-autoscaler-upscale-delay -horizontal-pod-autoscaler-downscale-delay -host-cluster-context -host-ipc-sources -hostname-override -host-network-sources -host-pid-sources -host-port-endpoints -host-system-namespace -http-check-frequency -http-port -ignore-daemonsets -ignore-not-found -image-config-file -image-description -image-gc-high-threshold -image-gc-low-threshold -image-project -image-pull-policy -image-pull-progress-deadline -image-service-endpoint -included-types-overrides -include-extended-apis -include-extended-apis -initial-sync-timeout -input-base -input-dirs -insecure-bind-address -insecure-experimental-approve-all-kubelet-csrs-for-group -insecure-port -insecure-skip-tls-verify -instance-metadata -instance-name-prefix -internal-clientset-package -iptables-drop-bit -iptables-masquerade-bit -iptables-min-sync-period -iptables-sync-period -ir-data-source -ir-dbname -ir-hawkular -ir-influxdb-host -ir-namespace-only -ir-password -ir-user -jenkins-host -jenkins-jobs -junit-file-number -k8s-bin-dir -k8s-build-output -keep-gogoproto -keep-terminated-pod-volumes -km-path -kops-admin-access -kops-cluster -kops-kubernetes-version -kops-nodes -kops-ssh-key -kops-state -kops-up-timeout -kops-zones -kubeadm-cmd-skip -kubeadm-cmd-skip -kubeadm-path -kubeadm-path -kube-api-burst -kube-api-content-type -kube-api-qps -kubecfg-file -kubectl-path -kubelet-address -kubelet-api-servers -kubelet-cadvisor-port -kubelet-certificate-authority -kubelet-cgroups -kubelet-client-certificate -kubelet-client-key -kubelet-docker-endpoint -kubelet-enable-debugging-handlers -kubelet-flags -kubelet-host-network-sources -kubelet-https -kubelet-kubeconfig -kubelet-network-plugin -kubelet-pod-infra-container-image -kubelet-port -kubelet-preferred-address-types -kubelet-read-only-port -kubelet-root-dir -kubelet-sync-frequency -kubelet-timeout -kube-master -kube-master -kube-master -kube-master -kube-master-url -kube-master-url -kube-reserved -kube-reserved -kube-reserved-cgroup -kube-master-url -kube-reserved -kubernetes-anywhere-cluster -kubernetes-anywhere-path -kubernetes-anywhere-phase2-provider -kubernetes-anywhere-up-timeout -kubernetes-service-node-port -kubernetes-version -label-columns -large-cluster-size-threshold -last-release-pr -leader-elect -leader-elect-lease-duration -leader-elect-lock-type -leader-elect-renew-deadline -leader-elect-resource-lock -leader-elect-retry-period -lease-duration -leave-stdin-open -limit-bytes -listen-address -listers-package -load-balancer-ip -lock-file -log-flush-frequency -log-lines-total -logexporter-gcs-path -long-running-request-regexp -make-iptables-util-chains -make-symlinks -manifest-url -manifest-url-header -masquerade-all -master-os-distro -master-service-namespace -master-tag -max-concurrency -max-connection-bytes-per-sec -maximum-dead-containers -maximum-dead-containers-per-container -max-log-age -max-log-backups -max-log-size -max-mutating-requests-inflight -max-open-files -max-outgoing-burst -max-outgoing-qps -max-pods -max-requests-inflight -max-unavailable -metrics-bind-address -metrics-path -min-available -minimum-container-ttl-duration -minimum-image-ttl-duration -minion-max-log-age -minion-max-log-backups -minion-max-log-size -minion-path-override -min-pr-number -min-request-timeout -min-resync-period -namespace-sync-period -network-plugin -network-plugin-dir -network-plugin-mtu -node-cidr-mask-size -node-eviction-rate -node-instance-group -node-ip -node-labels -node-max-log-age -node-max-log-backups -node-max-log-size -node-monitor-grace-period -node-monitor-period -node-name -node-os-distro -node-path-override -node-port -node-schedulable-timeout -node-startup-grace-period -node-status-update-frequency -node-sync-period -node-tag -no-headers -no-headers -non-masquerade-cidr -non-resource-url -no-suggestions -no-suggestions -num-nodes -oidc-ca-file -oidc-client-id -oidc-groups-claim -oidc-issuer-url -oidc-username-claim -only-idl -oom-score-adj -output-base -output-directory -output-file-base -output-package -output-patch -output-print-type -output-version -out-version -path-override -pod-cidr -pod-eviction-timeout -pod-infra-container-image -pod-manifest-path -pod-network-cidr -pod-running -pod-running-timeout -pods-per-core -policy-config-file -policy-configmap -policy-configmap-namespace -poll-interval -portal-net -prepull-images -private-mountns -prom-push-gateway -protect-kernel-defaults -proto-import -provider-id -proxy-bindall -proxy-client-cert-file -proxy-client-key-file -proxy-kubeconfig -proxy-logv -proxy-mode -proxy-port-range -public-address-override -pvclaimbinder-sync-period -pvclaimbinder-sync-period -pv-recycler-increment-timeout-nfs -pv-recycler-maximum-retry -pv-recycler-minimum-timeout-hostpath -pv-recycler-minimum-timeout-nfs -pv-recycler-pod-template-filepath-hostpath -pv-recycler-pod-template-filepath-nfs -pv-recycler-timeout-increment-hostpath -read-only-port -really-crash-for-testing -reconcile-cidr -reconcile-cooldown -reconcile-interval -register-node -register-retry-count -register-schedulable -register-with-taints -registry-burst -registry-qps -reject-methods -reject-paths -remove-node -repair-malformed-updates -replicaset-lookup-cache-size -replication-controller-lookup-cache-size -repo-root -report-dir -report-prefix -requestheader-allowed-names -requestheader-client-ca-file -requestheader-extra-headers-prefix -requestheader-group-headers -requestheader-username-headers -required-contexts -require-kubeconfig -resolv-conf -resource-container -resource-name -resource-quota-sync-period -resource-version -results-dir -rkt-api-endpoint -rkt-path -rkt-stage1-image -root-ca-file -root-dir -route-reconciliation-period -run-duration -run-kubelet-mode -run-proxy -run-services-mode -runtime-cgroups -runtime-config -runtime-request-timeout -save-config -schedule-pods-here -scheduler-config -scheduler-name -schema-cache-dir -scrape-timeout -seccomp-profile-root -secondary-node-eviction-rate -secret-name -secure-port -self-hosted -serialize-image-pulls -server-start-timeout -service-account-key-file -service-account-lookup -service-account-private-key-file -service-address -service-cidr -service-cluster-ip-range -service-dns-domain -service-dns-suffix -service-generator -service-node-port-range -service-node-ports -service-overrides -service-sync-period -session-affinity -show-all -show-events -show-kind -show-labels -shutdown-fd -shutdown-fifo -since-seconds -since-time -skip-generated-rewrite -skip-munges -skip-preflight-checks -skip-token-print -skip-unsafe -sort-by -source-file -ssh-env -ssh-key -ssh-keyfile -ssh-options -ssh-user -start-services -static-pods-config -stats-port -stop-services -storage-media-type -storage-version -storage-versions -streaming-connection-idle-timeout -suicide-timeout -sync-frequency -system-cgroups -system-pods-startup-timeout -system-reserved -system-reserved-cgroup -system-spec-file -system-spec-name -system-validate-mode -target-port -target-ram-mb -tcp-services -terminated-pod-gc-threshold -test-flags -test-timeout -tls-bootstrap-token -tls-ca-file -tls-cert-file -tls-private-key-file -tls-sni-cert-key -token-auth-file -token-ttl -to-version -to-version -ttl-keys-prefix -ttl-secs -type-src -udp-port -udp-timeout -unhealthy-zone-threshold -unix-socket -update-period -upgrade-image -upgrade-target -use-kubernetes-cluster-service -use-kubernetes-version -use-legacy-policy-config -use-real-proxier -use-service-account-credentials -user-whitelist -use-service-account-credentials -use-service-account-credentials -user-whitelist -use-service-account-credentials -use-taint-based-evictions -verify-only -versioned-clientset-package -viper-config -viper-config -volume-dir -volume-plugin-dir -volume-stats-agg-period -watch-cache -watch-cache-sizes -watch-only -whitelist-override-label -windows-line-endings -write-config-to -www-prefix -zone-id -zone-name -lock-object-name -lock-object-namespace - -horizontal-pod-autoscaler-use-rest-clients diff --git a/hack/verify-godeps.sh b/hack/verify-godeps.sh index d56c0597629..91731ec8aaa 100755 --- a/hack/verify-godeps.sh +++ b/hack/verify-godeps.sh @@ -49,7 +49,7 @@ readonly branch=${1:-${KUBE_VERIFY_GIT_BRANCH:-master}} if ! [[ ${KUBE_FORCE_VERIFY_CHECKS:-} =~ ^[yY]$ ]] && \ ! kube::util::has_changes_against_upstream_branch "${branch}" 'Godeps/' && \ ! kube::util::has_changes_against_upstream_branch "${branch}" 'vendor/' && \ - ! kube::util::has_changes_against_upstream_branch "${branch}" 'hack/'; then + ! kube::util::has_changes_against_upstream_branch "${branch}" 'hack/.*godep'; then exit 0 fi diff --git a/hack/verify-staging-imports.sh b/hack/verify-staging-imports.sh index fd9d7666a3a..30b8247e2f4 100755 --- a/hack/verify-staging-imports.sh +++ b/hack/verify-staging-imports.sh @@ -23,82 +23,19 @@ source "${KUBE_ROOT}/hack/lib/init.sh" kube::golang::setup_env -function print_forbidden_imports () { - set -o errexit # this was unset by || - local REPO="${1%%/*}" # everything in front of the / +make -C "${KUBE_ROOT}" WHAT=cmd/importverifier - # find packages with extended glob support of bash (supports inversion) - local PACKAGES=($( - shopt -s extglob; - eval ls -d -1 ./vendor/k8s.io/${1}/ - )) +# Find binary +importverifier=$(kube::util::find-binary "importverifier") - shift - local RE="" - local SEP="" - for CLAUSE in "$@"; do - RE+="${SEP}${CLAUSE}" - SEP='\|' - done - local FORBIDDEN=$( - go list -f $'{{with $package := .ImportPath}}{{range $.Imports}}{{$package}} imports {{.}}\n{{end}}{{end}}' "${PACKAGES[@]/%/...}" | - sed 's|^k8s.io/kubernetes/vendor/||;s| k8s.io/kubernetes/vendor/| |' | - grep -v " k8s.io/${REPO}" | - grep " k8s.io/" | - grep -v -e "imports \(${RE}\)" - ) - if [ -n "${FORBIDDEN}" ]; then - echo "${REPO} has a forbidden dependency:" - echo - echo "${FORBIDDEN}" | sed 's/^/ /' - echo - return 1 - fi - local TEST_FORBIDDEN=$( - go list -f $'{{with $package := .ImportPath}}{{range $.TestImports}}{{$package}} imports {{.}}\n{{end}}{{end}}' "${PACKAGES[@]/%/...}" | - sed 's|^k8s.io/kubernetes/vendor/||;s| k8s.io/kubernetes/vendor/| |' | - grep -v " k8s.io/${REPO}" | - grep " k8s.io/" | - grep -v -e "imports \(${RE}\)" - ) - if [ -n "${TEST_FORBIDDEN}" ]; then - echo "${REPO} has a forbidden dependency in test code:" - echo - echo "${TEST_FORBIDDEN}" | sed 's/^/ /' - echo - return 1 - fi - return 0 -} - -RC=0 -print_forbidden_imports apimachinery k8s.io/kube-openapi || RC=1 -print_forbidden_imports api k8s.io/apimachinery || RC=1 -print_forbidden_imports kube-gen k8s.io/apimachinery k8s.io/client-go k8s.io/gengo k8s.io/kube-openapi || RC=1 -print_forbidden_imports 'kube-gen/!(test)' k8s.io/gengo k8s.io/kube-openapi || RC=1 -print_forbidden_imports kube-gen/test k8s.io/apimachinery k8s.io/client-go || RC=1 -print_forbidden_imports client-go k8s.io/apimachinery k8s.io/api || RC=1 -print_forbidden_imports apiserver k8s.io/apimachinery k8s.io/client-go k8s.io/api k8s.io/kube-openapi || RC=1 -print_forbidden_imports metrics k8s.io/apimachinery k8s.io/client-go k8s.io/api || RC=1 -print_forbidden_imports kube-aggregator k8s.io/apimachinery k8s.io/client-go k8s.io/apiserver k8s.io/api k8s.io/kube-openapi || RC=1 -print_forbidden_imports sample-apiserver k8s.io/apimachinery k8s.io/client-go k8s.io/apiserver k8s.io/api || RC=1 -print_forbidden_imports apiextensions-apiserver k8s.io/apimachinery k8s.io/client-go k8s.io/apiserver k8s.io/api || RC=1 -print_forbidden_imports kube-openapi k8s.io/gengo || RC=1 -if [ ${RC} != 0 ]; then - exit ${RC} +if [[ ! -x "$importverifier" ]]; then + { + echo "It looks as if you don't have a compiled importverifier binary" + echo + echo "If you are running from a clone of the git repo, please run" + echo "'make WHAT=cmd/importverifier'." + } >&2 + exit 1 fi -if grep -rq '// import "k8s.io/kubernetes/' 'staging/'; then - echo 'file has "// import "k8s.io/kubernetes/"' - exit 1 -fi - -for EXAMPLE in vendor/k8s.io/client-go/examples/{in-cluster-client-configuration,out-of-cluster-client-configuration} vendor/k8s.io/apiextensions-apiserver/examples ; do - test -d "${EXAMPLE}" # make sure example is still there - if go list -f '{{ join .Deps "\n" }}' "./${EXAMPLE}/..." | sort | uniq | grep -q k8s.io/client-go/plugin; then - echo "${EXAMPLE} imports client-go plugins by default, but shouldn't." - exit 1 - fi -done - -exit 0 +"${importverifier}" "k8s.io/" "${KUBE_ROOT}/hack/staging-import-restrictions.json" \ No newline at end of file diff --git a/pkg/BUILD b/pkg/BUILD index 0b3ef1d254f..c5723921744 100644 --- a/pkg/BUILD +++ b/pkg/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/pkg/api/BUILD b/pkg/api/BUILD index a19431bbb15..ad8c7a0b1d4 100644 --- a/pkg/api/BUILD +++ b/pkg/api/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -23,7 +21,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", @@ -44,7 +41,6 @@ go_test( name = "go_default_test", srcs = ["taint_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_test( @@ -59,9 +55,8 @@ go_test( "serialization_test.go", "unstructured_test.go", ], - tags = ["automanaged"], deps = [ - "//pkg/api:go_default_library", + ":go_default_library", "//pkg/api/testapi:go_default_library", "//pkg/api/testing:go_default_library", "//pkg/api/v1:go_default_library", @@ -108,6 +103,7 @@ filegroup( "//pkg/api/endpoints:all-srcs", "//pkg/api/errors:all-srcs", "//pkg/api/events:all-srcs", + "//pkg/api/fuzzer:all-srcs", "//pkg/api/helper:all-srcs", "//pkg/api/install:all-srcs", "//pkg/api/meta:all-srcs", diff --git a/pkg/api/annotation_key_constants.go b/pkg/api/annotation_key_constants.go index bd7f21d64f4..0d41438191f 100644 --- a/pkg/api/annotation_key_constants.go +++ b/pkg/api/annotation_key_constants.go @@ -89,20 +89,4 @@ const ( // // Not all cloud providers support this annotation, though AWS & GCE do. AnnotationLoadBalancerSourceRangesKey = "service.beta.kubernetes.io/load-balancer-source-ranges" - - // AnnotationValueExternalTrafficLocal Value of annotation to specify local endpoints behavior. - AnnotationValueExternalTrafficLocal = "OnlyLocal" - // AnnotationValueExternalTrafficGlobal Value of annotation to specify global (legacy) behavior. - AnnotationValueExternalTrafficGlobal = "Global" - - // TODO: The beta annotations have been deprecated, remove them when we release k8s 1.8. - - // BetaAnnotationHealthCheckNodePort Annotation specifying the healthcheck nodePort for the service. - // If not specified, annotation is created by the service api backend with the allocated nodePort. - // Will use user-specified nodePort value if specified by the client. - BetaAnnotationHealthCheckNodePort = "service.beta.kubernetes.io/healthcheck-nodeport" - - // BetaAnnotationExternalTraffic An annotation that denotes if this Service desires to route - // external traffic to local endpoints only. This preserves Source IP and avoids a second hop. - BetaAnnotationExternalTraffic = "service.beta.kubernetes.io/external-traffic" ) diff --git a/pkg/api/defaulting_test.go b/pkg/api/defaulting_test.go index 562f1fda8b5..b440d68a359 100644 --- a/pkg/api/defaulting_test.go +++ b/pkg/api/defaulting_test.go @@ -95,8 +95,6 @@ func TestDefaulting(t *testing.T) { {Group: "batch", Version: "v2alpha1", Kind: "Job"}: {}, {Group: "batch", Version: "v2alpha1", Kind: "JobList"}: {}, {Group: "batch", Version: "v2alpha1", Kind: "JobTemplate"}: {}, - {Group: "batch", Version: "v2alpha1", Kind: "ScheduledJob"}: {}, - {Group: "batch", Version: "v2alpha1", Kind: "ScheduledJobList"}: {}, {Group: "certificates.k8s.io", Version: "v1beta1", Kind: "CertificateSigningRequest"}: {}, {Group: "certificates.k8s.io", Version: "v1beta1", Kind: "CertificateSigningRequestList"}: {}, {Group: "componentconfig", Version: "v1alpha1", Kind: "KubeProxyConfiguration"}: {}, @@ -128,6 +126,10 @@ func TestDefaulting(t *testing.T) { {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: "InitializerConfiguration"}: {}, diff --git a/pkg/api/endpoints/BUILD b/pkg/api/endpoints/BUILD index 02d29ce42c1..cbe2c30730b 100644 --- a/pkg/api/endpoints/BUILD +++ b/pkg/api/endpoints/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/util/hash:go_default_library", @@ -23,7 +20,6 @@ go_test( name = "go_default_test", srcs = ["util_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/github.com/davecgh/go-spew/spew:go_default_library", diff --git a/pkg/api/errors/BUILD b/pkg/api/errors/BUILD index deefdcef3c1..df044c0ebf9 100644 --- a/pkg/api/errors/BUILD +++ b/pkg/api/errors/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/api/events/BUILD b/pkg/api/events/BUILD index 23caf608ecf..1bb10b03c89 100644 --- a/pkg/api/events/BUILD +++ b/pkg/api/events/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["sorted_event_list.go"], - tags = ["automanaged"], deps = ["//pkg/api:go_default_library"], ) @@ -19,7 +16,6 @@ go_test( name = "go_default_test", srcs = ["sorted_event_list_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/api/fuzzer/BUILD b/pkg/api/fuzzer/BUILD new file mode 100644 index 00000000000..12725aa9c91 --- /dev/null +++ b/pkg/api/fuzzer/BUILD @@ -0,0 +1,35 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = [ + "//pkg/api:go_default_library", + "//vendor/github.com/google/gofuzz:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/resource: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/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/api/fuzzer/fuzzer.go b/pkg/api/fuzzer/fuzzer.go new file mode 100644 index 00000000000..9d0f94a2678 --- /dev/null +++ b/pkg/api/fuzzer/fuzzer.go @@ -0,0 +1,443 @@ +/* +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 fuzzer + +import ( + "reflect" + "strconv" + + fuzz "github.com/google/gofuzz" + + "k8s.io/apimachinery/pkg/api/resource" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/kubernetes/pkg/api" +) + +// Funcs returns the fuzzer functions for the core api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{ + func(q *resource.Quantity, c fuzz.Continue) { + *q = *resource.NewQuantity(c.Int63n(1000), resource.DecimalExponent) + }, + func(j *api.ObjectReference, c fuzz.Continue) { + // We have to customize the randomization of TypeMetas because their + // APIVersion and Kind must remain blank in memory. + j.APIVersion = c.RandString() + j.Kind = c.RandString() + j.Namespace = c.RandString() + j.Name = c.RandString() + j.ResourceVersion = strconv.FormatUint(c.RandUint64(), 10) + j.FieldPath = c.RandString() + }, + func(j *api.ListOptions, c fuzz.Continue) { + label, _ := labels.Parse("a=b") + j.LabelSelector = label + field, _ := fields.ParseSelector("a=b") + j.FieldSelector = field + }, + func(j *api.PodExecOptions, c fuzz.Continue) { + j.Stdout = true + j.Stderr = true + }, + func(j *api.PodAttachOptions, c fuzz.Continue) { + j.Stdout = true + j.Stderr = true + }, + func(j *api.PodPortForwardOptions, c fuzz.Continue) { + if c.RandBool() { + j.Ports = make([]int32, c.Intn(10)) + for i := range j.Ports { + j.Ports[i] = c.Int31n(65535) + } + } + }, + func(s *api.PodSpec, c fuzz.Continue) { + c.FuzzNoCustom(s) + // has a default value + ttl := int64(30) + if c.RandBool() { + ttl = int64(c.Uint32()) + } + s.TerminationGracePeriodSeconds = &ttl + + c.Fuzz(s.SecurityContext) + + if s.SecurityContext == nil { + s.SecurityContext = new(api.PodSecurityContext) + } + if s.Affinity == nil { + s.Affinity = new(api.Affinity) + } + if s.SchedulerName == "" { + s.SchedulerName = api.DefaultSchedulerName + } + }, + func(j *api.PodPhase, c fuzz.Continue) { + statuses := []api.PodPhase{api.PodPending, api.PodRunning, api.PodFailed, api.PodUnknown} + *j = statuses[c.Rand.Intn(len(statuses))] + }, + func(j *api.Binding, c fuzz.Continue) { + c.Fuzz(&j.ObjectMeta) + j.Target.Name = c.RandString() + }, + func(j *api.ReplicationControllerSpec, c fuzz.Continue) { + c.FuzzNoCustom(j) // fuzz self without calling this function again + //j.TemplateRef = nil // this is required for round trip + }, + func(j *api.List, c fuzz.Continue) { + c.FuzzNoCustom(j) // fuzz self without calling this function again + // TODO: uncomment when round trip starts from a versioned object + if false { //j.Items == nil { + j.Items = []runtime.Object{} + } + }, + func(q *api.ResourceRequirements, c fuzz.Continue) { + randomQuantity := func() resource.Quantity { + var q resource.Quantity + c.Fuzz(&q) + // precalc the string for benchmarking purposes + _ = q.String() + return q + } + q.Limits = make(api.ResourceList) + q.Requests = make(api.ResourceList) + cpuLimit := randomQuantity() + q.Limits[api.ResourceCPU] = *cpuLimit.Copy() + q.Requests[api.ResourceCPU] = *cpuLimit.Copy() + memoryLimit := randomQuantity() + q.Limits[api.ResourceMemory] = *memoryLimit.Copy() + q.Requests[api.ResourceMemory] = *memoryLimit.Copy() + storageLimit := randomQuantity() + q.Limits[api.ResourceStorage] = *storageLimit.Copy() + q.Requests[api.ResourceStorage] = *storageLimit.Copy() + }, + func(q *api.LimitRangeItem, c fuzz.Continue) { + var cpuLimit resource.Quantity + c.Fuzz(&cpuLimit) + + q.Type = api.LimitTypeContainer + q.Default = make(api.ResourceList) + q.Default[api.ResourceCPU] = *(cpuLimit.Copy()) + + q.DefaultRequest = make(api.ResourceList) + q.DefaultRequest[api.ResourceCPU] = *(cpuLimit.Copy()) + + q.Max = make(api.ResourceList) + q.Max[api.ResourceCPU] = *(cpuLimit.Copy()) + + q.Min = make(api.ResourceList) + q.Min[api.ResourceCPU] = *(cpuLimit.Copy()) + + q.MaxLimitRequestRatio = make(api.ResourceList) + q.MaxLimitRequestRatio[api.ResourceCPU] = resource.MustParse("10") + }, + func(p *api.PullPolicy, c fuzz.Continue) { + policies := []api.PullPolicy{api.PullAlways, api.PullNever, api.PullIfNotPresent} + *p = policies[c.Rand.Intn(len(policies))] + }, + func(rp *api.RestartPolicy, c fuzz.Continue) { + policies := []api.RestartPolicy{api.RestartPolicyAlways, api.RestartPolicyNever, api.RestartPolicyOnFailure} + *rp = policies[c.Rand.Intn(len(policies))] + }, + // api.DownwardAPIVolumeFile needs to have a specific func since FieldRef has to be + // defaulted to a version otherwise roundtrip will fail + func(m *api.DownwardAPIVolumeFile, c fuzz.Continue) { + m.Path = c.RandString() + versions := []string{"v1"} + m.FieldRef = &api.ObjectFieldSelector{} + m.FieldRef.APIVersion = versions[c.Rand.Intn(len(versions))] + m.FieldRef.FieldPath = c.RandString() + c.Fuzz(m.Mode) + if m.Mode != nil { + *m.Mode &= 0777 + } + }, + func(s *api.SecretVolumeSource, c fuzz.Continue) { + c.FuzzNoCustom(s) // fuzz self without calling this function again + + if c.RandBool() { + opt := c.RandBool() + s.Optional = &opt + } + // DefaultMode should always be set, it has a default + // value and it is expected to be between 0 and 0777 + var mode int32 + c.Fuzz(&mode) + mode &= 0777 + s.DefaultMode = &mode + }, + func(cm *api.ConfigMapVolumeSource, c fuzz.Continue) { + c.FuzzNoCustom(cm) // fuzz self without calling this function again + + if c.RandBool() { + opt := c.RandBool() + cm.Optional = &opt + } + // DefaultMode should always be set, it has a default + // value and it is expected to be between 0 and 0777 + var mode int32 + c.Fuzz(&mode) + mode &= 0777 + cm.DefaultMode = &mode + }, + func(d *api.DownwardAPIVolumeSource, c fuzz.Continue) { + c.FuzzNoCustom(d) // fuzz self without calling this function again + + // DefaultMode should always be set, it has a default + // value and it is expected to be between 0 and 0777 + var mode int32 + c.Fuzz(&mode) + mode &= 0777 + d.DefaultMode = &mode + }, + func(s *api.ProjectedVolumeSource, c fuzz.Continue) { + c.FuzzNoCustom(s) // fuzz self without calling this function again + + // DefaultMode should always be set, it has a default + // value and it is expected to be between 0 and 0777 + var mode int32 + c.Fuzz(&mode) + mode &= 0777 + s.DefaultMode = &mode + }, + func(k *api.KeyToPath, c fuzz.Continue) { + c.FuzzNoCustom(k) // fuzz self without calling this function again + k.Key = c.RandString() + k.Path = c.RandString() + + // Mode is not mandatory, but if it is set, it should be + // a value between 0 and 0777 + if k.Mode != nil { + *k.Mode &= 0777 + } + }, + func(vs *api.VolumeSource, c fuzz.Continue) { + // Exactly one of the fields must be set. + v := reflect.ValueOf(vs).Elem() + i := int(c.RandUint64() % uint64(v.NumField())) + t := v.Field(i).Addr() + for v.Field(i).IsNil() { + c.Fuzz(t.Interface()) + } + }, + func(i *api.ISCSIVolumeSource, c fuzz.Continue) { + i.ISCSIInterface = c.RandString() + if i.ISCSIInterface == "" { + i.ISCSIInterface = "default" + } + }, + func(d *api.DNSPolicy, c fuzz.Continue) { + policies := []api.DNSPolicy{api.DNSClusterFirst, api.DNSDefault} + *d = policies[c.Rand.Intn(len(policies))] + }, + func(p *api.Protocol, c fuzz.Continue) { + protocols := []api.Protocol{api.ProtocolTCP, api.ProtocolUDP} + *p = protocols[c.Rand.Intn(len(protocols))] + }, + func(p *api.ServiceAffinity, c fuzz.Continue) { + types := []api.ServiceAffinity{api.ServiceAffinityClientIP, api.ServiceAffinityNone} + *p = types[c.Rand.Intn(len(types))] + }, + func(p *api.ServiceType, c fuzz.Continue) { + types := []api.ServiceType{api.ServiceTypeClusterIP, api.ServiceTypeNodePort, api.ServiceTypeLoadBalancer} + *p = types[c.Rand.Intn(len(types))] + }, + func(p *api.ServiceExternalTrafficPolicyType, c fuzz.Continue) { + types := []api.ServiceExternalTrafficPolicyType{api.ServiceExternalTrafficPolicyTypeCluster, api.ServiceExternalTrafficPolicyTypeLocal} + *p = types[c.Rand.Intn(len(types))] + }, + func(ct *api.Container, c fuzz.Continue) { + c.FuzzNoCustom(ct) // fuzz self without calling this function again + ct.TerminationMessagePath = "/" + ct.TerminationMessagePath // Must be non-empty + ct.TerminationMessagePolicy = "File" + }, + func(p *api.Probe, c fuzz.Continue) { + c.FuzzNoCustom(p) + // These fields have default values. + intFieldsWithDefaults := [...]string{"TimeoutSeconds", "PeriodSeconds", "SuccessThreshold", "FailureThreshold"} + v := reflect.ValueOf(p).Elem() + for _, field := range intFieldsWithDefaults { + f := v.FieldByName(field) + if f.Int() == 0 { + f.SetInt(1) + } + } + }, + func(ev *api.EnvVar, c fuzz.Continue) { + ev.Name = c.RandString() + if c.RandBool() { + ev.Value = c.RandString() + } else { + ev.ValueFrom = &api.EnvVarSource{} + ev.ValueFrom.FieldRef = &api.ObjectFieldSelector{} + + versions := []schema.GroupVersion{ + {Group: "admission.k8s.io", Version: "v1alpha1"}, + {Group: "apps", Version: "v1beta1"}, + {Group: "apps", Version: "v1beta2"}, + {Group: "foo", Version: "v42"}, + } + + ev.ValueFrom.FieldRef.APIVersion = versions[c.Rand.Intn(len(versions))].String() + ev.ValueFrom.FieldRef.FieldPath = c.RandString() + } + }, + func(ev *api.EnvFromSource, c fuzz.Continue) { + if c.RandBool() { + ev.Prefix = "p_" + } + if c.RandBool() { + c.Fuzz(&ev.ConfigMapRef) + } else { + c.Fuzz(&ev.SecretRef) + } + }, + func(cm *api.ConfigMapEnvSource, c fuzz.Continue) { + c.FuzzNoCustom(cm) // fuzz self without calling this function again + if c.RandBool() { + opt := c.RandBool() + cm.Optional = &opt + } + }, + func(s *api.SecretEnvSource, c fuzz.Continue) { + c.FuzzNoCustom(s) // fuzz self without calling this function again + }, + func(sc *api.SecurityContext, c fuzz.Continue) { + c.FuzzNoCustom(sc) // fuzz self without calling this function again + if c.RandBool() { + priv := c.RandBool() + sc.Privileged = &priv + } + + if c.RandBool() { + sc.Capabilities = &api.Capabilities{ + Add: make([]api.Capability, 0), + Drop: make([]api.Capability, 0), + } + c.Fuzz(&sc.Capabilities.Add) + c.Fuzz(&sc.Capabilities.Drop) + } + }, + func(s *api.Secret, c fuzz.Continue) { + c.FuzzNoCustom(s) // fuzz self without calling this function again + s.Type = api.SecretTypeOpaque + }, + func(r *api.RBDVolumeSource, c fuzz.Continue) { + r.RBDPool = c.RandString() + if r.RBDPool == "" { + r.RBDPool = "rbd" + } + r.RadosUser = c.RandString() + if r.RadosUser == "" { + r.RadosUser = "admin" + } + r.Keyring = c.RandString() + if r.Keyring == "" { + r.Keyring = "/etc/ceph/keyring" + } + }, + func(pv *api.PersistentVolume, c fuzz.Continue) { + c.FuzzNoCustom(pv) // fuzz self without calling this function again + types := []api.PersistentVolumePhase{api.VolumeAvailable, api.VolumePending, api.VolumeBound, api.VolumeReleased, api.VolumeFailed} + pv.Status.Phase = types[c.Rand.Intn(len(types))] + pv.Status.Message = c.RandString() + reclamationPolicies := []api.PersistentVolumeReclaimPolicy{api.PersistentVolumeReclaimRecycle, api.PersistentVolumeReclaimRetain} + pv.Spec.PersistentVolumeReclaimPolicy = reclamationPolicies[c.Rand.Intn(len(reclamationPolicies))] + }, + func(pvc *api.PersistentVolumeClaim, c fuzz.Continue) { + c.FuzzNoCustom(pvc) // fuzz self without calling this function again + types := []api.PersistentVolumeClaimPhase{api.ClaimBound, api.ClaimPending, api.ClaimLost} + pvc.Status.Phase = types[c.Rand.Intn(len(types))] + }, + func(obj *api.AzureDiskVolumeSource, c fuzz.Continue) { + if obj.CachingMode == nil { + obj.CachingMode = new(api.AzureDataDiskCachingMode) + *obj.CachingMode = api.AzureDataDiskCachingReadWrite + } + if obj.Kind == nil { + obj.Kind = new(api.AzureDataDiskKind) + *obj.Kind = api.AzureSharedBlobDisk + } + if obj.FSType == nil { + obj.FSType = new(string) + *obj.FSType = "ext4" + } + if obj.ReadOnly == nil { + obj.ReadOnly = new(bool) + *obj.ReadOnly = false + } + }, + func(sio *api.ScaleIOVolumeSource, c fuzz.Continue) { + sio.ProtectionDomain = c.RandString() + if sio.ProtectionDomain == "" { + sio.ProtectionDomain = "default" + } + sio.StoragePool = c.RandString() + if sio.StoragePool == "" { + sio.StoragePool = "default" + } + sio.StorageMode = c.RandString() + if sio.StorageMode == "" { + sio.StorageMode = "ThinProvisioned" + } + sio.FSType = c.RandString() + if sio.FSType == "" { + sio.FSType = "xfs" + } + }, + func(s *api.NamespaceSpec, c fuzz.Continue) { + s.Finalizers = []api.FinalizerName{api.FinalizerKubernetes} + }, + func(s *api.NamespaceStatus, c fuzz.Continue) { + s.Phase = api.NamespaceActive + }, + func(http *api.HTTPGetAction, c fuzz.Continue) { + c.FuzzNoCustom(http) // fuzz self without calling this function again + http.Path = "/" + http.Path // can't be blank + http.Scheme = "x" + http.Scheme // can't be blank + }, + func(ss *api.ServiceSpec, c fuzz.Continue) { + c.FuzzNoCustom(ss) // fuzz self without calling this function again + if len(ss.Ports) == 0 { + // There must be at least 1 port. + ss.Ports = append(ss.Ports, api.ServicePort{}) + c.Fuzz(&ss.Ports[0]) + } + for i := range ss.Ports { + switch ss.Ports[i].TargetPort.Type { + case intstr.Int: + ss.Ports[i].TargetPort.IntVal = 1 + ss.Ports[i].TargetPort.IntVal%65535 // non-zero + case intstr.String: + ss.Ports[i].TargetPort.StrVal = "x" + ss.Ports[i].TargetPort.StrVal // non-empty + } + } + }, + func(n *api.Node, c fuzz.Continue) { + c.FuzzNoCustom(n) + n.Spec.ExternalID = "external" + }, + func(s *api.NodeStatus, c fuzz.Continue) { + c.FuzzNoCustom(s) + s.Allocatable = s.Capacity + }, + } +} diff --git a/pkg/api/helper/BUILD b/pkg/api/helper/BUILD index 159760269b0..384d2d09609 100644 --- a/pkg/api/helper/BUILD +++ b/pkg/api/helper/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["helpers_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", @@ -23,7 +20,6 @@ go_test( go_library( name = "go_default_library", srcs = ["helpers.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", diff --git a/pkg/api/helper/helpers.go b/pkg/api/helper/helpers.go index 962b8aafb50..fc0f70a876e 100644 --- a/pkg/api/helper/helpers.go +++ b/pkg/api/helper/helpers.go @@ -53,6 +53,9 @@ var Semantic = conversion.EqualitiesOrDie( // Uninitialized quantities are equivalent to 0 quantities. return a.Cmp(b) == 0 }, + func(a, b metav1.MicroTime) bool { + return a.UTC() == b.UTC() + }, func(a, b metav1.Time) bool { return a.UTC() == b.UTC() }, diff --git a/pkg/api/helper/qos/BUILD b/pkg/api/helper/qos/BUILD index 9dfe7de8549..63b594dc911 100644 --- a/pkg/api/helper/qos/BUILD +++ b/pkg/api/helper/qos/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["qos.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", diff --git a/pkg/api/install/BUILD b/pkg/api/install/BUILD index c13e1e212a6..ad64a56ce60 100644 --- a/pkg/api/install/BUILD +++ b/pkg/api/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1:go_default_library", @@ -26,7 +23,6 @@ go_test( name = "go_default_test", srcs = ["install_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/api/meta/BUILD b/pkg/api/meta/BUILD index 711339ed894..c674fdb2e60 100644 --- a/pkg/api/meta/BUILD +++ b/pkg/api/meta/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/api/meta/metatypes/BUILD b/pkg/api/meta/metatypes/BUILD index deefdcef3c1..df044c0ebf9 100644 --- a/pkg/api/meta/metatypes/BUILD +++ b/pkg/api/meta/metatypes/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/api/persistentvolume/BUILD b/pkg/api/persistentvolume/BUILD index 1699f870c30..26471bdb6db 100644 --- a/pkg/api/persistentvolume/BUILD +++ b/pkg/api/persistentvolume/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = ["//pkg/api:go_default_library"], ) @@ -32,7 +29,6 @@ go_test( name = "go_default_test", srcs = ["util_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", diff --git a/pkg/api/persistentvolume/util.go b/pkg/api/persistentvolume/util.go index 264e3f93b1d..d4edd807a79 100644 --- a/pkg/api/persistentvolume/util.go +++ b/pkg/api/persistentvolume/util.go @@ -27,10 +27,13 @@ func getClaimRefNamespace(pv *api.PersistentVolume) string { return "" } +// Visitor is called with each object's namespace and name, and returns true if visiting should continue +type Visitor func(namespace, name string) (shouldContinue bool) + // VisitPVSecretNames invokes the visitor function with the name of every secret // referenced by the PV spec. If visitor returns false, visiting is short-circuited. // Returns true if visiting completed, false if visiting was short-circuited. -func VisitPVSecretNames(pv *api.PersistentVolume, visitor func(string, string) bool) bool { +func VisitPVSecretNames(pv *api.PersistentVolume, visitor Visitor) bool { source := &pv.Spec.PersistentVolumeSource switch { case source.AzureFile != nil: diff --git a/pkg/api/persistentvolume/util_test.go b/pkg/api/persistentvolume/util_test.go index f35c5e7eb2b..87564d33723 100644 --- a/pkg/api/persistentvolume/util_test.go +++ b/pkg/api/persistentvolume/util_test.go @@ -31,44 +31,56 @@ func TestPVSecrets(t *testing.T) { // Stub containing all possible secret references in a PV. // The names of the referenced secrets match struct paths detected by reflection. pvs := []*api.PersistentVolume{ - {Spec: api.PersistentVolumeSpec{PersistentVolumeSource: api.PersistentVolumeSource{ - AzureFile: &api.AzureFileVolumeSource{ - SecretName: "Spec.PersistentVolumeSource.AzureFile.SecretName"}}}}, - {Spec: api.PersistentVolumeSpec{PersistentVolumeSource: api.PersistentVolumeSource{ - CephFS: &api.CephFSVolumeSource{ - SecretRef: &api.LocalObjectReference{ - Name: "Spec.PersistentVolumeSource.CephFS.SecretRef"}}}}}, - {Spec: api.PersistentVolumeSpec{PersistentVolumeSource: api.PersistentVolumeSource{ - FlexVolume: &api.FlexVolumeSource{ - SecretRef: &api.LocalObjectReference{ - Name: "Spec.PersistentVolumeSource.FlexVolume.SecretRef"}}}}}, - {Spec: api.PersistentVolumeSpec{PersistentVolumeSource: api.PersistentVolumeSource{ - RBD: &api.RBDVolumeSource{ - SecretRef: &api.LocalObjectReference{ - Name: "Spec.PersistentVolumeSource.RBD.SecretRef"}}}}}, - {Spec: api.PersistentVolumeSpec{PersistentVolumeSource: api.PersistentVolumeSource{ - ScaleIO: &api.ScaleIOVolumeSource{ - SecretRef: &api.LocalObjectReference{ - Name: "Spec.PersistentVolumeSource.ScaleIO.SecretRef"}}}}}, - {Spec: api.PersistentVolumeSpec{PersistentVolumeSource: api.PersistentVolumeSource{ - ISCSI: &api.ISCSIVolumeSource{ - SecretRef: &api.LocalObjectReference{ - Name: "Spec.PersistentVolumeSource.ISCSI.SecretRef"}}}}}, - {Spec: api.PersistentVolumeSpec{PersistentVolumeSource: api.PersistentVolumeSource{ - StorageOS: &api.StorageOSPersistentVolumeSource{ - SecretRef: &api.ObjectReference{ - Name: "Spec.PersistentVolumeSource.StorageOS.SecretRef", - Namespace: "Spec.PersistentVolumeSource.StorageOS.SecretRef"}}}}}, + {Spec: api.PersistentVolumeSpec{ + ClaimRef: &api.ObjectReference{Namespace: "claimrefns", Name: "claimrefname"}, + PersistentVolumeSource: api.PersistentVolumeSource{ + AzureFile: &api.AzureFileVolumeSource{ + SecretName: "Spec.PersistentVolumeSource.AzureFile.SecretName"}}}}, + {Spec: api.PersistentVolumeSpec{ + ClaimRef: &api.ObjectReference{Namespace: "claimrefns", Name: "claimrefname"}, + PersistentVolumeSource: api.PersistentVolumeSource{ + CephFS: &api.CephFSVolumeSource{ + SecretRef: &api.LocalObjectReference{ + Name: "Spec.PersistentVolumeSource.CephFS.SecretRef"}}}}}, + {Spec: api.PersistentVolumeSpec{ + ClaimRef: &api.ObjectReference{Namespace: "claimrefns", Name: "claimrefname"}, + PersistentVolumeSource: api.PersistentVolumeSource{ + FlexVolume: &api.FlexVolumeSource{ + SecretRef: &api.LocalObjectReference{ + Name: "Spec.PersistentVolumeSource.FlexVolume.SecretRef"}}}}}, + {Spec: api.PersistentVolumeSpec{ + ClaimRef: &api.ObjectReference{Namespace: "claimrefns", Name: "claimrefname"}, + PersistentVolumeSource: api.PersistentVolumeSource{ + RBD: &api.RBDVolumeSource{ + SecretRef: &api.LocalObjectReference{ + Name: "Spec.PersistentVolumeSource.RBD.SecretRef"}}}}}, + {Spec: api.PersistentVolumeSpec{ + ClaimRef: &api.ObjectReference{Namespace: "claimrefns", Name: "claimrefname"}, + PersistentVolumeSource: api.PersistentVolumeSource{ + ScaleIO: &api.ScaleIOVolumeSource{ + SecretRef: &api.LocalObjectReference{ + Name: "Spec.PersistentVolumeSource.ScaleIO.SecretRef"}}}}}, + {Spec: api.PersistentVolumeSpec{ + ClaimRef: &api.ObjectReference{Namespace: "claimrefns", Name: "claimrefname"}, + PersistentVolumeSource: api.PersistentVolumeSource{ + ISCSI: &api.ISCSIVolumeSource{ + SecretRef: &api.LocalObjectReference{ + Name: "Spec.PersistentVolumeSource.ISCSI.SecretRef"}}}}}, + {Spec: api.PersistentVolumeSpec{ + ClaimRef: &api.ObjectReference{Namespace: "claimrefns", Name: "claimrefname"}, + PersistentVolumeSource: api.PersistentVolumeSource{ + StorageOS: &api.StorageOSPersistentVolumeSource{ + SecretRef: &api.ObjectReference{ + Name: "Spec.PersistentVolumeSource.StorageOS.SecretRef", + Namespace: "storageosns"}}}}}, } extractedNames := sets.NewString() - extractedNamespaces := sets.NewString() + extractedNamesWithNamespace := sets.NewString() for _, pv := range pvs { VisitPVSecretNames(pv, func(namespace, name string) bool { extractedNames.Insert(name) - if namespace != "" { - extractedNamespaces.Insert(namespace) - } + extractedNamesWithNamespace.Insert(namespace + "/" + name) return true }) } @@ -108,12 +120,22 @@ func TestPVSecrets(t *testing.T) { t.Error("Extra secret names extracted. Verify VisitPVSecretNames() is correctly extracting secret names") } - expectedSecretNamespaces := sets.NewString( - "Spec.PersistentVolumeSource.StorageOS.SecretRef", + expectedNamespacedNames := sets.NewString( + "claimrefns/Spec.PersistentVolumeSource.AzureFile.SecretName", + "claimrefns/Spec.PersistentVolumeSource.CephFS.SecretRef", + "claimrefns/Spec.PersistentVolumeSource.FlexVolume.SecretRef", + "claimrefns/Spec.PersistentVolumeSource.RBD.SecretRef", + "claimrefns/Spec.PersistentVolumeSource.ScaleIO.SecretRef", + "claimrefns/Spec.PersistentVolumeSource.ISCSI.SecretRef", + "storageosns/Spec.PersistentVolumeSource.StorageOS.SecretRef", ) - - if len(expectedSecretNamespaces.Difference(extractedNamespaces)) > 0 { - t.Errorf("Missing expected secret namespace") + if missingNames := expectedNamespacedNames.Difference(extractedNamesWithNamespace); len(missingNames) > 0 { + t.Logf("Missing expected namespaced names:\n%s", strings.Join(missingNames.List(), "\n")) + t.Error("Missing expected namespaced names. Verify the PV stub above includes these references, then verify VisitPVSecretNames() is correctly finding the missing names") + } + if extraNames := extractedNamesWithNamespace.Difference(expectedNamespacedNames); len(extraNames) > 0 { + t.Logf("Extra namespaced names:\n%s", strings.Join(extraNames.List(), "\n")) + t.Error("Extra namespaced names extracted. Verify VisitPVSecretNames() is correctly extracting secret names") } } diff --git a/pkg/api/pod/BUILD b/pkg/api/pod/BUILD index 53074031c36..316c6a7819f 100644 --- a/pkg/api/pod/BUILD +++ b/pkg/api/pod/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -35,7 +32,6 @@ go_test( name = "go_default_test", srcs = ["util_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", diff --git a/pkg/api/ref/BUILD b/pkg/api/ref/BUILD index 29ad23ec654..162fbb21a20 100644 --- a/pkg/api/ref/BUILD +++ b/pkg/api/ref/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["ref_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -24,7 +21,6 @@ go_test( go_library( name = "go_default_library", srcs = ["ref.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", diff --git a/pkg/api/register.go b/pkg/api/register.go index 5f261bdfb5b..39562e5a566 100644 --- a/pkg/api/register.go +++ b/pkg/api/register.go @@ -85,6 +85,7 @@ func addKnownTypes(scheme *runtime.Scheme) error { &ServiceProxyOptions{}, &NodeList{}, &Node{}, + &NodeConfigSource{}, &NodeProxyOptions{}, &Endpoints{}, &EndpointsList{}, diff --git a/pkg/api/resource/BUILD b/pkg/api/resource/BUILD index 1625024d411..f115af29e9b 100644 --- a/pkg/api/resource/BUILD +++ b/pkg/api/resource/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["helpers.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", @@ -35,7 +32,6 @@ go_test( name = "go_default_test", srcs = ["helpers_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", diff --git a/pkg/api/service/BUILD b/pkg/api/service/BUILD index a514e373811..795a9707296 100644 --- a/pkg/api/service/BUILD +++ b/pkg/api/service/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,11 +9,9 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/util/net/sets:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", ], ) @@ -23,12 +19,9 @@ go_test( name = "go_default_test", srcs = ["util_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/util/net/sets:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ], ) diff --git a/pkg/api/service/util.go b/pkg/api/service/util.go index 50041f77e2e..242aab77f1f 100644 --- a/pkg/api/service/util.go +++ b/pkg/api/service/util.go @@ -18,13 +18,10 @@ package service import ( "fmt" - "strconv" "strings" "k8s.io/kubernetes/pkg/api" netsets "k8s.io/kubernetes/pkg/util/net/sets" - - "github.com/golang/glog" ) const ( @@ -77,72 +74,13 @@ func RequestsOnlyLocalTraffic(service *api.Service) bool { return false } - // First check the beta annotation and then the first class field. This is so that - // existing Services continue to work till the user decides to transition to the - // first class field. - if l, ok := service.Annotations[api.BetaAnnotationExternalTraffic]; ok { - switch l { - case api.AnnotationValueExternalTrafficLocal: - return true - case api.AnnotationValueExternalTrafficGlobal: - return false - default: - glog.Errorf("Invalid value for annotation %v: %v", api.BetaAnnotationExternalTraffic, l) - return false - } - } return service.Spec.ExternalTrafficPolicy == api.ServiceExternalTrafficPolicyTypeLocal } -// NeedsHealthCheck Check if service needs health check. +// NeedsHealthCheck checks if service needs health check. func NeedsHealthCheck(service *api.Service) bool { if service.Spec.Type != api.ServiceTypeLoadBalancer { return false } return RequestsOnlyLocalTraffic(service) } - -// GetServiceHealthCheckNodePort Return health check node port for service, if one exists -func GetServiceHealthCheckNodePort(service *api.Service) int32 { - // First check the beta annotation and then the first class field. This is so that - // existing Services continue to work till the user decides to transition to the - // first class field. - if l, ok := service.Annotations[api.BetaAnnotationHealthCheckNodePort]; ok { - p, err := strconv.Atoi(l) - if err != nil { - glog.Errorf("Failed to parse annotation %v: %v", api.BetaAnnotationHealthCheckNodePort, err) - return 0 - } - return int32(p) - } - return service.Spec.HealthCheckNodePort -} - -// ClearExternalTrafficPolicy resets the ExternalTrafficPolicy field. -func ClearExternalTrafficPolicy(service *api.Service) { - // First check the beta annotation and then the first class field. This is so that - // existing Services continue to work till the user decides to transition to the - // first class field. - if _, ok := service.Annotations[api.BetaAnnotationExternalTraffic]; ok { - delete(service.Annotations, api.BetaAnnotationExternalTraffic) - return - } - service.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyType("") -} - -// SetServiceHealthCheckNodePort sets the given health check node port on service. -// It does not check whether this service needs healthCheckNodePort. -func SetServiceHealthCheckNodePort(service *api.Service, hcNodePort int32) { - // First check the beta annotation and then the first class field. This is so that - // existing Services continue to work till the user decides to transition to the - // first class field. - if _, ok := service.Annotations[api.BetaAnnotationExternalTraffic]; ok { - if hcNodePort == 0 { - delete(service.Annotations, api.BetaAnnotationHealthCheckNodePort) - } else { - service.Annotations[api.BetaAnnotationHealthCheckNodePort] = fmt.Sprintf("%d", hcNodePort) - } - return - } - service.Spec.HealthCheckNodePort = hcNodePort -} diff --git a/pkg/api/service/util_test.go b/pkg/api/service/util_test.go index 6c87173ed27..c3eb0d1fb9b 100644 --- a/pkg/api/service/util_test.go +++ b/pkg/api/service/util_test.go @@ -17,16 +17,11 @@ limitations under the License. package service import ( + "strings" "testing" - "fmt" - "strings" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/kubernetes/pkg/api" netsets "k8s.io/kubernetes/pkg/util/net/sets" - - "github.com/davecgh/go-spew/spew" ) func TestGetLoadBalancerSourceRanges(t *testing.T) { @@ -218,200 +213,4 @@ func TestNeedsHealthCheck(t *testing.T) { ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeLocal, }, }) - - checkNeedsHealthCheck(false, &api.Service{ - Spec: api.ServiceSpec{ - Type: api.ServiceTypeLoadBalancer, - }, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - api.BetaAnnotationExternalTraffic: "invalid", - }, - }, - }) - checkNeedsHealthCheck(false, &api.Service{ - Spec: api.ServiceSpec{ - Type: api.ServiceTypeLoadBalancer, - }, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - api.BetaAnnotationExternalTraffic: api.AnnotationValueExternalTrafficGlobal, - }, - }, - }) - checkNeedsHealthCheck(true, &api.Service{ - Spec: api.ServiceSpec{ - Type: api.ServiceTypeLoadBalancer, - }, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - api.BetaAnnotationExternalTraffic: api.AnnotationValueExternalTrafficLocal, - }, - }, - }) -} - -func TestGetServiceHealthCheckNodePort(t *testing.T) { - checkGetServiceHealthCheckNodePort := func(healthCheckNodePort int32, service *api.Service) { - res := GetServiceHealthCheckNodePort(service) - if res != healthCheckNodePort { - t.Errorf("Expected health check node port = %v, got %v", - healthCheckNodePort, res) - } - } - - checkGetServiceHealthCheckNodePort(0, &api.Service{ - Spec: api.ServiceSpec{ - Type: api.ServiceTypeClusterIP, - }, - }) - checkGetServiceHealthCheckNodePort(0, &api.Service{ - Spec: api.ServiceSpec{ - Type: api.ServiceTypeNodePort, - ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeCluster, - }, - }) - checkGetServiceHealthCheckNodePort(0, &api.Service{ - Spec: api.ServiceSpec{ - Type: api.ServiceTypeLoadBalancer, - ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeCluster, - }, - }) - checkGetServiceHealthCheckNodePort(34567, &api.Service{ - Spec: api.ServiceSpec{ - Type: api.ServiceTypeLoadBalancer, - ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeLocal, - HealthCheckNodePort: int32(34567), - }, - }) - checkGetServiceHealthCheckNodePort(34567, &api.Service{ - Spec: api.ServiceSpec{ - Type: api.ServiceTypeLoadBalancer, - }, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - api.BetaAnnotationExternalTraffic: api.AnnotationValueExternalTrafficLocal, - api.BetaAnnotationHealthCheckNodePort: "34567", - }, - }, - }) -} - -func TestClearExternalTrafficPolicy(t *testing.T) { - testCases := []struct { - inputService *api.Service - }{ - // First class fields cases. - { - &api.Service{ - Spec: api.ServiceSpec{ - Type: api.ServiceTypeClusterIP, - ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeCluster, - }, - }, - }, - // Beta annotations cases. - { - &api.Service{ - Spec: api.ServiceSpec{ - Type: api.ServiceTypeClusterIP, - }, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - api.BetaAnnotationExternalTraffic: api.AnnotationValueExternalTrafficLocal, - }, - }, - }, - }, - } - - for i, tc := range testCases { - ClearExternalTrafficPolicy(tc.inputService) - if _, ok := tc.inputService.Annotations[api.BetaAnnotationExternalTraffic]; ok || - tc.inputService.Spec.ExternalTrafficPolicy != "" { - t.Errorf("%v: failed to clear ExternalTrafficPolicy", i) - spew.Dump(tc) - } - } -} - -func TestSetServiceHealthCheckNodePort(t *testing.T) { - testCases := []struct { - inputService *api.Service - hcNodePort int32 - beta bool - }{ - // First class fields cases. - { - &api.Service{ - Spec: api.ServiceSpec{ - Type: api.ServiceTypeClusterIP, - ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeCluster, - }, - }, - 30012, - false, - }, - { - &api.Service{ - Spec: api.ServiceSpec{ - Type: api.ServiceTypeClusterIP, - ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeCluster, - }, - }, - 0, - false, - }, - // Beta annotations cases. - { - &api.Service{ - Spec: api.ServiceSpec{ - Type: api.ServiceTypeClusterIP, - }, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - api.BetaAnnotationExternalTraffic: api.AnnotationValueExternalTrafficGlobal, - }, - }, - }, - 30012, - true, - }, - { - &api.Service{ - Spec: api.ServiceSpec{ - Type: api.ServiceTypeClusterIP, - }, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - api.BetaAnnotationExternalTraffic: api.AnnotationValueExternalTrafficGlobal, - }, - }, - }, - 0, - true, - }, - } - - for i, tc := range testCases { - SetServiceHealthCheckNodePort(tc.inputService, tc.hcNodePort) - if !tc.beta { - if tc.inputService.Spec.HealthCheckNodePort != tc.hcNodePort { - t.Errorf("%v: got HealthCheckNodePort %v, want %v", i, tc.inputService.Spec.HealthCheckNodePort, tc.hcNodePort) - } - } else { - l, ok := tc.inputService.Annotations[api.BetaAnnotationHealthCheckNodePort] - if tc.hcNodePort == 0 { - if ok { - t.Errorf("%v: HealthCheckNodePort set, want it to be cleared", i) - } - } else { - if !ok { - t.Errorf("%v: HealthCheckNodePort unset, want %v", i, tc.hcNodePort) - } else if l != fmt.Sprintf("%v", tc.hcNodePort) { - t.Errorf("%v: got HealthCheckNodePort %v, want %v", i, l, tc.hcNodePort) - } - } - } - } } diff --git a/pkg/api/testapi/BUILD b/pkg/api/testapi/BUILD index de3284b29f3..0bb93fc7418 100644 --- a/pkg/api/testapi/BUILD +++ b/pkg/api/testapi/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["testapi.go"], - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//federation/apis/federation/install:go_default_library", @@ -60,7 +57,6 @@ go_test( name = "go_default_test", srcs = ["testapi_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/pkg/api/testing/BUILD b/pkg/api/testing/BUILD index a0858217a65..636e289d2ac 100644 --- a/pkg/api/testing/BUILD +++ b/pkg/api/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,33 +12,28 @@ go_library( "fuzzer.go", "pod_specs.go", ], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm/fuzzer:go_default_library", "//pkg/api:go_default_library", - "//pkg/api/testapi:go_default_library", - "//pkg/apis/admissionregistration:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/batch:go_default_library", - "//pkg/apis/certificates:go_default_library", + "//pkg/api/fuzzer:go_default_library", + "//pkg/apis/admissionregistration/fuzzer:go_default_library", + "//pkg/apis/apps/fuzzer:go_default_library", + "//pkg/apis/autoscaling/fuzzer:go_default_library", + "//pkg/apis/batch/fuzzer:go_default_library", + "//pkg/apis/certificates/fuzzer:go_default_library", "//pkg/apis/extensions:go_default_library", + "//pkg/apis/extensions/fuzzer:go_default_library", "//pkg/apis/extensions/v1beta1:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/apis/rbac:go_default_library", + "//pkg/apis/policy/fuzzer:go_default_library", + "//pkg/apis/rbac/fuzzer:go_default_library", "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/testing:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/testing/fuzzer:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", ], ) diff --git a/pkg/api/testing/compat/BUILD b/pkg/api/testing/compat/BUILD index 73d70baf39f..ec922c60f6d 100644 --- a/pkg/api/testing/compat/BUILD +++ b/pkg/api/testing/compat/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["compatibility_tester.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/printers:go_default_library", diff --git a/pkg/api/testing/fuzzer.go b/pkg/api/testing/fuzzer.go index 8ec590deb98..cb1d85ecb8a 100644 --- a/pkg/api/testing/fuzzer.go +++ b/pkg/api/testing/fuzzer.go @@ -18,35 +18,28 @@ package testing import ( "fmt" - "reflect" - "strconv" "github.com/google/gofuzz" "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" apitesting "k8s.io/apimachinery/pkg/api/testing" "k8s.io/apimachinery/pkg/api/testing/fuzzer" genericfuzzer "k8s.io/apimachinery/pkg/apis/meta/fuzzer" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" - "k8s.io/apimachinery/pkg/util/intstr" kubeadmfuzzer "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/fuzzer" "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/apis/admissionregistration" - "k8s.io/kubernetes/pkg/apis/apps" - "k8s.io/kubernetes/pkg/apis/autoscaling" - "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/apis/certificates" + corefuzzer "k8s.io/kubernetes/pkg/api/fuzzer" + admissionregistrationfuzzer "k8s.io/kubernetes/pkg/apis/admissionregistration/fuzzer" + appsfuzzer "k8s.io/kubernetes/pkg/apis/apps/fuzzer" + autoscalingfuzzer "k8s.io/kubernetes/pkg/apis/autoscaling/fuzzer" + batchfuzzer "k8s.io/kubernetes/pkg/apis/batch/fuzzer" + certificatesfuzzer "k8s.io/kubernetes/pkg/apis/certificates/fuzzer" "k8s.io/kubernetes/pkg/apis/extensions" + extensionsfuzzer "k8s.io/kubernetes/pkg/apis/extensions/fuzzer" extensionsv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" - "k8s.io/kubernetes/pkg/apis/policy" - "k8s.io/kubernetes/pkg/apis/rbac" + policyfuzzer "k8s.io/kubernetes/pkg/apis/policy/fuzzer" + rbacfuzzer "k8s.io/kubernetes/pkg/apis/rbac/fuzzer" ) // overrideGenericFuncs override some generic fuzzer funcs from k8s.io/apiserver in order to have more realistic @@ -94,699 +87,17 @@ func overrideGenericFuncs(codecs runtimeserializer.CodecFactory) []interface{} { } } -func coreFuncs(codecs runtimeserializer.CodecFactory) []interface{} { - return []interface{}{ - func(q *resource.Quantity, c fuzz.Continue) { - *q = *resource.NewQuantity(c.Int63n(1000), resource.DecimalExponent) - }, - func(j *api.ObjectReference, c fuzz.Continue) { - // We have to customize the randomization of TypeMetas because their - // APIVersion and Kind must remain blank in memory. - j.APIVersion = c.RandString() - j.Kind = c.RandString() - j.Namespace = c.RandString() - j.Name = c.RandString() - j.ResourceVersion = strconv.FormatUint(c.RandUint64(), 10) - j.FieldPath = c.RandString() - }, - func(j *api.ListOptions, c fuzz.Continue) { - label, _ := labels.Parse("a=b") - j.LabelSelector = label - field, _ := fields.ParseSelector("a=b") - j.FieldSelector = field - }, - func(j *api.PodExecOptions, c fuzz.Continue) { - j.Stdout = true - j.Stderr = true - }, - func(j *api.PodAttachOptions, c fuzz.Continue) { - j.Stdout = true - j.Stderr = true - }, - func(j *api.PodPortForwardOptions, c fuzz.Continue) { - if c.RandBool() { - j.Ports = make([]int32, c.Intn(10)) - for i := range j.Ports { - j.Ports[i] = c.Int31n(65535) - } - } - }, - func(s *api.PodSpec, c fuzz.Continue) { - c.FuzzNoCustom(s) - // has a default value - ttl := int64(30) - if c.RandBool() { - ttl = int64(c.Uint32()) - } - s.TerminationGracePeriodSeconds = &ttl - - c.Fuzz(s.SecurityContext) - - if s.SecurityContext == nil { - s.SecurityContext = new(api.PodSecurityContext) - } - if s.Affinity == nil { - s.Affinity = new(api.Affinity) - } - if s.SchedulerName == "" { - s.SchedulerName = api.DefaultSchedulerName - } - }, - func(j *api.PodPhase, c fuzz.Continue) { - statuses := []api.PodPhase{api.PodPending, api.PodRunning, api.PodFailed, api.PodUnknown} - *j = statuses[c.Rand.Intn(len(statuses))] - }, - func(j *api.Binding, c fuzz.Continue) { - c.Fuzz(&j.ObjectMeta) - j.Target.Name = c.RandString() - }, - func(j *api.ReplicationControllerSpec, c fuzz.Continue) { - c.FuzzNoCustom(j) // fuzz self without calling this function again - //j.TemplateRef = nil // this is required for round trip - }, - func(j *api.List, c fuzz.Continue) { - c.FuzzNoCustom(j) // fuzz self without calling this function again - // TODO: uncomment when round trip starts from a versioned object - if false { //j.Items == nil { - j.Items = []runtime.Object{} - } - }, - func(q *api.ResourceRequirements, c fuzz.Continue) { - randomQuantity := func() resource.Quantity { - var q resource.Quantity - c.Fuzz(&q) - // precalc the string for benchmarking purposes - _ = q.String() - return q - } - q.Limits = make(api.ResourceList) - q.Requests = make(api.ResourceList) - cpuLimit := randomQuantity() - q.Limits[api.ResourceCPU] = *cpuLimit.Copy() - q.Requests[api.ResourceCPU] = *cpuLimit.Copy() - memoryLimit := randomQuantity() - q.Limits[api.ResourceMemory] = *memoryLimit.Copy() - q.Requests[api.ResourceMemory] = *memoryLimit.Copy() - storageLimit := randomQuantity() - q.Limits[api.ResourceStorage] = *storageLimit.Copy() - q.Requests[api.ResourceStorage] = *storageLimit.Copy() - }, - func(q *api.LimitRangeItem, c fuzz.Continue) { - var cpuLimit resource.Quantity - c.Fuzz(&cpuLimit) - - q.Type = api.LimitTypeContainer - q.Default = make(api.ResourceList) - q.Default[api.ResourceCPU] = *(cpuLimit.Copy()) - - q.DefaultRequest = make(api.ResourceList) - q.DefaultRequest[api.ResourceCPU] = *(cpuLimit.Copy()) - - q.Max = make(api.ResourceList) - q.Max[api.ResourceCPU] = *(cpuLimit.Copy()) - - q.Min = make(api.ResourceList) - q.Min[api.ResourceCPU] = *(cpuLimit.Copy()) - - q.MaxLimitRequestRatio = make(api.ResourceList) - q.MaxLimitRequestRatio[api.ResourceCPU] = resource.MustParse("10") - }, - func(p *api.PullPolicy, c fuzz.Continue) { - policies := []api.PullPolicy{api.PullAlways, api.PullNever, api.PullIfNotPresent} - *p = policies[c.Rand.Intn(len(policies))] - }, - func(rp *api.RestartPolicy, c fuzz.Continue) { - policies := []api.RestartPolicy{api.RestartPolicyAlways, api.RestartPolicyNever, api.RestartPolicyOnFailure} - *rp = policies[c.Rand.Intn(len(policies))] - }, - // api.DownwardAPIVolumeFile needs to have a specific func since FieldRef has to be - // defaulted to a version otherwise roundtrip will fail - func(m *api.DownwardAPIVolumeFile, c fuzz.Continue) { - m.Path = c.RandString() - versions := []string{"v1"} - m.FieldRef = &api.ObjectFieldSelector{} - m.FieldRef.APIVersion = versions[c.Rand.Intn(len(versions))] - m.FieldRef.FieldPath = c.RandString() - c.Fuzz(m.Mode) - if m.Mode != nil { - *m.Mode &= 0777 - } - }, - func(s *api.SecretVolumeSource, c fuzz.Continue) { - c.FuzzNoCustom(s) // fuzz self without calling this function again - - if c.RandBool() { - opt := c.RandBool() - s.Optional = &opt - } - // DefaultMode should always be set, it has a default - // value and it is expected to be between 0 and 0777 - var mode int32 - c.Fuzz(&mode) - mode &= 0777 - s.DefaultMode = &mode - }, - func(cm *api.ConfigMapVolumeSource, c fuzz.Continue) { - c.FuzzNoCustom(cm) // fuzz self without calling this function again - - if c.RandBool() { - opt := c.RandBool() - cm.Optional = &opt - } - // DefaultMode should always be set, it has a default - // value and it is expected to be between 0 and 0777 - var mode int32 - c.Fuzz(&mode) - mode &= 0777 - cm.DefaultMode = &mode - }, - func(d *api.DownwardAPIVolumeSource, c fuzz.Continue) { - c.FuzzNoCustom(d) // fuzz self without calling this function again - - // DefaultMode should always be set, it has a default - // value and it is expected to be between 0 and 0777 - var mode int32 - c.Fuzz(&mode) - mode &= 0777 - d.DefaultMode = &mode - }, - func(s *api.ProjectedVolumeSource, c fuzz.Continue) { - c.FuzzNoCustom(s) // fuzz self without calling this function again - - // DefaultMode should always be set, it has a default - // value and it is expected to be between 0 and 0777 - var mode int32 - c.Fuzz(&mode) - mode &= 0777 - s.DefaultMode = &mode - }, - func(k *api.KeyToPath, c fuzz.Continue) { - c.FuzzNoCustom(k) // fuzz self without calling this function again - k.Key = c.RandString() - k.Path = c.RandString() - - // Mode is not mandatory, but if it is set, it should be - // a value between 0 and 0777 - if k.Mode != nil { - *k.Mode &= 0777 - } - }, - func(vs *api.VolumeSource, c fuzz.Continue) { - // Exactly one of the fields must be set. - v := reflect.ValueOf(vs).Elem() - i := int(c.RandUint64() % uint64(v.NumField())) - t := v.Field(i).Addr() - for v.Field(i).IsNil() { - c.Fuzz(t.Interface()) - } - }, - func(i *api.ISCSIVolumeSource, c fuzz.Continue) { - i.ISCSIInterface = c.RandString() - if i.ISCSIInterface == "" { - i.ISCSIInterface = "default" - } - }, - func(d *api.DNSPolicy, c fuzz.Continue) { - policies := []api.DNSPolicy{api.DNSClusterFirst, api.DNSDefault} - *d = policies[c.Rand.Intn(len(policies))] - }, - func(p *api.Protocol, c fuzz.Continue) { - protocols := []api.Protocol{api.ProtocolTCP, api.ProtocolUDP} - *p = protocols[c.Rand.Intn(len(protocols))] - }, - func(p *api.ServiceAffinity, c fuzz.Continue) { - types := []api.ServiceAffinity{api.ServiceAffinityClientIP, api.ServiceAffinityNone} - *p = types[c.Rand.Intn(len(types))] - }, - func(p *api.ServiceType, c fuzz.Continue) { - types := []api.ServiceType{api.ServiceTypeClusterIP, api.ServiceTypeNodePort, api.ServiceTypeLoadBalancer} - *p = types[c.Rand.Intn(len(types))] - }, - func(p *api.ServiceExternalTrafficPolicyType, c fuzz.Continue) { - types := []api.ServiceExternalTrafficPolicyType{api.ServiceExternalTrafficPolicyTypeCluster, api.ServiceExternalTrafficPolicyTypeLocal} - *p = types[c.Rand.Intn(len(types))] - }, - func(ct *api.Container, c fuzz.Continue) { - c.FuzzNoCustom(ct) // fuzz self without calling this function again - ct.TerminationMessagePath = "/" + ct.TerminationMessagePath // Must be non-empty - ct.TerminationMessagePolicy = "File" - }, - func(p *api.Probe, c fuzz.Continue) { - c.FuzzNoCustom(p) - // These fields have default values. - intFieldsWithDefaults := [...]string{"TimeoutSeconds", "PeriodSeconds", "SuccessThreshold", "FailureThreshold"} - v := reflect.ValueOf(p).Elem() - for _, field := range intFieldsWithDefaults { - f := v.FieldByName(field) - if f.Int() == 0 { - f.SetInt(1) - } - } - }, - func(ev *api.EnvVar, c fuzz.Continue) { - ev.Name = c.RandString() - if c.RandBool() { - ev.Value = c.RandString() - } else { - ev.ValueFrom = &api.EnvVarSource{} - ev.ValueFrom.FieldRef = &api.ObjectFieldSelector{} - - var versions []schema.GroupVersion - for _, testGroup := range testapi.Groups { - versions = append(versions, *testGroup.GroupVersion()) - } - - ev.ValueFrom.FieldRef.APIVersion = versions[c.Rand.Intn(len(versions))].String() - ev.ValueFrom.FieldRef.FieldPath = c.RandString() - } - }, - func(ev *api.EnvFromSource, c fuzz.Continue) { - if c.RandBool() { - ev.Prefix = "p_" - } - if c.RandBool() { - c.Fuzz(&ev.ConfigMapRef) - } else { - c.Fuzz(&ev.SecretRef) - } - }, - func(cm *api.ConfigMapEnvSource, c fuzz.Continue) { - c.FuzzNoCustom(cm) // fuzz self without calling this function again - if c.RandBool() { - opt := c.RandBool() - cm.Optional = &opt - } - }, - func(s *api.SecretEnvSource, c fuzz.Continue) { - c.FuzzNoCustom(s) // fuzz self without calling this function again - }, - func(sc *api.SecurityContext, c fuzz.Continue) { - c.FuzzNoCustom(sc) // fuzz self without calling this function again - if c.RandBool() { - priv := c.RandBool() - sc.Privileged = &priv - } - - if c.RandBool() { - sc.Capabilities = &api.Capabilities{ - Add: make([]api.Capability, 0), - Drop: make([]api.Capability, 0), - } - c.Fuzz(&sc.Capabilities.Add) - c.Fuzz(&sc.Capabilities.Drop) - } - }, - func(s *api.Secret, c fuzz.Continue) { - c.FuzzNoCustom(s) // fuzz self without calling this function again - s.Type = api.SecretTypeOpaque - }, - func(r *api.RBDVolumeSource, c fuzz.Continue) { - r.RBDPool = c.RandString() - if r.RBDPool == "" { - r.RBDPool = "rbd" - } - r.RadosUser = c.RandString() - if r.RadosUser == "" { - r.RadosUser = "admin" - } - r.Keyring = c.RandString() - if r.Keyring == "" { - r.Keyring = "/etc/ceph/keyring" - } - }, - func(pv *api.PersistentVolume, c fuzz.Continue) { - c.FuzzNoCustom(pv) // fuzz self without calling this function again - types := []api.PersistentVolumePhase{api.VolumeAvailable, api.VolumePending, api.VolumeBound, api.VolumeReleased, api.VolumeFailed} - pv.Status.Phase = types[c.Rand.Intn(len(types))] - pv.Status.Message = c.RandString() - reclamationPolicies := []api.PersistentVolumeReclaimPolicy{api.PersistentVolumeReclaimRecycle, api.PersistentVolumeReclaimRetain} - pv.Spec.PersistentVolumeReclaimPolicy = reclamationPolicies[c.Rand.Intn(len(reclamationPolicies))] - }, - func(pvc *api.PersistentVolumeClaim, c fuzz.Continue) { - c.FuzzNoCustom(pvc) // fuzz self without calling this function again - types := []api.PersistentVolumeClaimPhase{api.ClaimBound, api.ClaimPending, api.ClaimLost} - pvc.Status.Phase = types[c.Rand.Intn(len(types))] - }, - func(obj *api.AzureDiskVolumeSource, c fuzz.Continue) { - if obj.CachingMode == nil { - obj.CachingMode = new(api.AzureDataDiskCachingMode) - *obj.CachingMode = api.AzureDataDiskCachingReadWrite - } - if obj.Kind == nil { - obj.Kind = new(api.AzureDataDiskKind) - *obj.Kind = api.AzureSharedBlobDisk - } - if obj.FSType == nil { - obj.FSType = new(string) - *obj.FSType = "ext4" - } - if obj.ReadOnly == nil { - obj.ReadOnly = new(bool) - *obj.ReadOnly = false - } - }, - func(sio *api.ScaleIOVolumeSource, c fuzz.Continue) { - sio.ProtectionDomain = c.RandString() - if sio.ProtectionDomain == "" { - sio.ProtectionDomain = "default" - } - sio.StoragePool = c.RandString() - if sio.StoragePool == "" { - sio.StoragePool = "default" - } - sio.StorageMode = c.RandString() - if sio.StorageMode == "" { - sio.StorageMode = "ThinProvisioned" - } - sio.FSType = c.RandString() - if sio.FSType == "" { - sio.FSType = "xfs" - } - }, - func(s *api.NamespaceSpec, c fuzz.Continue) { - s.Finalizers = []api.FinalizerName{api.FinalizerKubernetes} - }, - func(s *api.NamespaceStatus, c fuzz.Continue) { - s.Phase = api.NamespaceActive - }, - func(http *api.HTTPGetAction, c fuzz.Continue) { - c.FuzzNoCustom(http) // fuzz self without calling this function again - http.Path = "/" + http.Path // can't be blank - http.Scheme = "x" + http.Scheme // can't be blank - }, - func(ss *api.ServiceSpec, c fuzz.Continue) { - c.FuzzNoCustom(ss) // fuzz self without calling this function again - if len(ss.Ports) == 0 { - // There must be at least 1 port. - ss.Ports = append(ss.Ports, api.ServicePort{}) - c.Fuzz(&ss.Ports[0]) - } - for i := range ss.Ports { - switch ss.Ports[i].TargetPort.Type { - case intstr.Int: - ss.Ports[i].TargetPort.IntVal = 1 + ss.Ports[i].TargetPort.IntVal%65535 // non-zero - case intstr.String: - ss.Ports[i].TargetPort.StrVal = "x" + ss.Ports[i].TargetPort.StrVal // non-empty - } - } - }, - func(n *api.Node, c fuzz.Continue) { - c.FuzzNoCustom(n) - n.Spec.ExternalID = "external" - }, - func(s *api.NodeStatus, c fuzz.Continue) { - c.FuzzNoCustom(s) - s.Allocatable = s.Capacity - }, - } -} - -func extensionFuncs(codecs runtimeserializer.CodecFactory) []interface{} { - return []interface{}{ - func(j *extensions.DeploymentSpec, c fuzz.Continue) { - c.FuzzNoCustom(j) // fuzz self without calling this function again - rhl := int32(c.Rand.Int31()) - pds := int32(c.Rand.Int31()) - j.RevisionHistoryLimit = &rhl - j.ProgressDeadlineSeconds = &pds - }, - func(j *extensions.DeploymentStrategy, c fuzz.Continue) { - c.FuzzNoCustom(j) // fuzz self without calling this function again - // Ensure that strategyType is one of valid values. - strategyTypes := []extensions.DeploymentStrategyType{extensions.RecreateDeploymentStrategyType, extensions.RollingUpdateDeploymentStrategyType} - j.Type = strategyTypes[c.Rand.Intn(len(strategyTypes))] - if j.Type != extensions.RollingUpdateDeploymentStrategyType { - j.RollingUpdate = nil - } else { - rollingUpdate := extensions.RollingUpdateDeployment{} - if c.RandBool() { - rollingUpdate.MaxUnavailable = intstr.FromInt(int(c.Rand.Int31())) - rollingUpdate.MaxSurge = intstr.FromInt(int(c.Rand.Int31())) - } else { - rollingUpdate.MaxSurge = intstr.FromString(fmt.Sprintf("%d%%", c.Rand.Int31())) - } - j.RollingUpdate = &rollingUpdate - } - }, - func(psp *extensions.PodSecurityPolicySpec, c fuzz.Continue) { - c.FuzzNoCustom(psp) // fuzz self without calling this function again - runAsUserRules := []extensions.RunAsUserStrategy{extensions.RunAsUserStrategyMustRunAsNonRoot, extensions.RunAsUserStrategyMustRunAs, extensions.RunAsUserStrategyRunAsAny} - psp.RunAsUser.Rule = runAsUserRules[c.Rand.Intn(len(runAsUserRules))] - seLinuxRules := []extensions.SELinuxStrategy{extensions.SELinuxStrategyRunAsAny, extensions.SELinuxStrategyMustRunAs} - psp.SELinux.Rule = seLinuxRules[c.Rand.Intn(len(seLinuxRules))] - }, - func(s *extensions.Scale, c fuzz.Continue) { - c.FuzzNoCustom(s) // fuzz self without calling this function again - // TODO: Implement a fuzzer to generate valid keys, values and operators for - // selector requirements. - if s.Status.Selector != nil { - s.Status.Selector = &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "testlabelkey": "testlabelval", - }, - MatchExpressions: []metav1.LabelSelectorRequirement{ - { - Key: "testkey", - Operator: metav1.LabelSelectorOpIn, - Values: []string{"val1", "val2", "val3"}, - }, - }, - } - } - }, - func(j *extensions.DaemonSetSpec, c fuzz.Continue) { - c.FuzzNoCustom(j) // fuzz self without calling this function again - rhl := int32(c.Rand.Int31()) - j.RevisionHistoryLimit = &rhl - }, - func(j *extensions.DaemonSetUpdateStrategy, c fuzz.Continue) { - c.FuzzNoCustom(j) // fuzz self without calling this function again - // Ensure that strategyType is one of valid values. - strategyTypes := []extensions.DaemonSetUpdateStrategyType{extensions.RollingUpdateDaemonSetStrategyType, extensions.OnDeleteDaemonSetStrategyType} - j.Type = strategyTypes[c.Rand.Intn(len(strategyTypes))] - if j.Type != extensions.RollingUpdateDaemonSetStrategyType { - j.RollingUpdate = nil - } else { - rollingUpdate := extensions.RollingUpdateDaemonSet{} - if c.RandBool() { - if c.RandBool() { - rollingUpdate.MaxUnavailable = intstr.FromInt(1 + int(c.Rand.Int31())) - } else { - rollingUpdate.MaxUnavailable = intstr.FromString(fmt.Sprintf("%d%%", 1+c.Rand.Int31())) - } - } - j.RollingUpdate = &rollingUpdate - } - }, - } -} - -func batchFuncs(codecs runtimeserializer.CodecFactory) []interface{} { - return []interface{}{ - func(j *batch.JobSpec, c fuzz.Continue) { - c.FuzzNoCustom(j) // fuzz self without calling this function again - completions := int32(c.Rand.Int31()) - parallelism := int32(c.Rand.Int31()) - j.Completions = &completions - j.Parallelism = ¶llelism - if c.Rand.Int31()%2 == 0 { - j.ManualSelector = newBool(true) - } else { - j.ManualSelector = nil - } - }, - func(sj *batch.CronJobSpec, c fuzz.Continue) { - c.FuzzNoCustom(sj) - suspend := c.RandBool() - sj.Suspend = &suspend - sds := int64(c.RandUint64()) - sj.StartingDeadlineSeconds = &sds - sj.Schedule = c.RandString() - if hasSuccessLimit := c.RandBool(); hasSuccessLimit { - successfulJobsHistoryLimit := int32(c.Rand.Int31()) - sj.SuccessfulJobsHistoryLimit = &successfulJobsHistoryLimit - } - if hasFailedLimit := c.RandBool(); hasFailedLimit { - failedJobsHistoryLimit := int32(c.Rand.Int31()) - sj.FailedJobsHistoryLimit = &failedJobsHistoryLimit - } - }, - func(cp *batch.ConcurrencyPolicy, c fuzz.Continue) { - policies := []batch.ConcurrencyPolicy{batch.AllowConcurrent, batch.ForbidConcurrent, batch.ReplaceConcurrent} - *cp = policies[c.Rand.Intn(len(policies))] - }, - } -} - -func autoscalingFuncs(codecs runtimeserializer.CodecFactory) []interface{} { - return []interface{}{ - func(s *autoscaling.HorizontalPodAutoscalerSpec, c fuzz.Continue) { - c.FuzzNoCustom(s) // fuzz self without calling this function again - minReplicas := int32(c.Rand.Int31()) - s.MinReplicas = &minReplicas - - randomQuantity := func() resource.Quantity { - var q resource.Quantity - c.Fuzz(&q) - // precalc the string for benchmarking purposes - _ = q.String() - return q - } - - targetUtilization := int32(c.RandUint64()) - s.Metrics = []autoscaling.MetricSpec{ - { - Type: autoscaling.PodsMetricSourceType, - Pods: &autoscaling.PodsMetricSource{ - MetricName: c.RandString(), - TargetAverageValue: randomQuantity(), - }, - }, - { - Type: autoscaling.ResourceMetricSourceType, - Resource: &autoscaling.ResourceMetricSource{ - Name: api.ResourceCPU, - TargetAverageUtilization: &targetUtilization, - }, - }, - } - }, - func(s *autoscaling.HorizontalPodAutoscalerStatus, c fuzz.Continue) { - c.FuzzNoCustom(s) // fuzz self without calling this function again - randomQuantity := func() resource.Quantity { - var q resource.Quantity - c.Fuzz(&q) - // precalc the string for benchmarking purposes - _ = q.String() - return q - } - currentUtilization := int32(c.RandUint64()) - s.CurrentMetrics = []autoscaling.MetricStatus{ - { - Type: autoscaling.PodsMetricSourceType, - Pods: &autoscaling.PodsMetricStatus{ - MetricName: c.RandString(), - CurrentAverageValue: randomQuantity(), - }, - }, - { - Type: autoscaling.ResourceMetricSourceType, - Resource: &autoscaling.ResourceMetricStatus{ - Name: api.ResourceCPU, - CurrentAverageUtilization: ¤tUtilization, - }, - }, - } - }, - } -} - -func rbacFuncs(codecs runtimeserializer.CodecFactory) []interface{} { - return []interface{}{ - func(r *rbac.RoleRef, c fuzz.Continue) { - c.FuzzNoCustom(r) // fuzz self without calling this function again - - // match defaulter - if len(r.APIGroup) == 0 { - r.APIGroup = rbac.GroupName - } - }, - func(r *rbac.Subject, c fuzz.Continue) { - switch c.Int31n(3) { - case 0: - r.Kind = rbac.ServiceAccountKind - r.APIGroup = "" - c.FuzzNoCustom(&r.Name) - c.FuzzNoCustom(&r.Namespace) - case 1: - r.Kind = rbac.UserKind - r.APIGroup = rbac.GroupName - c.FuzzNoCustom(&r.Name) - // user "*" won't round trip because we convert it to the system:authenticated group. try again. - for r.Name == "*" { - c.FuzzNoCustom(&r.Name) - } - case 2: - r.Kind = rbac.GroupKind - r.APIGroup = rbac.GroupName - c.FuzzNoCustom(&r.Name) - } - }, - } -} - -func appsFuncs(codecs runtimeserializer.CodecFactory) []interface{} { - return []interface{}{ - func(s *apps.StatefulSet, c fuzz.Continue) { - c.FuzzNoCustom(s) // fuzz self without calling this function again - - // match defaulter - if len(s.Spec.PodManagementPolicy) == 0 { - s.Spec.PodManagementPolicy = apps.OrderedReadyPodManagement - } - if len(s.Spec.UpdateStrategy.Type) == 0 { - s.Spec.UpdateStrategy.Type = apps.RollingUpdateStatefulSetStrategyType - } - if s.Spec.RevisionHistoryLimit == nil { - s.Spec.RevisionHistoryLimit = new(int32) - *s.Spec.RevisionHistoryLimit = 10 - } - if s.Status.ObservedGeneration == nil { - s.Status.ObservedGeneration = new(int64) - } - }, - } -} -func policyFuncs(codecs runtimeserializer.CodecFactory) []interface{} { - return []interface{}{ - func(s *policy.PodDisruptionBudgetStatus, c fuzz.Continue) { - c.FuzzNoCustom(s) // fuzz self without calling this function again - s.PodDisruptionsAllowed = int32(c.Rand.Intn(2)) - }, - } -} - -func certificateFuncs(codecs runtimeserializer.CodecFactory) []interface{} { - return []interface{}{ - func(obj *certificates.CertificateSigningRequestSpec, c fuzz.Continue) { - c.FuzzNoCustom(obj) // fuzz self without calling this function again - obj.Usages = []certificates.KeyUsage{certificates.UsageKeyEncipherment} - }, - } -} - -func admissionregistrationFuncs(codecs runtimeserializer.CodecFactory) []interface{} { - return []interface{}{ - func(obj *admissionregistration.ExternalAdmissionHook, c fuzz.Continue) { - c.FuzzNoCustom(obj) // fuzz self without calling this function again - p := admissionregistration.FailurePolicyType("Fail") - obj.FailurePolicy = &p - }, - func(obj *admissionregistration.Initializer, c fuzz.Continue) { - c.FuzzNoCustom(obj) // fuzz self without calling this function again - p := admissionregistration.FailurePolicyType("Fail") - obj.FailurePolicy = &p - }, - } -} - var FuzzerFuncs = fuzzer.MergeFuzzerFuncs( genericfuzzer.Funcs, overrideGenericFuncs, - coreFuncs, - extensionFuncs, - appsFuncs, - batchFuncs, - autoscalingFuncs, - rbacFuncs, + corefuzzer.Funcs, + extensionsfuzzer.Funcs, + appsfuzzer.Funcs, + batchfuzzer.Funcs, + autoscalingfuzzer.Funcs, + rbacfuzzer.Funcs, kubeadmfuzzer.Funcs, - policyFuncs, - certificateFuncs, - admissionregistrationFuncs, + policyfuzzer.Funcs, + certificatesfuzzer.Funcs, + admissionregistrationfuzzer.Funcs, ) - -func newBool(val bool) *bool { - p := new(bool) - *p = val - return p -} diff --git a/pkg/api/types.go b/pkg/api/types.go index ab9b7056d4f..c00a816d44e 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -715,9 +715,11 @@ type ISCSIVolumeSource struct { // Fibre Channel volumes can only be mounted as read/write once. // Fibre Channel volumes support ownership management and SELinux relabeling. type FCVolumeSource struct { - // Required: FC target worldwide names (WWNs) + // Optional: FC target worldwide names (WWNs) + // +optional TargetWWNs []string - // Required: FC target lun number + // Optional: FC target lun number + // +optional Lun *int32 // Filesystem type to mount. // Must be a filesystem type supported by the host operating system. @@ -729,6 +731,10 @@ type FCVolumeSource struct { // the ReadOnly setting in VolumeMounts. // +optional ReadOnly bool + // Optional: FC volume World Wide Identifiers (WWIDs) + // Either WWIDs or TargetWWNs and Lun must be set, but not both simultaneously. + // +optional + WWIDs []string } // FlexVolume represents a generic volume resource that is @@ -1440,7 +1446,7 @@ type SecretKeySelector struct { // EnvFromSource represents the source of a set of ConfigMaps type EnvFromSource struct { - // An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. + // An optional identifier to prepend to each key in the ConfigMap. // +optional Prefix string // The ConfigMap to select from. @@ -1944,6 +1950,7 @@ type PodAffinity struct { // podAffinityTerm are intersected, i.e. all terms must be satisfied. // +optional // RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm + // If the affinity requirements specified by this field are not met at // scheduling time, the pod will not be scheduled onto the node. // If the affinity requirements specified by this field cease to be met @@ -1978,6 +1985,7 @@ type PodAntiAffinity struct { // podAffinityTerm are intersected, i.e. all terms must be satisfied. // +optional // RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm + // If the anti-affinity requirements specified by this field are not met at // scheduling time, the pod will not be scheduled onto the node. // If the anti-affinity requirements specified by this field cease to be met @@ -2722,6 +2730,18 @@ type ServiceSpec struct { // and ExternalTrafficPolicy is set to Local. // +optional HealthCheckNodePort int32 + + // publishNotReadyAddresses, when set to true, indicates that DNS implementations + // must publish the notReadyAddresses of subsets for the Endpoints associated with + // the Service. The default value is false. + // The primary use case for setting this field is to use a StatefulSet's Headless Service + // to propagate SRV records for its Pods without respect to their readiness for purpose + // of peer discovery. + // This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints + // when that annotation is deprecated and all clients have been converted to use this + // field. + // +optional + PublishNotReadyAddresses bool } type ServicePort struct { @@ -2913,6 +2933,19 @@ type NodeSpec struct { // If specified, the node's taints. // +optional Taints []Taint + + // If specified, the source to get node configuration from + // The DynamicKubeletConfig feature gate must be enabled for the Kubelet to use this field + // +optional + ConfigSource *NodeConfigSource +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// NodeConfigSource specifies a source of node configuration. Exactly one subfield must be non-nil. +type NodeConfigSource struct { + metav1.TypeMeta + ConfigMapRef *ObjectReference } // DaemonEndpoint contains information about a single Daemon endpoint. diff --git a/pkg/api/unversioned/BUILD b/pkg/api/unversioned/BUILD index 737a040dd8e..0d30056719e 100644 --- a/pkg/api/unversioned/BUILD +++ b/pkg/api/unversioned/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "time.go", "types.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/go-openapi/spec:go_default_library", "//vendor/github.com/google/gofuzz:go_default_library", diff --git a/pkg/api/util/BUILD b/pkg/api/util/BUILD index cf607087fb2..ae59f2f0ea9 100644 --- a/pkg/api/util/BUILD +++ b/pkg/api/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,14 +9,12 @@ load( go_library( name = "go_default_library", srcs = ["group_version.go"], - tags = ["automanaged"], ) go_test( name = "go_default_test", srcs = ["group_version_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/pkg/api/v1/BUILD b/pkg/api/v1/BUILD index 7f46d85e2d1..c79f190ccbd 100644 --- a/pkg/api/v1/BUILD +++ b/pkg/api/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", @@ -44,12 +41,11 @@ go_test( "conversion_test.go", "defaults_test.go", ], - tags = ["automanaged"], deps = [ + ":go_default_library", "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", "//pkg/api/testing/compat:go_default_library", - "//pkg/api/v1: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", diff --git a/pkg/api/v1/defaults.go b/pkg/api/v1/defaults.go index e4a1600dbf4..70c1d709efb 100644 --- a/pkg/api/v1/defaults.go +++ b/pkg/api/v1/defaults.go @@ -115,10 +115,7 @@ func SetDefaults_Service(obj *v1.Service) { } // Defaults ExternalTrafficPolicy field for NodePort / LoadBalancer service // to Global for consistency. - if _, ok := obj.Annotations[v1.BetaAnnotationExternalTraffic]; ok { - // Don't default this field if beta annotation exists. - return - } else if (obj.Spec.Type == v1.ServiceTypeNodePort || + if (obj.Spec.Type == v1.ServiceTypeNodePort || obj.Spec.Type == v1.ServiceTypeLoadBalancer) && obj.Spec.ExternalTrafficPolicy == "" { obj.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeCluster diff --git a/pkg/api/v1/defaults_test.go b/pkg/api/v1/defaults_test.go index 3b8eba645c2..0e39bd55d9f 100644 --- a/pkg/api/v1/defaults_test.go +++ b/pkg/api/v1/defaults_test.go @@ -896,18 +896,6 @@ func TestSetDefaulServiceExternalTraffic(t *testing.T) { if out.Spec.ExternalTrafficPolicy != v1.ServiceExternalTrafficPolicyTypeCluster { t.Errorf("Expected ExternalTrafficPolicy to be %v, got %v", v1.ServiceExternalTrafficPolicyTypeCluster, out.Spec.ExternalTrafficPolicy) } - - in = &v1.Service{ - Spec: v1.ServiceSpec{Type: v1.ServiceTypeLoadBalancer}, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{v1.BetaAnnotationExternalTraffic: v1.AnnotationValueExternalTrafficLocal}, - }, - } - obj = roundTrip(t, runtime.Object(in)) - out = obj.(*v1.Service) - if out.Spec.ExternalTrafficPolicy != "" { - t.Errorf("Expected ExternalTrafficPolicy to be empty, got %v", out.Spec.ExternalTrafficPolicy) - } } func TestSetDefaultNamespace(t *testing.T) { diff --git a/pkg/api/v1/endpoints/BUILD b/pkg/api/v1/endpoints/BUILD index f31c4cd90a8..10752b7b505 100644 --- a/pkg/api/v1/endpoints/BUILD +++ b/pkg/api/v1/endpoints/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = [ "//pkg/util/hash:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -23,7 +20,6 @@ go_test( name = "go_default_test", srcs = ["util_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/davecgh/go-spew/spew:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/api/v1/helper/BUILD b/pkg/api/v1/helper/BUILD index a2010a51493..a52a1be940e 100644 --- a/pkg/api/v1/helper/BUILD +++ b/pkg/api/v1/helper/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["helpers_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", @@ -24,7 +21,6 @@ go_test( go_library( name = "go_default_library", srcs = ["helpers.go"], - tags = ["automanaged"], deps = [ "//pkg/api/helper:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/api/v1/helper/qos/BUILD b/pkg/api/v1/helper/qos/BUILD index 4951f7986cb..e41f01c36b9 100644 --- a/pkg/api/v1/helper/qos/BUILD +++ b/pkg/api/v1/helper/qos/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["qos_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper/qos:go_default_library", @@ -26,7 +23,6 @@ go_test( go_library( name = "go_default_library", srcs = ["qos.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", diff --git a/pkg/api/v1/node/BUILD b/pkg/api/v1/node/BUILD index a7d82cca2f3..1c010126398 100644 --- a/pkg/api/v1/node/BUILD +++ b/pkg/api/v1/node/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/api/core/v1:go_default_library"], ) diff --git a/pkg/api/v1/pod/BUILD b/pkg/api/v1/pod/BUILD index 961577f8a11..b619ba1b058 100644 --- a/pkg/api/v1/pod/BUILD +++ b/pkg/api/v1/pod/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -23,7 +20,6 @@ go_test( name = "go_default_test", srcs = ["util_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/api/v1/resource/BUILD b/pkg/api/v1/resource/BUILD index 24da2e7c3db..dd60163916d 100644 --- a/pkg/api/v1/resource/BUILD +++ b/pkg/api/v1/resource/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["helpers_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -23,7 +20,6 @@ go_test( go_library( name = "go_default_library", srcs = ["helpers.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", diff --git a/pkg/api/v1/service/BUILD b/pkg/api/v1/service/BUILD index 51ffdcac445..190e84512e6 100644 --- a/pkg/api/v1/service/BUILD +++ b/pkg/api/v1/service/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,10 +9,8 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = [ "//pkg/util/net/sets:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", ], ) @@ -23,12 +19,9 @@ go_test( name = "go_default_test", srcs = ["util_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/net/sets:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ], ) diff --git a/pkg/api/v1/service/util.go b/pkg/api/v1/service/util.go index 03d18492b35..4cb453cf3eb 100644 --- a/pkg/api/v1/service/util.go +++ b/pkg/api/v1/service/util.go @@ -18,13 +18,10 @@ package service import ( "fmt" - "strconv" "strings" "k8s.io/api/core/v1" netsets "k8s.io/kubernetes/pkg/util/net/sets" - - "github.com/golang/glog" ) const ( @@ -76,25 +73,10 @@ func RequestsOnlyLocalTraffic(service *v1.Service) bool { service.Spec.Type != v1.ServiceTypeNodePort { return false } - - // First check the beta annotation and then the first class field. This is so that - // existing Services continue to work till the user decides to transition to the - // first class field. - if l, ok := service.Annotations[v1.BetaAnnotationExternalTraffic]; ok { - switch l { - case v1.AnnotationValueExternalTrafficLocal: - return true - case v1.AnnotationValueExternalTrafficGlobal: - return false - default: - glog.Errorf("Invalid value for annotation %v: %v", v1.BetaAnnotationExternalTraffic, l) - return false - } - } return service.Spec.ExternalTrafficPolicy == v1.ServiceExternalTrafficPolicyTypeLocal } -// NeedsHealthCheck Check if service needs health check. +// NeedsHealthCheck checks if service needs health check. func NeedsHealthCheck(service *v1.Service) bool { if service.Spec.Type != v1.ServiceTypeLoadBalancer { return false @@ -102,56 +84,12 @@ func NeedsHealthCheck(service *v1.Service) bool { return RequestsOnlyLocalTraffic(service) } -// GetServiceHealthCheckNodePort Return health check node port for service, if one exists -func GetServiceHealthCheckNodePort(service *v1.Service) int32 { - // First check the beta annotation and then the first class field. This is so that - // existing Services continue to work till the user decides to transition to the - // first class field. - if l, ok := service.Annotations[v1.BetaAnnotationHealthCheckNodePort]; ok { - p, err := strconv.Atoi(l) - if err != nil { - glog.Errorf("Failed to parse annotation %v: %v", v1.BetaAnnotationHealthCheckNodePort, err) - return 0 - } - return int32(p) - } - return service.Spec.HealthCheckNodePort -} - -// ClearExternalTrafficPolicy resets the ExternalTrafficPolicy field. -func ClearExternalTrafficPolicy(service *v1.Service) { - // First check the beta annotation and then the first class field. This is so existing - // Services continue to work till the user decides to transition to the first class field. - if _, ok := service.Annotations[v1.BetaAnnotationExternalTraffic]; ok { - delete(service.Annotations, v1.BetaAnnotationExternalTraffic) - return - } - service.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyType("") -} - -// SetServiceHealthCheckNodePort sets the given health check node port on service. -// It does not check whether this service needs healthCheckNodePort. -func SetServiceHealthCheckNodePort(service *v1.Service, hcNodePort int32) { - // First check the beta annotation and then the first class field. This is so that - // existing Services continue to work till the user decides to transition to the - // first class field. - if _, ok := service.Annotations[v1.BetaAnnotationExternalTraffic]; ok { - if hcNodePort == 0 { - delete(service.Annotations, v1.BetaAnnotationHealthCheckNodePort) - } else { - service.Annotations[v1.BetaAnnotationHealthCheckNodePort] = fmt.Sprintf("%d", hcNodePort) - } - return - } - service.Spec.HealthCheckNodePort = hcNodePort -} - -// GetServiceHealthCheckPathPort Return the path and nodePort programmed into the Cloud LB Health Check +// GetServiceHealthCheckPathPort returns the path and nodePort programmed into the Cloud LB Health Check func GetServiceHealthCheckPathPort(service *v1.Service) (string, int32) { if !NeedsHealthCheck(service) { return "", 0 } - port := GetServiceHealthCheckNodePort(service) + port := service.Spec.HealthCheckNodePort if port == 0 { return "", 0 } diff --git a/pkg/api/v1/service/util_test.go b/pkg/api/v1/service/util_test.go index e4ad9daeca7..df9504cbe6c 100644 --- a/pkg/api/v1/service/util_test.go +++ b/pkg/api/v1/service/util_test.go @@ -17,16 +17,11 @@ limitations under the License. package service import ( + "strings" "testing" - "fmt" - "strings" - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" netsets "k8s.io/kubernetes/pkg/util/net/sets" - - "github.com/davecgh/go-spew/spew" ) func TestGetLoadBalancerSourceRanges(t *testing.T) { @@ -218,200 +213,4 @@ func TestNeedsHealthCheck(t *testing.T) { ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeLocal, }, }) - - checkNeedsHealthCheck(false, &v1.Service{ - Spec: v1.ServiceSpec{ - Type: v1.ServiceTypeLoadBalancer, - }, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - v1.BetaAnnotationExternalTraffic: "invalid", - }, - }, - }) - checkNeedsHealthCheck(false, &v1.Service{ - Spec: v1.ServiceSpec{ - Type: v1.ServiceTypeLoadBalancer, - }, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - v1.BetaAnnotationExternalTraffic: v1.AnnotationValueExternalTrafficGlobal, - }, - }, - }) - checkNeedsHealthCheck(true, &v1.Service{ - Spec: v1.ServiceSpec{ - Type: v1.ServiceTypeLoadBalancer, - }, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - v1.BetaAnnotationExternalTraffic: v1.AnnotationValueExternalTrafficLocal, - }, - }, - }) -} - -func TestGetServiceHealthCheckNodePort(t *testing.T) { - checkGetServiceHealthCheckNodePort := func(healthCheckNodePort int32, service *v1.Service) { - res := GetServiceHealthCheckNodePort(service) - if res != healthCheckNodePort { - t.Errorf("Expected health check node port = %v, got %v", - healthCheckNodePort, res) - } - } - - checkGetServiceHealthCheckNodePort(0, &v1.Service{ - Spec: v1.ServiceSpec{ - Type: v1.ServiceTypeClusterIP, - }, - }) - checkGetServiceHealthCheckNodePort(0, &v1.Service{ - Spec: v1.ServiceSpec{ - Type: v1.ServiceTypeNodePort, - ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeCluster, - }, - }) - checkGetServiceHealthCheckNodePort(0, &v1.Service{ - Spec: v1.ServiceSpec{ - Type: v1.ServiceTypeLoadBalancer, - ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeCluster, - }, - }) - checkGetServiceHealthCheckNodePort(34567, &v1.Service{ - Spec: v1.ServiceSpec{ - Type: v1.ServiceTypeLoadBalancer, - ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeLocal, - HealthCheckNodePort: int32(34567), - }, - }) - checkGetServiceHealthCheckNodePort(34567, &v1.Service{ - Spec: v1.ServiceSpec{ - Type: v1.ServiceTypeLoadBalancer, - }, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - v1.BetaAnnotationExternalTraffic: v1.AnnotationValueExternalTrafficLocal, - v1.BetaAnnotationHealthCheckNodePort: "34567", - }, - }, - }) -} - -func TestClearExternalTrafficPolicy(t *testing.T) { - testCases := []struct { - inputService *v1.Service - }{ - // First class fields cases. - { - &v1.Service{ - Spec: v1.ServiceSpec{ - Type: v1.ServiceTypeClusterIP, - ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeCluster, - }, - }, - }, - // Beta annotations cases. - { - &v1.Service{ - Spec: v1.ServiceSpec{ - Type: v1.ServiceTypeClusterIP, - }, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - v1.BetaAnnotationExternalTraffic: v1.AnnotationValueExternalTrafficLocal, - }, - }, - }, - }, - } - - for i, tc := range testCases { - ClearExternalTrafficPolicy(tc.inputService) - if _, ok := tc.inputService.Annotations[v1.BetaAnnotationExternalTraffic]; ok || - tc.inputService.Spec.ExternalTrafficPolicy != "" { - t.Errorf("%v: failed to clear ExternalTrafficPolicy", i) - spew.Dump(tc) - } - } -} - -func TestSetServiceHealthCheckNodePort(t *testing.T) { - testCases := []struct { - inputService *v1.Service - hcNodePort int32 - beta bool - }{ - // First class fields cases. - { - &v1.Service{ - Spec: v1.ServiceSpec{ - Type: v1.ServiceTypeClusterIP, - ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeCluster, - }, - }, - 30012, - false, - }, - { - &v1.Service{ - Spec: v1.ServiceSpec{ - Type: v1.ServiceTypeClusterIP, - ExternalTrafficPolicy: v1.ServiceExternalTrafficPolicyTypeCluster, - }, - }, - 0, - false, - }, - // Beta annotations cases. - { - &v1.Service{ - Spec: v1.ServiceSpec{ - Type: v1.ServiceTypeClusterIP, - }, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - v1.BetaAnnotationExternalTraffic: v1.AnnotationValueExternalTrafficGlobal, - }, - }, - }, - 30012, - true, - }, - { - &v1.Service{ - Spec: v1.ServiceSpec{ - Type: v1.ServiceTypeClusterIP, - }, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - v1.BetaAnnotationExternalTraffic: v1.AnnotationValueExternalTrafficGlobal, - }, - }, - }, - 0, - true, - }, - } - - for i, tc := range testCases { - SetServiceHealthCheckNodePort(tc.inputService, tc.hcNodePort) - if !tc.beta { - if tc.inputService.Spec.HealthCheckNodePort != tc.hcNodePort { - t.Errorf("%v: got HealthCheckNodePort %v, want %v", i, tc.inputService.Spec.HealthCheckNodePort, tc.hcNodePort) - } - } else { - l, ok := tc.inputService.Annotations[v1.BetaAnnotationHealthCheckNodePort] - if tc.hcNodePort == 0 { - if ok { - t.Errorf("%v: HealthCheckNodePort set, want it to be cleared", i) - } - } else { - if !ok { - t.Errorf("%v: HealthCheckNodePort unset, want %v", i, tc.hcNodePort) - } else if l != fmt.Sprintf("%v", tc.hcNodePort) { - t.Errorf("%v: got HealthCheckNodePort %v, want %v", i, l, tc.hcNodePort) - } - } - } - } } diff --git a/pkg/api/v1/validation/BUILD b/pkg/api/v1/validation/BUILD index eff5e7ea52d..f930f2d29e7 100644 --- a/pkg/api/v1/validation/BUILD +++ b/pkg/api/v1/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//pkg/api/helper:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/api/v1/zz_generated.conversion.go b/pkg/api/v1/zz_generated.conversion.go index 3ba66d60ac6..53c9d373955 100644 --- a/pkg/api/v1/zz_generated.conversion.go +++ b/pkg/api/v1/zz_generated.conversion.go @@ -194,6 +194,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_api_NodeAffinity_To_v1_NodeAffinity, Convert_v1_NodeCondition_To_api_NodeCondition, Convert_api_NodeCondition_To_v1_NodeCondition, + Convert_v1_NodeConfigSource_To_api_NodeConfigSource, + Convert_api_NodeConfigSource_To_v1_NodeConfigSource, Convert_v1_NodeDaemonEndpoints_To_api_NodeDaemonEndpoints, Convert_api_NodeDaemonEndpoints_To_v1_NodeDaemonEndpoints, Convert_v1_NodeList_To_api_NodeList, @@ -1594,6 +1596,7 @@ func autoConvert_v1_FCVolumeSource_To_api_FCVolumeSource(in *v1.FCVolumeSource, out.Lun = (*int32)(unsafe.Pointer(in.Lun)) out.FSType = in.FSType out.ReadOnly = in.ReadOnly + out.WWIDs = *(*[]string)(unsafe.Pointer(&in.WWIDs)) return nil } @@ -1603,14 +1606,11 @@ func Convert_v1_FCVolumeSource_To_api_FCVolumeSource(in *v1.FCVolumeSource, out } func autoConvert_api_FCVolumeSource_To_v1_FCVolumeSource(in *api.FCVolumeSource, out *v1.FCVolumeSource, s conversion.Scope) error { - if in.TargetWWNs == nil { - out.TargetWWNs = make([]string, 0) - } else { - out.TargetWWNs = *(*[]string)(unsafe.Pointer(&in.TargetWWNs)) - } + out.TargetWWNs = *(*[]string)(unsafe.Pointer(&in.TargetWWNs)) out.Lun = (*int32)(unsafe.Pointer(in.Lun)) out.FSType = in.FSType out.ReadOnly = in.ReadOnly + out.WWIDs = *(*[]string)(unsafe.Pointer(&in.WWIDs)) return nil } @@ -2439,6 +2439,26 @@ func Convert_api_NodeCondition_To_v1_NodeCondition(in *api.NodeCondition, out *v return autoConvert_api_NodeCondition_To_v1_NodeCondition(in, out, s) } +func autoConvert_v1_NodeConfigSource_To_api_NodeConfigSource(in *v1.NodeConfigSource, out *api.NodeConfigSource, s conversion.Scope) error { + out.ConfigMapRef = (*api.ObjectReference)(unsafe.Pointer(in.ConfigMapRef)) + return nil +} + +// Convert_v1_NodeConfigSource_To_api_NodeConfigSource is an autogenerated conversion function. +func Convert_v1_NodeConfigSource_To_api_NodeConfigSource(in *v1.NodeConfigSource, out *api.NodeConfigSource, s conversion.Scope) error { + return autoConvert_v1_NodeConfigSource_To_api_NodeConfigSource(in, out, s) +} + +func autoConvert_api_NodeConfigSource_To_v1_NodeConfigSource(in *api.NodeConfigSource, out *v1.NodeConfigSource, s conversion.Scope) error { + out.ConfigMapRef = (*v1.ObjectReference)(unsafe.Pointer(in.ConfigMapRef)) + return nil +} + +// Convert_api_NodeConfigSource_To_v1_NodeConfigSource is an autogenerated conversion function. +func Convert_api_NodeConfigSource_To_v1_NodeConfigSource(in *api.NodeConfigSource, out *v1.NodeConfigSource, s conversion.Scope) error { + return autoConvert_api_NodeConfigSource_To_v1_NodeConfigSource(in, out, s) +} + func autoConvert_v1_NodeDaemonEndpoints_To_api_NodeDaemonEndpoints(in *v1.NodeDaemonEndpoints, out *api.NodeDaemonEndpoints, s conversion.Scope) error { if err := Convert_v1_DaemonEndpoint_To_api_DaemonEndpoint(&in.KubeletEndpoint, &out.KubeletEndpoint, s); err != nil { return err @@ -2607,6 +2627,7 @@ func autoConvert_v1_NodeSpec_To_api_NodeSpec(in *v1.NodeSpec, out *api.NodeSpec, out.ProviderID = in.ProviderID out.Unschedulable = in.Unschedulable out.Taints = *(*[]api.Taint)(unsafe.Pointer(&in.Taints)) + out.ConfigSource = (*api.NodeConfigSource)(unsafe.Pointer(in.ConfigSource)) return nil } @@ -2621,6 +2642,7 @@ func autoConvert_api_NodeSpec_To_v1_NodeSpec(in *api.NodeSpec, out *v1.NodeSpec, out.ProviderID = in.ProviderID out.Unschedulable = in.Unschedulable out.Taints = *(*[]v1.Taint)(unsafe.Pointer(&in.Taints)) + out.ConfigSource = (*v1.NodeConfigSource)(unsafe.Pointer(in.ConfigSource)) return nil } @@ -4815,6 +4837,7 @@ func autoConvert_v1_ServiceSpec_To_api_ServiceSpec(in *v1.ServiceSpec, out *api. out.ExternalName = in.ExternalName out.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyType(in.ExternalTrafficPolicy) out.HealthCheckNodePort = in.HealthCheckNodePort + out.PublishNotReadyAddresses = in.PublishNotReadyAddresses return nil } @@ -4835,6 +4858,7 @@ func autoConvert_api_ServiceSpec_To_v1_ServiceSpec(in *api.ServiceSpec, out *v1. out.LoadBalancerSourceRanges = *(*[]string)(unsafe.Pointer(&in.LoadBalancerSourceRanges)) out.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyType(in.ExternalTrafficPolicy) out.HealthCheckNodePort = in.HealthCheckNodePort + out.PublishNotReadyAddresses = in.PublishNotReadyAddresses return nil } diff --git a/pkg/api/validation/BUILD b/pkg/api/validation/BUILD index b4b2ed17549..7c1615d1782 100644 --- a/pkg/api/validation/BUILD +++ b/pkg/api/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "schema.go", "validation.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", @@ -67,7 +64,6 @@ go_test( "//api/swagger-spec", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", @@ -84,6 +80,7 @@ go_test( "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index a6b49774425..b160c0110c1 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -24,7 +24,6 @@ import ( "path/filepath" "reflect" "regexp" - "strconv" "strings" "github.com/golang/glog" @@ -648,15 +647,21 @@ func validateISCSIVolumeSource(iscsi *api.ISCSIVolumeSource, fldPath *field.Path func validateFCVolumeSource(fc *api.FCVolumeSource, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} - if len(fc.TargetWWNs) < 1 { - allErrs = append(allErrs, field.Required(fldPath.Child("targetWWNs"), "")) + if len(fc.TargetWWNs) < 1 && len(fc.WWIDs) < 1 { + allErrs = append(allErrs, field.Required(fldPath.Child("targetWWNs"), "must specify either targetWWNs or wwids, but not both")) } - if fc.Lun == nil { - allErrs = append(allErrs, field.Required(fldPath.Child("lun"), "")) - } else { - if *fc.Lun < 0 || *fc.Lun > 255 { - allErrs = append(allErrs, field.Invalid(fldPath.Child("lun"), fc.Lun, validation.InclusiveRangeError(0, 255))) + if len(fc.TargetWWNs) != 0 && len(fc.WWIDs) != 0 { + allErrs = append(allErrs, field.Invalid(fldPath.Child("targetWWNs"), fc.TargetWWNs, "targetWWNs and wwids can not be specified simultaneously")) + } + + if len(fc.TargetWWNs) != 0 { + if fc.Lun == nil { + allErrs = append(allErrs, field.Required(fldPath.Child("lun"), "lun is required if targetWWNs is specified")) + } else { + if *fc.Lun < 0 || *fc.Lun > 255 { + allErrs = append(allErrs, field.Invalid(fldPath.Child("lun"), fc.Lun, validation.InclusiveRangeError(0, 255))) + } } } return allErrs @@ -1548,7 +1553,7 @@ func ValidateEnv(vars []api.EnvVar, fldPath *field.Path) field.ErrorList { if len(ev.Name) == 0 { allErrs = append(allErrs, field.Required(idxPath.Child("name"), "")) } else { - for _, msg := range validation.IsCIdentifier(ev.Name) { + for _, msg := range validation.IsEnvVarName(ev.Name) { allErrs = append(allErrs, field.Invalid(idxPath.Child("name"), ev.Name, msg)) } } @@ -1637,7 +1642,7 @@ func ValidateEnvFrom(vars []api.EnvFromSource, fldPath *field.Path) field.ErrorL for i, ev := range vars { idxPath := fldPath.Index(i) if len(ev.Prefix) > 0 { - for _, msg := range validation.IsCIdentifier(ev.Prefix) { + for _, msg := range validation.IsEnvVarName(ev.Prefix) { allErrs = append(allErrs, field.Invalid(idxPath.Child("prefix"), ev.Prefix, msg)) } } @@ -2964,7 +2969,6 @@ func ValidateService(service *api.Service) field.ErrorList { } allErrs = append(allErrs, validateServiceExternalTrafficFieldsValue(service)...) - allErrs = append(allErrs, validateServiceExternalTrafficAPIVersion(service)...) return allErrs } @@ -3012,25 +3016,6 @@ func validateServicePort(sp *api.ServicePort, requireName, isHeadlessService boo func validateServiceExternalTrafficFieldsValue(service *api.Service) field.ErrorList { allErrs := field.ErrorList{} - // Check beta annotations. - if l, ok := service.Annotations[api.BetaAnnotationExternalTraffic]; ok { - if l != api.AnnotationValueExternalTrafficLocal && - l != api.AnnotationValueExternalTrafficGlobal { - allErrs = append(allErrs, field.Invalid(field.NewPath("metadata", "annotations").Key(api.BetaAnnotationExternalTraffic), l, - fmt.Sprintf("ExternalTraffic must be %v or %v", api.AnnotationValueExternalTrafficLocal, api.AnnotationValueExternalTrafficGlobal))) - } - } - if l, ok := service.Annotations[api.BetaAnnotationHealthCheckNodePort]; ok { - p, err := strconv.Atoi(l) - if err != nil { - allErrs = append(allErrs, field.Invalid(field.NewPath("metadata", "annotations").Key(api.BetaAnnotationHealthCheckNodePort), l, - "HealthCheckNodePort must be a valid port number")) - } else if p <= 0 { - allErrs = append(allErrs, field.Invalid(field.NewPath("metadata", "annotations").Key(api.BetaAnnotationHealthCheckNodePort), l, - "HealthCheckNodePort must be greater than 0")) - } - } - // Check first class fields. if service.Spec.ExternalTrafficPolicy != "" && service.Spec.ExternalTrafficPolicy != api.ServiceExternalTrafficPolicyTypeCluster && @@ -3046,54 +3031,6 @@ func validateServiceExternalTrafficFieldsValue(service *api.Service) field.Error return allErrs } -// serviceExternalTrafficStatus stores flags indicating whether ExternalTraffic -// related beta annotations and GA fields are set on service. -type serviceExternalTrafficStatus struct { - betaExternalTrafficIsSet bool - betaHealthCheckIsSet bool - gaExternalTrafficIsSet bool - gaHealthCheckIsSet bool -} - -func (s *serviceExternalTrafficStatus) useBetaExternalTrafficWithGA() bool { - return s.betaExternalTrafficIsSet && (s.gaExternalTrafficIsSet || s.gaHealthCheckIsSet) -} - -func (s *serviceExternalTrafficStatus) useBetaHealthCheckWithGA() bool { - return s.betaHealthCheckIsSet && (s.gaExternalTrafficIsSet || s.gaHealthCheckIsSet) -} - -func getServiceExternalTrafficStatus(service *api.Service) *serviceExternalTrafficStatus { - s := serviceExternalTrafficStatus{} - _, s.betaExternalTrafficIsSet = service.Annotations[api.BetaAnnotationExternalTraffic] - _, s.betaHealthCheckIsSet = service.Annotations[api.BetaAnnotationHealthCheckNodePort] - s.gaExternalTrafficIsSet = service.Spec.ExternalTrafficPolicy != "" - s.gaHealthCheckIsSet = service.Spec.HealthCheckNodePort != 0 - return &s -} - -// validateServiceExternalTrafficAPIVersion checks if user mixes ExternalTraffic -// API versions. -func validateServiceExternalTrafficAPIVersion(service *api.Service) field.ErrorList { - allErrs := field.ErrorList{} - - status := getServiceExternalTrafficStatus(service) - - if status.useBetaExternalTrafficWithGA() { - fieldPath := field.NewPath("metadata", "annotations").Key(api.BetaAnnotationExternalTraffic) - msg := fmt.Sprintf("please replace the beta annotation with 'ExternalTrafficPolicy' field") - allErrs = append(allErrs, field.Invalid(fieldPath, api.BetaAnnotationExternalTraffic, msg)) - } - - if status.useBetaHealthCheckWithGA() { - fieldPath := field.NewPath("metadata", "annotations").Key(api.BetaAnnotationHealthCheckNodePort) - msg := fmt.Sprintf("please replace the beta annotation with 'HealthCheckNodePort' field") - allErrs = append(allErrs, field.Invalid(fieldPath, api.BetaAnnotationHealthCheckNodePort, msg)) - } - - return allErrs -} - // ValidateServiceExternalTrafficFieldsCombination validates if ExternalTrafficPolicy, // HealthCheckNodePort and Type combination are legal. For update, it should be called // after clearing externalTraffic related fields for the ease of transitioning between @@ -3338,6 +3275,11 @@ func ValidateNode(node *api.Node) field.ErrorList { allErrs = append(allErrs, field.Required(field.NewPath("spec", "externalID"), "")) } + // Only allow Node.Spec.ConfigSource to be set if the DynamicKubeletConfig feature gate is enabled + if node.Spec.ConfigSource != nil && !utilfeature.DefaultFeatureGate.Enabled(features.DynamicKubeletConfig) { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "configSource"), "configSource may only be set if the DynamicKubeletConfig feature gate is enabled)")) + } + // TODO(rjnagal): Ignore PodCIDR till its completely implemented. return allErrs } @@ -3365,7 +3307,7 @@ func ValidateNodeUpdate(node, oldNode *api.Node) field.ErrorList { allErrs = append(allErrs, ValidateResourceQuantityValue(string(k), v, resPath)...) } - // Validte no duplicate addresses in node status. + // Validate no duplicate addresses in node status. addresses := make(map[api.NodeAddress]bool) for i, address := range node.Status.Addresses { if _, ok := addresses[address]; ok { @@ -3398,10 +3340,16 @@ func ValidateNodeUpdate(node, oldNode *api.Node) field.ErrorList { } oldNode.Spec.Taints = node.Spec.Taints + // Allow updates to Node.Spec.ConfigSource if DynamicKubeletConfig feature gate is enabled + if utilfeature.DefaultFeatureGate.Enabled(features.DynamicKubeletConfig) { + oldNode.Spec.ConfigSource = node.Spec.ConfigSource + } + + // We made allowed changes to oldNode, and now we compare oldNode to node. Any remaining differences indicate changes to protected fields. // TODO: Add a 'real' error type for this error and provide print actual diffs. if !apiequality.Semantic.DeepEqual(oldNode, node) { glog.V(4).Infof("Update failed validation %#v vs %#v", oldNode, node) - allErrs = append(allErrs, field.Forbidden(field.NewPath(""), "node updates may only change labels, taints or capacity")) + allErrs = append(allErrs, field.Forbidden(field.NewPath(""), "node updates may only change labels, taints, or capacity (or configSource, if the DynamicKubeletConfig feature gate is enabled)")) } return allErrs diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index 4dbd31dd5eb..a849df8445f 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -27,6 +27,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api" @@ -38,12 +39,7 @@ import ( const ( dnsLabelErrMsg = "a DNS-1123 label must consist of" dnsSubdomainLabelErrMsg = "a DNS-1123 subdomain" - labelErrMsg = "a valid label must be an empty string or consist of" - lowerCaseLabelErrMsg = "a valid label must consist of" - maxLengthErrMsg = "must be no more than" - namePartErrMsg = "name part must consist of" - nameErrMsg = "a qualified name must consist of" - idErrMsg = "a valid C identifier must" + envVarNameErrMsg = "a valid environment variable name must consist of" ) func testVolume(name string, namespace string, spec api.PersistentVolumeSpec) *api.PersistentVolume { @@ -2104,7 +2100,7 @@ func TestValidateVolumes(t *testing.T) { }, // FC { - name: "valid FC", + name: "FC valid targetWWNs and lun", vol: api.Volume{ Name: "fc", VolumeSource: api.VolumeSource{ @@ -2118,23 +2114,56 @@ func TestValidateVolumes(t *testing.T) { }, }, { - name: "fc empty wwn", + name: "FC valid wwids", + vol: api.Volume{ + Name: "fc", + VolumeSource: api.VolumeSource{ + FC: &api.FCVolumeSource{ + WWIDs: []string{"some_wwid"}, + FSType: "ext4", + ReadOnly: false, + }, + }, + }, + }, + { + name: "FC empty targetWWNs and wwids", vol: api.Volume{ Name: "fc", VolumeSource: api.VolumeSource{ FC: &api.FCVolumeSource{ TargetWWNs: []string{}, Lun: newInt32(1), + WWIDs: []string{}, FSType: "ext4", ReadOnly: false, }, }, }, - errtype: field.ErrorTypeRequired, - errfield: "fc.targetWWNs", + errtype: field.ErrorTypeRequired, + errfield: "fc.targetWWNs", + errdetail: "must specify either targetWWNs or wwids", }, { - name: "fc empty lun", + name: "FC invalid: both targetWWNs and wwids simultaneously", + vol: api.Volume{ + Name: "fc", + VolumeSource: api.VolumeSource{ + FC: &api.FCVolumeSource{ + TargetWWNs: []string{"some_wwn"}, + Lun: newInt32(1), + WWIDs: []string{"some_wwid"}, + FSType: "ext4", + ReadOnly: false, + }, + }, + }, + errtype: field.ErrorTypeInvalid, + errfield: "fc.targetWWNs", + errdetail: "targetWWNs and wwids can not be specified simultaneously", + }, + { + name: "FC valid targetWWNs and empty lun", vol: api.Volume{ Name: "fc", VolumeSource: api.VolumeSource{ @@ -2146,8 +2175,26 @@ func TestValidateVolumes(t *testing.T) { }, }, }, - errtype: field.ErrorTypeRequired, - errfield: "fc.lun", + errtype: field.ErrorTypeRequired, + errfield: "fc.lun", + errdetail: "lun is required if targetWWNs is specified", + }, + { + name: "FC valid targetWWNs and invalid lun", + vol: api.Volume{ + Name: "fc", + VolumeSource: api.VolumeSource{ + FC: &api.FCVolumeSource{ + TargetWWNs: []string{"wwn"}, + Lun: newInt32(256), + FSType: "ext4", + ReadOnly: false, + }, + }, + }, + errtype: field.ErrorTypeInvalid, + errfield: "fc.lun", + errdetail: validation.InclusiveRangeError(0, 255), }, // FlexVolume { @@ -2575,6 +2622,8 @@ func TestValidateEnv(t *testing.T) { {Name: "ABC", Value: "value"}, {Name: "AbC_123", Value: "value"}, {Name: "abc", Value: ""}, + {Name: "a.b.c", Value: "value"}, + {Name: "a-b-c", Value: "value"}, { Name: "abc", ValueFrom: &api.EnvVarSource{ @@ -2676,9 +2725,24 @@ func TestValidateEnv(t *testing.T) { expectedError: "[0].name: Required value", }, { - name: "name not a C identifier", - envs: []api.EnvVar{{Name: "a.b.c"}}, - expectedError: `[0].name: Invalid value: "a.b.c": ` + idErrMsg, + name: "illegal character", + envs: []api.EnvVar{{Name: "a!b"}}, + expectedError: `[0].name: Invalid value: "a!b": ` + envVarNameErrMsg, + }, + { + name: "dot only", + envs: []api.EnvVar{{Name: "."}}, + expectedError: `[0].name: Invalid value: ".": must not be`, + }, + { + name: "double dots only", + envs: []api.EnvVar{{Name: ".."}}, + expectedError: `[0].name: Invalid value: "..": must not be`, + }, + { + name: "leading double dots", + envs: []api.EnvVar{{Name: "..abc"}}, + expectedError: `[0].name: Invalid value: "..abc": must not start with`, }, { name: "value and valueFrom specified", @@ -2897,6 +2961,12 @@ func TestValidateEnvFrom(t *testing.T) { LocalObjectReference: api.LocalObjectReference{Name: "abc"}, }, }, + { + Prefix: "a.b", + ConfigMapRef: &api.ConfigMapEnvSource{ + LocalObjectReference: api.LocalObjectReference{Name: "abc"}, + }, + }, { SecretRef: &api.SecretEnvSource{ LocalObjectReference: api.LocalObjectReference{Name: "abc"}, @@ -2908,6 +2978,12 @@ func TestValidateEnvFrom(t *testing.T) { LocalObjectReference: api.LocalObjectReference{Name: "abc"}, }, }, + { + Prefix: "a.b", + SecretRef: &api.SecretEnvSource{ + LocalObjectReference: api.LocalObjectReference{Name: "abc"}, + }, + }, } if errs := ValidateEnvFrom(successCase, field.NewPath("field")); len(errs) != 0 { t.Errorf("expected success: %v", errs) @@ -2942,12 +3018,12 @@ func TestValidateEnvFrom(t *testing.T) { name: "invalid prefix", envs: []api.EnvFromSource{ { - Prefix: "a.b", + Prefix: "a!b", ConfigMapRef: &api.ConfigMapEnvSource{ LocalObjectReference: api.LocalObjectReference{Name: "abc"}}, }, }, - expectedError: `field[0].prefix: Invalid value: "a.b": ` + idErrMsg, + expectedError: `field[0].prefix: Invalid value: "a!b": ` + envVarNameErrMsg, }, { name: "zero-length name", @@ -2973,12 +3049,12 @@ func TestValidateEnvFrom(t *testing.T) { name: "invalid prefix", envs: []api.EnvFromSource{ { - Prefix: "a.b", + Prefix: "a!b", SecretRef: &api.SecretEnvSource{ LocalObjectReference: api.LocalObjectReference{Name: "abc"}}, }, }, - expectedError: `field[0].prefix: Invalid value: "a.b": ` + idErrMsg, + expectedError: `field[0].prefix: Invalid value: "a!b": ` + envVarNameErrMsg, }, { name: "no refs", @@ -3374,7 +3450,7 @@ func TestValidateContainers(t *testing.T) { ImagePullPolicy: "IfNotPresent", TerminationMessagePolicy: "File"}, }, "invalid env var name": { - {Name: "abc", Image: "image", Env: []api.EnvVar{{Name: "ev.1"}}, ImagePullPolicy: "IfNotPresent", TerminationMessagePolicy: "File"}, + {Name: "abc", Image: "image", Env: []api.EnvVar{{Name: "ev!1"}}, ImagePullPolicy: "IfNotPresent", TerminationMessagePolicy: "File"}, }, "unknown volume name": { {Name: "abc", Image: "image", VolumeMounts: []api.VolumeMount{{Name: "anything", MountPath: "/foo"}}, @@ -6450,48 +6526,6 @@ func TestValidateService(t *testing.T) { numErrs: 1, }, // ESIPP section begins. - { - name: "LoadBalancer allows onlyLocal beta annotations", - tweakSvc: func(s *api.Service) { - s.Annotations[api.BetaAnnotationExternalTraffic] = api.AnnotationValueExternalTrafficLocal - }, - numErrs: 0, - }, - { - name: "invalid externalTraffic beta annotation", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - s.Annotations[api.BetaAnnotationExternalTraffic] = "invalid" - }, - numErrs: 1, - }, - { - name: "nagative healthCheckNodePort beta annotation", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - s.Annotations[api.BetaAnnotationExternalTraffic] = api.AnnotationValueExternalTrafficLocal - s.Annotations[api.BetaAnnotationHealthCheckNodePort] = "-1" - }, - numErrs: 1, - }, - { - name: "invalid healthCheckNodePort beta annotation", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - s.Annotations[api.BetaAnnotationExternalTraffic] = api.AnnotationValueExternalTrafficLocal - s.Annotations[api.BetaAnnotationHealthCheckNodePort] = "whatisthis" - }, - numErrs: 1, - }, - { - name: "valid healthCheckNodePort beta annotation", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - s.Annotations[api.BetaAnnotationExternalTraffic] = api.AnnotationValueExternalTrafficLocal - s.Annotations[api.BetaAnnotationHealthCheckNodePort] = "31100" - }, - numErrs: 0, - }, { name: "invalid externalTraffic field", tweakSvc: func(s *api.Service) { @@ -6518,33 +6552,6 @@ func TestValidateService(t *testing.T) { }, numErrs: 0, }, - { - name: "disallows use ExternalTraffic beta annotation with first class field", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - s.Annotations[api.BetaAnnotationExternalTraffic] = api.AnnotationValueExternalTrafficLocal - s.Spec.HealthCheckNodePort = 3001 - }, - numErrs: 1, - }, - { - name: "disallows duplicated ExternalTraffic beta annotation with first class field", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - s.Annotations[api.BetaAnnotationExternalTraffic] = api.AnnotationValueExternalTrafficLocal - s.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal - }, - numErrs: 1, - }, - { - name: "disallows use HealthCheckNodePort beta annotation with first class field", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - s.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal - s.Annotations[api.BetaAnnotationHealthCheckNodePort] = "3001" - }, - numErrs: 1, - }, // ESIPP section ends. } @@ -8005,50 +8012,6 @@ func TestValidateServiceUpdate(t *testing.T) { }, numErrs: 1, }, - { - name: "Service allows removing onlyLocal beta annotations", - tweakSvc: func(oldSvc, newSvc *api.Service) { - oldSvc.Annotations[api.BetaAnnotationExternalTraffic] = api.AnnotationValueExternalTrafficLocal - oldSvc.Annotations[api.BetaAnnotationHealthCheckNodePort] = "3001" - }, - numErrs: 0, - }, - { - name: "Service allows modifying onlyLocal beta annotations", - tweakSvc: func(oldSvc, newSvc *api.Service) { - oldSvc.Spec.Type = api.ServiceTypeLoadBalancer - oldSvc.Annotations[api.BetaAnnotationExternalTraffic] = api.AnnotationValueExternalTrafficLocal - oldSvc.Annotations[api.BetaAnnotationHealthCheckNodePort] = "3001" - newSvc.Spec.Type = api.ServiceTypeLoadBalancer - newSvc.Annotations[api.BetaAnnotationExternalTraffic] = api.AnnotationValueExternalTrafficGlobal - newSvc.Annotations[api.BetaAnnotationHealthCheckNodePort] = oldSvc.Annotations[api.BetaAnnotationHealthCheckNodePort] - }, - numErrs: 0, - }, - { - name: "Service disallows promoting one of the onlyLocal pair to GA", - tweakSvc: func(oldSvc, newSvc *api.Service) { - oldSvc.Spec.Type = api.ServiceTypeLoadBalancer - oldSvc.Annotations[api.BetaAnnotationExternalTraffic] = api.AnnotationValueExternalTrafficLocal - oldSvc.Annotations[api.BetaAnnotationHealthCheckNodePort] = "3001" - newSvc.Spec.Type = api.ServiceTypeLoadBalancer - newSvc.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal - newSvc.Annotations[api.BetaAnnotationHealthCheckNodePort] = oldSvc.Annotations[api.BetaAnnotationHealthCheckNodePort] - }, - numErrs: 1, - }, - { - name: "Service allows changing both onlyLocal annotations from beta to GA", - tweakSvc: func(oldSvc, newSvc *api.Service) { - oldSvc.Spec.Type = api.ServiceTypeLoadBalancer - oldSvc.Annotations[api.BetaAnnotationExternalTraffic] = api.AnnotationValueExternalTrafficLocal - oldSvc.Annotations[api.BetaAnnotationHealthCheckNodePort] = "3001" - newSvc.Spec.Type = api.ServiceTypeLoadBalancer - newSvc.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal - newSvc.Spec.HealthCheckNodePort = 3001 - }, - numErrs: 0, - }, { name: "`None` ClusterIP cannot be changed", tweakSvc: func(oldSvc, newSvc *api.Service) { @@ -9320,29 +9283,17 @@ func TestValidateBasicAuthSecret(t *testing.T) { var ( missingBasicAuthUsernamePasswordKeys = validBasicAuthSecret() - // invalidBasicAuthUsernamePasswordKey = validBasicAuthSecret() - // emptyBasicAuthUsernameKey = validBasicAuthSecret() - // emptyBasicAuthPasswordKey = validBasicAuthSecret() ) delete(missingBasicAuthUsernamePasswordKeys.Data, api.BasicAuthUsernameKey) delete(missingBasicAuthUsernamePasswordKeys.Data, api.BasicAuthPasswordKey) - // invalidBasicAuthUsernamePasswordKey.Data[api.BasicAuthUsernameKey] = []byte("bad") - // invalidBasicAuthUsernamePasswordKey.Data[api.BasicAuthPasswordKey] = []byte("bad") - - // emptyBasicAuthUsernameKey.Data[api.BasicAuthUsernameKey] = []byte("") - // emptyBasicAuthPasswordKey.Data[api.BasicAuthPasswordKey] = []byte("") - tests := map[string]struct { secret api.Secret valid bool }{ "valid": {validBasicAuthSecret(), true}, "missing username and password": {missingBasicAuthUsernamePasswordKeys, false}, - // "invalid username and password": {invalidBasicAuthUsernamePasswordKey, false}, - // "empty username": {emptyBasicAuthUsernameKey, false}, - // "empty password": {emptyBasicAuthPasswordKey, false}, } for name, tc := range tests { diff --git a/pkg/api/zz_generated.deepcopy.go b/pkg/api/zz_generated.deepcopy.go index 1463f72fdeb..efba5e24a50 100644 --- a/pkg/api/zz_generated.deepcopy.go +++ b/pkg/api/zz_generated.deepcopy.go @@ -350,6 +350,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*NodeCondition).DeepCopyInto(out.(*NodeCondition)) return nil }, InType: reflect.TypeOf(&NodeCondition{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*NodeConfigSource).DeepCopyInto(out.(*NodeConfigSource)) + return nil + }, InType: reflect.TypeOf(&NodeConfigSource{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*NodeDaemonEndpoints).DeepCopyInto(out.(*NodeDaemonEndpoints)) return nil @@ -2080,6 +2084,11 @@ func (in *FCVolumeSource) DeepCopyInto(out *FCVolumeSource) { **out = **in } } + if in.WWIDs != nil { + in, out := &in.WWIDs, &out.WWIDs + *out = make([]string, len(*in)) + copy(*out, *in) + } return } @@ -2895,6 +2904,41 @@ func (in *NodeCondition) DeepCopy() *NodeCondition { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeConfigSource) DeepCopyInto(out *NodeConfigSource) { + *out = *in + out.TypeMeta = in.TypeMeta + if in.ConfigMapRef != nil { + in, out := &in.ConfigMapRef, &out.ConfigMapRef + if *in == nil { + *out = nil + } else { + *out = new(ObjectReference) + **out = **in + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeConfigSource. +func (in *NodeConfigSource) DeepCopy() *NodeConfigSource { + if in == nil { + return nil + } + out := new(NodeConfigSource) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *NodeConfigSource) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } else { + return nil + } +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NodeDaemonEndpoints) DeepCopyInto(out *NodeDaemonEndpoints) { *out = *in @@ -3072,6 +3116,15 @@ func (in *NodeSpec) DeepCopyInto(out *NodeSpec) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.ConfigSource != nil { + in, out := &in.ConfigSource, &out.ConfigSource + if *in == nil { + *out = nil + } else { + *out = new(NodeConfigSource) + (*in).DeepCopyInto(*out) + } + } return } diff --git a/pkg/apimachinery/tests/BUILD b/pkg/apimachinery/tests/BUILD index 20d0a176ce4..613436fbe38 100644 --- a/pkg/apimachinery/tests/BUILD +++ b/pkg/apimachinery/tests/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -10,7 +8,6 @@ load( go_test( name = "go_default_test", srcs = ["api_meta_scheme_test.go"], - tags = ["automanaged"], deps = [ "//pkg/api/testapi:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/apis/abac/BUILD b/pkg/apis/abac/BUILD index 92e6ea9683c..51caaac2954 100644 --- a/pkg/apis/abac/BUILD +++ b/pkg/apis/abac/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", @@ -36,6 +33,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/abac/fuzzer:all-srcs", "//pkg/apis/abac/latest:all-srcs", "//pkg/apis/abac/v0:all-srcs", "//pkg/apis/abac/v1beta1:all-srcs", diff --git a/pkg/apis/abac/fuzzer/BUILD b/pkg/apis/abac/fuzzer/BUILD new file mode 100644 index 00000000000..dd0561eec8f --- /dev/null +++ b/pkg/apis/abac/fuzzer/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = ["//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/registry/core/serviceaccount/strategy_test.go b/pkg/apis/abac/fuzzer/fuzzer.go similarity index 57% rename from pkg/registry/core/serviceaccount/strategy_test.go rename to pkg/apis/abac/fuzzer/fuzzer.go index 76b1cdc57c1..9f6e432bc6e 100644 --- a/pkg/registry/core/serviceaccount/strategy_test.go +++ b/pkg/apis/abac/fuzzer/fuzzer.go @@ -1,5 +1,5 @@ /* -Copyright 2015 The Kubernetes Authors. +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. @@ -14,20 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -package serviceaccount +package fuzzer import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - apitesting "k8s.io/kubernetes/pkg/api/testing" + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" ) -func TestSelectableFieldLabelConversions(t *testing.T) { - apitesting.TestSelectableFieldLabelConversionsOfKind(t, - api.Registry.GroupOrDie(api.GroupName).GroupVersion.String(), - "ServiceAccount", - SelectableFields(&api.ServiceAccount{}), - nil, - ) +// Funcs returns the fuzzer functions for the abac api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{} } diff --git a/pkg/apis/abac/latest/BUILD b/pkg/apis/abac/latest/BUILD index d3ae95e7db4..b8d85b7b6d9 100644 --- a/pkg/apis/abac/latest/BUILD +++ b/pkg/apis/abac/latest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["latest.go"], - tags = ["automanaged"], deps = [ "//pkg/apis/abac:go_default_library", "//pkg/apis/abac/v0:go_default_library", diff --git a/pkg/apis/abac/v0/BUILD b/pkg/apis/abac/v0/BUILD index 12a9c67c51d..3115c85f928 100644 --- a/pkg/apis/abac/v0/BUILD +++ b/pkg/apis/abac/v0/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/abac:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -30,10 +27,9 @@ go_library( go_test( name = "go_default_xtest", srcs = ["conversion_test.go"], - tags = ["automanaged"], deps = [ + ":go_default_library", "//pkg/apis/abac:go_default_library", - "//pkg/apis/abac/v0:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", ], ) diff --git a/pkg/apis/abac/v1beta1/BUILD b/pkg/apis/abac/v1beta1/BUILD index e6ed5eb772c..56db2e65bd5 100644 --- a/pkg/apis/abac/v1beta1/BUILD +++ b/pkg/apis/abac/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/abac:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -32,10 +29,9 @@ go_library( go_test( name = "go_default_xtest", srcs = ["conversion_test.go"], - tags = ["automanaged"], deps = [ + ":go_default_library", "//pkg/apis/abac:go_default_library", - "//pkg/apis/abac/v1beta1:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", ], ) diff --git a/pkg/apis/admission/BUILD b/pkg/apis/admission/BUILD index cc3632025b2..ea672dbcacc 100644 --- a/pkg/apis/admission/BUILD +++ b/pkg/apis/admission/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/authentication:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -37,6 +34,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/admission/fuzzer:all-srcs", "//pkg/apis/admission/install:all-srcs", "//pkg/apis/admission/v1alpha1:all-srcs", ], diff --git a/pkg/apis/admission/fuzzer/BUILD b/pkg/apis/admission/fuzzer/BUILD new file mode 100644 index 00000000000..dd0561eec8f --- /dev/null +++ b/pkg/apis/admission/fuzzer/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = ["//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/registry/core/limitrange/strategy_test.go b/pkg/apis/admission/fuzzer/fuzzer.go similarity index 57% rename from pkg/registry/core/limitrange/strategy_test.go rename to pkg/apis/admission/fuzzer/fuzzer.go index 8c7c98e6efc..6b4aea2de13 100644 --- a/pkg/registry/core/limitrange/strategy_test.go +++ b/pkg/apis/admission/fuzzer/fuzzer.go @@ -1,5 +1,5 @@ /* -Copyright 2015 The Kubernetes Authors. +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. @@ -14,20 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -package limitrange +package fuzzer import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - apitesting "k8s.io/kubernetes/pkg/api/testing" + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" ) -func TestSelectableFieldLabelConversions(t *testing.T) { - apitesting.TestSelectableFieldLabelConversionsOfKind(t, - api.Registry.GroupOrDie(api.GroupName).GroupVersion.String(), - "LimitRange", - LimitRangeToSelectableFields(&api.LimitRange{}), - nil, - ) +// Funcs returns the fuzzer functions for the admission api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{} } diff --git a/pkg/apis/admission/install/BUILD b/pkg/apis/admission/install/BUILD index 72644e603c7..ec8e8cd88a7 100644 --- a/pkg/apis/admission/install/BUILD +++ b/pkg/apis/admission/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/admission:go_default_library", diff --git a/pkg/apis/admission/v1alpha1/BUILD b/pkg/apis/admission/v1alpha1/BUILD index 04bdde67d5e..984b3f6cb79 100644 --- a/pkg/apis/admission/v1alpha1/BUILD +++ b/pkg/apis/admission/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/admission:go_default_library", "//vendor/k8s.io/api/admission/v1alpha1:go_default_library", diff --git a/pkg/apis/admissionregistration/BUILD b/pkg/apis/admissionregistration/BUILD index 72f4fd29b83..5d7b1813f8c 100644 --- a/pkg/apis/admissionregistration/BUILD +++ b/pkg/apis/admissionregistration/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", @@ -35,6 +32,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/admissionregistration/fuzzer:all-srcs", "//pkg/apis/admissionregistration/install:all-srcs", "//pkg/apis/admissionregistration/v1alpha1:all-srcs", "//pkg/apis/admissionregistration/validation:all-srcs", diff --git a/pkg/apis/admissionregistration/fuzzer/BUILD b/pkg/apis/admissionregistration/fuzzer/BUILD new file mode 100644 index 00000000000..0f5bfa3a15a --- /dev/null +++ b/pkg/apis/admissionregistration/fuzzer/BUILD @@ -0,0 +1,29 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = [ + "//pkg/apis/admissionregistration:go_default_library", + "//vendor/github.com/google/gofuzz:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/apis/admissionregistration/fuzzer/fuzzer.go b/pkg/apis/admissionregistration/fuzzer/fuzzer.go new file mode 100644 index 00000000000..4029e02298c --- /dev/null +++ b/pkg/apis/admissionregistration/fuzzer/fuzzer.go @@ -0,0 +1,40 @@ +/* +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 fuzzer + +import ( + fuzz "github.com/google/gofuzz" + + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/kubernetes/pkg/apis/admissionregistration" +) + +// Funcs returns the fuzzer functions for the admissionregistration api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{ + func(obj *admissionregistration.ExternalAdmissionHook, c fuzz.Continue) { + c.FuzzNoCustom(obj) // fuzz self without calling this function again + p := admissionregistration.FailurePolicyType("Fail") + obj.FailurePolicy = &p + }, + func(obj *admissionregistration.Initializer, c fuzz.Continue) { + c.FuzzNoCustom(obj) // fuzz self without calling this function again + p := admissionregistration.FailurePolicyType("Fail") + obj.FailurePolicy = &p + }, + } +} diff --git a/pkg/apis/admissionregistration/install/BUILD b/pkg/apis/admissionregistration/install/BUILD index 49cc0c90e0b..49d881d0ed0 100644 --- a/pkg/apis/admissionregistration/install/BUILD +++ b/pkg/apis/admissionregistration/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/admissionregistration:go_default_library", diff --git a/pkg/apis/admissionregistration/v1alpha1/BUILD b/pkg/apis/admissionregistration/v1alpha1/BUILD index 8fa2a0ad5ff..6126c72af70 100644 --- a/pkg/apis/admissionregistration/v1alpha1/BUILD +++ b/pkg/apis/admissionregistration/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/admissionregistration:go_default_library", "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", diff --git a/pkg/apis/admissionregistration/validation/BUILD b/pkg/apis/admissionregistration/validation/BUILD index fe158316026..00268be3f1e 100644 --- a/pkg/apis/admissionregistration/validation/BUILD +++ b/pkg/apis/admissionregistration/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/admissionregistration:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -22,7 +19,6 @@ go_test( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//pkg/apis/admissionregistration:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/validation:go_default_library", diff --git a/pkg/apis/apps/BUILD b/pkg/apis/apps/BUILD index 890b1ecc1c3..0b1a8701f08 100644 --- a/pkg/apis/apps/BUILD +++ b/pkg/apis/apps/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", @@ -37,6 +34,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/apps/fuzzer:all-srcs", "//pkg/apis/apps/install:all-srcs", "//pkg/apis/apps/v1beta1:all-srcs", "//pkg/apis/apps/v1beta2:all-srcs", diff --git a/pkg/apis/apps/fuzzer/BUILD b/pkg/apis/apps/fuzzer/BUILD new file mode 100644 index 00000000000..b933f045eda --- /dev/null +++ b/pkg/apis/apps/fuzzer/BUILD @@ -0,0 +1,29 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = [ + "//pkg/apis/apps:go_default_library", + "//vendor/github.com/google/gofuzz:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/apis/apps/fuzzer/fuzzer.go b/pkg/apis/apps/fuzzer/fuzzer.go new file mode 100644 index 00000000000..beb97dc1684 --- /dev/null +++ b/pkg/apis/apps/fuzzer/fuzzer.go @@ -0,0 +1,51 @@ +/* +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 fuzzer + +import ( + fuzz "github.com/google/gofuzz" + + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/kubernetes/pkg/apis/apps" +) + +// Funcs returns the fuzzer functions for the apps api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{ + func(s *apps.StatefulSet, c fuzz.Continue) { + c.FuzzNoCustom(s) // fuzz self without calling this function again + + // match defaulter + if len(s.Spec.PodManagementPolicy) == 0 { + s.Spec.PodManagementPolicy = apps.OrderedReadyPodManagement + } + if len(s.Spec.UpdateStrategy.Type) == 0 { + s.Spec.UpdateStrategy.Type = apps.RollingUpdateStatefulSetStrategyType + } + if s.Spec.RevisionHistoryLimit == nil { + s.Spec.RevisionHistoryLimit = new(int32) + *s.Spec.RevisionHistoryLimit = 10 + } + if s.Status.ObservedGeneration == nil { + s.Status.ObservedGeneration = new(int64) + } + if s.Status.CollisionCount == nil { + s.Status.CollisionCount = new(int64) + } + }, + } +} diff --git a/pkg/apis/apps/install/BUILD b/pkg/apis/apps/install/BUILD index 55145d88f50..55b72470796 100644 --- a/pkg/apis/apps/install/BUILD +++ b/pkg/apis/apps/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/apps:go_default_library", diff --git a/pkg/apis/apps/types.go b/pkg/apis/apps/types.go index 5e4173b0828..9841c2ab4f6 100644 --- a/pkg/apis/apps/types.go +++ b/pkg/apis/apps/types.go @@ -187,6 +187,12 @@ type StatefulSetStatus struct { // updateRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence // [replicas-updatedReplicas,replicas) UpdateRevision string + + // collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller + // uses this field as a collision avoidance mechanism when it needs to create the name for the + // newest ControllerRevision. + // +optional + CollisionCount *int64 } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/pkg/apis/apps/v1beta1/BUILD b/pkg/apis/apps/v1beta1/BUILD index 95414092113..b97be7b7dc8 100644 --- a/pkg/apis/apps/v1beta1/BUILD +++ b/pkg/apis/apps/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1:go_default_library", @@ -50,12 +47,11 @@ filegroup( go_test( name = "go_default_xtest", srcs = ["defaults_test.go"], - tags = ["automanaged"], deps = [ + ":go_default_library", "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", "//pkg/apis/apps/install:go_default_library", - "//pkg/apis/apps/v1beta1:go_default_library", "//vendor/k8s.io/api/apps/v1beta1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", diff --git a/pkg/apis/apps/v1beta1/doc.go b/pkg/apis/apps/v1beta1/doc.go index 079bf6ef9b2..058dce37f1d 100644 --- a/pkg/apis/apps/v1beta1/doc.go +++ b/pkg/apis/apps/v1beta1/doc.go @@ -15,6 +15,7 @@ limitations under the License. */ // +k8s:conversion-gen=k8s.io/kubernetes/pkg/apis/apps +// +k8s:conversion-gen=k8s.io/kubernetes/pkg/apis/extensions // +k8s:conversion-gen-external-types=../../../../vendor/k8s.io/api/apps/v1beta1 // +k8s:defaulter-gen=TypeMeta // +k8s:defaulter-gen-input=../../../../vendor/k8s.io/api/apps/v1beta1 diff --git a/pkg/apis/apps/v1beta1/zz_generated.conversion.go b/pkg/apis/apps/v1beta1/zz_generated.conversion.go index 7da7c398cee..972e5a70a25 100644 --- a/pkg/apis/apps/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/apps/v1beta1/zz_generated.conversion.go @@ -22,13 +22,14 @@ package v1beta1 import ( v1beta1 "k8s.io/api/apps/v1beta1" - core_v1 "k8s.io/api/core/v1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + v1 "k8s.io/api/core/v1" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" api "k8s.io/kubernetes/pkg/api" api_v1 "k8s.io/kubernetes/pkg/api/v1" apps "k8s.io/kubernetes/pkg/apis/apps" + extensions "k8s.io/kubernetes/pkg/apis/extensions" unsafe "unsafe" ) @@ -44,8 +45,32 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_apps_ControllerRevision_To_v1beta1_ControllerRevision, Convert_v1beta1_ControllerRevisionList_To_apps_ControllerRevisionList, Convert_apps_ControllerRevisionList_To_v1beta1_ControllerRevisionList, + Convert_v1beta1_Deployment_To_extensions_Deployment, + Convert_extensions_Deployment_To_v1beta1_Deployment, + Convert_v1beta1_DeploymentCondition_To_extensions_DeploymentCondition, + Convert_extensions_DeploymentCondition_To_v1beta1_DeploymentCondition, + Convert_v1beta1_DeploymentList_To_extensions_DeploymentList, + Convert_extensions_DeploymentList_To_v1beta1_DeploymentList, + Convert_v1beta1_DeploymentRollback_To_extensions_DeploymentRollback, + Convert_extensions_DeploymentRollback_To_v1beta1_DeploymentRollback, + Convert_v1beta1_DeploymentSpec_To_extensions_DeploymentSpec, + Convert_extensions_DeploymentSpec_To_v1beta1_DeploymentSpec, + Convert_v1beta1_DeploymentStatus_To_extensions_DeploymentStatus, + Convert_extensions_DeploymentStatus_To_v1beta1_DeploymentStatus, + Convert_v1beta1_DeploymentStrategy_To_extensions_DeploymentStrategy, + Convert_extensions_DeploymentStrategy_To_v1beta1_DeploymentStrategy, + Convert_v1beta1_RollbackConfig_To_extensions_RollbackConfig, + Convert_extensions_RollbackConfig_To_v1beta1_RollbackConfig, + Convert_v1beta1_RollingUpdateDeployment_To_extensions_RollingUpdateDeployment, + Convert_extensions_RollingUpdateDeployment_To_v1beta1_RollingUpdateDeployment, Convert_v1beta1_RollingUpdateStatefulSetStrategy_To_apps_RollingUpdateStatefulSetStrategy, Convert_apps_RollingUpdateStatefulSetStrategy_To_v1beta1_RollingUpdateStatefulSetStrategy, + Convert_v1beta1_Scale_To_extensions_Scale, + Convert_extensions_Scale_To_v1beta1_Scale, + Convert_v1beta1_ScaleSpec_To_extensions_ScaleSpec, + Convert_extensions_ScaleSpec_To_v1beta1_ScaleSpec, + Convert_v1beta1_ScaleStatus_To_extensions_ScaleStatus, + Convert_extensions_ScaleStatus_To_v1beta1_ScaleStatus, Convert_v1beta1_StatefulSet_To_apps_StatefulSet, Convert_apps_StatefulSet_To_v1beta1_StatefulSet, Convert_v1beta1_StatefulSetList_To_apps_StatefulSetList, @@ -129,8 +154,272 @@ func Convert_apps_ControllerRevisionList_To_v1beta1_ControllerRevisionList(in *a return autoConvert_apps_ControllerRevisionList_To_v1beta1_ControllerRevisionList(in, out, s) } +func autoConvert_v1beta1_Deployment_To_extensions_Deployment(in *v1beta1.Deployment, out *extensions.Deployment, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_v1beta1_DeploymentSpec_To_extensions_DeploymentSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + if err := Convert_v1beta1_DeploymentStatus_To_extensions_DeploymentStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +// Convert_v1beta1_Deployment_To_extensions_Deployment is an autogenerated conversion function. +func Convert_v1beta1_Deployment_To_extensions_Deployment(in *v1beta1.Deployment, out *extensions.Deployment, s conversion.Scope) error { + return autoConvert_v1beta1_Deployment_To_extensions_Deployment(in, out, s) +} + +func autoConvert_extensions_Deployment_To_v1beta1_Deployment(in *extensions.Deployment, out *v1beta1.Deployment, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_extensions_DeploymentSpec_To_v1beta1_DeploymentSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + if err := Convert_extensions_DeploymentStatus_To_v1beta1_DeploymentStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +// Convert_extensions_Deployment_To_v1beta1_Deployment is an autogenerated conversion function. +func Convert_extensions_Deployment_To_v1beta1_Deployment(in *extensions.Deployment, out *v1beta1.Deployment, s conversion.Scope) error { + return autoConvert_extensions_Deployment_To_v1beta1_Deployment(in, out, s) +} + +func autoConvert_v1beta1_DeploymentCondition_To_extensions_DeploymentCondition(in *v1beta1.DeploymentCondition, out *extensions.DeploymentCondition, s conversion.Scope) error { + out.Type = extensions.DeploymentConditionType(in.Type) + out.Status = api.ConditionStatus(in.Status) + out.LastUpdateTime = in.LastUpdateTime + out.LastTransitionTime = in.LastTransitionTime + out.Reason = in.Reason + out.Message = in.Message + return nil +} + +// Convert_v1beta1_DeploymentCondition_To_extensions_DeploymentCondition is an autogenerated conversion function. +func Convert_v1beta1_DeploymentCondition_To_extensions_DeploymentCondition(in *v1beta1.DeploymentCondition, out *extensions.DeploymentCondition, s conversion.Scope) error { + return autoConvert_v1beta1_DeploymentCondition_To_extensions_DeploymentCondition(in, out, s) +} + +func autoConvert_extensions_DeploymentCondition_To_v1beta1_DeploymentCondition(in *extensions.DeploymentCondition, out *v1beta1.DeploymentCondition, s conversion.Scope) error { + out.Type = v1beta1.DeploymentConditionType(in.Type) + out.Status = v1.ConditionStatus(in.Status) + out.LastUpdateTime = in.LastUpdateTime + out.LastTransitionTime = in.LastTransitionTime + out.Reason = in.Reason + out.Message = in.Message + return nil +} + +// Convert_extensions_DeploymentCondition_To_v1beta1_DeploymentCondition is an autogenerated conversion function. +func Convert_extensions_DeploymentCondition_To_v1beta1_DeploymentCondition(in *extensions.DeploymentCondition, out *v1beta1.DeploymentCondition, s conversion.Scope) error { + return autoConvert_extensions_DeploymentCondition_To_v1beta1_DeploymentCondition(in, out, s) +} + +func autoConvert_v1beta1_DeploymentList_To_extensions_DeploymentList(in *v1beta1.DeploymentList, out *extensions.DeploymentList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]extensions.Deployment, len(*in)) + for i := range *in { + if err := Convert_v1beta1_Deployment_To_extensions_Deployment(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Items = nil + } + return nil +} + +// Convert_v1beta1_DeploymentList_To_extensions_DeploymentList is an autogenerated conversion function. +func Convert_v1beta1_DeploymentList_To_extensions_DeploymentList(in *v1beta1.DeploymentList, out *extensions.DeploymentList, s conversion.Scope) error { + return autoConvert_v1beta1_DeploymentList_To_extensions_DeploymentList(in, out, s) +} + +func autoConvert_extensions_DeploymentList_To_v1beta1_DeploymentList(in *extensions.DeploymentList, out *v1beta1.DeploymentList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]v1beta1.Deployment, len(*in)) + for i := range *in { + if err := Convert_extensions_Deployment_To_v1beta1_Deployment(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Items = make([]v1beta1.Deployment, 0) + } + return nil +} + +// Convert_extensions_DeploymentList_To_v1beta1_DeploymentList is an autogenerated conversion function. +func Convert_extensions_DeploymentList_To_v1beta1_DeploymentList(in *extensions.DeploymentList, out *v1beta1.DeploymentList, s conversion.Scope) error { + return autoConvert_extensions_DeploymentList_To_v1beta1_DeploymentList(in, out, s) +} + +func autoConvert_v1beta1_DeploymentRollback_To_extensions_DeploymentRollback(in *v1beta1.DeploymentRollback, out *extensions.DeploymentRollback, s conversion.Scope) error { + out.Name = in.Name + out.UpdatedAnnotations = *(*map[string]string)(unsafe.Pointer(&in.UpdatedAnnotations)) + if err := Convert_v1beta1_RollbackConfig_To_extensions_RollbackConfig(&in.RollbackTo, &out.RollbackTo, s); err != nil { + return err + } + return nil +} + +// Convert_v1beta1_DeploymentRollback_To_extensions_DeploymentRollback is an autogenerated conversion function. +func Convert_v1beta1_DeploymentRollback_To_extensions_DeploymentRollback(in *v1beta1.DeploymentRollback, out *extensions.DeploymentRollback, s conversion.Scope) error { + return autoConvert_v1beta1_DeploymentRollback_To_extensions_DeploymentRollback(in, out, s) +} + +func autoConvert_extensions_DeploymentRollback_To_v1beta1_DeploymentRollback(in *extensions.DeploymentRollback, out *v1beta1.DeploymentRollback, s conversion.Scope) error { + out.Name = in.Name + out.UpdatedAnnotations = *(*map[string]string)(unsafe.Pointer(&in.UpdatedAnnotations)) + if err := Convert_extensions_RollbackConfig_To_v1beta1_RollbackConfig(&in.RollbackTo, &out.RollbackTo, s); err != nil { + return err + } + return nil +} + +// Convert_extensions_DeploymentRollback_To_v1beta1_DeploymentRollback is an autogenerated conversion function. +func Convert_extensions_DeploymentRollback_To_v1beta1_DeploymentRollback(in *extensions.DeploymentRollback, out *v1beta1.DeploymentRollback, s conversion.Scope) error { + return autoConvert_extensions_DeploymentRollback_To_v1beta1_DeploymentRollback(in, out, s) +} + +func autoConvert_v1beta1_DeploymentSpec_To_extensions_DeploymentSpec(in *v1beta1.DeploymentSpec, out *extensions.DeploymentSpec, s conversion.Scope) error { + if err := meta_v1.Convert_Pointer_int32_To_int32(&in.Replicas, &out.Replicas, s); err != nil { + return err + } + out.Selector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.Selector)) + if err := api_v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { + return err + } + if err := Convert_v1beta1_DeploymentStrategy_To_extensions_DeploymentStrategy(&in.Strategy, &out.Strategy, s); err != nil { + return err + } + out.MinReadySeconds = in.MinReadySeconds + out.RevisionHistoryLimit = (*int32)(unsafe.Pointer(in.RevisionHistoryLimit)) + out.Paused = in.Paused + out.RollbackTo = (*extensions.RollbackConfig)(unsafe.Pointer(in.RollbackTo)) + out.ProgressDeadlineSeconds = (*int32)(unsafe.Pointer(in.ProgressDeadlineSeconds)) + return nil +} + +func autoConvert_extensions_DeploymentSpec_To_v1beta1_DeploymentSpec(in *extensions.DeploymentSpec, out *v1beta1.DeploymentSpec, s conversion.Scope) error { + if err := meta_v1.Convert_int32_To_Pointer_int32(&in.Replicas, &out.Replicas, s); err != nil { + return err + } + out.Selector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.Selector)) + if err := api_v1.Convert_api_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { + return err + } + if err := Convert_extensions_DeploymentStrategy_To_v1beta1_DeploymentStrategy(&in.Strategy, &out.Strategy, s); err != nil { + return err + } + out.MinReadySeconds = in.MinReadySeconds + out.RevisionHistoryLimit = (*int32)(unsafe.Pointer(in.RevisionHistoryLimit)) + out.Paused = in.Paused + out.RollbackTo = (*v1beta1.RollbackConfig)(unsafe.Pointer(in.RollbackTo)) + out.ProgressDeadlineSeconds = (*int32)(unsafe.Pointer(in.ProgressDeadlineSeconds)) + return nil +} + +func autoConvert_v1beta1_DeploymentStatus_To_extensions_DeploymentStatus(in *v1beta1.DeploymentStatus, out *extensions.DeploymentStatus, s conversion.Scope) error { + out.ObservedGeneration = in.ObservedGeneration + out.Replicas = in.Replicas + out.UpdatedReplicas = in.UpdatedReplicas + out.ReadyReplicas = in.ReadyReplicas + out.AvailableReplicas = in.AvailableReplicas + out.UnavailableReplicas = in.UnavailableReplicas + out.Conditions = *(*[]extensions.DeploymentCondition)(unsafe.Pointer(&in.Conditions)) + out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + return nil +} + +// Convert_v1beta1_DeploymentStatus_To_extensions_DeploymentStatus is an autogenerated conversion function. +func Convert_v1beta1_DeploymentStatus_To_extensions_DeploymentStatus(in *v1beta1.DeploymentStatus, out *extensions.DeploymentStatus, s conversion.Scope) error { + return autoConvert_v1beta1_DeploymentStatus_To_extensions_DeploymentStatus(in, out, s) +} + +func autoConvert_extensions_DeploymentStatus_To_v1beta1_DeploymentStatus(in *extensions.DeploymentStatus, out *v1beta1.DeploymentStatus, s conversion.Scope) error { + out.ObservedGeneration = in.ObservedGeneration + out.Replicas = in.Replicas + out.UpdatedReplicas = in.UpdatedReplicas + out.ReadyReplicas = in.ReadyReplicas + out.AvailableReplicas = in.AvailableReplicas + out.UnavailableReplicas = in.UnavailableReplicas + out.Conditions = *(*[]v1beta1.DeploymentCondition)(unsafe.Pointer(&in.Conditions)) + out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + return nil +} + +// Convert_extensions_DeploymentStatus_To_v1beta1_DeploymentStatus is an autogenerated conversion function. +func Convert_extensions_DeploymentStatus_To_v1beta1_DeploymentStatus(in *extensions.DeploymentStatus, out *v1beta1.DeploymentStatus, s conversion.Scope) error { + return autoConvert_extensions_DeploymentStatus_To_v1beta1_DeploymentStatus(in, out, s) +} + +func autoConvert_v1beta1_DeploymentStrategy_To_extensions_DeploymentStrategy(in *v1beta1.DeploymentStrategy, out *extensions.DeploymentStrategy, s conversion.Scope) error { + out.Type = extensions.DeploymentStrategyType(in.Type) + if in.RollingUpdate != nil { + in, out := &in.RollingUpdate, &out.RollingUpdate + *out = new(extensions.RollingUpdateDeployment) + if err := Convert_v1beta1_RollingUpdateDeployment_To_extensions_RollingUpdateDeployment(*in, *out, s); err != nil { + return err + } + } else { + out.RollingUpdate = nil + } + return nil +} + +func autoConvert_extensions_DeploymentStrategy_To_v1beta1_DeploymentStrategy(in *extensions.DeploymentStrategy, out *v1beta1.DeploymentStrategy, s conversion.Scope) error { + out.Type = v1beta1.DeploymentStrategyType(in.Type) + if in.RollingUpdate != nil { + in, out := &in.RollingUpdate, &out.RollingUpdate + *out = new(v1beta1.RollingUpdateDeployment) + if err := Convert_extensions_RollingUpdateDeployment_To_v1beta1_RollingUpdateDeployment(*in, *out, s); err != nil { + return err + } + } else { + out.RollingUpdate = nil + } + return nil +} + +func autoConvert_v1beta1_RollbackConfig_To_extensions_RollbackConfig(in *v1beta1.RollbackConfig, out *extensions.RollbackConfig, s conversion.Scope) error { + out.Revision = in.Revision + return nil +} + +// Convert_v1beta1_RollbackConfig_To_extensions_RollbackConfig is an autogenerated conversion function. +func Convert_v1beta1_RollbackConfig_To_extensions_RollbackConfig(in *v1beta1.RollbackConfig, out *extensions.RollbackConfig, s conversion.Scope) error { + return autoConvert_v1beta1_RollbackConfig_To_extensions_RollbackConfig(in, out, s) +} + +func autoConvert_extensions_RollbackConfig_To_v1beta1_RollbackConfig(in *extensions.RollbackConfig, out *v1beta1.RollbackConfig, s conversion.Scope) error { + out.Revision = in.Revision + return nil +} + +// Convert_extensions_RollbackConfig_To_v1beta1_RollbackConfig is an autogenerated conversion function. +func Convert_extensions_RollbackConfig_To_v1beta1_RollbackConfig(in *extensions.RollbackConfig, out *v1beta1.RollbackConfig, s conversion.Scope) error { + return autoConvert_extensions_RollbackConfig_To_v1beta1_RollbackConfig(in, out, s) +} + +func autoConvert_v1beta1_RollingUpdateDeployment_To_extensions_RollingUpdateDeployment(in *v1beta1.RollingUpdateDeployment, out *extensions.RollingUpdateDeployment, s conversion.Scope) error { + // WARNING: in.MaxUnavailable requires manual conversion: inconvertible types (*k8s.io/apimachinery/pkg/util/intstr.IntOrString vs k8s.io/apimachinery/pkg/util/intstr.IntOrString) + // WARNING: in.MaxSurge requires manual conversion: inconvertible types (*k8s.io/apimachinery/pkg/util/intstr.IntOrString vs k8s.io/apimachinery/pkg/util/intstr.IntOrString) + return nil +} + +func autoConvert_extensions_RollingUpdateDeployment_To_v1beta1_RollingUpdateDeployment(in *extensions.RollingUpdateDeployment, out *v1beta1.RollingUpdateDeployment, s conversion.Scope) error { + // WARNING: in.MaxUnavailable requires manual conversion: inconvertible types (k8s.io/apimachinery/pkg/util/intstr.IntOrString vs *k8s.io/apimachinery/pkg/util/intstr.IntOrString) + // WARNING: in.MaxSurge requires manual conversion: inconvertible types (k8s.io/apimachinery/pkg/util/intstr.IntOrString vs *k8s.io/apimachinery/pkg/util/intstr.IntOrString) + return nil +} + func autoConvert_v1beta1_RollingUpdateStatefulSetStrategy_To_apps_RollingUpdateStatefulSetStrategy(in *v1beta1.RollingUpdateStatefulSetStrategy, out *apps.RollingUpdateStatefulSetStrategy, s conversion.Scope) error { - if err := v1.Convert_Pointer_int32_To_int32(&in.Partition, &out.Partition, s); err != nil { + if err := meta_v1.Convert_Pointer_int32_To_int32(&in.Partition, &out.Partition, s); err != nil { return err } return nil @@ -142,7 +431,7 @@ func Convert_v1beta1_RollingUpdateStatefulSetStrategy_To_apps_RollingUpdateState } func autoConvert_apps_RollingUpdateStatefulSetStrategy_To_v1beta1_RollingUpdateStatefulSetStrategy(in *apps.RollingUpdateStatefulSetStrategy, out *v1beta1.RollingUpdateStatefulSetStrategy, s conversion.Scope) error { - if err := v1.Convert_int32_To_Pointer_int32(&in.Partition, &out.Partition, s); err != nil { + if err := meta_v1.Convert_int32_To_Pointer_int32(&in.Partition, &out.Partition, s); err != nil { return err } return nil @@ -153,6 +442,71 @@ func Convert_apps_RollingUpdateStatefulSetStrategy_To_v1beta1_RollingUpdateState return autoConvert_apps_RollingUpdateStatefulSetStrategy_To_v1beta1_RollingUpdateStatefulSetStrategy(in, out, s) } +func autoConvert_v1beta1_Scale_To_extensions_Scale(in *v1beta1.Scale, out *extensions.Scale, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_v1beta1_ScaleSpec_To_extensions_ScaleSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + if err := Convert_v1beta1_ScaleStatus_To_extensions_ScaleStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +// Convert_v1beta1_Scale_To_extensions_Scale is an autogenerated conversion function. +func Convert_v1beta1_Scale_To_extensions_Scale(in *v1beta1.Scale, out *extensions.Scale, s conversion.Scope) error { + return autoConvert_v1beta1_Scale_To_extensions_Scale(in, out, s) +} + +func autoConvert_extensions_Scale_To_v1beta1_Scale(in *extensions.Scale, out *v1beta1.Scale, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_extensions_ScaleSpec_To_v1beta1_ScaleSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + if err := Convert_extensions_ScaleStatus_To_v1beta1_ScaleStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +// Convert_extensions_Scale_To_v1beta1_Scale is an autogenerated conversion function. +func Convert_extensions_Scale_To_v1beta1_Scale(in *extensions.Scale, out *v1beta1.Scale, s conversion.Scope) error { + return autoConvert_extensions_Scale_To_v1beta1_Scale(in, out, s) +} + +func autoConvert_v1beta1_ScaleSpec_To_extensions_ScaleSpec(in *v1beta1.ScaleSpec, out *extensions.ScaleSpec, s conversion.Scope) error { + out.Replicas = in.Replicas + return nil +} + +// Convert_v1beta1_ScaleSpec_To_extensions_ScaleSpec is an autogenerated conversion function. +func Convert_v1beta1_ScaleSpec_To_extensions_ScaleSpec(in *v1beta1.ScaleSpec, out *extensions.ScaleSpec, s conversion.Scope) error { + return autoConvert_v1beta1_ScaleSpec_To_extensions_ScaleSpec(in, out, s) +} + +func autoConvert_extensions_ScaleSpec_To_v1beta1_ScaleSpec(in *extensions.ScaleSpec, out *v1beta1.ScaleSpec, s conversion.Scope) error { + out.Replicas = in.Replicas + return nil +} + +// Convert_extensions_ScaleSpec_To_v1beta1_ScaleSpec is an autogenerated conversion function. +func Convert_extensions_ScaleSpec_To_v1beta1_ScaleSpec(in *extensions.ScaleSpec, out *v1beta1.ScaleSpec, s conversion.Scope) error { + return autoConvert_extensions_ScaleSpec_To_v1beta1_ScaleSpec(in, out, s) +} + +func autoConvert_v1beta1_ScaleStatus_To_extensions_ScaleStatus(in *v1beta1.ScaleStatus, out *extensions.ScaleStatus, s conversion.Scope) error { + out.Replicas = in.Replicas + // WARNING: in.Selector requires manual conversion: inconvertible types (map[string]string vs *k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector) + // WARNING: in.TargetSelector requires manual conversion: does not exist in peer-type + return nil +} + +func autoConvert_extensions_ScaleStatus_To_v1beta1_ScaleStatus(in *extensions.ScaleStatus, out *v1beta1.ScaleStatus, s conversion.Scope) error { + out.Replicas = in.Replicas + // WARNING: in.Selector requires manual conversion: inconvertible types (*k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector vs map[string]string) + return nil +} + func autoConvert_v1beta1_StatefulSet_To_apps_StatefulSet(in *v1beta1.StatefulSet, out *apps.StatefulSet, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta if err := Convert_v1beta1_StatefulSetSpec_To_apps_StatefulSetSpec(&in.Spec, &out.Spec, s); err != nil { @@ -228,10 +582,10 @@ func Convert_apps_StatefulSetList_To_v1beta1_StatefulSetList(in *apps.StatefulSe } func autoConvert_v1beta1_StatefulSetSpec_To_apps_StatefulSetSpec(in *v1beta1.StatefulSetSpec, out *apps.StatefulSetSpec, s conversion.Scope) error { - if err := v1.Convert_Pointer_int32_To_int32(&in.Replicas, &out.Replicas, s); err != nil { + if err := meta_v1.Convert_Pointer_int32_To_int32(&in.Replicas, &out.Replicas, s); err != nil { return err } - out.Selector = (*v1.LabelSelector)(unsafe.Pointer(in.Selector)) + out.Selector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.Selector)) if err := api_v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { return err } @@ -246,14 +600,14 @@ func autoConvert_v1beta1_StatefulSetSpec_To_apps_StatefulSetSpec(in *v1beta1.Sta } func autoConvert_apps_StatefulSetSpec_To_v1beta1_StatefulSetSpec(in *apps.StatefulSetSpec, out *v1beta1.StatefulSetSpec, s conversion.Scope) error { - if err := v1.Convert_int32_To_Pointer_int32(&in.Replicas, &out.Replicas, s); err != nil { + if err := meta_v1.Convert_int32_To_Pointer_int32(&in.Replicas, &out.Replicas, s); err != nil { return err } - out.Selector = (*v1.LabelSelector)(unsafe.Pointer(in.Selector)) + out.Selector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.Selector)) if err := api_v1.Convert_api_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { return err } - out.VolumeClaimTemplates = *(*[]core_v1.PersistentVolumeClaim)(unsafe.Pointer(&in.VolumeClaimTemplates)) + out.VolumeClaimTemplates = *(*[]v1.PersistentVolumeClaim)(unsafe.Pointer(&in.VolumeClaimTemplates)) out.ServiceName = in.ServiceName out.PodManagementPolicy = v1beta1.PodManagementPolicyType(in.PodManagementPolicy) if err := Convert_apps_StatefulSetUpdateStrategy_To_v1beta1_StatefulSetUpdateStrategy(&in.UpdateStrategy, &out.UpdateStrategy, s); err != nil { @@ -271,6 +625,7 @@ func autoConvert_v1beta1_StatefulSetStatus_To_apps_StatefulSetStatus(in *v1beta1 out.UpdatedReplicas = in.UpdatedReplicas out.CurrentRevision = in.CurrentRevision out.UpdateRevision = in.UpdateRevision + out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) return nil } @@ -287,6 +642,7 @@ func autoConvert_apps_StatefulSetStatus_To_v1beta1_StatefulSetStatus(in *apps.St out.UpdatedReplicas = in.UpdatedReplicas out.CurrentRevision = in.CurrentRevision out.UpdateRevision = in.UpdateRevision + out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) return nil } diff --git a/pkg/apis/apps/v1beta2/BUILD b/pkg/apis/apps/v1beta2/BUILD index 447128368a4..ae7e3be562f 100644 --- a/pkg/apis/apps/v1beta2/BUILD +++ b/pkg/apis/apps/v1beta2/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1:go_default_library", @@ -50,12 +47,11 @@ filegroup( go_test( name = "go_default_xtest", srcs = ["defaults_test.go"], - tags = ["automanaged"], deps = [ + ":go_default_library", "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", "//pkg/apis/apps/install:go_default_library", - "//pkg/apis/apps/v1beta2:go_default_library", "//vendor/k8s.io/api/apps/v1beta2:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", diff --git a/pkg/apis/apps/v1beta2/conversion.go b/pkg/apis/apps/v1beta2/conversion.go index 7fc32b3ccb4..02340a01076 100644 --- a/pkg/apis/apps/v1beta2/conversion.go +++ b/pkg/apis/apps/v1beta2/conversion.go @@ -18,6 +18,7 @@ package v1beta2 import ( "fmt" + "strconv" appsv1beta2 "k8s.io/api/apps/v1beta2" "k8s.io/api/core/v1" @@ -45,6 +46,8 @@ func addConversionFuncs(scheme *runtime.Scheme) error { Convert_v1beta2_RollingUpdateDaemonSet_To_extensions_RollingUpdateDaemonSet, Convert_v1beta2_StatefulSetStatus_To_apps_StatefulSetStatus, Convert_apps_StatefulSetStatus_To_v1beta2_StatefulSetStatus, + Convert_v1beta2_Deployment_To_extensions_Deployment, + Convert_extensions_Deployment_To_v1beta2_Deployment, // extensions // TODO: below conversions should be dropped in favor of auto-generated // ones, see https://github.com/kubernetes/kubernetes/issues/39865 @@ -234,6 +237,10 @@ func Convert_v1beta2_StatefulSetStatus_To_apps_StatefulSetStatus(in *appsv1beta2 out.UpdatedReplicas = in.UpdatedReplicas out.CurrentRevision = in.CurrentRevision out.UpdateRevision = in.UpdateRevision + if in.CollisionCount != nil { + out.CollisionCount = new(int64) + *out.CollisionCount = *in.CollisionCount + } return nil } @@ -247,6 +254,10 @@ func Convert_apps_StatefulSetStatus_To_v1beta2_StatefulSetStatus(in *apps.Statef out.UpdatedReplicas = in.UpdatedReplicas out.CurrentRevision = in.CurrentRevision out.UpdateRevision = in.UpdateRevision + if in.CollisionCount != nil { + out.CollisionCount = new(int64) + *out.CollisionCount = *in.CollisionCount + } return nil } @@ -310,12 +321,6 @@ func Convert_v1beta2_DeploymentSpec_To_extensions_DeploymentSpec(in *appsv1beta2 out.RevisionHistoryLimit = in.RevisionHistoryLimit out.MinReadySeconds = in.MinReadySeconds out.Paused = in.Paused - if in.RollbackTo != nil { - out.RollbackTo = new(extensions.RollbackConfig) - out.RollbackTo.Revision = in.RollbackTo.Revision - } else { - out.RollbackTo = nil - } if in.ProgressDeadlineSeconds != nil { out.ProgressDeadlineSeconds = new(int32) *out.ProgressDeadlineSeconds = *in.ProgressDeadlineSeconds @@ -338,12 +343,6 @@ func Convert_extensions_DeploymentSpec_To_v1beta2_DeploymentSpec(in *extensions. } out.MinReadySeconds = int32(in.MinReadySeconds) out.Paused = in.Paused - if in.RollbackTo != nil { - out.RollbackTo = new(appsv1beta2.RollbackConfig) - out.RollbackTo.Revision = int64(in.RollbackTo.Revision) - } else { - out.RollbackTo = nil - } if in.ProgressDeadlineSeconds != nil { out.ProgressDeadlineSeconds = new(int32) *out.ProgressDeadlineSeconds = *in.ProgressDeadlineSeconds @@ -414,6 +413,32 @@ func Convert_extensions_ReplicaSetSpec_To_v1beta2_ReplicaSetSpec(in *extensions. return nil } +func Convert_v1beta2_Deployment_To_extensions_Deployment(in *appsv1beta2.Deployment, out *extensions.Deployment, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_v1beta2_DeploymentSpec_To_extensions_DeploymentSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + + // Copy annotation to deprecated rollbackTo field for roundtrip + // TODO: remove this conversion after we delete extensions/v1beta1 and apps/v1beta1 Deployment + if revision, _ := in.Annotations[appsv1beta2.DeprecatedRollbackTo]; revision != "" { + if revision64, err := strconv.ParseInt(revision, 10, 64); err != nil { + return fmt.Errorf("failed to parse annotation[%s]=%s as int64: %v", appsv1beta2.DeprecatedRollbackTo, revision, err) + } else { + out.Spec.RollbackTo = new(extensions.RollbackConfig) + out.Spec.RollbackTo.Revision = revision64 + } + delete(out.Annotations, appsv1beta2.DeprecatedRollbackTo) + } else { + out.Spec.RollbackTo = nil + } + + if err := Convert_v1beta2_DeploymentStatus_To_extensions_DeploymentStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + func Convert_v1beta2_ReplicaSetSpec_To_extensions_ReplicaSetSpec(in *appsv1beta2.ReplicaSetSpec, out *extensions.ReplicaSetSpec, s conversion.Scope) error { if in.Replicas != nil { out.Replicas = *in.Replicas @@ -425,3 +450,26 @@ func Convert_v1beta2_ReplicaSetSpec_To_extensions_ReplicaSetSpec(in *appsv1beta2 } return nil } + +func Convert_extensions_Deployment_To_v1beta2_Deployment(in *extensions.Deployment, out *appsv1beta2.Deployment, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_extensions_DeploymentSpec_To_v1beta2_DeploymentSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + + // Copy deprecated rollbackTo field to annotation for roundtrip + // TODO: remove this conversion after we delete extensions/v1beta1 and apps/v1beta1 Deployment + if in.Spec.RollbackTo != nil { + if out.Annotations == nil { + out.Annotations = make(map[string]string) + } + out.Annotations[appsv1beta2.DeprecatedRollbackTo] = strconv.FormatInt(in.Spec.RollbackTo.Revision, 10) + } else { + delete(out.Annotations, appsv1beta2.DeprecatedRollbackTo) + } + + if err := Convert_extensions_DeploymentStatus_To_v1beta2_DeploymentStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} diff --git a/pkg/apis/apps/v1beta2/defaults.go b/pkg/apis/apps/v1beta2/defaults.go index f1046b16ff5..c93db681dad 100644 --- a/pkg/apis/apps/v1beta2/defaults.go +++ b/pkg/apis/apps/v1beta2/defaults.go @@ -18,7 +18,6 @@ package v1beta2 import ( appsv1beta2 "k8s.io/api/apps/v1beta2" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" ) @@ -28,22 +27,9 @@ func addDefaultingFuncs(scheme *runtime.Scheme) error { } func SetDefaults_DaemonSet(obj *appsv1beta2.DaemonSet) { - labels := obj.Spec.Template.Labels - - // TODO: support templates defined elsewhere when we support them in the API - if labels != nil { - if obj.Spec.Selector == nil { - obj.Spec.Selector = &metav1.LabelSelector{ - MatchLabels: labels, - } - } - if len(obj.Labels) == 0 { - obj.Labels = labels - } - } updateStrategy := &obj.Spec.UpdateStrategy if updateStrategy.Type == "" { - updateStrategy.Type = appsv1beta2.OnDeleteDaemonSetStrategyType + updateStrategy.Type = appsv1beta2.RollingUpdateDaemonSetStrategyType } if updateStrategy.Type == appsv1beta2.RollingUpdateDaemonSetStrategyType { if updateStrategy.RollingUpdate == nil { @@ -68,19 +54,19 @@ func SetDefaults_StatefulSet(obj *appsv1beta2.StatefulSet) { } if obj.Spec.UpdateStrategy.Type == "" { - obj.Spec.UpdateStrategy.Type = appsv1beta2.OnDeleteStatefulSetStrategyType + obj.Spec.UpdateStrategy.Type = appsv1beta2.RollingUpdateStatefulSetStrategyType + + // UpdateStrategy.RollingUpdate will take default values below. + obj.Spec.UpdateStrategy.RollingUpdate = &appsv1beta2.RollingUpdateStatefulSetStrategy{} } - labels := obj.Spec.Template.Labels - if labels != nil { - if obj.Spec.Selector == nil { - obj.Spec.Selector = &metav1.LabelSelector{ - MatchLabels: labels, - } - } - if len(obj.Labels) == 0 { - obj.Labels = labels - } + + if obj.Spec.UpdateStrategy.Type == appsv1beta2.RollingUpdateStatefulSetStrategyType && + obj.Spec.UpdateStrategy.RollingUpdate != nil && + obj.Spec.UpdateStrategy.RollingUpdate.Partition == nil { + obj.Spec.UpdateStrategy.RollingUpdate.Partition = new(int32) + *obj.Spec.UpdateStrategy.RollingUpdate.Partition = 0 } + if obj.Spec.Replicas == nil { obj.Spec.Replicas = new(int32) *obj.Spec.Replicas = 1 @@ -89,13 +75,6 @@ func SetDefaults_StatefulSet(obj *appsv1beta2.StatefulSet) { obj.Spec.RevisionHistoryLimit = new(int32) *obj.Spec.RevisionHistoryLimit = 10 } - if obj.Spec.UpdateStrategy.Type == appsv1beta2.RollingUpdateStatefulSetStrategyType && - obj.Spec.UpdateStrategy.RollingUpdate != nil && - obj.Spec.UpdateStrategy.RollingUpdate.Partition == nil { - obj.Spec.UpdateStrategy.RollingUpdate.Partition = new(int32) - *obj.Spec.UpdateStrategy.RollingUpdate.Partition = 0 - } - } // SetDefaults_Deployment sets additional defaults compared to its counterpart @@ -105,17 +84,6 @@ func SetDefaults_StatefulSet(obj *appsv1beta2.StatefulSet) { // - RevisionHistoryLimit set to 10 (not set in extensions) // - ProgressDeadlineSeconds set to 600s (not set in extensions) func SetDefaults_Deployment(obj *appsv1beta2.Deployment) { - // Default labels and selector to labels from pod template spec. - labels := obj.Spec.Template.Labels - - if labels != nil { - if obj.Spec.Selector == nil { - obj.Spec.Selector = &metav1.LabelSelector{MatchLabels: labels} - } - if len(obj.Labels) == 0 { - obj.Labels = labels - } - } // Set appsv1beta2.DeploymentSpec.Replicas to 1 if it is not set. if obj.Spec.Replicas == nil { obj.Spec.Replicas = new(int32) @@ -153,19 +121,6 @@ func SetDefaults_Deployment(obj *appsv1beta2.Deployment) { } func SetDefaults_ReplicaSet(obj *appsv1beta2.ReplicaSet) { - labels := obj.Spec.Template.Labels - - // TODO: support templates defined elsewhere when we support them in the API - if labels != nil { - if obj.Spec.Selector == nil { - obj.Spec.Selector = &metav1.LabelSelector{ - MatchLabels: labels, - } - } - if len(obj.Labels) == 0 { - obj.Labels = labels - } - } if obj.Spec.Replicas == nil { obj.Spec.Replicas = new(int32) *obj.Spec.Replicas = 1 diff --git a/pkg/apis/apps/v1beta2/defaults_test.go b/pkg/apis/apps/v1beta2/defaults_test.go index d017a52688c..19bef1c1893 100644 --- a/pkg/apis/apps/v1beta2/defaults_test.go +++ b/pkg/apis/apps/v1beta2/defaults_test.go @@ -21,7 +21,6 @@ import ( "testing" appsv1beta2 "k8s.io/api/apps/v1beta2" - "k8s.io/api/core/v1" apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/api/resource" @@ -36,6 +35,7 @@ import ( func TestSetDefaultDaemonSetSpec(t *testing.T) { defaultLabels := map[string]string{"foo": "bar"} + maxUnavailable := intstr.FromInt(1) period := int64(v1.DefaultTerminationGracePeriodSeconds) defaultTemplate := v1.PodTemplateSpec{ Spec: v1.PodSpec{ @@ -73,12 +73,12 @@ func TestSetDefaultDaemonSetSpec(t *testing.T) { Labels: defaultLabels, }, Spec: appsv1beta2.DaemonSetSpec{ - Selector: &metav1.LabelSelector{ - MatchLabels: defaultLabels, - }, Template: defaultTemplate, UpdateStrategy: appsv1beta2.DaemonSetUpdateStrategy{ - Type: appsv1beta2.OnDeleteDaemonSetStrategyType, + Type: appsv1beta2.RollingUpdateStatefulSetStrategyType, + RollingUpdate: &appsv1beta2.RollingUpdateDaemonSet{ + MaxUnavailable: &maxUnavailable, + }, }, RevisionHistoryLimit: newInt32(10), }, @@ -103,19 +103,26 @@ func TestSetDefaultDaemonSetSpec(t *testing.T) { }, }, Spec: appsv1beta2.DaemonSetSpec{ - Selector: &metav1.LabelSelector{ - MatchLabels: defaultLabels, - }, Template: defaultTemplate, UpdateStrategy: appsv1beta2.DaemonSetUpdateStrategy{ - Type: appsv1beta2.OnDeleteDaemonSetStrategyType, + Type: appsv1beta2.RollingUpdateStatefulSetStrategyType, + RollingUpdate: &appsv1beta2.RollingUpdateDaemonSet{ + MaxUnavailable: &maxUnavailable, + }, }, RevisionHistoryLimit: newInt32(1), }, }, }, - { // Update strategy. - original: &appsv1beta2.DaemonSet{}, + { // OnDeleteDaemonSetStrategyType update strategy. + original: &appsv1beta2.DaemonSet{ + Spec: appsv1beta2.DaemonSetSpec{ + Template: templateNoLabel, + UpdateStrategy: appsv1beta2.DaemonSetUpdateStrategy{ + Type: appsv1beta2.OnDeleteDaemonSetStrategyType, + }, + }, + }, expected: &appsv1beta2.DaemonSet{ Spec: appsv1beta2.DaemonSetSpec{ Template: templateNoLabel, @@ -134,7 +141,10 @@ func TestSetDefaultDaemonSetSpec(t *testing.T) { Spec: appsv1beta2.DaemonSetSpec{ Template: templateNoLabel, UpdateStrategy: appsv1beta2.DaemonSetUpdateStrategy{ - Type: appsv1beta2.OnDeleteDaemonSetStrategyType, + Type: appsv1beta2.RollingUpdateStatefulSetStrategyType, + RollingUpdate: &appsv1beta2.RollingUpdateDaemonSet{ + MaxUnavailable: &maxUnavailable, + }, }, RevisionHistoryLimit: newInt32(10), }, @@ -157,6 +167,119 @@ func TestSetDefaultDaemonSetSpec(t *testing.T) { } } +func TestSetDefaultStatefulSet(t *testing.T) { + defaultLabels := map[string]string{"foo": "bar"} + var defaultPartition int32 = 0 + var defaultReplicas int32 = 1 + + period := int64(v1.DefaultTerminationGracePeriodSeconds) + defaultTemplate := v1.PodTemplateSpec{ + Spec: v1.PodSpec{ + DNSPolicy: v1.DNSClusterFirst, + RestartPolicy: v1.RestartPolicyAlways, + SecurityContext: &v1.PodSecurityContext{}, + TerminationGracePeriodSeconds: &period, + SchedulerName: api.DefaultSchedulerName, + }, + ObjectMeta: metav1.ObjectMeta{ + Labels: defaultLabels, + }, + } + + tests := []struct { + original *appsv1beta2.StatefulSet + expected *appsv1beta2.StatefulSet + }{ + { // labels and default update strategy + original: &appsv1beta2.StatefulSet{ + Spec: appsv1beta2.StatefulSetSpec{ + Template: defaultTemplate, + }, + }, + expected: &appsv1beta2.StatefulSet{ + ObjectMeta: metav1.ObjectMeta{ + Labels: defaultLabels, + }, + Spec: appsv1beta2.StatefulSetSpec{ + Replicas: &defaultReplicas, + Template: defaultTemplate, + PodManagementPolicy: appsv1beta2.OrderedReadyPodManagement, + UpdateStrategy: appsv1beta2.StatefulSetUpdateStrategy{ + Type: appsv1beta2.RollingUpdateStatefulSetStrategyType, + RollingUpdate: &appsv1beta2.RollingUpdateStatefulSetStrategy{ + Partition: &defaultPartition, + }, + }, + RevisionHistoryLimit: newInt32(10), + }, + }, + }, + { // Alternate update strategy + original: &appsv1beta2.StatefulSet{ + Spec: appsv1beta2.StatefulSetSpec{ + Template: defaultTemplate, + UpdateStrategy: appsv1beta2.StatefulSetUpdateStrategy{ + Type: appsv1beta2.OnDeleteStatefulSetStrategyType, + }, + }, + }, + expected: &appsv1beta2.StatefulSet{ + ObjectMeta: metav1.ObjectMeta{ + Labels: defaultLabels, + }, + Spec: appsv1beta2.StatefulSetSpec{ + Replicas: &defaultReplicas, + Template: defaultTemplate, + PodManagementPolicy: appsv1beta2.OrderedReadyPodManagement, + UpdateStrategy: appsv1beta2.StatefulSetUpdateStrategy{ + Type: appsv1beta2.OnDeleteStatefulSetStrategyType, + }, + RevisionHistoryLimit: newInt32(10), + }, + }, + }, + { // Parallel pod management policy. + original: &appsv1beta2.StatefulSet{ + Spec: appsv1beta2.StatefulSetSpec{ + Template: defaultTemplate, + PodManagementPolicy: appsv1beta2.ParallelPodManagement, + }, + }, + expected: &appsv1beta2.StatefulSet{ + ObjectMeta: metav1.ObjectMeta{ + Labels: defaultLabels, + }, + Spec: appsv1beta2.StatefulSetSpec{ + Replicas: &defaultReplicas, + Template: defaultTemplate, + PodManagementPolicy: appsv1beta2.ParallelPodManagement, + UpdateStrategy: appsv1beta2.StatefulSetUpdateStrategy{ + Type: appsv1beta2.RollingUpdateStatefulSetStrategyType, + RollingUpdate: &appsv1beta2.RollingUpdateStatefulSetStrategy{ + Partition: &defaultPartition, + }, + }, + RevisionHistoryLimit: newInt32(10), + }, + }, + }, + } + + for i, test := range tests { + original := test.original + expected := test.expected + obj2 := roundTrip(t, runtime.Object(original)) + got, ok := obj2.(*appsv1beta2.StatefulSet) + if !ok { + t.Errorf("(%d) unexpected object: %v", i, got) + t.FailNow() + } + if !apiequality.Semantic.DeepEqual(got.Spec, expected.Spec) { + t.Errorf("(%d) got different than expected\ngot:\n\t%+v\nexpected:\n\t%+v", i, got.Spec, expected.Spec) + } + } +} + func TestSetDefaultDeployment(t *testing.T) { defaultIntOrString := intstr.FromString("25%") differentIntOrString := intstr.FromInt(5) @@ -320,119 +443,6 @@ func TestDefaultDeploymentAvailability(t *testing.T) { } } -func TestSetDefaultReplicaSet(t *testing.T) { - tests := []struct { - rs *appsv1beta2.ReplicaSet - expectLabels bool - expectSelector bool - }{ - { - rs: &appsv1beta2.ReplicaSet{ - Spec: appsv1beta2.ReplicaSetSpec{ - Template: v1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectLabels: true, - expectSelector: true, - }, - { - rs: &appsv1beta2.ReplicaSet{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{ - "bar": "foo", - }, - }, - Spec: appsv1beta2.ReplicaSetSpec{ - Template: v1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectLabels: false, - expectSelector: true, - }, - { - rs: &appsv1beta2.ReplicaSet{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{ - "bar": "foo", - }, - }, - Spec: appsv1beta2.ReplicaSetSpec{ - Selector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "some": "other", - }, - }, - Template: v1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectLabels: false, - expectSelector: false, - }, - { - rs: &appsv1beta2.ReplicaSet{ - Spec: appsv1beta2.ReplicaSetSpec{ - Selector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "some": "other", - }, - }, - Template: v1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectLabels: true, - expectSelector: false, - }, - } - - for _, test := range tests { - rs := test.rs - obj2 := roundTrip(t, runtime.Object(rs)) - rs2, ok := obj2.(*appsv1beta2.ReplicaSet) - if !ok { - t.Errorf("unexpected object: %v", rs2) - t.FailNow() - } - if test.expectSelector != reflect.DeepEqual(rs2.Spec.Selector.MatchLabels, rs2.Spec.Template.Labels) { - if test.expectSelector { - t.Errorf("expected: %v, got: %v", rs2.Spec.Template.Labels, rs2.Spec.Selector) - } else { - t.Errorf("unexpected equality: %v", rs.Spec.Selector) - } - } - if test.expectLabels != reflect.DeepEqual(rs2.Labels, rs2.Spec.Template.Labels) { - if test.expectLabels { - t.Errorf("expected: %v, got: %v", rs2.Spec.Template.Labels, rs2.Labels) - } else { - t.Errorf("unexpected equality: %v", rs.Labels) - } - } - } -} - func TestSetDefaultReplicaSetReplicas(t *testing.T) { tests := []struct { rs appsv1beta2.ReplicaSet diff --git a/pkg/apis/apps/v1beta2/doc.go b/pkg/apis/apps/v1beta2/doc.go index 6cea002d3f5..9a0bb581994 100644 --- a/pkg/apis/apps/v1beta2/doc.go +++ b/pkg/apis/apps/v1beta2/doc.go @@ -15,6 +15,7 @@ limitations under the License. */ // +k8s:conversion-gen=k8s.io/kubernetes/pkg/apis/apps +// +k8s:conversion-gen=k8s.io/kubernetes/pkg/apis/extensions // +k8s:conversion-gen-external-types=../../../../vendor/k8s.io/api/apps/v1beta2 // +k8s:defaulter-gen=TypeMeta // +k8s:defaulter-gen-input=../../../../vendor/k8s.io/api/apps/v1beta2 diff --git a/pkg/apis/apps/v1beta2/zz_generated.conversion.go b/pkg/apis/apps/v1beta2/zz_generated.conversion.go index 7bda17f45d6..d0042e747e3 100644 --- a/pkg/apis/apps/v1beta2/zz_generated.conversion.go +++ b/pkg/apis/apps/v1beta2/zz_generated.conversion.go @@ -29,6 +29,7 @@ import ( api "k8s.io/kubernetes/pkg/api" api_v1 "k8s.io/kubernetes/pkg/api/v1" apps "k8s.io/kubernetes/pkg/apis/apps" + extensions "k8s.io/kubernetes/pkg/apis/extensions" unsafe "unsafe" ) @@ -40,8 +41,50 @@ func init() { // Public to allow building arbitrary schemes. func RegisterConversions(scheme *runtime.Scheme) error { return scheme.AddGeneratedConversionFuncs( + Convert_v1beta2_DaemonSet_To_extensions_DaemonSet, + Convert_extensions_DaemonSet_To_v1beta2_DaemonSet, + Convert_v1beta2_DaemonSetList_To_extensions_DaemonSetList, + Convert_extensions_DaemonSetList_To_v1beta2_DaemonSetList, + Convert_v1beta2_DaemonSetSpec_To_extensions_DaemonSetSpec, + Convert_extensions_DaemonSetSpec_To_v1beta2_DaemonSetSpec, + Convert_v1beta2_DaemonSetStatus_To_extensions_DaemonSetStatus, + Convert_extensions_DaemonSetStatus_To_v1beta2_DaemonSetStatus, + Convert_v1beta2_DaemonSetUpdateStrategy_To_extensions_DaemonSetUpdateStrategy, + Convert_extensions_DaemonSetUpdateStrategy_To_v1beta2_DaemonSetUpdateStrategy, + Convert_v1beta2_Deployment_To_extensions_Deployment, + Convert_extensions_Deployment_To_v1beta2_Deployment, + Convert_v1beta2_DeploymentCondition_To_extensions_DeploymentCondition, + Convert_extensions_DeploymentCondition_To_v1beta2_DeploymentCondition, + Convert_v1beta2_DeploymentList_To_extensions_DeploymentList, + Convert_extensions_DeploymentList_To_v1beta2_DeploymentList, + Convert_v1beta2_DeploymentSpec_To_extensions_DeploymentSpec, + Convert_extensions_DeploymentSpec_To_v1beta2_DeploymentSpec, + Convert_v1beta2_DeploymentStatus_To_extensions_DeploymentStatus, + Convert_extensions_DeploymentStatus_To_v1beta2_DeploymentStatus, + Convert_v1beta2_DeploymentStrategy_To_extensions_DeploymentStrategy, + Convert_extensions_DeploymentStrategy_To_v1beta2_DeploymentStrategy, + Convert_v1beta2_ReplicaSet_To_extensions_ReplicaSet, + Convert_extensions_ReplicaSet_To_v1beta2_ReplicaSet, + Convert_v1beta2_ReplicaSetCondition_To_extensions_ReplicaSetCondition, + Convert_extensions_ReplicaSetCondition_To_v1beta2_ReplicaSetCondition, + Convert_v1beta2_ReplicaSetList_To_extensions_ReplicaSetList, + Convert_extensions_ReplicaSetList_To_v1beta2_ReplicaSetList, + Convert_v1beta2_ReplicaSetSpec_To_extensions_ReplicaSetSpec, + Convert_extensions_ReplicaSetSpec_To_v1beta2_ReplicaSetSpec, + Convert_v1beta2_ReplicaSetStatus_To_extensions_ReplicaSetStatus, + Convert_extensions_ReplicaSetStatus_To_v1beta2_ReplicaSetStatus, + Convert_v1beta2_RollingUpdateDaemonSet_To_extensions_RollingUpdateDaemonSet, + Convert_extensions_RollingUpdateDaemonSet_To_v1beta2_RollingUpdateDaemonSet, + Convert_v1beta2_RollingUpdateDeployment_To_extensions_RollingUpdateDeployment, + Convert_extensions_RollingUpdateDeployment_To_v1beta2_RollingUpdateDeployment, Convert_v1beta2_RollingUpdateStatefulSetStrategy_To_apps_RollingUpdateStatefulSetStrategy, Convert_apps_RollingUpdateStatefulSetStrategy_To_v1beta2_RollingUpdateStatefulSetStrategy, + Convert_v1beta2_Scale_To_extensions_Scale, + Convert_extensions_Scale_To_v1beta2_Scale, + Convert_v1beta2_ScaleSpec_To_extensions_ScaleSpec, + Convert_extensions_ScaleSpec_To_v1beta2_ScaleSpec, + Convert_v1beta2_ScaleStatus_To_extensions_ScaleStatus, + Convert_extensions_ScaleStatus_To_v1beta2_ScaleStatus, Convert_v1beta2_StatefulSet_To_apps_StatefulSet, Convert_apps_StatefulSet_To_v1beta2_StatefulSet, Convert_v1beta2_StatefulSetList_To_apps_StatefulSetList, @@ -55,6 +98,563 @@ func RegisterConversions(scheme *runtime.Scheme) error { ) } +func autoConvert_v1beta2_DaemonSet_To_extensions_DaemonSet(in *v1beta2.DaemonSet, out *extensions.DaemonSet, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_v1beta2_DaemonSetSpec_To_extensions_DaemonSetSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + if err := Convert_v1beta2_DaemonSetStatus_To_extensions_DaemonSetStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +// Convert_v1beta2_DaemonSet_To_extensions_DaemonSet is an autogenerated conversion function. +func Convert_v1beta2_DaemonSet_To_extensions_DaemonSet(in *v1beta2.DaemonSet, out *extensions.DaemonSet, s conversion.Scope) error { + return autoConvert_v1beta2_DaemonSet_To_extensions_DaemonSet(in, out, s) +} + +func autoConvert_extensions_DaemonSet_To_v1beta2_DaemonSet(in *extensions.DaemonSet, out *v1beta2.DaemonSet, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_extensions_DaemonSetSpec_To_v1beta2_DaemonSetSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + if err := Convert_extensions_DaemonSetStatus_To_v1beta2_DaemonSetStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +// Convert_extensions_DaemonSet_To_v1beta2_DaemonSet is an autogenerated conversion function. +func Convert_extensions_DaemonSet_To_v1beta2_DaemonSet(in *extensions.DaemonSet, out *v1beta2.DaemonSet, s conversion.Scope) error { + return autoConvert_extensions_DaemonSet_To_v1beta2_DaemonSet(in, out, s) +} + +func autoConvert_v1beta2_DaemonSetList_To_extensions_DaemonSetList(in *v1beta2.DaemonSetList, out *extensions.DaemonSetList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]extensions.DaemonSet, len(*in)) + for i := range *in { + if err := Convert_v1beta2_DaemonSet_To_extensions_DaemonSet(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Items = nil + } + return nil +} + +// Convert_v1beta2_DaemonSetList_To_extensions_DaemonSetList is an autogenerated conversion function. +func Convert_v1beta2_DaemonSetList_To_extensions_DaemonSetList(in *v1beta2.DaemonSetList, out *extensions.DaemonSetList, s conversion.Scope) error { + return autoConvert_v1beta2_DaemonSetList_To_extensions_DaemonSetList(in, out, s) +} + +func autoConvert_extensions_DaemonSetList_To_v1beta2_DaemonSetList(in *extensions.DaemonSetList, out *v1beta2.DaemonSetList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]v1beta2.DaemonSet, len(*in)) + for i := range *in { + if err := Convert_extensions_DaemonSet_To_v1beta2_DaemonSet(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Items = make([]v1beta2.DaemonSet, 0) + } + return nil +} + +// Convert_extensions_DaemonSetList_To_v1beta2_DaemonSetList is an autogenerated conversion function. +func Convert_extensions_DaemonSetList_To_v1beta2_DaemonSetList(in *extensions.DaemonSetList, out *v1beta2.DaemonSetList, s conversion.Scope) error { + return autoConvert_extensions_DaemonSetList_To_v1beta2_DaemonSetList(in, out, s) +} + +func autoConvert_v1beta2_DaemonSetSpec_To_extensions_DaemonSetSpec(in *v1beta2.DaemonSetSpec, out *extensions.DaemonSetSpec, s conversion.Scope) error { + out.Selector = (*v1.LabelSelector)(unsafe.Pointer(in.Selector)) + if err := api_v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { + return err + } + if err := Convert_v1beta2_DaemonSetUpdateStrategy_To_extensions_DaemonSetUpdateStrategy(&in.UpdateStrategy, &out.UpdateStrategy, s); err != nil { + return err + } + out.MinReadySeconds = in.MinReadySeconds + out.TemplateGeneration = in.TemplateGeneration + out.RevisionHistoryLimit = (*int32)(unsafe.Pointer(in.RevisionHistoryLimit)) + return nil +} + +// Convert_v1beta2_DaemonSetSpec_To_extensions_DaemonSetSpec is an autogenerated conversion function. +func Convert_v1beta2_DaemonSetSpec_To_extensions_DaemonSetSpec(in *v1beta2.DaemonSetSpec, out *extensions.DaemonSetSpec, s conversion.Scope) error { + return autoConvert_v1beta2_DaemonSetSpec_To_extensions_DaemonSetSpec(in, out, s) +} + +func autoConvert_extensions_DaemonSetSpec_To_v1beta2_DaemonSetSpec(in *extensions.DaemonSetSpec, out *v1beta2.DaemonSetSpec, s conversion.Scope) error { + out.Selector = (*v1.LabelSelector)(unsafe.Pointer(in.Selector)) + if err := api_v1.Convert_api_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { + return err + } + if err := Convert_extensions_DaemonSetUpdateStrategy_To_v1beta2_DaemonSetUpdateStrategy(&in.UpdateStrategy, &out.UpdateStrategy, s); err != nil { + return err + } + out.MinReadySeconds = in.MinReadySeconds + out.TemplateGeneration = in.TemplateGeneration + out.RevisionHistoryLimit = (*int32)(unsafe.Pointer(in.RevisionHistoryLimit)) + return nil +} + +// Convert_extensions_DaemonSetSpec_To_v1beta2_DaemonSetSpec is an autogenerated conversion function. +func Convert_extensions_DaemonSetSpec_To_v1beta2_DaemonSetSpec(in *extensions.DaemonSetSpec, out *v1beta2.DaemonSetSpec, s conversion.Scope) error { + return autoConvert_extensions_DaemonSetSpec_To_v1beta2_DaemonSetSpec(in, out, s) +} + +func autoConvert_v1beta2_DaemonSetStatus_To_extensions_DaemonSetStatus(in *v1beta2.DaemonSetStatus, out *extensions.DaemonSetStatus, s conversion.Scope) error { + out.CurrentNumberScheduled = in.CurrentNumberScheduled + out.NumberMisscheduled = in.NumberMisscheduled + out.DesiredNumberScheduled = in.DesiredNumberScheduled + out.NumberReady = in.NumberReady + out.ObservedGeneration = in.ObservedGeneration + out.UpdatedNumberScheduled = in.UpdatedNumberScheduled + out.NumberAvailable = in.NumberAvailable + out.NumberUnavailable = in.NumberUnavailable + out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + return nil +} + +// Convert_v1beta2_DaemonSetStatus_To_extensions_DaemonSetStatus is an autogenerated conversion function. +func Convert_v1beta2_DaemonSetStatus_To_extensions_DaemonSetStatus(in *v1beta2.DaemonSetStatus, out *extensions.DaemonSetStatus, s conversion.Scope) error { + return autoConvert_v1beta2_DaemonSetStatus_To_extensions_DaemonSetStatus(in, out, s) +} + +func autoConvert_extensions_DaemonSetStatus_To_v1beta2_DaemonSetStatus(in *extensions.DaemonSetStatus, out *v1beta2.DaemonSetStatus, s conversion.Scope) error { + out.CurrentNumberScheduled = in.CurrentNumberScheduled + out.NumberMisscheduled = in.NumberMisscheduled + out.DesiredNumberScheduled = in.DesiredNumberScheduled + out.NumberReady = in.NumberReady + out.ObservedGeneration = in.ObservedGeneration + out.UpdatedNumberScheduled = in.UpdatedNumberScheduled + out.NumberAvailable = in.NumberAvailable + out.NumberUnavailable = in.NumberUnavailable + out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + return nil +} + +// Convert_extensions_DaemonSetStatus_To_v1beta2_DaemonSetStatus is an autogenerated conversion function. +func Convert_extensions_DaemonSetStatus_To_v1beta2_DaemonSetStatus(in *extensions.DaemonSetStatus, out *v1beta2.DaemonSetStatus, s conversion.Scope) error { + return autoConvert_extensions_DaemonSetStatus_To_v1beta2_DaemonSetStatus(in, out, s) +} + +func autoConvert_v1beta2_DaemonSetUpdateStrategy_To_extensions_DaemonSetUpdateStrategy(in *v1beta2.DaemonSetUpdateStrategy, out *extensions.DaemonSetUpdateStrategy, s conversion.Scope) error { + out.Type = extensions.DaemonSetUpdateStrategyType(in.Type) + if in.RollingUpdate != nil { + in, out := &in.RollingUpdate, &out.RollingUpdate + *out = new(extensions.RollingUpdateDaemonSet) + if err := Convert_v1beta2_RollingUpdateDaemonSet_To_extensions_RollingUpdateDaemonSet(*in, *out, s); err != nil { + return err + } + } else { + out.RollingUpdate = nil + } + return nil +} + +// Convert_v1beta2_DaemonSetUpdateStrategy_To_extensions_DaemonSetUpdateStrategy is an autogenerated conversion function. +func Convert_v1beta2_DaemonSetUpdateStrategy_To_extensions_DaemonSetUpdateStrategy(in *v1beta2.DaemonSetUpdateStrategy, out *extensions.DaemonSetUpdateStrategy, s conversion.Scope) error { + return autoConvert_v1beta2_DaemonSetUpdateStrategy_To_extensions_DaemonSetUpdateStrategy(in, out, s) +} + +func autoConvert_extensions_DaemonSetUpdateStrategy_To_v1beta2_DaemonSetUpdateStrategy(in *extensions.DaemonSetUpdateStrategy, out *v1beta2.DaemonSetUpdateStrategy, s conversion.Scope) error { + out.Type = v1beta2.DaemonSetUpdateStrategyType(in.Type) + if in.RollingUpdate != nil { + in, out := &in.RollingUpdate, &out.RollingUpdate + *out = new(v1beta2.RollingUpdateDaemonSet) + if err := Convert_extensions_RollingUpdateDaemonSet_To_v1beta2_RollingUpdateDaemonSet(*in, *out, s); err != nil { + return err + } + } else { + out.RollingUpdate = nil + } + return nil +} + +// Convert_extensions_DaemonSetUpdateStrategy_To_v1beta2_DaemonSetUpdateStrategy is an autogenerated conversion function. +func Convert_extensions_DaemonSetUpdateStrategy_To_v1beta2_DaemonSetUpdateStrategy(in *extensions.DaemonSetUpdateStrategy, out *v1beta2.DaemonSetUpdateStrategy, s conversion.Scope) error { + return autoConvert_extensions_DaemonSetUpdateStrategy_To_v1beta2_DaemonSetUpdateStrategy(in, out, s) +} + +func autoConvert_v1beta2_Deployment_To_extensions_Deployment(in *v1beta2.Deployment, out *extensions.Deployment, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_v1beta2_DeploymentSpec_To_extensions_DeploymentSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + if err := Convert_v1beta2_DeploymentStatus_To_extensions_DeploymentStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +func autoConvert_extensions_Deployment_To_v1beta2_Deployment(in *extensions.Deployment, out *v1beta2.Deployment, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_extensions_DeploymentSpec_To_v1beta2_DeploymentSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + if err := Convert_extensions_DeploymentStatus_To_v1beta2_DeploymentStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +func autoConvert_v1beta2_DeploymentCondition_To_extensions_DeploymentCondition(in *v1beta2.DeploymentCondition, out *extensions.DeploymentCondition, s conversion.Scope) error { + out.Type = extensions.DeploymentConditionType(in.Type) + out.Status = api.ConditionStatus(in.Status) + out.LastUpdateTime = in.LastUpdateTime + out.LastTransitionTime = in.LastTransitionTime + out.Reason = in.Reason + out.Message = in.Message + return nil +} + +// Convert_v1beta2_DeploymentCondition_To_extensions_DeploymentCondition is an autogenerated conversion function. +func Convert_v1beta2_DeploymentCondition_To_extensions_DeploymentCondition(in *v1beta2.DeploymentCondition, out *extensions.DeploymentCondition, s conversion.Scope) error { + return autoConvert_v1beta2_DeploymentCondition_To_extensions_DeploymentCondition(in, out, s) +} + +func autoConvert_extensions_DeploymentCondition_To_v1beta2_DeploymentCondition(in *extensions.DeploymentCondition, out *v1beta2.DeploymentCondition, s conversion.Scope) error { + out.Type = v1beta2.DeploymentConditionType(in.Type) + out.Status = core_v1.ConditionStatus(in.Status) + out.LastUpdateTime = in.LastUpdateTime + out.LastTransitionTime = in.LastTransitionTime + out.Reason = in.Reason + out.Message = in.Message + return nil +} + +// Convert_extensions_DeploymentCondition_To_v1beta2_DeploymentCondition is an autogenerated conversion function. +func Convert_extensions_DeploymentCondition_To_v1beta2_DeploymentCondition(in *extensions.DeploymentCondition, out *v1beta2.DeploymentCondition, s conversion.Scope) error { + return autoConvert_extensions_DeploymentCondition_To_v1beta2_DeploymentCondition(in, out, s) +} + +func autoConvert_v1beta2_DeploymentList_To_extensions_DeploymentList(in *v1beta2.DeploymentList, out *extensions.DeploymentList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]extensions.Deployment, len(*in)) + for i := range *in { + if err := Convert_v1beta2_Deployment_To_extensions_Deployment(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Items = nil + } + return nil +} + +// Convert_v1beta2_DeploymentList_To_extensions_DeploymentList is an autogenerated conversion function. +func Convert_v1beta2_DeploymentList_To_extensions_DeploymentList(in *v1beta2.DeploymentList, out *extensions.DeploymentList, s conversion.Scope) error { + return autoConvert_v1beta2_DeploymentList_To_extensions_DeploymentList(in, out, s) +} + +func autoConvert_extensions_DeploymentList_To_v1beta2_DeploymentList(in *extensions.DeploymentList, out *v1beta2.DeploymentList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]v1beta2.Deployment, len(*in)) + for i := range *in { + if err := Convert_extensions_Deployment_To_v1beta2_Deployment(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Items = make([]v1beta2.Deployment, 0) + } + return nil +} + +// Convert_extensions_DeploymentList_To_v1beta2_DeploymentList is an autogenerated conversion function. +func Convert_extensions_DeploymentList_To_v1beta2_DeploymentList(in *extensions.DeploymentList, out *v1beta2.DeploymentList, s conversion.Scope) error { + return autoConvert_extensions_DeploymentList_To_v1beta2_DeploymentList(in, out, s) +} + +func autoConvert_v1beta2_DeploymentSpec_To_extensions_DeploymentSpec(in *v1beta2.DeploymentSpec, out *extensions.DeploymentSpec, s conversion.Scope) error { + if err := v1.Convert_Pointer_int32_To_int32(&in.Replicas, &out.Replicas, s); err != nil { + return err + } + out.Selector = (*v1.LabelSelector)(unsafe.Pointer(in.Selector)) + if err := api_v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { + return err + } + if err := Convert_v1beta2_DeploymentStrategy_To_extensions_DeploymentStrategy(&in.Strategy, &out.Strategy, s); err != nil { + return err + } + out.MinReadySeconds = in.MinReadySeconds + out.RevisionHistoryLimit = (*int32)(unsafe.Pointer(in.RevisionHistoryLimit)) + out.Paused = in.Paused + out.ProgressDeadlineSeconds = (*int32)(unsafe.Pointer(in.ProgressDeadlineSeconds)) + return nil +} + +func autoConvert_extensions_DeploymentSpec_To_v1beta2_DeploymentSpec(in *extensions.DeploymentSpec, out *v1beta2.DeploymentSpec, s conversion.Scope) error { + if err := v1.Convert_int32_To_Pointer_int32(&in.Replicas, &out.Replicas, s); err != nil { + return err + } + out.Selector = (*v1.LabelSelector)(unsafe.Pointer(in.Selector)) + if err := api_v1.Convert_api_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { + return err + } + if err := Convert_extensions_DeploymentStrategy_To_v1beta2_DeploymentStrategy(&in.Strategy, &out.Strategy, s); err != nil { + return err + } + out.MinReadySeconds = in.MinReadySeconds + out.RevisionHistoryLimit = (*int32)(unsafe.Pointer(in.RevisionHistoryLimit)) + out.Paused = in.Paused + // WARNING: in.RollbackTo requires manual conversion: does not exist in peer-type + out.ProgressDeadlineSeconds = (*int32)(unsafe.Pointer(in.ProgressDeadlineSeconds)) + return nil +} + +func autoConvert_v1beta2_DeploymentStatus_To_extensions_DeploymentStatus(in *v1beta2.DeploymentStatus, out *extensions.DeploymentStatus, s conversion.Scope) error { + out.ObservedGeneration = in.ObservedGeneration + out.Replicas = in.Replicas + out.UpdatedReplicas = in.UpdatedReplicas + out.ReadyReplicas = in.ReadyReplicas + out.AvailableReplicas = in.AvailableReplicas + out.UnavailableReplicas = in.UnavailableReplicas + out.Conditions = *(*[]extensions.DeploymentCondition)(unsafe.Pointer(&in.Conditions)) + out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + return nil +} + +// Convert_v1beta2_DeploymentStatus_To_extensions_DeploymentStatus is an autogenerated conversion function. +func Convert_v1beta2_DeploymentStatus_To_extensions_DeploymentStatus(in *v1beta2.DeploymentStatus, out *extensions.DeploymentStatus, s conversion.Scope) error { + return autoConvert_v1beta2_DeploymentStatus_To_extensions_DeploymentStatus(in, out, s) +} + +func autoConvert_extensions_DeploymentStatus_To_v1beta2_DeploymentStatus(in *extensions.DeploymentStatus, out *v1beta2.DeploymentStatus, s conversion.Scope) error { + out.ObservedGeneration = in.ObservedGeneration + out.Replicas = in.Replicas + out.UpdatedReplicas = in.UpdatedReplicas + out.ReadyReplicas = in.ReadyReplicas + out.AvailableReplicas = in.AvailableReplicas + out.UnavailableReplicas = in.UnavailableReplicas + out.Conditions = *(*[]v1beta2.DeploymentCondition)(unsafe.Pointer(&in.Conditions)) + out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + return nil +} + +// Convert_extensions_DeploymentStatus_To_v1beta2_DeploymentStatus is an autogenerated conversion function. +func Convert_extensions_DeploymentStatus_To_v1beta2_DeploymentStatus(in *extensions.DeploymentStatus, out *v1beta2.DeploymentStatus, s conversion.Scope) error { + return autoConvert_extensions_DeploymentStatus_To_v1beta2_DeploymentStatus(in, out, s) +} + +func autoConvert_v1beta2_DeploymentStrategy_To_extensions_DeploymentStrategy(in *v1beta2.DeploymentStrategy, out *extensions.DeploymentStrategy, s conversion.Scope) error { + out.Type = extensions.DeploymentStrategyType(in.Type) + if in.RollingUpdate != nil { + in, out := &in.RollingUpdate, &out.RollingUpdate + *out = new(extensions.RollingUpdateDeployment) + if err := Convert_v1beta2_RollingUpdateDeployment_To_extensions_RollingUpdateDeployment(*in, *out, s); err != nil { + return err + } + } else { + out.RollingUpdate = nil + } + return nil +} + +func autoConvert_extensions_DeploymentStrategy_To_v1beta2_DeploymentStrategy(in *extensions.DeploymentStrategy, out *v1beta2.DeploymentStrategy, s conversion.Scope) error { + out.Type = v1beta2.DeploymentStrategyType(in.Type) + if in.RollingUpdate != nil { + in, out := &in.RollingUpdate, &out.RollingUpdate + *out = new(v1beta2.RollingUpdateDeployment) + if err := Convert_extensions_RollingUpdateDeployment_To_v1beta2_RollingUpdateDeployment(*in, *out, s); err != nil { + return err + } + } else { + out.RollingUpdate = nil + } + return nil +} + +func autoConvert_v1beta2_ReplicaSet_To_extensions_ReplicaSet(in *v1beta2.ReplicaSet, out *extensions.ReplicaSet, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_v1beta2_ReplicaSetSpec_To_extensions_ReplicaSetSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + if err := Convert_v1beta2_ReplicaSetStatus_To_extensions_ReplicaSetStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +// Convert_v1beta2_ReplicaSet_To_extensions_ReplicaSet is an autogenerated conversion function. +func Convert_v1beta2_ReplicaSet_To_extensions_ReplicaSet(in *v1beta2.ReplicaSet, out *extensions.ReplicaSet, s conversion.Scope) error { + return autoConvert_v1beta2_ReplicaSet_To_extensions_ReplicaSet(in, out, s) +} + +func autoConvert_extensions_ReplicaSet_To_v1beta2_ReplicaSet(in *extensions.ReplicaSet, out *v1beta2.ReplicaSet, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_extensions_ReplicaSetSpec_To_v1beta2_ReplicaSetSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + if err := Convert_extensions_ReplicaSetStatus_To_v1beta2_ReplicaSetStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +// Convert_extensions_ReplicaSet_To_v1beta2_ReplicaSet is an autogenerated conversion function. +func Convert_extensions_ReplicaSet_To_v1beta2_ReplicaSet(in *extensions.ReplicaSet, out *v1beta2.ReplicaSet, s conversion.Scope) error { + return autoConvert_extensions_ReplicaSet_To_v1beta2_ReplicaSet(in, out, s) +} + +func autoConvert_v1beta2_ReplicaSetCondition_To_extensions_ReplicaSetCondition(in *v1beta2.ReplicaSetCondition, out *extensions.ReplicaSetCondition, s conversion.Scope) error { + out.Type = extensions.ReplicaSetConditionType(in.Type) + out.Status = api.ConditionStatus(in.Status) + out.LastTransitionTime = in.LastTransitionTime + out.Reason = in.Reason + out.Message = in.Message + return nil +} + +// Convert_v1beta2_ReplicaSetCondition_To_extensions_ReplicaSetCondition is an autogenerated conversion function. +func Convert_v1beta2_ReplicaSetCondition_To_extensions_ReplicaSetCondition(in *v1beta2.ReplicaSetCondition, out *extensions.ReplicaSetCondition, s conversion.Scope) error { + return autoConvert_v1beta2_ReplicaSetCondition_To_extensions_ReplicaSetCondition(in, out, s) +} + +func autoConvert_extensions_ReplicaSetCondition_To_v1beta2_ReplicaSetCondition(in *extensions.ReplicaSetCondition, out *v1beta2.ReplicaSetCondition, s conversion.Scope) error { + out.Type = v1beta2.ReplicaSetConditionType(in.Type) + out.Status = core_v1.ConditionStatus(in.Status) + out.LastTransitionTime = in.LastTransitionTime + out.Reason = in.Reason + out.Message = in.Message + return nil +} + +// Convert_extensions_ReplicaSetCondition_To_v1beta2_ReplicaSetCondition is an autogenerated conversion function. +func Convert_extensions_ReplicaSetCondition_To_v1beta2_ReplicaSetCondition(in *extensions.ReplicaSetCondition, out *v1beta2.ReplicaSetCondition, s conversion.Scope) error { + return autoConvert_extensions_ReplicaSetCondition_To_v1beta2_ReplicaSetCondition(in, out, s) +} + +func autoConvert_v1beta2_ReplicaSetList_To_extensions_ReplicaSetList(in *v1beta2.ReplicaSetList, out *extensions.ReplicaSetList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]extensions.ReplicaSet, len(*in)) + for i := range *in { + if err := Convert_v1beta2_ReplicaSet_To_extensions_ReplicaSet(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Items = nil + } + return nil +} + +// Convert_v1beta2_ReplicaSetList_To_extensions_ReplicaSetList is an autogenerated conversion function. +func Convert_v1beta2_ReplicaSetList_To_extensions_ReplicaSetList(in *v1beta2.ReplicaSetList, out *extensions.ReplicaSetList, s conversion.Scope) error { + return autoConvert_v1beta2_ReplicaSetList_To_extensions_ReplicaSetList(in, out, s) +} + +func autoConvert_extensions_ReplicaSetList_To_v1beta2_ReplicaSetList(in *extensions.ReplicaSetList, out *v1beta2.ReplicaSetList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]v1beta2.ReplicaSet, len(*in)) + for i := range *in { + if err := Convert_extensions_ReplicaSet_To_v1beta2_ReplicaSet(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Items = make([]v1beta2.ReplicaSet, 0) + } + return nil +} + +// Convert_extensions_ReplicaSetList_To_v1beta2_ReplicaSetList is an autogenerated conversion function. +func Convert_extensions_ReplicaSetList_To_v1beta2_ReplicaSetList(in *extensions.ReplicaSetList, out *v1beta2.ReplicaSetList, s conversion.Scope) error { + return autoConvert_extensions_ReplicaSetList_To_v1beta2_ReplicaSetList(in, out, s) +} + +func autoConvert_v1beta2_ReplicaSetSpec_To_extensions_ReplicaSetSpec(in *v1beta2.ReplicaSetSpec, out *extensions.ReplicaSetSpec, s conversion.Scope) error { + if err := v1.Convert_Pointer_int32_To_int32(&in.Replicas, &out.Replicas, s); err != nil { + return err + } + out.MinReadySeconds = in.MinReadySeconds + out.Selector = (*v1.LabelSelector)(unsafe.Pointer(in.Selector)) + if err := api_v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { + return err + } + return nil +} + +func autoConvert_extensions_ReplicaSetSpec_To_v1beta2_ReplicaSetSpec(in *extensions.ReplicaSetSpec, out *v1beta2.ReplicaSetSpec, s conversion.Scope) error { + if err := v1.Convert_int32_To_Pointer_int32(&in.Replicas, &out.Replicas, s); err != nil { + return err + } + out.MinReadySeconds = in.MinReadySeconds + out.Selector = (*v1.LabelSelector)(unsafe.Pointer(in.Selector)) + if err := api_v1.Convert_api_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { + return err + } + return nil +} + +func autoConvert_v1beta2_ReplicaSetStatus_To_extensions_ReplicaSetStatus(in *v1beta2.ReplicaSetStatus, out *extensions.ReplicaSetStatus, s conversion.Scope) error { + out.Replicas = in.Replicas + out.FullyLabeledReplicas = in.FullyLabeledReplicas + out.ReadyReplicas = in.ReadyReplicas + out.AvailableReplicas = in.AvailableReplicas + out.ObservedGeneration = in.ObservedGeneration + out.Conditions = *(*[]extensions.ReplicaSetCondition)(unsafe.Pointer(&in.Conditions)) + return nil +} + +// Convert_v1beta2_ReplicaSetStatus_To_extensions_ReplicaSetStatus is an autogenerated conversion function. +func Convert_v1beta2_ReplicaSetStatus_To_extensions_ReplicaSetStatus(in *v1beta2.ReplicaSetStatus, out *extensions.ReplicaSetStatus, s conversion.Scope) error { + return autoConvert_v1beta2_ReplicaSetStatus_To_extensions_ReplicaSetStatus(in, out, s) +} + +func autoConvert_extensions_ReplicaSetStatus_To_v1beta2_ReplicaSetStatus(in *extensions.ReplicaSetStatus, out *v1beta2.ReplicaSetStatus, s conversion.Scope) error { + out.Replicas = in.Replicas + out.FullyLabeledReplicas = in.FullyLabeledReplicas + out.ReadyReplicas = in.ReadyReplicas + out.AvailableReplicas = in.AvailableReplicas + out.ObservedGeneration = in.ObservedGeneration + out.Conditions = *(*[]v1beta2.ReplicaSetCondition)(unsafe.Pointer(&in.Conditions)) + return nil +} + +// Convert_extensions_ReplicaSetStatus_To_v1beta2_ReplicaSetStatus is an autogenerated conversion function. +func Convert_extensions_ReplicaSetStatus_To_v1beta2_ReplicaSetStatus(in *extensions.ReplicaSetStatus, out *v1beta2.ReplicaSetStatus, s conversion.Scope) error { + return autoConvert_extensions_ReplicaSetStatus_To_v1beta2_ReplicaSetStatus(in, out, s) +} + +func autoConvert_v1beta2_RollingUpdateDaemonSet_To_extensions_RollingUpdateDaemonSet(in *v1beta2.RollingUpdateDaemonSet, out *extensions.RollingUpdateDaemonSet, s conversion.Scope) error { + // WARNING: in.MaxUnavailable requires manual conversion: inconvertible types (*k8s.io/apimachinery/pkg/util/intstr.IntOrString vs k8s.io/apimachinery/pkg/util/intstr.IntOrString) + return nil +} + +func autoConvert_extensions_RollingUpdateDaemonSet_To_v1beta2_RollingUpdateDaemonSet(in *extensions.RollingUpdateDaemonSet, out *v1beta2.RollingUpdateDaemonSet, s conversion.Scope) error { + // WARNING: in.MaxUnavailable requires manual conversion: inconvertible types (k8s.io/apimachinery/pkg/util/intstr.IntOrString vs *k8s.io/apimachinery/pkg/util/intstr.IntOrString) + return nil +} + +func autoConvert_v1beta2_RollingUpdateDeployment_To_extensions_RollingUpdateDeployment(in *v1beta2.RollingUpdateDeployment, out *extensions.RollingUpdateDeployment, s conversion.Scope) error { + // WARNING: in.MaxUnavailable requires manual conversion: inconvertible types (*k8s.io/apimachinery/pkg/util/intstr.IntOrString vs k8s.io/apimachinery/pkg/util/intstr.IntOrString) + // WARNING: in.MaxSurge requires manual conversion: inconvertible types (*k8s.io/apimachinery/pkg/util/intstr.IntOrString vs k8s.io/apimachinery/pkg/util/intstr.IntOrString) + return nil +} + +func autoConvert_extensions_RollingUpdateDeployment_To_v1beta2_RollingUpdateDeployment(in *extensions.RollingUpdateDeployment, out *v1beta2.RollingUpdateDeployment, s conversion.Scope) error { + // WARNING: in.MaxUnavailable requires manual conversion: inconvertible types (k8s.io/apimachinery/pkg/util/intstr.IntOrString vs *k8s.io/apimachinery/pkg/util/intstr.IntOrString) + // WARNING: in.MaxSurge requires manual conversion: inconvertible types (k8s.io/apimachinery/pkg/util/intstr.IntOrString vs *k8s.io/apimachinery/pkg/util/intstr.IntOrString) + return nil +} + func autoConvert_v1beta2_RollingUpdateStatefulSetStrategy_To_apps_RollingUpdateStatefulSetStrategy(in *v1beta2.RollingUpdateStatefulSetStrategy, out *apps.RollingUpdateStatefulSetStrategy, s conversion.Scope) error { if err := v1.Convert_Pointer_int32_To_int32(&in.Partition, &out.Partition, s); err != nil { return err @@ -79,6 +679,71 @@ func Convert_apps_RollingUpdateStatefulSetStrategy_To_v1beta2_RollingUpdateState return autoConvert_apps_RollingUpdateStatefulSetStrategy_To_v1beta2_RollingUpdateStatefulSetStrategy(in, out, s) } +func autoConvert_v1beta2_Scale_To_extensions_Scale(in *v1beta2.Scale, out *extensions.Scale, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_v1beta2_ScaleSpec_To_extensions_ScaleSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + if err := Convert_v1beta2_ScaleStatus_To_extensions_ScaleStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +// Convert_v1beta2_Scale_To_extensions_Scale is an autogenerated conversion function. +func Convert_v1beta2_Scale_To_extensions_Scale(in *v1beta2.Scale, out *extensions.Scale, s conversion.Scope) error { + return autoConvert_v1beta2_Scale_To_extensions_Scale(in, out, s) +} + +func autoConvert_extensions_Scale_To_v1beta2_Scale(in *extensions.Scale, out *v1beta2.Scale, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_extensions_ScaleSpec_To_v1beta2_ScaleSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + if err := Convert_extensions_ScaleStatus_To_v1beta2_ScaleStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +// Convert_extensions_Scale_To_v1beta2_Scale is an autogenerated conversion function. +func Convert_extensions_Scale_To_v1beta2_Scale(in *extensions.Scale, out *v1beta2.Scale, s conversion.Scope) error { + return autoConvert_extensions_Scale_To_v1beta2_Scale(in, out, s) +} + +func autoConvert_v1beta2_ScaleSpec_To_extensions_ScaleSpec(in *v1beta2.ScaleSpec, out *extensions.ScaleSpec, s conversion.Scope) error { + out.Replicas = in.Replicas + return nil +} + +// Convert_v1beta2_ScaleSpec_To_extensions_ScaleSpec is an autogenerated conversion function. +func Convert_v1beta2_ScaleSpec_To_extensions_ScaleSpec(in *v1beta2.ScaleSpec, out *extensions.ScaleSpec, s conversion.Scope) error { + return autoConvert_v1beta2_ScaleSpec_To_extensions_ScaleSpec(in, out, s) +} + +func autoConvert_extensions_ScaleSpec_To_v1beta2_ScaleSpec(in *extensions.ScaleSpec, out *v1beta2.ScaleSpec, s conversion.Scope) error { + out.Replicas = in.Replicas + return nil +} + +// Convert_extensions_ScaleSpec_To_v1beta2_ScaleSpec is an autogenerated conversion function. +func Convert_extensions_ScaleSpec_To_v1beta2_ScaleSpec(in *extensions.ScaleSpec, out *v1beta2.ScaleSpec, s conversion.Scope) error { + return autoConvert_extensions_ScaleSpec_To_v1beta2_ScaleSpec(in, out, s) +} + +func autoConvert_v1beta2_ScaleStatus_To_extensions_ScaleStatus(in *v1beta2.ScaleStatus, out *extensions.ScaleStatus, s conversion.Scope) error { + out.Replicas = in.Replicas + // WARNING: in.Selector requires manual conversion: inconvertible types (map[string]string vs *k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector) + // WARNING: in.TargetSelector requires manual conversion: does not exist in peer-type + return nil +} + +func autoConvert_extensions_ScaleStatus_To_v1beta2_ScaleStatus(in *extensions.ScaleStatus, out *v1beta2.ScaleStatus, s conversion.Scope) error { + out.Replicas = in.Replicas + // WARNING: in.Selector requires manual conversion: inconvertible types (*k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector vs map[string]string) + return nil +} + func autoConvert_v1beta2_StatefulSet_To_apps_StatefulSet(in *v1beta2.StatefulSet, out *apps.StatefulSet, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta if err := Convert_v1beta2_StatefulSetSpec_To_apps_StatefulSetSpec(&in.Spec, &out.Spec, s); err != nil { @@ -197,6 +862,7 @@ func autoConvert_v1beta2_StatefulSetStatus_To_apps_StatefulSetStatus(in *v1beta2 out.UpdatedReplicas = in.UpdatedReplicas out.CurrentRevision = in.CurrentRevision out.UpdateRevision = in.UpdateRevision + out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) return nil } @@ -208,6 +874,7 @@ func autoConvert_apps_StatefulSetStatus_To_v1beta2_StatefulSetStatus(in *apps.St out.UpdatedReplicas = in.UpdatedReplicas out.CurrentRevision = in.CurrentRevision out.UpdateRevision = in.UpdateRevision + out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) return nil } diff --git a/pkg/apis/apps/validation/BUILD b/pkg/apis/apps/validation/BUILD index 2cd9d971bc6..fbb4a08ac77 100644 --- a/pkg/apis/apps/validation/BUILD +++ b/pkg/apis/apps/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation:go_default_library", @@ -27,12 +24,12 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/apps:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", ], ) diff --git a/pkg/apis/apps/validation/validation.go b/pkg/apis/apps/validation/validation.go index d4a02bc7434..6b0e7d98534 100644 --- a/pkg/apis/apps/validation/validation.go +++ b/pkg/apis/apps/validation/validation.go @@ -163,9 +163,39 @@ func ValidateStatefulSetUpdate(statefulSet, oldStatefulSet *apps.StatefulSet) fi return allErrs } +// ValidateStatefulSetStatus validates a StatefulSetStatus. +func ValidateStatefulSetStatus(status *apps.StatefulSetStatus, fieldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + + allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.Replicas), fieldPath.Child("replicas"))...) + allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.ReadyReplicas), fieldPath.Child("readyReplicas"))...) + allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.CurrentReplicas), fieldPath.Child("currentReplicas"))...) + allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.UpdatedReplicas), fieldPath.Child("updatedReplicas"))...) + if status.ObservedGeneration != nil { + allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(*status.ObservedGeneration), fieldPath.Child("observedGeneration"))...) + } + if status.CollisionCount != nil { + allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(*status.CollisionCount), fieldPath.Child("collisionCount"))...) + } + + msg := "cannot be greater than status.replicas" + if status.ReadyReplicas > status.Replicas { + allErrs = append(allErrs, field.Invalid(fieldPath.Child("readyReplicas"), status.ReadyReplicas, msg)) + } + if status.CurrentReplicas > status.Replicas { + allErrs = append(allErrs, field.Invalid(fieldPath.Child("currentReplicas"), status.CurrentReplicas, msg)) + } + if status.UpdatedReplicas > status.Replicas { + allErrs = append(allErrs, field.Invalid(fieldPath.Child("updatedReplicas"), status.UpdatedReplicas, msg)) + } + + return allErrs +} + // ValidateStatefulSetStatusUpdate tests if required fields in the StatefulSet are set. func ValidateStatefulSetStatusUpdate(statefulSet, oldStatefulSet *apps.StatefulSet) field.ErrorList { allErrs := field.ErrorList{} + allErrs = append(allErrs, ValidateStatefulSetStatus(&statefulSet.Status, field.NewPath("status"))...) allErrs = append(allErrs, apivalidation.ValidateObjectMetaUpdate(&statefulSet.ObjectMeta, &oldStatefulSet.ObjectMeta, field.NewPath("metadata"))...) // TODO: Validate status. return allErrs diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index f968fdc83cb..9071fa189f0 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -22,6 +22,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/apps" ) @@ -300,6 +301,119 @@ func TestValidateStatefulSet(t *testing.T) { } } +func TestValidateStatefulSetStatus(t *testing.T) { + minusOne := int64(-1) + tests := []struct { + name string + replicas int32 + readyReplicas int32 + currentReplicas int32 + updatedReplicas int32 + observedGeneration *int64 + collisionCount *int64 + expectedErr bool + }{ + { + name: "valid status", + replicas: 3, + readyReplicas: 3, + currentReplicas: 2, + updatedReplicas: 1, + expectedErr: false, + }, + { + name: "invalid replicas", + replicas: -1, + readyReplicas: 3, + currentReplicas: 2, + updatedReplicas: 1, + expectedErr: true, + }, + { + name: "invalid readyReplicas", + replicas: 3, + readyReplicas: -1, + currentReplicas: 2, + updatedReplicas: 1, + expectedErr: true, + }, + { + name: "invalid currentReplicas", + replicas: 3, + readyReplicas: 3, + currentReplicas: -1, + updatedReplicas: 1, + expectedErr: true, + }, + { + name: "invalid updatedReplicas", + replicas: 3, + readyReplicas: 3, + currentReplicas: 2, + updatedReplicas: -1, + expectedErr: true, + }, + { + name: "invalid observedGeneration", + replicas: 3, + readyReplicas: 3, + currentReplicas: 2, + updatedReplicas: 1, + observedGeneration: &minusOne, + expectedErr: true, + }, + { + name: "invalid collisionCount", + replicas: 3, + readyReplicas: 3, + currentReplicas: 2, + updatedReplicas: 1, + collisionCount: &minusOne, + expectedErr: true, + }, + { + name: "readyReplicas greater than replicas", + replicas: 3, + readyReplicas: 4, + currentReplicas: 2, + updatedReplicas: 1, + expectedErr: true, + }, + { + name: "currentReplicas greater than replicas", + replicas: 3, + readyReplicas: 3, + currentReplicas: 4, + updatedReplicas: 1, + expectedErr: true, + }, + { + name: "updatedReplicas greater than replicas", + replicas: 3, + readyReplicas: 3, + currentReplicas: 2, + updatedReplicas: 4, + expectedErr: true, + }, + } + + for _, test := range tests { + status := apps.StatefulSetStatus{ + Replicas: test.replicas, + ReadyReplicas: test.readyReplicas, + CurrentReplicas: test.currentReplicas, + UpdatedReplicas: test.updatedReplicas, + ObservedGeneration: test.observedGeneration, + CollisionCount: test.collisionCount, + } + + errs := ValidateStatefulSetStatus(&status, field.NewPath("status")) + if hasErr := len(errs) > 0; hasErr != test.expectedErr { + t.Errorf("%s: expected error: %t, got error: %t\nerrors: %s", test.name, test.expectedErr, hasErr, errs.ToAggregate().Error()) + } + } +} + func TestValidateStatefulSetUpdate(t *testing.T) { validLabels := map[string]string{"a": "b"} validPodTemplate := api.PodTemplate{ diff --git a/pkg/apis/apps/zz_generated.deepcopy.go b/pkg/apis/apps/zz_generated.deepcopy.go index 5ac521976c7..0a4d3638614 100644 --- a/pkg/apis/apps/zz_generated.deepcopy.go +++ b/pkg/apis/apps/zz_generated.deepcopy.go @@ -273,6 +273,15 @@ func (in *StatefulSetStatus) DeepCopyInto(out *StatefulSetStatus) { **out = **in } } + if in.CollisionCount != nil { + in, out := &in.CollisionCount, &out.CollisionCount + if *in == nil { + *out = nil + } else { + *out = new(int64) + **out = **in + } + } return } diff --git a/pkg/apis/authentication/BUILD b/pkg/apis/authentication/BUILD index 996c1eff8fd..18fbe12e116 100644 --- a/pkg/apis/authentication/BUILD +++ b/pkg/apis/authentication/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", @@ -35,6 +32,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/authentication/fuzzer:all-srcs", "//pkg/apis/authentication/install:all-srcs", "//pkg/apis/authentication/v1:all-srcs", "//pkg/apis/authentication/v1beta1:all-srcs", diff --git a/pkg/apis/authentication/fuzzer/BUILD b/pkg/apis/authentication/fuzzer/BUILD new file mode 100644 index 00000000000..dd0561eec8f --- /dev/null +++ b/pkg/apis/authentication/fuzzer/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = ["//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/registry/core/podtemplate/strategy_test.go b/pkg/apis/authentication/fuzzer/fuzzer.go similarity index 57% rename from pkg/registry/core/podtemplate/strategy_test.go rename to pkg/apis/authentication/fuzzer/fuzzer.go index 0f82101df0b..7bb5204e92c 100644 --- a/pkg/registry/core/podtemplate/strategy_test.go +++ b/pkg/apis/authentication/fuzzer/fuzzer.go @@ -1,5 +1,5 @@ /* -Copyright 2015 The Kubernetes Authors. +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. @@ -14,20 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -package podtemplate +package fuzzer import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - apitesting "k8s.io/kubernetes/pkg/api/testing" + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" ) -func TestSelectableFieldLabelConversions(t *testing.T) { - apitesting.TestSelectableFieldLabelConversionsOfKind(t, - api.Registry.GroupOrDie(api.GroupName).GroupVersion.String(), - "PodTemplate", - PodTemplateToSelectableFields(&api.PodTemplate{}), - nil, - ) +// Funcs returns the fuzzer functions for the authentication api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{} } diff --git a/pkg/apis/authentication/install/BUILD b/pkg/apis/authentication/install/BUILD index 7db41429cbc..7ec2b74077b 100644 --- a/pkg/apis/authentication/install/BUILD +++ b/pkg/apis/authentication/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/authentication:go_default_library", diff --git a/pkg/apis/authentication/v1/BUILD b/pkg/apis/authentication/v1/BUILD index a3f24718005..ff7e40f0a07 100644 --- a/pkg/apis/authentication/v1/BUILD +++ b/pkg/apis/authentication/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/authentication:go_default_library", "//vendor/k8s.io/api/authentication/v1:go_default_library", diff --git a/pkg/apis/authentication/v1beta1/BUILD b/pkg/apis/authentication/v1beta1/BUILD index ea44ec5433a..25cc2abae8c 100644 --- a/pkg/apis/authentication/v1beta1/BUILD +++ b/pkg/apis/authentication/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/authentication:go_default_library", "//vendor/k8s.io/api/authentication/v1beta1:go_default_library", diff --git a/pkg/apis/authorization/BUILD b/pkg/apis/authorization/BUILD index 4cdc7b8deed..d64dc5b2c96 100644 --- a/pkg/apis/authorization/BUILD +++ b/pkg/apis/authorization/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", @@ -35,6 +32,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/authorization/fuzzer:all-srcs", "//pkg/apis/authorization/install:all-srcs", "//pkg/apis/authorization/v1:all-srcs", "//pkg/apis/authorization/v1beta1:all-srcs", diff --git a/pkg/apis/authorization/fuzzer/BUILD b/pkg/apis/authorization/fuzzer/BUILD new file mode 100644 index 00000000000..dd0561eec8f --- /dev/null +++ b/pkg/apis/authorization/fuzzer/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = ["//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/apis/authorization/fuzzer/fuzzer.go b/pkg/apis/authorization/fuzzer/fuzzer.go new file mode 100644 index 00000000000..fb154c0d751 --- /dev/null +++ b/pkg/apis/authorization/fuzzer/fuzzer.go @@ -0,0 +1,26 @@ +/* +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 fuzzer + +import ( + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" +) + +// Funcs returns the fuzzer functions for the authorization api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{} +} diff --git a/pkg/apis/authorization/install/BUILD b/pkg/apis/authorization/install/BUILD index ade14ca788e..8f36c7f5a45 100644 --- a/pkg/apis/authorization/install/BUILD +++ b/pkg/apis/authorization/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/authorization:go_default_library", diff --git a/pkg/apis/authorization/v1/BUILD b/pkg/apis/authorization/v1/BUILD index 12e1c372053..f7d262bfee4 100644 --- a/pkg/apis/authorization/v1/BUILD +++ b/pkg/apis/authorization/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/authorization:go_default_library", "//vendor/k8s.io/api/authorization/v1:go_default_library", diff --git a/pkg/apis/authorization/v1beta1/BUILD b/pkg/apis/authorization/v1beta1/BUILD index 2b2fedc8977..2f5a0fbfc8a 100644 --- a/pkg/apis/authorization/v1beta1/BUILD +++ b/pkg/apis/authorization/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/authorization:go_default_library", "//vendor/k8s.io/api/authorization/v1beta1:go_default_library", diff --git a/pkg/apis/authorization/validation/BUILD b/pkg/apis/authorization/validation/BUILD index b52d61ece89..d9fd992ec0f 100644 --- a/pkg/apis/authorization/validation/BUILD +++ b/pkg/apis/authorization/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//pkg/apis/authorization:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", @@ -24,7 +21,6 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/authorization:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/apis/autoscaling/BUILD b/pkg/apis/autoscaling/BUILD index 7543110a8da..6c8c597cd0c 100644 --- a/pkg/apis/autoscaling/BUILD +++ b/pkg/apis/autoscaling/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", @@ -38,6 +35,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/autoscaling/fuzzer:all-srcs", "//pkg/apis/autoscaling/install:all-srcs", "//pkg/apis/autoscaling/v1:all-srcs", "//pkg/apis/autoscaling/v2alpha1:all-srcs", diff --git a/pkg/apis/autoscaling/fuzzer/BUILD b/pkg/apis/autoscaling/fuzzer/BUILD new file mode 100644 index 00000000000..2d3f29e4ef6 --- /dev/null +++ b/pkg/apis/autoscaling/fuzzer/BUILD @@ -0,0 +1,31 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = [ + "//pkg/api:go_default_library", + "//pkg/apis/autoscaling:go_default_library", + "//vendor/github.com/google/gofuzz:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/apis/autoscaling/fuzzer/fuzzer.go b/pkg/apis/autoscaling/fuzzer/fuzzer.go new file mode 100644 index 00000000000..7133c162735 --- /dev/null +++ b/pkg/apis/autoscaling/fuzzer/fuzzer.go @@ -0,0 +1,89 @@ +/* +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 fuzzer + +import ( + fuzz "github.com/google/gofuzz" + "k8s.io/apimachinery/pkg/api/resource" + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/apis/autoscaling" +) + +// Funcs returns the fuzzer functions for the autoscaling api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{ + func(s *autoscaling.HorizontalPodAutoscalerSpec, c fuzz.Continue) { + c.FuzzNoCustom(s) // fuzz self without calling this function again + minReplicas := int32(c.Rand.Int31()) + s.MinReplicas = &minReplicas + + randomQuantity := func() resource.Quantity { + var q resource.Quantity + c.Fuzz(&q) + // precalc the string for benchmarking purposes + _ = q.String() + return q + } + + targetUtilization := int32(c.RandUint64()) + s.Metrics = []autoscaling.MetricSpec{ + { + Type: autoscaling.PodsMetricSourceType, + Pods: &autoscaling.PodsMetricSource{ + MetricName: c.RandString(), + TargetAverageValue: randomQuantity(), + }, + }, + { + Type: autoscaling.ResourceMetricSourceType, + Resource: &autoscaling.ResourceMetricSource{ + Name: api.ResourceCPU, + TargetAverageUtilization: &targetUtilization, + }, + }, + } + }, + func(s *autoscaling.HorizontalPodAutoscalerStatus, c fuzz.Continue) { + c.FuzzNoCustom(s) // fuzz self without calling this function again + randomQuantity := func() resource.Quantity { + var q resource.Quantity + c.Fuzz(&q) + // precalc the string for benchmarking purposes + _ = q.String() + return q + } + currentUtilization := int32(c.RandUint64()) + s.CurrentMetrics = []autoscaling.MetricStatus{ + { + Type: autoscaling.PodsMetricSourceType, + Pods: &autoscaling.PodsMetricStatus{ + MetricName: c.RandString(), + CurrentAverageValue: randomQuantity(), + }, + }, + { + Type: autoscaling.ResourceMetricSourceType, + Resource: &autoscaling.ResourceMetricStatus{ + Name: api.ResourceCPU, + CurrentAverageUtilization: ¤tUtilization, + }, + }, + } + }, + } +} diff --git a/pkg/apis/autoscaling/install/BUILD b/pkg/apis/autoscaling/install/BUILD index 3f23a1ecdda..52a5f95b490 100644 --- a/pkg/apis/autoscaling/install/BUILD +++ b/pkg/apis/autoscaling/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/autoscaling:go_default_library", diff --git a/pkg/apis/autoscaling/v1/BUILD b/pkg/apis/autoscaling/v1/BUILD index 3d951b6da7f..8774793d048 100644 --- a/pkg/apis/autoscaling/v1/BUILD +++ b/pkg/apis/autoscaling/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/autoscaling:go_default_library", @@ -35,12 +32,11 @@ go_library( go_test( name = "go_default_xtest", srcs = ["defaults_test.go"], - tags = ["automanaged"], deps = [ + ":go_default_library", "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", "//pkg/apis/autoscaling/install:go_default_library", - "//pkg/apis/autoscaling/v1:go_default_library", "//vendor/k8s.io/api/autoscaling/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", ], diff --git a/pkg/apis/autoscaling/v2alpha1/BUILD b/pkg/apis/autoscaling/v2alpha1/BUILD index 37ba6d2ccfb..3cbdae37c32 100644 --- a/pkg/apis/autoscaling/v2alpha1/BUILD +++ b/pkg/apis/autoscaling/v2alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/autoscaling:go_default_library", diff --git a/pkg/apis/autoscaling/validation/BUILD b/pkg/apis/autoscaling/validation/BUILD index a33051958bf..5355d0e553c 100644 --- a/pkg/apis/autoscaling/validation/BUILD +++ b/pkg/apis/autoscaling/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//pkg/api/validation:go_default_library", "//pkg/apis/autoscaling:go_default_library", @@ -25,7 +22,6 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/autoscaling:go_default_library", diff --git a/pkg/apis/batch/BUILD b/pkg/apis/batch/BUILD index 4ee030ca40c..9f48416e7f3 100644 --- a/pkg/apis/batch/BUILD +++ b/pkg/apis/batch/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -36,6 +33,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/batch/fuzzer:all-srcs", "//pkg/apis/batch/install:all-srcs", "//pkg/apis/batch/v1:all-srcs", "//pkg/apis/batch/v2alpha1:all-srcs", diff --git a/pkg/apis/batch/fuzzer/BUILD b/pkg/apis/batch/fuzzer/BUILD new file mode 100644 index 00000000000..ca3366aaef3 --- /dev/null +++ b/pkg/apis/batch/fuzzer/BUILD @@ -0,0 +1,29 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = [ + "//pkg/apis/batch:go_default_library", + "//vendor/github.com/google/gofuzz:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/apis/batch/fuzzer/fuzzer.go b/pkg/apis/batch/fuzzer/fuzzer.go new file mode 100644 index 00000000000..cb4b751f6d1 --- /dev/null +++ b/pkg/apis/batch/fuzzer/fuzzer.go @@ -0,0 +1,68 @@ +/* +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 fuzzer + +import ( + fuzz "github.com/google/gofuzz" + + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/kubernetes/pkg/apis/batch" +) + +func newBool(val bool) *bool { + p := new(bool) + *p = val + return p +} + +// Funcs returns the fuzzer functions for the batch api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{ + func(j *batch.JobSpec, c fuzz.Continue) { + c.FuzzNoCustom(j) // fuzz self without calling this function again + completions := int32(c.Rand.Int31()) + parallelism := int32(c.Rand.Int31()) + j.Completions = &completions + j.Parallelism = ¶llelism + if c.Rand.Int31()%2 == 0 { + j.ManualSelector = newBool(true) + } else { + j.ManualSelector = nil + } + }, + func(sj *batch.CronJobSpec, c fuzz.Continue) { + c.FuzzNoCustom(sj) + suspend := c.RandBool() + sj.Suspend = &suspend + sds := int64(c.RandUint64()) + sj.StartingDeadlineSeconds = &sds + sj.Schedule = c.RandString() + if hasSuccessLimit := c.RandBool(); hasSuccessLimit { + successfulJobsHistoryLimit := int32(c.Rand.Int31()) + sj.SuccessfulJobsHistoryLimit = &successfulJobsHistoryLimit + } + if hasFailedLimit := c.RandBool(); hasFailedLimit { + failedJobsHistoryLimit := int32(c.Rand.Int31()) + sj.FailedJobsHistoryLimit = &failedJobsHistoryLimit + } + }, + func(cp *batch.ConcurrencyPolicy, c fuzz.Continue) { + policies := []batch.ConcurrencyPolicy{batch.AllowConcurrent, batch.ForbidConcurrent, batch.ReplaceConcurrent} + *cp = policies[c.Rand.Intn(len(policies))] + }, + } +} diff --git a/pkg/apis/batch/install/BUILD b/pkg/apis/batch/install/BUILD index 0807b67e8fc..e668dc386a2 100644 --- a/pkg/apis/batch/install/BUILD +++ b/pkg/apis/batch/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/batch:go_default_library", diff --git a/pkg/apis/batch/register.go b/pkg/apis/batch/register.go index 4601ca4ec14..49414bd3fce 100644 --- a/pkg/apis/batch/register.go +++ b/pkg/apis/batch/register.go @@ -51,7 +51,5 @@ func addKnownTypes(scheme *runtime.Scheme) error { &CronJob{}, &CronJobList{}, ) - scheme.AddKnownTypeWithName(SchemeGroupVersion.WithKind("ScheduledJob"), &CronJob{}) - scheme.AddKnownTypeWithName(SchemeGroupVersion.WithKind("ScheduledJobList"), &CronJobList{}) return nil } diff --git a/pkg/apis/batch/v1/BUILD b/pkg/apis/batch/v1/BUILD index 0a73fab2186..1f766c3c9a5 100644 --- a/pkg/apis/batch/v1/BUILD +++ b/pkg/apis/batch/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1:go_default_library", @@ -35,12 +32,11 @@ go_library( go_test( name = "go_default_xtest", srcs = ["defaults_test.go"], - tags = ["automanaged"], deps = [ + ":go_default_library", "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", "//pkg/apis/batch/install:go_default_library", - "//pkg/apis/batch/v1:go_default_library", "//vendor/k8s.io/api/batch/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/apis/batch/v2alpha1/BUILD b/pkg/apis/batch/v2alpha1/BUILD index 8dc368540f8..09776447e94 100644 --- a/pkg/apis/batch/v2alpha1/BUILD +++ b/pkg/apis/batch/v2alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1:go_default_library", @@ -36,12 +33,11 @@ go_library( go_test( name = "go_default_xtest", srcs = ["defaults_test.go"], - tags = ["automanaged"], deps = [ + ":go_default_library", "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", "//pkg/apis/batch/install:go_default_library", - "//pkg/apis/batch/v2alpha1:go_default_library", "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", ], diff --git a/pkg/apis/batch/validation/BUILD b/pkg/apis/batch/validation/BUILD index d4dac0e25c4..5ea444ddf9e 100644 --- a/pkg/apis/batch/validation/BUILD +++ b/pkg/apis/batch/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation:go_default_library", @@ -28,7 +25,6 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/batch:go_default_library", diff --git a/pkg/apis/certificates/BUILD b/pkg/apis/certificates/BUILD index 44cb3863035..1c99c0cbfa8 100644 --- a/pkg/apis/certificates/BUILD +++ b/pkg/apis/certificates/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", @@ -36,6 +33,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/certificates/fuzzer:all-srcs", "//pkg/apis/certificates/install:all-srcs", "//pkg/apis/certificates/v1beta1:all-srcs", "//pkg/apis/certificates/validation:all-srcs", diff --git a/pkg/apis/certificates/fuzzer/BUILD b/pkg/apis/certificates/fuzzer/BUILD new file mode 100644 index 00000000000..b4ec41d97d2 --- /dev/null +++ b/pkg/apis/certificates/fuzzer/BUILD @@ -0,0 +1,29 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = [ + "//pkg/apis/certificates:go_default_library", + "//vendor/github.com/google/gofuzz:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/apis/certificates/fuzzer/fuzzer.go b/pkg/apis/certificates/fuzzer/fuzzer.go new file mode 100644 index 00000000000..ccfca013bed --- /dev/null +++ b/pkg/apis/certificates/fuzzer/fuzzer.go @@ -0,0 +1,34 @@ +/* +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 fuzzer + +import ( + fuzz "github.com/google/gofuzz" + + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/kubernetes/pkg/apis/certificates" +) + +// Funcs returns the fuzzer functions for the certificates api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{ + func(obj *certificates.CertificateSigningRequestSpec, c fuzz.Continue) { + c.FuzzNoCustom(obj) // fuzz self without calling this function again + obj.Usages = []certificates.KeyUsage{certificates.UsageKeyEncipherment} + }, + } +} diff --git a/pkg/apis/certificates/install/BUILD b/pkg/apis/certificates/install/BUILD index d9372bb43a8..276c112c66c 100644 --- a/pkg/apis/certificates/install/BUILD +++ b/pkg/apis/certificates/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/certificates:go_default_library", diff --git a/pkg/apis/certificates/v1beta1/BUILD b/pkg/apis/certificates/v1beta1/BUILD index 900b40218e0..aa2d4eed068 100644 --- a/pkg/apis/certificates/v1beta1/BUILD +++ b/pkg/apis/certificates/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/certificates:go_default_library", "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", diff --git a/pkg/apis/certificates/validation/BUILD b/pkg/apis/certificates/validation/BUILD index 63a7165ec52..efab0be82d6 100644 --- a/pkg/apis/certificates/validation/BUILD +++ b/pkg/apis/certificates/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//pkg/api/validation:go_default_library", "//pkg/apis/certificates:go_default_library", diff --git a/pkg/apis/componentconfig/BUILD b/pkg/apis/componentconfig/BUILD index d651fa89495..bdce94c2c1a 100644 --- a/pkg/apis/componentconfig/BUILD +++ b/pkg/apis/componentconfig/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -33,7 +30,6 @@ go_test( name = "go_default_test", srcs = ["helpers_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/github.com/spf13/pflag:go_default_library"], ) @@ -48,8 +44,10 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/componentconfig/fuzzer:all-srcs", "//pkg/apis/componentconfig/install:all-srcs", "//pkg/apis/componentconfig/v1alpha1:all-srcs", + "//pkg/apis/componentconfig/validation:all-srcs", ], tags = ["automanaged"], ) diff --git a/pkg/apis/componentconfig/fuzzer/BUILD b/pkg/apis/componentconfig/fuzzer/BUILD new file mode 100644 index 00000000000..dd0561eec8f --- /dev/null +++ b/pkg/apis/componentconfig/fuzzer/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = ["//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/apis/componentconfig/fuzzer/fuzzer.go b/pkg/apis/componentconfig/fuzzer/fuzzer.go new file mode 100644 index 00000000000..cfde7535a30 --- /dev/null +++ b/pkg/apis/componentconfig/fuzzer/fuzzer.go @@ -0,0 +1,26 @@ +/* +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 fuzzer + +import ( + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" +) + +// Funcs returns the fuzzer functions for the componentconfig api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{} +} diff --git a/pkg/apis/componentconfig/install/BUILD b/pkg/apis/componentconfig/install/BUILD index 79169d480aa..a6292c0d167 100644 --- a/pkg/apis/componentconfig/install/BUILD +++ b/pkg/apis/componentconfig/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/componentconfig:go_default_library", diff --git a/pkg/apis/componentconfig/types.go b/pkg/apis/componentconfig/types.go index f3ff3497760..4e4d5e1c1e6 100644 --- a/pkg/apis/componentconfig/types.go +++ b/pkg/apis/componentconfig/types.go @@ -180,6 +180,18 @@ const ( type KubeletConfiguration struct { metav1.TypeMeta + // Only used for dynamic configuration. + // The length of the trial period for this configuration. If the Kubelet records CrashLoopThreshold or + // more startups during this period, the current configuration will be marked bad and the + // Kubelet will roll-back to the last-known-good. Default 10 minutes. + ConfigTrialDuration metav1.Duration + // Only used for dynamic configuration. + // If this number of Kubelet "crashes" during ConfigTrialDuration meets this threshold, + // the configuration fails the trial and the Kubelet rolls back to its last-known-good config. + // Crash-loops are detected by counting Kubelet startups, so one startup is implicitly added + // to this threshold to always allow a single restart per config change. + // Default 10, mimimum allowed is 0, maximum allowed is 10. + CrashLoopThreshold int32 // podManifestPath is the path to the directory containing pod manifests to // run, or the path to a single manifest file PodManifestPath string @@ -215,17 +227,10 @@ type KubeletConfiguration struct { // tlsPrivateKeyFile is the ile containing x509 private key matching // tlsCertFile. TLSPrivateKeyFile string - // certDirectory is the directory where the TLS certs are located (by - // default /var/run/kubernetes). If tlsCertFile and tlsPrivateKeyFile - // are provided, this flag will be ignored. - CertDirectory string // authentication specifies how requests to the Kubelet's server are authenticated Authentication KubeletAuthentication // authorization specifies how requests to the Kubelet's server are authorized Authorization KubeletAuthorization - // rootDirectory is the directory path to place kubelet files (volume - // mounts,etc). - RootDirectory string // seccompProfileRoot is the directory path for seccomp profiles. SeccompProfileRoot string // allowPrivileged enables containers to request privileged mode. @@ -314,12 +319,6 @@ type KubeletConfiguration struct { // volumePluginDir is the full path of the directory in which to search // for additional third party volume plugins VolumePluginDir string - // cloudProvider is the provider for cloud services. - // +optional - CloudProvider string - // cloudConfigFile is the path to the cloud provider configuration file. - // +optional - CloudConfigFile string // KubeletCgroups is the absolute name of cgroups to isolate the kubelet in. // +optional KubeletCgroups string @@ -670,6 +669,8 @@ type KubeControllerManagerConfiguration struct { CloudProvider string // cloudConfigFile is the path to the cloud provider configuration file. CloudConfigFile string + // run with untagged cloud instances + AllowUntaggedCloud bool // concurrentEndpointSyncs is the number of endpoint syncing operations // that will be done concurrently. Larger number = faster endpoint updating, // but more CPU (and network) load. diff --git a/pkg/apis/componentconfig/v1alpha1/BUILD b/pkg/apis/componentconfig/v1alpha1/BUILD index 966ea0eb7c0..c85b0bf075c 100644 --- a/pkg/apis/componentconfig/v1alpha1/BUILD +++ b/pkg/apis/componentconfig/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/componentconfig:go_default_library", @@ -53,6 +50,5 @@ go_test( name = "go_default_test", srcs = ["defaults_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//pkg/apis/componentconfig:go_default_library"], ) diff --git a/pkg/apis/componentconfig/v1alpha1/defaults.go b/pkg/apis/componentconfig/v1alpha1/defaults.go index 8b34965684d..bb501e17a2a 100644 --- a/pkg/apis/componentconfig/v1alpha1/defaults.go +++ b/pkg/apis/componentconfig/v1alpha1/defaults.go @@ -34,7 +34,7 @@ import ( ) const ( - defaultRootDir = "/var/lib/kubelet" + DefaultRootDir = "/var/lib/kubelet" AutoDetectCloudProvider = "auto-detect" @@ -192,6 +192,13 @@ func SetDefaults_LeaderElectionConfiguration(obj *LeaderElectionConfiguration) { } func SetDefaults_KubeletConfiguration(obj *KubeletConfiguration) { + // pointer because the zeroDuration is valid - if you want to skip the trial period + if obj.ConfigTrialDuration == nil { + obj.ConfigTrialDuration = &metav1.Duration{Duration: 10 * time.Minute} + } + if obj.CrashLoopThreshold == nil { + obj.CrashLoopThreshold = utilpointer.Int32Ptr(10) + } if obj.Authentication.Anonymous.Enabled == nil { obj.Authentication.Anonymous.Enabled = boolVar(true) } @@ -214,18 +221,12 @@ func SetDefaults_KubeletConfiguration(obj *KubeletConfiguration) { if obj.Address == "" { obj.Address = "0.0.0.0" } - if obj.CloudProvider == "" { - obj.CloudProvider = AutoDetectCloudProvider - } if obj.CAdvisorPort == nil { obj.CAdvisorPort = utilpointer.Int32Ptr(4194) } if obj.VolumeStatsAggPeriod == zeroDuration { obj.VolumeStatsAggPeriod = metav1.Duration{Duration: time.Minute} } - if obj.CertDirectory == "" { - obj.CertDirectory = "/var/run/kubernetes" - } if obj.ContainerRuntime == "" { obj.ContainerRuntime = "docker" } @@ -338,14 +339,11 @@ func SetDefaults_KubeletConfiguration(obj *KubeletConfiguration) { if obj.ResolverConfig == "" { obj.ResolverConfig = kubetypes.ResolvConfDefault } - if obj.RootDirectory == "" { - obj.RootDirectory = defaultRootDir - } if obj.SerializeImagePulls == nil { obj.SerializeImagePulls = boolVar(true) } if obj.SeccompProfileRoot == "" { - obj.SeccompProfileRoot = filepath.Join(defaultRootDir, "seccomp") + obj.SeccompProfileRoot = filepath.Join(DefaultRootDir, "seccomp") } if obj.StreamingConnectionIdleTimeout == zeroDuration { obj.StreamingConnectionIdleTimeout = metav1.Duration{Duration: 4 * time.Hour} diff --git a/pkg/apis/componentconfig/v1alpha1/types.go b/pkg/apis/componentconfig/v1alpha1/types.go index 77fd7d42518..12941dc610d 100644 --- a/pkg/apis/componentconfig/v1alpha1/types.go +++ b/pkg/apis/componentconfig/v1alpha1/types.go @@ -256,6 +256,18 @@ type LeaderElectionConfiguration struct { type KubeletConfiguration struct { metav1.TypeMeta `json:",inline"` + // Only used for dynamic configuration. + // The length of the trial period for this configuration. If the Kubelet records CrashLoopThreshold or + // more startups during this period, the current configuration will be marked bad and the + // Kubelet will roll-back to the last-known-good. Default 10 minutes. + ConfigTrialDuration *metav1.Duration `json:"configTrialDuration"` + // Only used for dynamic configuration. + // If this number of Kubelet "crashes" during ConfigTrialDuration meets this threshold, + // the configuration fails the trial and the Kubelet rolls back to its last-known-good config. + // Crash-loops are detected by counting Kubelet startups, so one startup is implicitly added + // to this threshold to always allow a single restart per config change. + // Default 10, mimimum allowed is 0, maximum allowed is 10. + CrashLoopThreshold *int32 `json:"crashLoopThreshold"` // podManifestPath is the path to the directory containing pod manifests to // run, or the path to a single manifest file PodManifestPath string `json:"podManifestPath"` @@ -291,17 +303,10 @@ type KubeletConfiguration struct { // tlsPrivateKeyFile is the ile containing x509 private key matching // tlsCertFile. TLSPrivateKeyFile string `json:"tlsPrivateKeyFile"` - // certDirectory is the directory where the TLS certs are located (by - // default /var/run/kubernetes). If tlsCertFile and tlsPrivateKeyFile - // are provided, this flag will be ignored. - CertDirectory string `json:"certDirectory"` // authentication specifies how requests to the Kubelet's server are authenticated Authentication KubeletAuthentication `json:"authentication"` // authorization specifies how requests to the Kubelet's server are authorized Authorization KubeletAuthorization `json:"authorization"` - // rootDirectory is the directory path to place kubelet files (volume - // mounts,etc). - RootDirectory string `json:"rootDirectory"` // seccompProfileRoot is the directory path for seccomp profiles. SeccompProfileRoot string `json:"seccompProfileRoot"` // allowPrivileged enables containers to request privileged mode. @@ -391,10 +396,6 @@ type KubeletConfiguration struct { // volumePluginDir is the full path of the directory in which to search // for additional third party volume plugins VolumePluginDir string `json:"volumePluginDir"` - // cloudProvider is the provider for cloud services. - CloudProvider string `json:"cloudProvider"` - // cloudConfigFile is the path to the cloud provider configuration file. - CloudConfigFile string `json:"cloudConfigFile"` // kubeletCgroups is the absolute name of cgroups to isolate the kubelet in. KubeletCgroups string `json:"kubeletCgroups"` // runtimeCgroups are cgroups that container runtime is expected to be isolated in. diff --git a/pkg/apis/componentconfig/v1alpha1/zz_generated.conversion.go b/pkg/apis/componentconfig/v1alpha1/zz_generated.conversion.go index f5ee97915d8..c83d572d5ee 100644 --- a/pkg/apis/componentconfig/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/componentconfig/v1alpha1/zz_generated.conversion.go @@ -360,6 +360,12 @@ func Convert_componentconfig_KubeletAuthorization_To_v1alpha1_KubeletAuthorizati } func autoConvert_v1alpha1_KubeletConfiguration_To_componentconfig_KubeletConfiguration(in *KubeletConfiguration, out *componentconfig.KubeletConfiguration, s conversion.Scope) error { + if err := v1.Convert_Pointer_v1_Duration_To_v1_Duration(&in.ConfigTrialDuration, &out.ConfigTrialDuration, s); err != nil { + return err + } + if err := v1.Convert_Pointer_int32_To_int32(&in.CrashLoopThreshold, &out.CrashLoopThreshold, s); err != nil { + return err + } out.PodManifestPath = in.PodManifestPath out.SyncFrequency = in.SyncFrequency out.FileCheckFrequency = in.FileCheckFrequency @@ -374,14 +380,12 @@ func autoConvert_v1alpha1_KubeletConfiguration_To_componentconfig_KubeletConfigu out.ReadOnlyPort = in.ReadOnlyPort out.TLSCertFile = in.TLSCertFile out.TLSPrivateKeyFile = in.TLSPrivateKeyFile - out.CertDirectory = in.CertDirectory if err := Convert_v1alpha1_KubeletAuthentication_To_componentconfig_KubeletAuthentication(&in.Authentication, &out.Authentication, s); err != nil { return err } if err := Convert_v1alpha1_KubeletAuthorization_To_componentconfig_KubeletAuthorization(&in.Authorization, &out.Authorization, s); err != nil { return err } - out.RootDirectory = in.RootDirectory out.SeccompProfileRoot = in.SeccompProfileRoot if err := v1.Convert_Pointer_bool_To_bool(&in.AllowPrivileged, &out.AllowPrivileged, s); err != nil { return err @@ -431,8 +435,6 @@ func autoConvert_v1alpha1_KubeletConfiguration_To_componentconfig_KubeletConfigu } out.VolumeStatsAggPeriod = in.VolumeStatsAggPeriod out.VolumePluginDir = in.VolumePluginDir - out.CloudProvider = in.CloudProvider - out.CloudConfigFile = in.CloudConfigFile out.KubeletCgroups = in.KubeletCgroups out.RuntimeCgroups = in.RuntimeCgroups out.SystemCgroups = in.SystemCgroups @@ -522,6 +524,12 @@ func Convert_v1alpha1_KubeletConfiguration_To_componentconfig_KubeletConfigurati } func autoConvert_componentconfig_KubeletConfiguration_To_v1alpha1_KubeletConfiguration(in *componentconfig.KubeletConfiguration, out *KubeletConfiguration, s conversion.Scope) error { + if err := v1.Convert_v1_Duration_To_Pointer_v1_Duration(&in.ConfigTrialDuration, &out.ConfigTrialDuration, s); err != nil { + return err + } + if err := v1.Convert_int32_To_Pointer_int32(&in.CrashLoopThreshold, &out.CrashLoopThreshold, s); err != nil { + return err + } out.PodManifestPath = in.PodManifestPath out.SyncFrequency = in.SyncFrequency out.FileCheckFrequency = in.FileCheckFrequency @@ -536,14 +544,12 @@ func autoConvert_componentconfig_KubeletConfiguration_To_v1alpha1_KubeletConfigu out.ReadOnlyPort = in.ReadOnlyPort out.TLSCertFile = in.TLSCertFile out.TLSPrivateKeyFile = in.TLSPrivateKeyFile - out.CertDirectory = in.CertDirectory if err := Convert_componentconfig_KubeletAuthentication_To_v1alpha1_KubeletAuthentication(&in.Authentication, &out.Authentication, s); err != nil { return err } if err := Convert_componentconfig_KubeletAuthorization_To_v1alpha1_KubeletAuthorization(&in.Authorization, &out.Authorization, s); err != nil { return err } - out.RootDirectory = in.RootDirectory out.SeccompProfileRoot = in.SeccompProfileRoot if err := v1.Convert_bool_To_Pointer_bool(&in.AllowPrivileged, &out.AllowPrivileged, s); err != nil { return err @@ -609,8 +615,6 @@ func autoConvert_componentconfig_KubeletConfiguration_To_v1alpha1_KubeletConfigu } out.VolumeStatsAggPeriod = in.VolumeStatsAggPeriod out.VolumePluginDir = in.VolumePluginDir - out.CloudProvider = in.CloudProvider - out.CloudConfigFile = in.CloudConfigFile out.KubeletCgroups = in.KubeletCgroups if err := v1.Convert_bool_To_Pointer_bool(&in.CgroupsPerQOS, &out.CgroupsPerQOS, s); err != nil { return err diff --git a/pkg/apis/componentconfig/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/componentconfig/v1alpha1/zz_generated.deepcopy.go index ddb972745f7..37773f758e7 100644 --- a/pkg/apis/componentconfig/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/componentconfig/v1alpha1/zz_generated.deepcopy.go @@ -21,7 +21,8 @@ limitations under the License. package v1alpha1 import ( - v1 "k8s.io/api/core/v1" + core_v1 "k8s.io/api/core/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" reflect "reflect" @@ -294,6 +295,24 @@ func (in *KubeletAuthorization) DeepCopy() *KubeletAuthorization { func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) { *out = *in out.TypeMeta = in.TypeMeta + if in.ConfigTrialDuration != nil { + in, out := &in.ConfigTrialDuration, &out.ConfigTrialDuration + if *in == nil { + *out = nil + } else { + *out = new(v1.Duration) + **out = **in + } + } + if in.CrashLoopThreshold != nil { + in, out := &in.CrashLoopThreshold, &out.CrashLoopThreshold + if *in == nil { + *out = nil + } else { + *out = new(int32) + **out = **in + } + } out.SyncFrequency = in.SyncFrequency out.FileCheckFrequency = in.FileCheckFrequency out.HTTPCheckFrequency = in.HTTPCheckFrequency @@ -471,7 +490,7 @@ func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) { } if in.RegisterWithTaints != nil { in, out := &in.RegisterWithTaints, &out.RegisterWithTaints - *out = make([]v1.Taint, len(*in)) + *out = make([]core_v1.Taint, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } diff --git a/vendor/github.com/gregjones/httpcache/BUILD b/pkg/apis/componentconfig/validation/BUILD similarity index 66% rename from vendor/github.com/gregjones/httpcache/BUILD rename to pkg/apis/componentconfig/validation/BUILD index a1aa088b72e..a9c496aca6d 100644 --- a/vendor/github.com/gregjones/httpcache/BUILD +++ b/pkg/apis/componentconfig/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,8 +7,11 @@ load( go_library( name = "go_default_library", - srcs = ["httpcache.go"], - tags = ["automanaged"], + srcs = ["validation.go"], + deps = [ + "//pkg/apis/componentconfig:go_default_library", + "//pkg/kubelet/cm:go_default_library", + ], ) filegroup( @@ -22,9 +23,6 @@ filegroup( filegroup( name = "all-srcs", - srcs = [ - ":package-srcs", - "//vendor/github.com/gregjones/httpcache/diskcache:all-srcs", - ], + srcs = [":package-srcs"], tags = ["automanaged"], ) diff --git a/pkg/apis/componentconfig/validation/validation.go b/pkg/apis/componentconfig/validation/validation.go new file mode 100644 index 00000000000..3931672c721 --- /dev/null +++ b/pkg/apis/componentconfig/validation/validation.go @@ -0,0 +1,56 @@ +/* +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 validation + +import ( + "fmt" + + "k8s.io/kubernetes/pkg/apis/componentconfig" + containermanager "k8s.io/kubernetes/pkg/kubelet/cm" +) + +// MaxCrashLoopThreshold is the maximum allowed KubeletConfiguraiton.CrashLoopThreshold +const MaxCrashLoopThreshold = 10 + +// ValidateKubeletConfiguration validates `kc` and returns an error if it is invalid +func ValidateKubeletConfiguration(kc *componentconfig.KubeletConfiguration) error { + // restrict crashloop threshold to between 0 and `maxCrashLoopThreshold`, inclusive + // more than `maxStartups=maxCrashLoopThreshold` adds unnecessary bloat to the .startups.json file, + // and negative values would be silly. + if kc.CrashLoopThreshold < 0 || kc.CrashLoopThreshold > MaxCrashLoopThreshold { + return fmt.Errorf("field `CrashLoopThreshold` must be between 0 and %d, inclusive", MaxCrashLoopThreshold) + } + + if !kc.CgroupsPerQOS && len(kc.EnforceNodeAllocatable) > 0 { + return fmt.Errorf("node allocatable enforcement is not supported unless Cgroups Per QOS feature is turned on") + } + if kc.SystemCgroups != "" && kc.CgroupRoot == "" { + return fmt.Errorf("invalid configuration: system container was specified and cgroup root was not specified") + } + for _, val := range kc.EnforceNodeAllocatable { + switch val { + case containermanager.NodeAllocatableEnforcementKey: + case containermanager.SystemReservedEnforcementKey: + case containermanager.KubeReservedEnforcementKey: + continue + default: + return fmt.Errorf("invalid option %q specified for EnforceNodeAllocatable setting. Valid options are %q, %q or %q", + val, containermanager.NodeAllocatableEnforcementKey, containermanager.SystemReservedEnforcementKey, containermanager.KubeReservedEnforcementKey) + } + } + return nil +} diff --git a/pkg/apis/componentconfig/zz_generated.deepcopy.go b/pkg/apis/componentconfig/zz_generated.deepcopy.go index 8455e792502..5537f1a3570 100644 --- a/pkg/apis/componentconfig/zz_generated.deepcopy.go +++ b/pkg/apis/componentconfig/zz_generated.deepcopy.go @@ -397,6 +397,7 @@ func (in *KubeletAuthorization) DeepCopy() *KubeletAuthorization { func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) { *out = *in out.TypeMeta = in.TypeMeta + out.ConfigTrialDuration = in.ConfigTrialDuration out.SyncFrequency = in.SyncFrequency out.FileCheckFrequency = in.FileCheckFrequency out.HTTPCheckFrequency = in.HTTPCheckFrequency diff --git a/pkg/apis/extensions/BUILD b/pkg/apis/extensions/BUILD index a9de8e682ee..d0c4efdda4c 100644 --- a/pkg/apis/extensions/BUILD +++ b/pkg/apis/extensions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["helpers_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -24,7 +21,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", @@ -47,6 +43,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/extensions/fuzzer:all-srcs", "//pkg/apis/extensions/install:all-srcs", "//pkg/apis/extensions/v1beta1:all-srcs", "//pkg/apis/extensions/validation:all-srcs", diff --git a/pkg/apis/extensions/fuzzer/BUILD b/pkg/apis/extensions/fuzzer/BUILD new file mode 100644 index 00000000000..8eeb981419b --- /dev/null +++ b/pkg/apis/extensions/fuzzer/BUILD @@ -0,0 +1,31 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = [ + "//pkg/apis/extensions:go_default_library", + "//vendor/github.com/google/gofuzz:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/apis/extensions/fuzzer/fuzzer.go b/pkg/apis/extensions/fuzzer/fuzzer.go new file mode 100644 index 00000000000..a36148b79d7 --- /dev/null +++ b/pkg/apis/extensions/fuzzer/fuzzer.go @@ -0,0 +1,109 @@ +/* +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 fuzzer + +import ( + "fmt" + + fuzz "github.com/google/gofuzz" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/kubernetes/pkg/apis/extensions" +) + +// Funcs returns the fuzzer functions for the extensions api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{ + func(j *extensions.DeploymentSpec, c fuzz.Continue) { + c.FuzzNoCustom(j) // fuzz self without calling this function again + rhl := int32(c.Rand.Int31()) + pds := int32(c.Rand.Int31()) + j.RevisionHistoryLimit = &rhl + j.ProgressDeadlineSeconds = &pds + }, + func(j *extensions.DeploymentStrategy, c fuzz.Continue) { + c.FuzzNoCustom(j) // fuzz self without calling this function again + // Ensure that strategyType is one of valid values. + strategyTypes := []extensions.DeploymentStrategyType{extensions.RecreateDeploymentStrategyType, extensions.RollingUpdateDeploymentStrategyType} + j.Type = strategyTypes[c.Rand.Intn(len(strategyTypes))] + if j.Type != extensions.RollingUpdateDeploymentStrategyType { + j.RollingUpdate = nil + } else { + rollingUpdate := extensions.RollingUpdateDeployment{} + if c.RandBool() { + rollingUpdate.MaxUnavailable = intstr.FromInt(int(c.Rand.Int31())) + rollingUpdate.MaxSurge = intstr.FromInt(int(c.Rand.Int31())) + } else { + rollingUpdate.MaxSurge = intstr.FromString(fmt.Sprintf("%d%%", c.Rand.Int31())) + } + j.RollingUpdate = &rollingUpdate + } + }, + func(psp *extensions.PodSecurityPolicySpec, c fuzz.Continue) { + c.FuzzNoCustom(psp) // fuzz self without calling this function again + runAsUserRules := []extensions.RunAsUserStrategy{extensions.RunAsUserStrategyMustRunAsNonRoot, extensions.RunAsUserStrategyMustRunAs, extensions.RunAsUserStrategyRunAsAny} + psp.RunAsUser.Rule = runAsUserRules[c.Rand.Intn(len(runAsUserRules))] + seLinuxRules := []extensions.SELinuxStrategy{extensions.SELinuxStrategyRunAsAny, extensions.SELinuxStrategyMustRunAs} + psp.SELinux.Rule = seLinuxRules[c.Rand.Intn(len(seLinuxRules))] + }, + func(s *extensions.Scale, c fuzz.Continue) { + c.FuzzNoCustom(s) // fuzz self without calling this function again + // TODO: Implement a fuzzer to generate valid keys, values and operators for + // selector requirements. + if s.Status.Selector != nil { + s.Status.Selector = &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "testlabelkey": "testlabelval", + }, + MatchExpressions: []metav1.LabelSelectorRequirement{ + { + Key: "testkey", + Operator: metav1.LabelSelectorOpIn, + Values: []string{"val1", "val2", "val3"}, + }, + }, + } + } + }, + func(j *extensions.DaemonSetSpec, c fuzz.Continue) { + c.FuzzNoCustom(j) // fuzz self without calling this function again + rhl := int32(c.Rand.Int31()) + j.RevisionHistoryLimit = &rhl + }, + func(j *extensions.DaemonSetUpdateStrategy, c fuzz.Continue) { + c.FuzzNoCustom(j) // fuzz self without calling this function again + // Ensure that strategyType is one of valid values. + strategyTypes := []extensions.DaemonSetUpdateStrategyType{extensions.RollingUpdateDaemonSetStrategyType, extensions.OnDeleteDaemonSetStrategyType} + j.Type = strategyTypes[c.Rand.Intn(len(strategyTypes))] + if j.Type != extensions.RollingUpdateDaemonSetStrategyType { + j.RollingUpdate = nil + } else { + rollingUpdate := extensions.RollingUpdateDaemonSet{} + if c.RandBool() { + if c.RandBool() { + rollingUpdate.MaxUnavailable = intstr.FromInt(1 + int(c.Rand.Int31())) + } else { + rollingUpdate.MaxUnavailable = intstr.FromString(fmt.Sprintf("%d%%", 1+c.Rand.Int31())) + } + } + j.RollingUpdate = &rollingUpdate + } + }, + } +} diff --git a/pkg/apis/extensions/install/BUILD b/pkg/apis/extensions/install/BUILD index f55384644e7..f223d80385d 100644 --- a/pkg/apis/extensions/install/BUILD +++ b/pkg/apis/extensions/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/apis/extensions/types.go b/pkg/apis/extensions/types.go index 6009be69816..50f3f9522d9 100644 --- a/pkg/apis/extensions/types.go +++ b/pkg/apis/extensions/types.go @@ -216,6 +216,7 @@ type DeploymentSpec struct { // +optional Paused bool + // DEPRECATED. // The config this deployment is rolling back to. Will be cleared after rollback is done. // +optional RollbackTo *RollbackConfig @@ -232,6 +233,7 @@ type DeploymentSpec struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// DEPRECATED. // DeploymentRollback stores the information required to rollback a deployment. type DeploymentRollback struct { metav1.TypeMeta @@ -244,6 +246,7 @@ type DeploymentRollback struct { RollbackTo RollbackConfig } +// DEPRECATED. type RollbackConfig struct { // The revision to rollback to. If set to 0, rollback to the last revision. // +optional diff --git a/pkg/apis/extensions/v1beta1/BUILD b/pkg/apis/extensions/v1beta1/BUILD index 050d7366545..4fe6e2d19fb 100644 --- a/pkg/apis/extensions/v1beta1/BUILD +++ b/pkg/apis/extensions/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1:go_default_library", @@ -37,12 +34,11 @@ go_library( go_test( name = "go_default_xtest", srcs = ["defaults_test.go"], - tags = ["automanaged"], deps = [ + ":go_default_library", "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", "//pkg/apis/extensions/install:go_default_library", - "//pkg/apis/extensions/v1beta1: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", diff --git a/pkg/apis/extensions/validation/BUILD b/pkg/apis/extensions/validation/BUILD index 5291abbf861..3cc6e3ace0e 100644 --- a/pkg/apis/extensions/validation/BUILD +++ b/pkg/apis/extensions/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation:go_default_library", @@ -34,7 +31,6 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/apis/imagepolicy/BUILD b/pkg/apis/imagepolicy/BUILD index b63c74769c9..c72a0f3a4ca 100644 --- a/pkg/apis/imagepolicy/BUILD +++ b/pkg/apis/imagepolicy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", @@ -35,6 +32,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/imagepolicy/fuzzer:all-srcs", "//pkg/apis/imagepolicy/install:all-srcs", "//pkg/apis/imagepolicy/v1alpha1:all-srcs", ], diff --git a/pkg/apis/imagepolicy/fuzzer/BUILD b/pkg/apis/imagepolicy/fuzzer/BUILD new file mode 100644 index 00000000000..dd0561eec8f --- /dev/null +++ b/pkg/apis/imagepolicy/fuzzer/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = ["//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/apis/imagepolicy/fuzzer/fuzzer.go b/pkg/apis/imagepolicy/fuzzer/fuzzer.go new file mode 100644 index 00000000000..fedada09f0b --- /dev/null +++ b/pkg/apis/imagepolicy/fuzzer/fuzzer.go @@ -0,0 +1,26 @@ +/* +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 fuzzer + +import ( + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" +) + +// Funcs returns the fuzzer functions for the imagepolicy api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{} +} diff --git a/pkg/apis/imagepolicy/install/BUILD b/pkg/apis/imagepolicy/install/BUILD index 6e285be3ee4..89706b15f25 100644 --- a/pkg/apis/imagepolicy/install/BUILD +++ b/pkg/apis/imagepolicy/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/imagepolicy:go_default_library", diff --git a/pkg/apis/imagepolicy/v1alpha1/BUILD b/pkg/apis/imagepolicy/v1alpha1/BUILD index 0e86162f86d..f1a3ffaac56 100644 --- a/pkg/apis/imagepolicy/v1alpha1/BUILD +++ b/pkg/apis/imagepolicy/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/imagepolicy:go_default_library", "//vendor/k8s.io/api/imagepolicy/v1alpha1:go_default_library", diff --git a/pkg/apis/meta/v1/BUILD b/pkg/apis/meta/v1/BUILD index 116a5717fad..b29556cb2e5 100644 --- a/pkg/apis/meta/v1/BUILD +++ b/pkg/apis/meta/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["time.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/go-openapi/spec:go_default_library", "//vendor/github.com/google/gofuzz:go_default_library", diff --git a/pkg/apis/networking/BUILD b/pkg/apis/networking/BUILD index 385b9ef7195..0918167e436 100644 --- a/pkg/apis/networking/BUILD +++ b/pkg/apis/networking/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -37,6 +34,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/networking/fuzzer:all-srcs", "//pkg/apis/networking/install:all-srcs", "//pkg/apis/networking/v1:all-srcs", "//pkg/apis/networking/validation:all-srcs", diff --git a/pkg/apis/networking/fuzzer/BUILD b/pkg/apis/networking/fuzzer/BUILD new file mode 100644 index 00000000000..dd0561eec8f --- /dev/null +++ b/pkg/apis/networking/fuzzer/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = ["//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/apis/networking/fuzzer/fuzzer.go b/pkg/apis/networking/fuzzer/fuzzer.go new file mode 100644 index 00000000000..6e142826d3b --- /dev/null +++ b/pkg/apis/networking/fuzzer/fuzzer.go @@ -0,0 +1,26 @@ +/* +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 fuzzer + +import ( + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" +) + +// Funcs returns the fuzzer functions for the networking api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{} +} diff --git a/pkg/apis/networking/install/BUILD b/pkg/apis/networking/install/BUILD index 0ecf69ea6b5..e1a348568b1 100644 --- a/pkg/apis/networking/install/BUILD +++ b/pkg/apis/networking/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/networking:go_default_library", diff --git a/pkg/apis/networking/v1/BUILD b/pkg/apis/networking/v1/BUILD index e971124985a..5edf89f5e8b 100644 --- a/pkg/apis/networking/v1/BUILD +++ b/pkg/apis/networking/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/apis/networking/validation/BUILD b/pkg/apis/networking/validation/BUILD index 534c0b5e295..c5d7dbdaa37 100644 --- a/pkg/apis/networking/validation/BUILD +++ b/pkg/apis/networking/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/networking:go_default_library", @@ -24,7 +21,6 @@ go_test( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation:go_default_library", diff --git a/pkg/apis/policy/BUILD b/pkg/apis/policy/BUILD index e971f0bd3c9..38f32cc79d6 100644 --- a/pkg/apis/policy/BUILD +++ b/pkg/apis/policy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", @@ -36,6 +33,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/policy/fuzzer:all-srcs", "//pkg/apis/policy/install:all-srcs", "//pkg/apis/policy/v1alpha1:all-srcs", "//pkg/apis/policy/v1beta1:all-srcs", diff --git a/pkg/apis/policy/fuzzer/BUILD b/pkg/apis/policy/fuzzer/BUILD new file mode 100644 index 00000000000..985a520646e --- /dev/null +++ b/pkg/apis/policy/fuzzer/BUILD @@ -0,0 +1,29 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = [ + "//pkg/apis/policy:go_default_library", + "//vendor/github.com/google/gofuzz:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/apis/policy/fuzzer/fuzzer.go b/pkg/apis/policy/fuzzer/fuzzer.go new file mode 100644 index 00000000000..e6b5a6b9798 --- /dev/null +++ b/pkg/apis/policy/fuzzer/fuzzer.go @@ -0,0 +1,34 @@ +/* +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 fuzzer + +import ( + fuzz "github.com/google/gofuzz" + + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/kubernetes/pkg/apis/policy" +) + +// Funcs returns the fuzzer functions for the policy api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{ + func(s *policy.PodDisruptionBudgetStatus, c fuzz.Continue) { + c.FuzzNoCustom(s) // fuzz self without calling this function again + s.PodDisruptionsAllowed = int32(c.Rand.Intn(2)) + }, + } +} diff --git a/pkg/apis/policy/install/BUILD b/pkg/apis/policy/install/BUILD index 863071ac900..d37deb82a8a 100644 --- a/pkg/apis/policy/install/BUILD +++ b/pkg/apis/policy/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/policy:go_default_library", diff --git a/pkg/apis/policy/v1alpha1/BUILD b/pkg/apis/policy/v1alpha1/BUILD index deeb15dc4ce..35a26c49c88 100644 --- a/pkg/apis/policy/v1alpha1/BUILD +++ b/pkg/apis/policy/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", diff --git a/pkg/apis/policy/v1beta1/BUILD b/pkg/apis/policy/v1beta1/BUILD index 527d6da645f..24f9971dc52 100644 --- a/pkg/apis/policy/v1beta1/BUILD +++ b/pkg/apis/policy/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/policy:go_default_library", "//vendor/k8s.io/api/policy/v1beta1:go_default_library", diff --git a/pkg/apis/policy/validation/BUILD b/pkg/apis/policy/validation/BUILD index e696f3234e1..f61e12c25d4 100644 --- a/pkg/apis/policy/validation/BUILD +++ b/pkg/apis/policy/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//pkg/api/validation:go_default_library", "//pkg/apis/extensions/validation:go_default_library", @@ -25,7 +22,6 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/policy:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", diff --git a/pkg/apis/rbac/BUILD b/pkg/apis/rbac/BUILD index 05d8e56eb3d..ce8db5f6b5f 100644 --- a/pkg/apis/rbac/BUILD +++ b/pkg/apis/rbac/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", @@ -37,7 +34,9 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/rbac/fuzzer:all-srcs", "//pkg/apis/rbac/install:all-srcs", + "//pkg/apis/rbac/v1:all-srcs", "//pkg/apis/rbac/v1alpha1:all-srcs", "//pkg/apis/rbac/v1beta1:all-srcs", "//pkg/apis/rbac/validation:all-srcs", diff --git a/pkg/apis/rbac/fuzzer/BUILD b/pkg/apis/rbac/fuzzer/BUILD new file mode 100644 index 00000000000..b9b71c4bd3c --- /dev/null +++ b/pkg/apis/rbac/fuzzer/BUILD @@ -0,0 +1,29 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = [ + "//pkg/apis/rbac:go_default_library", + "//vendor/github.com/google/gofuzz:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/apis/rbac/fuzzer/fuzzer.go b/pkg/apis/rbac/fuzzer/fuzzer.go new file mode 100644 index 00000000000..ca8f462ec54 --- /dev/null +++ b/pkg/apis/rbac/fuzzer/fuzzer.go @@ -0,0 +1,59 @@ +/* +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 fuzzer + +import ( + fuzz "github.com/google/gofuzz" + + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/kubernetes/pkg/apis/rbac" +) + +// Funcs returns the fuzzer functions for the rbac api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{ + func(r *rbac.RoleRef, c fuzz.Continue) { + c.FuzzNoCustom(r) // fuzz self without calling this function again + + // match defaulter + if len(r.APIGroup) == 0 { + r.APIGroup = rbac.GroupName + } + }, + func(r *rbac.Subject, c fuzz.Continue) { + switch c.Int31n(3) { + case 0: + r.Kind = rbac.ServiceAccountKind + r.APIGroup = "" + c.FuzzNoCustom(&r.Name) + c.FuzzNoCustom(&r.Namespace) + case 1: + r.Kind = rbac.UserKind + r.APIGroup = rbac.GroupName + c.FuzzNoCustom(&r.Name) + // user "*" won't round trip because we convert it to the system:authenticated group. try again. + for r.Name == "*" { + c.FuzzNoCustom(&r.Name) + } + case 2: + r.Kind = rbac.GroupKind + r.APIGroup = rbac.GroupName + c.FuzzNoCustom(&r.Name) + } + }, + } +} diff --git a/pkg/apis/rbac/install/BUILD b/pkg/apis/rbac/install/BUILD index 17e4a91250e..8a1d8c5844c 100644 --- a/pkg/apis/rbac/install/BUILD +++ b/pkg/apis/rbac/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,10 +8,10 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", + "//pkg/apis/rbac/v1:go_default_library", "//pkg/apis/rbac/v1alpha1:go_default_library", "//pkg/apis/rbac/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", diff --git a/pkg/apis/rbac/install/install.go b/pkg/apis/rbac/install/install.go index 4d3c6b61a8e..c787bfacb9d 100644 --- a/pkg/apis/rbac/install/install.go +++ b/pkg/apis/rbac/install/install.go @@ -25,6 +25,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/rbac" + "k8s.io/kubernetes/pkg/apis/rbac/v1" "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1" "k8s.io/kubernetes/pkg/apis/rbac/v1beta1" ) @@ -37,13 +38,24 @@ func init() { func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { if err := announced.NewGroupMetaFactory( &announced.GroupMetaFactoryArgs{ - GroupName: rbac.GroupName, - VersionPreferenceOrder: []string{v1beta1.SchemeGroupVersion.Version, v1alpha1.SchemeGroupVersion.Version}, + GroupName: rbac.GroupName, + // Rollout plan: + // 1.8: + // * announce deprecation of v1alpha1 (people should use v1beta1 or v1) + // 1.9 (once all version-skewed API servers in an HA cluster are capable of reading/writing v1 to etcd): + // * move v1 to the beginning + // * add RBAC objects to update-storage-objects.sh + // * update TestEtcdStoragePath to expect objects to be stored in v1 + // * document that RBAC storage objects should be migrated to ensure storage is a v1-level (via update-storage-objects.sh or otherwise) + // 1.10 (once all stored objects are at v1): + // * remove v1alpha1 + VersionPreferenceOrder: []string{v1beta1.SchemeGroupVersion.Version, v1.SchemeGroupVersion.Version, v1alpha1.SchemeGroupVersion.Version}, ImportPrefix: "k8s.io/api/rbac", RootScopedKinds: sets.NewString("ClusterRole", "ClusterRoleBinding"), AddInternalObjectsToScheme: rbac.AddToScheme, }, announced.VersionToSchemeFunc{ + v1.SchemeGroupVersion.Version: v1.AddToScheme, v1beta1.SchemeGroupVersion.Version: v1beta1.AddToScheme, v1alpha1.SchemeGroupVersion.Version: v1alpha1.AddToScheme, }, diff --git a/pkg/apis/rbac/v1/BUILD b/pkg/apis/rbac/v1/BUILD new file mode 100644 index 00000000000..c6f661b3b97 --- /dev/null +++ b/pkg/apis/rbac/v1/BUILD @@ -0,0 +1,39 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = [ + "defaults.go", + "doc.go", + "helpers.go", + "register.go", + "zz_generated.conversion.go", + "zz_generated.defaults.go", + ], + deps = [ + "//pkg/apis/rbac:go_default_library", + "//vendor/k8s.io/api/rbac/v1: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/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/apis/rbac/v1/defaults.go b/pkg/apis/rbac/v1/defaults.go new file mode 100644 index 00000000000..7d285a8574c --- /dev/null +++ b/pkg/apis/rbac/v1/defaults.go @@ -0,0 +1,49 @@ +/* +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 v1 + +import ( + rbacv1 "k8s.io/api/rbac/v1" + "k8s.io/apimachinery/pkg/runtime" +) + +func addDefaultingFuncs(scheme *runtime.Scheme) error { + return RegisterDefaults(scheme) +} + +func SetDefaults_ClusterRoleBinding(obj *rbacv1.ClusterRoleBinding) { + if len(obj.RoleRef.APIGroup) == 0 { + obj.RoleRef.APIGroup = GroupName + } +} +func SetDefaults_RoleBinding(obj *rbacv1.RoleBinding) { + if len(obj.RoleRef.APIGroup) == 0 { + obj.RoleRef.APIGroup = GroupName + } +} +func SetDefaults_Subject(obj *rbacv1.Subject) { + if len(obj.APIGroup) == 0 { + switch obj.Kind { + case rbacv1.ServiceAccountKind: + obj.APIGroup = "" + case rbacv1.UserKind: + obj.APIGroup = GroupName + case rbacv1.GroupKind: + obj.APIGroup = GroupName + } + } +} diff --git a/pkg/apis/rbac/v1/doc.go b/pkg/apis/rbac/v1/doc.go new file mode 100644 index 00000000000..6dec982b781 --- /dev/null +++ b/pkg/apis/rbac/v1/doc.go @@ -0,0 +1,23 @@ +/* +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. +*/ + +// +k8s:conversion-gen=k8s.io/kubernetes/pkg/apis/rbac +// +k8s:conversion-gen-external-types=../../../../vendor/k8s.io/api/rbac/v1 +// +k8s:defaulter-gen=TypeMeta +// +k8s:defaulter-gen-input=../../../../vendor/k8s.io/api/rbac/v1 + +// +groupName=rbac.authorization.k8s.io +package v1 // import "k8s.io/kubernetes/pkg/apis/rbac/v1" diff --git a/pkg/apis/rbac/v1/helpers.go b/pkg/apis/rbac/v1/helpers.go new file mode 100644 index 00000000000..02484796905 --- /dev/null +++ b/pkg/apis/rbac/v1/helpers.go @@ -0,0 +1,150 @@ +/* +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 v1 + +import ( + "fmt" + + rbacv1 "k8s.io/api/rbac/v1" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +k8s:deepcopy-gen=false +// PolicyRuleBuilder let's us attach methods. A no-no for API types. +// We use it to construct rules in code. It's more compact than trying to write them +// out in a literal and allows us to perform some basic checking during construction +type PolicyRuleBuilder struct { + PolicyRule rbacv1.PolicyRule `protobuf:"bytes,1,opt,name=policyRule"` +} + +func NewRule(verbs ...string) *PolicyRuleBuilder { + return &PolicyRuleBuilder{ + PolicyRule: rbacv1.PolicyRule{Verbs: verbs}, + } +} + +func (r *PolicyRuleBuilder) Groups(groups ...string) *PolicyRuleBuilder { + r.PolicyRule.APIGroups = append(r.PolicyRule.APIGroups, groups...) + return r +} + +func (r *PolicyRuleBuilder) Resources(resources ...string) *PolicyRuleBuilder { + r.PolicyRule.Resources = append(r.PolicyRule.Resources, resources...) + return r +} + +func (r *PolicyRuleBuilder) Names(names ...string) *PolicyRuleBuilder { + r.PolicyRule.ResourceNames = append(r.PolicyRule.ResourceNames, names...) + return r +} + +func (r *PolicyRuleBuilder) URLs(urls ...string) *PolicyRuleBuilder { + r.PolicyRule.NonResourceURLs = append(r.PolicyRule.NonResourceURLs, urls...) + return r +} + +func (r *PolicyRuleBuilder) RuleOrDie() rbacv1.PolicyRule { + ret, err := r.Rule() + if err != nil { + panic(err) + } + return ret +} + +func (r *PolicyRuleBuilder) Rule() (rbacv1.PolicyRule, error) { + if len(r.PolicyRule.Verbs) == 0 { + return rbacv1.PolicyRule{}, fmt.Errorf("verbs are required: %#v", r.PolicyRule) + } + + switch { + case len(r.PolicyRule.NonResourceURLs) > 0: + if len(r.PolicyRule.APIGroups) != 0 || len(r.PolicyRule.Resources) != 0 || len(r.PolicyRule.ResourceNames) != 0 { + return rbacv1.PolicyRule{}, fmt.Errorf("non-resource rule may not have apiGroups, resources, or resourceNames: %#v", r.PolicyRule) + } + case len(r.PolicyRule.Resources) > 0: + if len(r.PolicyRule.NonResourceURLs) != 0 { + return rbacv1.PolicyRule{}, fmt.Errorf("resource rule may not have nonResourceURLs: %#v", r.PolicyRule) + } + if len(r.PolicyRule.APIGroups) == 0 { + // this a common bug + return rbacv1.PolicyRule{}, fmt.Errorf("resource rule must have apiGroups: %#v", r.PolicyRule) + } + default: + return rbacv1.PolicyRule{}, fmt.Errorf("a rule must have either nonResourceURLs or resources: %#v", r.PolicyRule) + } + + return r.PolicyRule, nil +} + +// +k8s:deepcopy-gen=false +// ClusterRoleBindingBuilder let's us attach methods. A no-no for API types. +// We use it to construct bindings in code. It's more compact than trying to write them +// out in a literal. +type ClusterRoleBindingBuilder struct { + ClusterRoleBinding rbacv1.ClusterRoleBinding `protobuf:"bytes,1,opt,name=clusterRoleBinding"` +} + +func NewClusterBinding(clusterRoleName string) *ClusterRoleBindingBuilder { + return &ClusterRoleBindingBuilder{ + ClusterRoleBinding: rbacv1.ClusterRoleBinding{ + ObjectMeta: metav1.ObjectMeta{Name: clusterRoleName}, + RoleRef: rbacv1.RoleRef{ + APIGroup: GroupName, + Kind: "ClusterRole", + Name: clusterRoleName, + }, + }, + } +} + +func (r *ClusterRoleBindingBuilder) Groups(groups ...string) *ClusterRoleBindingBuilder { + for _, group := range groups { + r.ClusterRoleBinding.Subjects = append(r.ClusterRoleBinding.Subjects, rbacv1.Subject{Kind: rbacv1.GroupKind, Name: group}) + } + return r +} + +func (r *ClusterRoleBindingBuilder) Users(users ...string) *ClusterRoleBindingBuilder { + for _, user := range users { + r.ClusterRoleBinding.Subjects = append(r.ClusterRoleBinding.Subjects, rbacv1.Subject{Kind: rbacv1.UserKind, Name: user}) + } + return r +} + +func (r *ClusterRoleBindingBuilder) SAs(namespace string, serviceAccountNames ...string) *ClusterRoleBindingBuilder { + for _, saName := range serviceAccountNames { + r.ClusterRoleBinding.Subjects = append(r.ClusterRoleBinding.Subjects, rbacv1.Subject{Kind: rbacv1.ServiceAccountKind, Namespace: namespace, Name: saName}) + } + return r +} + +func (r *ClusterRoleBindingBuilder) BindingOrDie() rbacv1.ClusterRoleBinding { + ret, err := r.Binding() + if err != nil { + panic(err) + } + return ret +} + +func (r *ClusterRoleBindingBuilder) Binding() (rbacv1.ClusterRoleBinding, error) { + if len(r.ClusterRoleBinding.Subjects) == 0 { + return rbacv1.ClusterRoleBinding{}, fmt.Errorf("subjects are required: %#v", r.ClusterRoleBinding) + } + + return r.ClusterRoleBinding, nil +} diff --git a/pkg/apis/rbac/v1/register.go b/pkg/apis/rbac/v1/register.go new file mode 100644 index 00000000000..ae138c88837 --- /dev/null +++ b/pkg/apis/rbac/v1/register.go @@ -0,0 +1,44 @@ +/* +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 v1 + +import ( + rbacv1 "k8s.io/api/rbac/v1" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +const GroupName = "rbac.authorization.k8s.io" + +// SchemeGroupVersion is group version used to register these objects +var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"} + +// Resource takes an unqualified resource and returns a Group qualified GroupResource +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +var ( + localSchemeBuilder = &rbacv1.SchemeBuilder + AddToScheme = localSchemeBuilder.AddToScheme +) + +func init() { + // We only register manually written functions here. The registration of the + // generated functions takes place in the generated files. The separation + // makes the code compile even when the generated files are missing. + localSchemeBuilder.Register(addDefaultingFuncs) +} diff --git a/pkg/apis/rbac/v1/zz_generated.conversion.go b/pkg/apis/rbac/v1/zz_generated.conversion.go new file mode 100644 index 00000000000..dab304a2127 --- /dev/null +++ b/pkg/apis/rbac/v1/zz_generated.conversion.go @@ -0,0 +1,364 @@ +// +build !ignore_autogenerated + +/* +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. +*/ + +// This file was autogenerated by conversion-gen. Do not edit it manually! + +package v1 + +import ( + v1 "k8s.io/api/rbac/v1" + conversion "k8s.io/apimachinery/pkg/conversion" + runtime "k8s.io/apimachinery/pkg/runtime" + rbac "k8s.io/kubernetes/pkg/apis/rbac" + unsafe "unsafe" +) + +func init() { + localSchemeBuilder.Register(RegisterConversions) +} + +// RegisterConversions adds conversion functions to the given scheme. +// Public to allow building arbitrary schemes. +func RegisterConversions(scheme *runtime.Scheme) error { + return scheme.AddGeneratedConversionFuncs( + Convert_v1_ClusterRole_To_rbac_ClusterRole, + Convert_rbac_ClusterRole_To_v1_ClusterRole, + Convert_v1_ClusterRoleBinding_To_rbac_ClusterRoleBinding, + Convert_rbac_ClusterRoleBinding_To_v1_ClusterRoleBinding, + Convert_v1_ClusterRoleBindingList_To_rbac_ClusterRoleBindingList, + Convert_rbac_ClusterRoleBindingList_To_v1_ClusterRoleBindingList, + Convert_v1_ClusterRoleList_To_rbac_ClusterRoleList, + Convert_rbac_ClusterRoleList_To_v1_ClusterRoleList, + Convert_v1_PolicyRule_To_rbac_PolicyRule, + Convert_rbac_PolicyRule_To_v1_PolicyRule, + Convert_v1_Role_To_rbac_Role, + Convert_rbac_Role_To_v1_Role, + Convert_v1_RoleBinding_To_rbac_RoleBinding, + Convert_rbac_RoleBinding_To_v1_RoleBinding, + Convert_v1_RoleBindingList_To_rbac_RoleBindingList, + Convert_rbac_RoleBindingList_To_v1_RoleBindingList, + Convert_v1_RoleList_To_rbac_RoleList, + Convert_rbac_RoleList_To_v1_RoleList, + Convert_v1_RoleRef_To_rbac_RoleRef, + Convert_rbac_RoleRef_To_v1_RoleRef, + Convert_v1_Subject_To_rbac_Subject, + Convert_rbac_Subject_To_v1_Subject, + ) +} + +func autoConvert_v1_ClusterRole_To_rbac_ClusterRole(in *v1.ClusterRole, out *rbac.ClusterRole, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + out.Rules = *(*[]rbac.PolicyRule)(unsafe.Pointer(&in.Rules)) + return nil +} + +// Convert_v1_ClusterRole_To_rbac_ClusterRole is an autogenerated conversion function. +func Convert_v1_ClusterRole_To_rbac_ClusterRole(in *v1.ClusterRole, out *rbac.ClusterRole, s conversion.Scope) error { + return autoConvert_v1_ClusterRole_To_rbac_ClusterRole(in, out, s) +} + +func autoConvert_rbac_ClusterRole_To_v1_ClusterRole(in *rbac.ClusterRole, out *v1.ClusterRole, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if in.Rules == nil { + out.Rules = make([]v1.PolicyRule, 0) + } else { + out.Rules = *(*[]v1.PolicyRule)(unsafe.Pointer(&in.Rules)) + } + return nil +} + +// Convert_rbac_ClusterRole_To_v1_ClusterRole is an autogenerated conversion function. +func Convert_rbac_ClusterRole_To_v1_ClusterRole(in *rbac.ClusterRole, out *v1.ClusterRole, s conversion.Scope) error { + return autoConvert_rbac_ClusterRole_To_v1_ClusterRole(in, out, s) +} + +func autoConvert_v1_ClusterRoleBinding_To_rbac_ClusterRoleBinding(in *v1.ClusterRoleBinding, out *rbac.ClusterRoleBinding, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + out.Subjects = *(*[]rbac.Subject)(unsafe.Pointer(&in.Subjects)) + if err := Convert_v1_RoleRef_To_rbac_RoleRef(&in.RoleRef, &out.RoleRef, s); err != nil { + return err + } + return nil +} + +// Convert_v1_ClusterRoleBinding_To_rbac_ClusterRoleBinding is an autogenerated conversion function. +func Convert_v1_ClusterRoleBinding_To_rbac_ClusterRoleBinding(in *v1.ClusterRoleBinding, out *rbac.ClusterRoleBinding, s conversion.Scope) error { + return autoConvert_v1_ClusterRoleBinding_To_rbac_ClusterRoleBinding(in, out, s) +} + +func autoConvert_rbac_ClusterRoleBinding_To_v1_ClusterRoleBinding(in *rbac.ClusterRoleBinding, out *v1.ClusterRoleBinding, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if in.Subjects == nil { + out.Subjects = make([]v1.Subject, 0) + } else { + out.Subjects = *(*[]v1.Subject)(unsafe.Pointer(&in.Subjects)) + } + if err := Convert_rbac_RoleRef_To_v1_RoleRef(&in.RoleRef, &out.RoleRef, s); err != nil { + return err + } + return nil +} + +// Convert_rbac_ClusterRoleBinding_To_v1_ClusterRoleBinding is an autogenerated conversion function. +func Convert_rbac_ClusterRoleBinding_To_v1_ClusterRoleBinding(in *rbac.ClusterRoleBinding, out *v1.ClusterRoleBinding, s conversion.Scope) error { + return autoConvert_rbac_ClusterRoleBinding_To_v1_ClusterRoleBinding(in, out, s) +} + +func autoConvert_v1_ClusterRoleBindingList_To_rbac_ClusterRoleBindingList(in *v1.ClusterRoleBindingList, out *rbac.ClusterRoleBindingList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + out.Items = *(*[]rbac.ClusterRoleBinding)(unsafe.Pointer(&in.Items)) + return nil +} + +// Convert_v1_ClusterRoleBindingList_To_rbac_ClusterRoleBindingList is an autogenerated conversion function. +func Convert_v1_ClusterRoleBindingList_To_rbac_ClusterRoleBindingList(in *v1.ClusterRoleBindingList, out *rbac.ClusterRoleBindingList, s conversion.Scope) error { + return autoConvert_v1_ClusterRoleBindingList_To_rbac_ClusterRoleBindingList(in, out, s) +} + +func autoConvert_rbac_ClusterRoleBindingList_To_v1_ClusterRoleBindingList(in *rbac.ClusterRoleBindingList, out *v1.ClusterRoleBindingList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + if in.Items == nil { + out.Items = make([]v1.ClusterRoleBinding, 0) + } else { + out.Items = *(*[]v1.ClusterRoleBinding)(unsafe.Pointer(&in.Items)) + } + return nil +} + +// Convert_rbac_ClusterRoleBindingList_To_v1_ClusterRoleBindingList is an autogenerated conversion function. +func Convert_rbac_ClusterRoleBindingList_To_v1_ClusterRoleBindingList(in *rbac.ClusterRoleBindingList, out *v1.ClusterRoleBindingList, s conversion.Scope) error { + return autoConvert_rbac_ClusterRoleBindingList_To_v1_ClusterRoleBindingList(in, out, s) +} + +func autoConvert_v1_ClusterRoleList_To_rbac_ClusterRoleList(in *v1.ClusterRoleList, out *rbac.ClusterRoleList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + out.Items = *(*[]rbac.ClusterRole)(unsafe.Pointer(&in.Items)) + return nil +} + +// Convert_v1_ClusterRoleList_To_rbac_ClusterRoleList is an autogenerated conversion function. +func Convert_v1_ClusterRoleList_To_rbac_ClusterRoleList(in *v1.ClusterRoleList, out *rbac.ClusterRoleList, s conversion.Scope) error { + return autoConvert_v1_ClusterRoleList_To_rbac_ClusterRoleList(in, out, s) +} + +func autoConvert_rbac_ClusterRoleList_To_v1_ClusterRoleList(in *rbac.ClusterRoleList, out *v1.ClusterRoleList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + if in.Items == nil { + out.Items = make([]v1.ClusterRole, 0) + } else { + out.Items = *(*[]v1.ClusterRole)(unsafe.Pointer(&in.Items)) + } + return nil +} + +// Convert_rbac_ClusterRoleList_To_v1_ClusterRoleList is an autogenerated conversion function. +func Convert_rbac_ClusterRoleList_To_v1_ClusterRoleList(in *rbac.ClusterRoleList, out *v1.ClusterRoleList, s conversion.Scope) error { + return autoConvert_rbac_ClusterRoleList_To_v1_ClusterRoleList(in, out, s) +} + +func autoConvert_v1_PolicyRule_To_rbac_PolicyRule(in *v1.PolicyRule, out *rbac.PolicyRule, s conversion.Scope) error { + out.Verbs = *(*[]string)(unsafe.Pointer(&in.Verbs)) + out.APIGroups = *(*[]string)(unsafe.Pointer(&in.APIGroups)) + out.Resources = *(*[]string)(unsafe.Pointer(&in.Resources)) + out.ResourceNames = *(*[]string)(unsafe.Pointer(&in.ResourceNames)) + out.NonResourceURLs = *(*[]string)(unsafe.Pointer(&in.NonResourceURLs)) + return nil +} + +// Convert_v1_PolicyRule_To_rbac_PolicyRule is an autogenerated conversion function. +func Convert_v1_PolicyRule_To_rbac_PolicyRule(in *v1.PolicyRule, out *rbac.PolicyRule, s conversion.Scope) error { + return autoConvert_v1_PolicyRule_To_rbac_PolicyRule(in, out, s) +} + +func autoConvert_rbac_PolicyRule_To_v1_PolicyRule(in *rbac.PolicyRule, out *v1.PolicyRule, s conversion.Scope) error { + if in.Verbs == nil { + out.Verbs = make([]string, 0) + } else { + out.Verbs = *(*[]string)(unsafe.Pointer(&in.Verbs)) + } + out.APIGroups = *(*[]string)(unsafe.Pointer(&in.APIGroups)) + out.Resources = *(*[]string)(unsafe.Pointer(&in.Resources)) + out.ResourceNames = *(*[]string)(unsafe.Pointer(&in.ResourceNames)) + out.NonResourceURLs = *(*[]string)(unsafe.Pointer(&in.NonResourceURLs)) + return nil +} + +// Convert_rbac_PolicyRule_To_v1_PolicyRule is an autogenerated conversion function. +func Convert_rbac_PolicyRule_To_v1_PolicyRule(in *rbac.PolicyRule, out *v1.PolicyRule, s conversion.Scope) error { + return autoConvert_rbac_PolicyRule_To_v1_PolicyRule(in, out, s) +} + +func autoConvert_v1_Role_To_rbac_Role(in *v1.Role, out *rbac.Role, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + out.Rules = *(*[]rbac.PolicyRule)(unsafe.Pointer(&in.Rules)) + return nil +} + +// Convert_v1_Role_To_rbac_Role is an autogenerated conversion function. +func Convert_v1_Role_To_rbac_Role(in *v1.Role, out *rbac.Role, s conversion.Scope) error { + return autoConvert_v1_Role_To_rbac_Role(in, out, s) +} + +func autoConvert_rbac_Role_To_v1_Role(in *rbac.Role, out *v1.Role, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if in.Rules == nil { + out.Rules = make([]v1.PolicyRule, 0) + } else { + out.Rules = *(*[]v1.PolicyRule)(unsafe.Pointer(&in.Rules)) + } + return nil +} + +// Convert_rbac_Role_To_v1_Role is an autogenerated conversion function. +func Convert_rbac_Role_To_v1_Role(in *rbac.Role, out *v1.Role, s conversion.Scope) error { + return autoConvert_rbac_Role_To_v1_Role(in, out, s) +} + +func autoConvert_v1_RoleBinding_To_rbac_RoleBinding(in *v1.RoleBinding, out *rbac.RoleBinding, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + out.Subjects = *(*[]rbac.Subject)(unsafe.Pointer(&in.Subjects)) + if err := Convert_v1_RoleRef_To_rbac_RoleRef(&in.RoleRef, &out.RoleRef, s); err != nil { + return err + } + return nil +} + +// Convert_v1_RoleBinding_To_rbac_RoleBinding is an autogenerated conversion function. +func Convert_v1_RoleBinding_To_rbac_RoleBinding(in *v1.RoleBinding, out *rbac.RoleBinding, s conversion.Scope) error { + return autoConvert_v1_RoleBinding_To_rbac_RoleBinding(in, out, s) +} + +func autoConvert_rbac_RoleBinding_To_v1_RoleBinding(in *rbac.RoleBinding, out *v1.RoleBinding, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if in.Subjects == nil { + out.Subjects = make([]v1.Subject, 0) + } else { + out.Subjects = *(*[]v1.Subject)(unsafe.Pointer(&in.Subjects)) + } + if err := Convert_rbac_RoleRef_To_v1_RoleRef(&in.RoleRef, &out.RoleRef, s); err != nil { + return err + } + return nil +} + +// Convert_rbac_RoleBinding_To_v1_RoleBinding is an autogenerated conversion function. +func Convert_rbac_RoleBinding_To_v1_RoleBinding(in *rbac.RoleBinding, out *v1.RoleBinding, s conversion.Scope) error { + return autoConvert_rbac_RoleBinding_To_v1_RoleBinding(in, out, s) +} + +func autoConvert_v1_RoleBindingList_To_rbac_RoleBindingList(in *v1.RoleBindingList, out *rbac.RoleBindingList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + out.Items = *(*[]rbac.RoleBinding)(unsafe.Pointer(&in.Items)) + return nil +} + +// Convert_v1_RoleBindingList_To_rbac_RoleBindingList is an autogenerated conversion function. +func Convert_v1_RoleBindingList_To_rbac_RoleBindingList(in *v1.RoleBindingList, out *rbac.RoleBindingList, s conversion.Scope) error { + return autoConvert_v1_RoleBindingList_To_rbac_RoleBindingList(in, out, s) +} + +func autoConvert_rbac_RoleBindingList_To_v1_RoleBindingList(in *rbac.RoleBindingList, out *v1.RoleBindingList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + if in.Items == nil { + out.Items = make([]v1.RoleBinding, 0) + } else { + out.Items = *(*[]v1.RoleBinding)(unsafe.Pointer(&in.Items)) + } + return nil +} + +// Convert_rbac_RoleBindingList_To_v1_RoleBindingList is an autogenerated conversion function. +func Convert_rbac_RoleBindingList_To_v1_RoleBindingList(in *rbac.RoleBindingList, out *v1.RoleBindingList, s conversion.Scope) error { + return autoConvert_rbac_RoleBindingList_To_v1_RoleBindingList(in, out, s) +} + +func autoConvert_v1_RoleList_To_rbac_RoleList(in *v1.RoleList, out *rbac.RoleList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + out.Items = *(*[]rbac.Role)(unsafe.Pointer(&in.Items)) + return nil +} + +// Convert_v1_RoleList_To_rbac_RoleList is an autogenerated conversion function. +func Convert_v1_RoleList_To_rbac_RoleList(in *v1.RoleList, out *rbac.RoleList, s conversion.Scope) error { + return autoConvert_v1_RoleList_To_rbac_RoleList(in, out, s) +} + +func autoConvert_rbac_RoleList_To_v1_RoleList(in *rbac.RoleList, out *v1.RoleList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + if in.Items == nil { + out.Items = make([]v1.Role, 0) + } else { + out.Items = *(*[]v1.Role)(unsafe.Pointer(&in.Items)) + } + return nil +} + +// Convert_rbac_RoleList_To_v1_RoleList is an autogenerated conversion function. +func Convert_rbac_RoleList_To_v1_RoleList(in *rbac.RoleList, out *v1.RoleList, s conversion.Scope) error { + return autoConvert_rbac_RoleList_To_v1_RoleList(in, out, s) +} + +func autoConvert_v1_RoleRef_To_rbac_RoleRef(in *v1.RoleRef, out *rbac.RoleRef, s conversion.Scope) error { + out.APIGroup = in.APIGroup + out.Kind = in.Kind + out.Name = in.Name + return nil +} + +// Convert_v1_RoleRef_To_rbac_RoleRef is an autogenerated conversion function. +func Convert_v1_RoleRef_To_rbac_RoleRef(in *v1.RoleRef, out *rbac.RoleRef, s conversion.Scope) error { + return autoConvert_v1_RoleRef_To_rbac_RoleRef(in, out, s) +} + +func autoConvert_rbac_RoleRef_To_v1_RoleRef(in *rbac.RoleRef, out *v1.RoleRef, s conversion.Scope) error { + out.APIGroup = in.APIGroup + out.Kind = in.Kind + out.Name = in.Name + return nil +} + +// Convert_rbac_RoleRef_To_v1_RoleRef is an autogenerated conversion function. +func Convert_rbac_RoleRef_To_v1_RoleRef(in *rbac.RoleRef, out *v1.RoleRef, s conversion.Scope) error { + return autoConvert_rbac_RoleRef_To_v1_RoleRef(in, out, s) +} + +func autoConvert_v1_Subject_To_rbac_Subject(in *v1.Subject, out *rbac.Subject, s conversion.Scope) error { + out.Kind = in.Kind + out.APIGroup = in.APIGroup + out.Name = in.Name + out.Namespace = in.Namespace + return nil +} + +// Convert_v1_Subject_To_rbac_Subject is an autogenerated conversion function. +func Convert_v1_Subject_To_rbac_Subject(in *v1.Subject, out *rbac.Subject, s conversion.Scope) error { + return autoConvert_v1_Subject_To_rbac_Subject(in, out, s) +} + +func autoConvert_rbac_Subject_To_v1_Subject(in *rbac.Subject, out *v1.Subject, s conversion.Scope) error { + out.Kind = in.Kind + out.APIGroup = in.APIGroup + out.Name = in.Name + out.Namespace = in.Namespace + return nil +} + +// Convert_rbac_Subject_To_v1_Subject is an autogenerated conversion function. +func Convert_rbac_Subject_To_v1_Subject(in *rbac.Subject, out *v1.Subject, s conversion.Scope) error { + return autoConvert_rbac_Subject_To_v1_Subject(in, out, s) +} diff --git a/pkg/apis/rbac/v1/zz_generated.defaults.go b/pkg/apis/rbac/v1/zz_generated.defaults.go new file mode 100644 index 00000000000..756d155b33b --- /dev/null +++ b/pkg/apis/rbac/v1/zz_generated.defaults.go @@ -0,0 +1,67 @@ +// +build !ignore_autogenerated + +/* +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. +*/ + +// This file was autogenerated by defaulter-gen. Do not edit it manually! + +package v1 + +import ( + v1 "k8s.io/api/rbac/v1" + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// RegisterDefaults adds defaulters functions to the given scheme. +// Public to allow building arbitrary schemes. +// All generated defaulters are covering - they call all nested defaulters. +func RegisterDefaults(scheme *runtime.Scheme) error { + scheme.AddTypeDefaultingFunc(&v1.ClusterRoleBinding{}, func(obj interface{}) { SetObjectDefaults_ClusterRoleBinding(obj.(*v1.ClusterRoleBinding)) }) + scheme.AddTypeDefaultingFunc(&v1.ClusterRoleBindingList{}, func(obj interface{}) { SetObjectDefaults_ClusterRoleBindingList(obj.(*v1.ClusterRoleBindingList)) }) + scheme.AddTypeDefaultingFunc(&v1.RoleBinding{}, func(obj interface{}) { SetObjectDefaults_RoleBinding(obj.(*v1.RoleBinding)) }) + scheme.AddTypeDefaultingFunc(&v1.RoleBindingList{}, func(obj interface{}) { SetObjectDefaults_RoleBindingList(obj.(*v1.RoleBindingList)) }) + return nil +} + +func SetObjectDefaults_ClusterRoleBinding(in *v1.ClusterRoleBinding) { + SetDefaults_ClusterRoleBinding(in) + for i := range in.Subjects { + a := &in.Subjects[i] + SetDefaults_Subject(a) + } +} + +func SetObjectDefaults_ClusterRoleBindingList(in *v1.ClusterRoleBindingList) { + for i := range in.Items { + a := &in.Items[i] + SetObjectDefaults_ClusterRoleBinding(a) + } +} + +func SetObjectDefaults_RoleBinding(in *v1.RoleBinding) { + SetDefaults_RoleBinding(in) + for i := range in.Subjects { + a := &in.Subjects[i] + SetDefaults_Subject(a) + } +} + +func SetObjectDefaults_RoleBindingList(in *v1.RoleBindingList) { + for i := range in.Items { + a := &in.Items[i] + SetObjectDefaults_RoleBinding(a) + } +} diff --git a/pkg/apis/rbac/v1alpha1/BUILD b/pkg/apis/rbac/v1alpha1/BUILD index b21eb11f3fe..a0bb58f106c 100644 --- a/pkg/apis/rbac/v1alpha1/BUILD +++ b/pkg/apis/rbac/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/rbac:go_default_library", "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", @@ -33,7 +30,6 @@ go_library( go_test( name = "go_default_xtest", srcs = ["conversion_test.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", diff --git a/pkg/apis/rbac/v1beta1/BUILD b/pkg/apis/rbac/v1beta1/BUILD index 7578a5dda76..5e7c7656d1d 100644 --- a/pkg/apis/rbac/v1beta1/BUILD +++ b/pkg/apis/rbac/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/rbac:go_default_library", "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", diff --git a/pkg/apis/rbac/validation/BUILD b/pkg/apis/rbac/validation/BUILD index 332d3f8817d..53d572ab31f 100644 --- a/pkg/apis/rbac/validation/BUILD +++ b/pkg/apis/rbac/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//pkg/api/validation:go_default_library", "//pkg/apis/rbac:go_default_library", @@ -24,7 +21,6 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/rbac:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/apis/scheduling/BUILD b/pkg/apis/scheduling/BUILD index f8e055121a1..c32f8b22d05 100644 --- a/pkg/apis/scheduling/BUILD +++ b/pkg/apis/scheduling/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", @@ -35,6 +32,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/scheduling/fuzzer:all-srcs", "//pkg/apis/scheduling/install:all-srcs", "//pkg/apis/scheduling/v1alpha1:all-srcs", "//pkg/apis/scheduling/validation:all-srcs", diff --git a/pkg/apis/scheduling/fuzzer/BUILD b/pkg/apis/scheduling/fuzzer/BUILD new file mode 100644 index 00000000000..dd0561eec8f --- /dev/null +++ b/pkg/apis/scheduling/fuzzer/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = ["//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/apis/scheduling/fuzzer/fuzzer.go b/pkg/apis/scheduling/fuzzer/fuzzer.go new file mode 100644 index 00000000000..ee9286de2cb --- /dev/null +++ b/pkg/apis/scheduling/fuzzer/fuzzer.go @@ -0,0 +1,26 @@ +/* +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 fuzzer + +import ( + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" +) + +// Funcs returns the fuzzer functions for the scheduling api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{} +} diff --git a/pkg/apis/scheduling/install/BUILD b/pkg/apis/scheduling/install/BUILD index b4f916e3349..8d5557ef363 100644 --- a/pkg/apis/scheduling/install/BUILD +++ b/pkg/apis/scheduling/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/scheduling:go_default_library", diff --git a/pkg/apis/scheduling/v1alpha1/BUILD b/pkg/apis/scheduling/v1alpha1/BUILD index 4eb31ac837e..b9ed61b3d11 100644 --- a/pkg/apis/scheduling/v1alpha1/BUILD +++ b/pkg/apis/scheduling/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/scheduling:go_default_library", "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", diff --git a/pkg/apis/scheduling/validation/BUILD b/pkg/apis/scheduling/validation/BUILD index dbf313a5ab3..388caf9afa7 100644 --- a/pkg/apis/scheduling/validation/BUILD +++ b/pkg/apis/scheduling/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/scheduling:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -23,7 +20,6 @@ go_test( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//pkg/api/validation:go_default_library", "//pkg/apis/scheduling:go_default_library", diff --git a/pkg/apis/settings/BUILD b/pkg/apis/settings/BUILD index 96a9ee6421f..e328e7d02df 100644 --- a/pkg/apis/settings/BUILD +++ b/pkg/apis/settings/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -36,6 +33,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/settings/fuzzer:all-srcs", "//pkg/apis/settings/install:all-srcs", "//pkg/apis/settings/v1alpha1:all-srcs", "//pkg/apis/settings/validation:all-srcs", diff --git a/pkg/apis/settings/fuzzer/BUILD b/pkg/apis/settings/fuzzer/BUILD new file mode 100644 index 00000000000..dd0561eec8f --- /dev/null +++ b/pkg/apis/settings/fuzzer/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = ["//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/apis/settings/fuzzer/fuzzer.go b/pkg/apis/settings/fuzzer/fuzzer.go new file mode 100644 index 00000000000..be5a228f5a1 --- /dev/null +++ b/pkg/apis/settings/fuzzer/fuzzer.go @@ -0,0 +1,26 @@ +/* +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 fuzzer + +import ( + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" +) + +// Funcs returns the fuzzer functions for the settings api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{} +} diff --git a/pkg/apis/settings/install/BUILD b/pkg/apis/settings/install/BUILD index 4bc81b91fe7..1a91d59d332 100644 --- a/pkg/apis/settings/install/BUILD +++ b/pkg/apis/settings/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/settings:go_default_library", diff --git a/pkg/apis/settings/v1alpha1/BUILD b/pkg/apis/settings/v1alpha1/BUILD index ce1634e55f4..f3b1c5b333e 100644 --- a/pkg/apis/settings/v1alpha1/BUILD +++ b/pkg/apis/settings/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1:go_default_library", diff --git a/pkg/apis/settings/validation/BUILD b/pkg/apis/settings/validation/BUILD index 5aef42d89b4..e825fca8492 100644 --- a/pkg/apis/settings/validation/BUILD +++ b/pkg/apis/settings/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/settings:go_default_library", @@ -23,7 +20,6 @@ go_test( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//pkg/api/validation:go_default_library", "//pkg/apis/settings:go_default_library", diff --git a/pkg/apis/storage/BUILD b/pkg/apis/storage/BUILD index 24f25759fa5..f47699e1f7d 100644 --- a/pkg/apis/storage/BUILD +++ b/pkg/apis/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", @@ -35,6 +32,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/apis/storage/fuzzer:all-srcs", "//pkg/apis/storage/install:all-srcs", "//pkg/apis/storage/util:all-srcs", "//pkg/apis/storage/v1:all-srcs", diff --git a/pkg/apis/storage/fuzzer/BUILD b/pkg/apis/storage/fuzzer/BUILD new file mode 100644 index 00000000000..dd0561eec8f --- /dev/null +++ b/pkg/apis/storage/fuzzer/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["fuzzer.go"], + deps = ["//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/registry/core/endpoint/strategy_test.go b/pkg/apis/storage/fuzzer/fuzzer.go similarity index 58% rename from pkg/registry/core/endpoint/strategy_test.go rename to pkg/apis/storage/fuzzer/fuzzer.go index b520dd4c9d8..a0a68bdf9ff 100644 --- a/pkg/registry/core/endpoint/strategy_test.go +++ b/pkg/apis/storage/fuzzer/fuzzer.go @@ -1,5 +1,5 @@ /* -Copyright 2014 The Kubernetes Authors. +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. @@ -14,20 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -package endpoint +package fuzzer import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - apitesting "k8s.io/kubernetes/pkg/api/testing" + runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" ) -func TestSelectableFieldLabelConversions(t *testing.T) { - apitesting.TestSelectableFieldLabelConversionsOfKind(t, - api.Registry.GroupOrDie(api.GroupName).GroupVersion.String(), - "Endpoints", - EndpointsToSelectableFields(&api.Endpoints{}), - nil, - ) +// Funcs returns the fuzzer functions for the storage api group. +var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { + return []interface{}{} } diff --git a/pkg/apis/storage/install/BUILD b/pkg/apis/storage/install/BUILD index ab080e3a974..6bb4fbb9ecd 100644 --- a/pkg/apis/storage/install/BUILD +++ b/pkg/apis/storage/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/storage:go_default_library", diff --git a/pkg/apis/storage/util/BUILD b/pkg/apis/storage/util/BUILD index 50157cf26c2..451f7221a1f 100644 --- a/pkg/apis/storage/util/BUILD +++ b/pkg/apis/storage/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["helpers.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], ) diff --git a/pkg/apis/storage/v1/BUILD b/pkg/apis/storage/v1/BUILD index 49f05c6f042..1cf3cf86ab3 100644 --- a/pkg/apis/storage/v1/BUILD +++ b/pkg/apis/storage/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/storage:go_default_library", "//vendor/k8s.io/api/storage/v1:go_default_library", diff --git a/pkg/apis/storage/v1/util/BUILD b/pkg/apis/storage/v1/util/BUILD index 50157cf26c2..451f7221a1f 100644 --- a/pkg/apis/storage/v1/util/BUILD +++ b/pkg/apis/storage/v1/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["helpers.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], ) diff --git a/pkg/apis/storage/v1beta1/BUILD b/pkg/apis/storage/v1beta1/BUILD index 78c2231a938..6e9c1695fa7 100644 --- a/pkg/apis/storage/v1beta1/BUILD +++ b/pkg/apis/storage/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/storage:go_default_library", "//vendor/k8s.io/api/storage/v1beta1:go_default_library", diff --git a/pkg/apis/storage/v1beta1/util/BUILD b/pkg/apis/storage/v1beta1/util/BUILD index 50157cf26c2..451f7221a1f 100644 --- a/pkg/apis/storage/v1beta1/util/BUILD +++ b/pkg/apis/storage/v1beta1/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["helpers.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], ) diff --git a/pkg/apis/storage/validation/BUILD b/pkg/apis/storage/validation/BUILD index 281ecaa133f..2c6b951cf6a 100644 --- a/pkg/apis/storage/validation/BUILD +++ b/pkg/apis/storage/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//pkg/api/validation:go_default_library", "//pkg/apis/storage:go_default_library", @@ -24,7 +21,6 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/storage:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/auth/authorizer/abac/BUILD b/pkg/auth/authorizer/abac/BUILD index 44c1f7044e5..307072800dc 100644 --- a/pkg/auth/authorizer/abac/BUILD +++ b/pkg/auth/authorizer/abac/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["abac.go"], - tags = ["automanaged"], deps = [ "//pkg/apis/abac:go_default_library", "//pkg/apis/abac/latest:go_default_library", @@ -37,7 +34,6 @@ go_test( ":example_policy", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/abac:go_default_library", "//pkg/apis/abac/v0:go_default_library", diff --git a/pkg/auth/nodeidentifier/BUILD b/pkg/auth/nodeidentifier/BUILD index cc228ad79c1..84e7f09fd5a 100644 --- a/pkg/auth/nodeidentifier/BUILD +++ b/pkg/auth/nodeidentifier/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "default.go", "interfaces.go", ], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library"], ) @@ -22,7 +19,6 @@ go_test( name = "go_default_test", srcs = ["default_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library"], ) diff --git a/pkg/auth/user/BUILD b/pkg/auth/user/BUILD index deefdcef3c1..df044c0ebf9 100644 --- a/pkg/auth/user/BUILD +++ b/pkg/auth/user/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/bootstrap/api/BUILD b/pkg/bootstrap/api/BUILD index 2d30e7bf0f5..dfb7d697638 100644 --- a/pkg/bootstrap/api/BUILD +++ b/pkg/bootstrap/api/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "types.go", ], - tags = ["automanaged"], deps = ["//vendor/k8s.io/api/core/v1:go_default_library"], ) diff --git a/pkg/capabilities/BUILD b/pkg/capabilities/BUILD index b94c1427700..b4fdbc79fc5 100644 --- a/pkg/capabilities/BUILD +++ b/pkg/capabilities/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "capabilities.go", "doc.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/client/chaosclient/BUILD b/pkg/client/chaosclient/BUILD index c04debc1707..9c46e126906 100644 --- a/pkg/client/chaosclient/BUILD +++ b/pkg/client/chaosclient/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["chaosclient.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library"], ) @@ -19,7 +16,6 @@ go_test( name = "go_default_test", srcs = ["chaosclient_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/pkg/client/clientset_generated/internalclientset/BUILD b/pkg/client/clientset_generated/internalclientset/BUILD index 07f299d3adf..09f1e0d3adf 100644 --- a/pkg/client/clientset_generated/internalclientset/BUILD +++ b/pkg/client/clientset_generated/internalclientset/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "clientset.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//pkg/client/clientset_generated/internalclientset/typed/admissionregistration/internalversion:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/apps/internalversion:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/fake/BUILD b/pkg/client/clientset_generated/internalclientset/fake/BUILD index 31484b6a9db..986f9b20789 100644 --- a/pkg/client/clientset_generated/internalclientset/fake/BUILD +++ b/pkg/client/clientset_generated/internalclientset/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/admissionregistration:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/scheme/BUILD b/pkg/client/clientset_generated/internalclientset/scheme/BUILD index 0b59a456a3a..0c3683d8a3f 100644 --- a/pkg/client/clientset_generated/internalclientset/scheme/BUILD +++ b/pkg/client/clientset_generated/internalclientset/scheme/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "register.go", "register_custom.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/install:go_default_library", "//pkg/apis/admissionregistration/install:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/admissionregistration/internalversion/BUILD b/pkg/client/clientset_generated/internalclientset/typed/admissionregistration/internalversion/BUILD index c8e974c5f0f..d7894dfa43f 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/admissionregistration/internalversion/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/admissionregistration/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "generated_expansion.go", "initializerconfiguration.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/admissionregistration:go_default_library", "//pkg/client/clientset_generated/internalclientset/scheme:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/admissionregistration/internalversion/fake/BUILD b/pkg/client/clientset_generated/internalclientset/typed/admissionregistration/internalversion/fake/BUILD index 925360762ae..c0dec497fd0 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/admissionregistration/internalversion/fake/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/admissionregistration/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "fake_externaladmissionhookconfiguration.go", "fake_initializerconfiguration.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/admissionregistration:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/admissionregistration/internalversion:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/apps/internalversion/BUILD b/pkg/client/clientset_generated/internalclientset/typed/apps/internalversion/BUILD index 67dd8b7c704..83474a0708e 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/apps/internalversion/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/apps/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "generated_expansion.go", "statefulset.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/apps:go_default_library", "//pkg/client/clientset_generated/internalclientset/scheme:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/apps/internalversion/fake/BUILD b/pkg/client/clientset_generated/internalclientset/typed/apps/internalversion/fake/BUILD index 4cc26e947ff..6aab6439666 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/apps/internalversion/fake/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/apps/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "fake_controllerrevision.go", "fake_statefulset.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/apps:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/apps/internalversion:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/authentication/internalversion/BUILD b/pkg/client/clientset_generated/internalclientset/typed/authentication/internalversion/BUILD index 9ef15fb517c..cf58a8906d3 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/authentication/internalversion/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/authentication/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "tokenreview.go", "tokenreview_expansion.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/authentication:go_default_library", "//pkg/client/clientset_generated/internalclientset/scheme:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/authentication/internalversion/fake/BUILD b/pkg/client/clientset_generated/internalclientset/typed/authentication/internalversion/fake/BUILD index beff2fd338f..d7f8e7f2134 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/authentication/internalversion/fake/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/authentication/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "fake_tokenreview.go", "fake_tokenreview_expansion.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/authentication:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/authentication/internalversion:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion/BUILD b/pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion/BUILD index 3ac661ef811..311749fb48b 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -20,7 +18,6 @@ go_library( "subjectaccessreview.go", "subjectaccessreview_expansion.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/authorization:go_default_library", "//pkg/client/clientset_generated/internalclientset/scheme:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion/fake/BUILD b/pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion/fake/BUILD index 33db41d177a..481ab6164a3 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion/fake/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -20,7 +18,6 @@ go_library( "fake_subjectaccessreview.go", "fake_subjectaccessreview_expansion.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/authorization:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/autoscaling/internalversion/BUILD b/pkg/client/clientset_generated/internalclientset/typed/autoscaling/internalversion/BUILD index c5bde645030..2d8baf418bb 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/autoscaling/internalversion/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/autoscaling/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "generated_expansion.go", "horizontalpodautoscaler.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/autoscaling:go_default_library", "//pkg/client/clientset_generated/internalclientset/scheme:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/autoscaling/internalversion/fake/BUILD b/pkg/client/clientset_generated/internalclientset/typed/autoscaling/internalversion/fake/BUILD index 360bb9dc4ad..22e49580105 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/autoscaling/internalversion/fake/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/autoscaling/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_autoscaling_client.go", "fake_horizontalpodautoscaler.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/autoscaling:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/autoscaling/internalversion:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/batch/internalversion/BUILD b/pkg/client/clientset_generated/internalclientset/typed/batch/internalversion/BUILD index 1841dd4b558..761a54f89df 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/batch/internalversion/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/batch/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "generated_expansion.go", "job.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/batch:go_default_library", "//pkg/client/clientset_generated/internalclientset/scheme:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/batch/internalversion/fake/BUILD b/pkg/client/clientset_generated/internalclientset/typed/batch/internalversion/fake/BUILD index 8870efa6368..cb1ff0d8739 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/batch/internalversion/fake/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/batch/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "fake_cronjob.go", "fake_job.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/batch:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/batch/internalversion:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/certificates/internalversion/BUILD b/pkg/client/clientset_generated/internalclientset/typed/certificates/internalversion/BUILD index c4e41532b73..3e39ccdf048 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/certificates/internalversion/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/certificates/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "doc.go", "generated_expansion.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/certificates:go_default_library", "//pkg/client/clientset_generated/internalclientset/scheme:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/certificates/internalversion/fake/BUILD b/pkg/client/clientset_generated/internalclientset/typed/certificates/internalversion/fake/BUILD index c76a2c0d078..e9d3a20d360 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/certificates/internalversion/fake/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/certificates/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "fake_certificatesigningrequest.go", "fake_certificatesigningrequest_expansion.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/certificates:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/certificates/internalversion:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/core/internalversion/BUILD b/pkg/client/clientset_generated/internalclientset/typed/core/internalversion/BUILD index ab1b04eac07..276b269b4e8 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/core/internalversion/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/core/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -35,7 +33,6 @@ go_library( "service_expansion.go", "serviceaccount.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/ref:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/core/internalversion/fake/BUILD b/pkg/client/clientset_generated/internalclientset/typed/core/internalversion/fake/BUILD index 5dc0e4eed9d..0f8b91a29fa 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/core/internalversion/fake/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/core/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -34,7 +32,6 @@ go_library( "fake_service_expansion.go", "fake_serviceaccount.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/core/internalversion:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion/BUILD b/pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion/BUILD index 84efe82f809..4acadb06874 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -24,7 +22,6 @@ go_library( "scale_expansion.go", "thirdpartyresource.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/extensions:go_default_library", "//pkg/client/clientset_generated/internalclientset/scheme:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion/fake/BUILD b/pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion/fake/BUILD index 98c12eb90c6..762bf894989 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion/fake/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -23,7 +21,6 @@ go_library( "fake_scale_expansion.go", "fake_thirdpartyresource.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/extensions:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/networking/internalversion/BUILD b/pkg/client/clientset_generated/internalclientset/typed/networking/internalversion/BUILD index 2af7d8d64ba..f7a14f9fe70 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/networking/internalversion/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/networking/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "networking_client.go", "networkpolicy.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/networking:go_default_library", "//pkg/client/clientset_generated/internalclientset/scheme:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/networking/internalversion/fake/BUILD b/pkg/client/clientset_generated/internalclientset/typed/networking/internalversion/fake/BUILD index 67398435bef..e5cf8e9cce3 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/networking/internalversion/fake/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/networking/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_networking_client.go", "fake_networkpolicy.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/networking:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/networking/internalversion:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/policy/internalversion/BUILD b/pkg/client/clientset_generated/internalclientset/typed/policy/internalversion/BUILD index 0da1443d20d..2288c94c625 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/policy/internalversion/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/policy/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "poddisruptionbudget.go", "policy_client.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/policy:go_default_library", "//pkg/client/clientset_generated/internalclientset/scheme:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/policy/internalversion/fake/BUILD b/pkg/client/clientset_generated/internalclientset/typed/policy/internalversion/fake/BUILD index 9fd74a45310..4d93b59269a 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/policy/internalversion/fake/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/policy/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "fake_poddisruptionbudget.go", "fake_policy_client.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/policy:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/policy/internalversion:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion/BUILD b/pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion/BUILD index 0143b7322fb..fdc305f8ea2 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "role.go", "rolebinding.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/rbac:go_default_library", "//pkg/client/clientset_generated/internalclientset/scheme:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion/fake/BUILD b/pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion/fake/BUILD index 5f741c02326..ae36e7ede0c 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion/fake/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "fake_role.go", "fake_rolebinding.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/rbac:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/scheduling/internalversion/BUILD b/pkg/client/clientset_generated/internalclientset/typed/scheduling/internalversion/BUILD index 6d462f3aad5..c6ecdbea017 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/scheduling/internalversion/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/scheduling/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "priorityclass.go", "scheduling_client.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/scheduling:go_default_library", "//pkg/client/clientset_generated/internalclientset/scheme:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/scheduling/internalversion/fake/BUILD b/pkg/client/clientset_generated/internalclientset/typed/scheduling/internalversion/fake/BUILD index 35a77dd23c3..f5653d1b139 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/scheduling/internalversion/fake/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/scheduling/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_priorityclass.go", "fake_scheduling_client.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/scheduling:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/scheduling/internalversion:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/settings/internalversion/BUILD b/pkg/client/clientset_generated/internalclientset/typed/settings/internalversion/BUILD index 1210dcb1ae5..45f1886ae0c 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/settings/internalversion/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/settings/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "podpreset.go", "settings_client.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/settings:go_default_library", "//pkg/client/clientset_generated/internalclientset/scheme:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/settings/internalversion/fake/BUILD b/pkg/client/clientset_generated/internalclientset/typed/settings/internalversion/fake/BUILD index 413b0a058f3..c0d49515d30 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/settings/internalversion/fake/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/settings/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_podpreset.go", "fake_settings_client.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/settings:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/settings/internalversion:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/storage/internalversion/BUILD b/pkg/client/clientset_generated/internalclientset/typed/storage/internalversion/BUILD index 205a29c0a78..1a4b8f4d034 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/storage/internalversion/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/storage/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "storage_client.go", "storageclass.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/storage:go_default_library", "//pkg/client/clientset_generated/internalclientset/scheme:go_default_library", diff --git a/pkg/client/clientset_generated/internalclientset/typed/storage/internalversion/fake/BUILD b/pkg/client/clientset_generated/internalclientset/typed/storage/internalversion/fake/BUILD index bb0bb5d8891..e5769ea7636 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/storage/internalversion/fake/BUILD +++ b/pkg/client/clientset_generated/internalclientset/typed/storage/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_storage_client.go", "fake_storageclass.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/storage:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/storage/internalversion:go_default_library", diff --git a/pkg/client/conditions/BUILD b/pkg/client/conditions/BUILD index 60c1d8968e3..cbaff53dc80 100644 --- a/pkg/client/conditions/BUILD +++ b/pkg/client/conditions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["conditions.go"], - tags = ["automanaged"], deps = [ "//pkg/api/v1/pod:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/BUILD b/pkg/client/informers/informers_generated/internalversion/BUILD index 697ab720629..f9383819f1f 100644 --- a/pkg/client/informers/informers_generated/internalversion/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "factory.go", "generic.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/admissionregistration:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/admissionregistration/BUILD b/pkg/client/informers/informers_generated/internalversion/admissionregistration/BUILD index cdf05aa8930..4bd8bd02e1d 100644 --- a/pkg/client/informers/informers_generated/internalversion/admissionregistration/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/admissionregistration/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//pkg/client/informers/informers_generated/internalversion/admissionregistration/internalversion:go_default_library", "//pkg/client/informers/informers_generated/internalversion/internalinterfaces:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/admissionregistration/internalversion/BUILD b/pkg/client/informers/informers_generated/internalversion/admissionregistration/internalversion/BUILD index d653f6eeb75..2604d64f622 100644 --- a/pkg/client/informers/informers_generated/internalversion/admissionregistration/internalversion/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/admissionregistration/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "initializerconfiguration.go", "interface.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/admissionregistration:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/apps/BUILD b/pkg/client/informers/informers_generated/internalversion/apps/BUILD index 5fcb310e9b3..535cefd539f 100644 --- a/pkg/client/informers/informers_generated/internalversion/apps/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/apps/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//pkg/client/informers/informers_generated/internalversion/apps/internalversion:go_default_library", "//pkg/client/informers/informers_generated/internalversion/internalinterfaces:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/apps/internalversion/BUILD b/pkg/client/informers/informers_generated/internalversion/apps/internalversion/BUILD index 05854af6d8e..58739286a0d 100644 --- a/pkg/client/informers/informers_generated/internalversion/apps/internalversion/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/apps/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "interface.go", "statefulset.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/apps:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/autoscaling/BUILD b/pkg/client/informers/informers_generated/internalversion/autoscaling/BUILD index ac489a213c7..b436b210fdf 100644 --- a/pkg/client/informers/informers_generated/internalversion/autoscaling/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/autoscaling/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//pkg/client/informers/informers_generated/internalversion/autoscaling/internalversion:go_default_library", "//pkg/client/informers/informers_generated/internalversion/internalinterfaces:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/autoscaling/internalversion/BUILD b/pkg/client/informers/informers_generated/internalversion/autoscaling/internalversion/BUILD index a29a3771755..c08c0fcad19 100644 --- a/pkg/client/informers/informers_generated/internalversion/autoscaling/internalversion/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/autoscaling/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "horizontalpodautoscaler.go", "interface.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/autoscaling:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/batch/BUILD b/pkg/client/informers/informers_generated/internalversion/batch/BUILD index 03be35f4413..5e4cb6c270c 100644 --- a/pkg/client/informers/informers_generated/internalversion/batch/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/batch/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//pkg/client/informers/informers_generated/internalversion/batch/internalversion:go_default_library", "//pkg/client/informers/informers_generated/internalversion/internalinterfaces:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/batch/internalversion/BUILD b/pkg/client/informers/informers_generated/internalversion/batch/internalversion/BUILD index 031c0f2330e..595ce620461 100644 --- a/pkg/client/informers/informers_generated/internalversion/batch/internalversion/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/batch/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "interface.go", "job.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/batch:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/certificates/BUILD b/pkg/client/informers/informers_generated/internalversion/certificates/BUILD index 1bce86577cf..efb814b17d2 100644 --- a/pkg/client/informers/informers_generated/internalversion/certificates/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/certificates/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//pkg/client/informers/informers_generated/internalversion/certificates/internalversion:go_default_library", "//pkg/client/informers/informers_generated/internalversion/internalinterfaces:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/certificates/internalversion/BUILD b/pkg/client/informers/informers_generated/internalversion/certificates/internalversion/BUILD index 92833f1fdc4..5af82636abd 100644 --- a/pkg/client/informers/informers_generated/internalversion/certificates/internalversion/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/certificates/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "certificatesigningrequest.go", "interface.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/certificates:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/core/BUILD b/pkg/client/informers/informers_generated/internalversion/core/BUILD index e3e1d012901..944f76bac95 100644 --- a/pkg/client/informers/informers_generated/internalversion/core/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/core/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//pkg/client/informers/informers_generated/internalversion/core/internalversion:go_default_library", "//pkg/client/informers/informers_generated/internalversion/internalinterfaces:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/core/internalversion/BUILD b/pkg/client/informers/informers_generated/internalversion/core/internalversion/BUILD index f33c7ad9efe..2c4ac26d23f 100644 --- a/pkg/client/informers/informers_generated/internalversion/core/internalversion/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/core/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -28,7 +26,6 @@ go_library( "service.go", "serviceaccount.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/extensions/BUILD b/pkg/client/informers/informers_generated/internalversion/extensions/BUILD index 9b87715f804..7ecba36be6d 100644 --- a/pkg/client/informers/informers_generated/internalversion/extensions/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/extensions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//pkg/client/informers/informers_generated/internalversion/extensions/internalversion:go_default_library", "//pkg/client/informers/informers_generated/internalversion/internalinterfaces:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/extensions/internalversion/BUILD b/pkg/client/informers/informers_generated/internalversion/extensions/internalversion/BUILD index 5d57819fab4..ddf7cbf7773 100644 --- a/pkg/client/informers/informers_generated/internalversion/extensions/internalversion/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/extensions/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "replicaset.go", "thirdpartyresource.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/extensions:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/internalinterfaces/BUILD b/pkg/client/informers/informers_generated/internalversion/internalinterfaces/BUILD index ab44b755a8b..b283332b28d 100644 --- a/pkg/client/informers/informers_generated/internalversion/internalinterfaces/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/internalinterfaces/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["factory_interfaces.go"], - tags = ["automanaged"], deps = [ "//pkg/client/clientset_generated/internalclientset:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/networking/BUILD b/pkg/client/informers/informers_generated/internalversion/networking/BUILD index 63b4fc3d45e..dfc51cb9a13 100644 --- a/pkg/client/informers/informers_generated/internalversion/networking/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/networking/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//pkg/client/informers/informers_generated/internalversion/internalinterfaces:go_default_library", "//pkg/client/informers/informers_generated/internalversion/networking/internalversion:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/networking/internalversion/BUILD b/pkg/client/informers/informers_generated/internalversion/networking/internalversion/BUILD index dffb4f61c9d..56a2a65706e 100644 --- a/pkg/client/informers/informers_generated/internalversion/networking/internalversion/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/networking/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "interface.go", "networkpolicy.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/networking:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/policy/BUILD b/pkg/client/informers/informers_generated/internalversion/policy/BUILD index ac23f4f2cf3..470c4c220be 100644 --- a/pkg/client/informers/informers_generated/internalversion/policy/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/policy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//pkg/client/informers/informers_generated/internalversion/internalinterfaces:go_default_library", "//pkg/client/informers/informers_generated/internalversion/policy/internalversion:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/policy/internalversion/BUILD b/pkg/client/informers/informers_generated/internalversion/policy/internalversion/BUILD index cc7ccd0b67f..f43798ea92e 100644 --- a/pkg/client/informers/informers_generated/internalversion/policy/internalversion/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/policy/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "interface.go", "poddisruptionbudget.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/policy:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/rbac/BUILD b/pkg/client/informers/informers_generated/internalversion/rbac/BUILD index 193f617acbc..44e9a641f14 100644 --- a/pkg/client/informers/informers_generated/internalversion/rbac/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/rbac/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//pkg/client/informers/informers_generated/internalversion/internalinterfaces:go_default_library", "//pkg/client/informers/informers_generated/internalversion/rbac/internalversion:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/rbac/internalversion/BUILD b/pkg/client/informers/informers_generated/internalversion/rbac/internalversion/BUILD index 661f05bd69f..3352580d4a9 100644 --- a/pkg/client/informers/informers_generated/internalversion/rbac/internalversion/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/rbac/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "role.go", "rolebinding.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/rbac:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/scheduling/BUILD b/pkg/client/informers/informers_generated/internalversion/scheduling/BUILD index 6bd55c518b2..4f48fc8ba0f 100644 --- a/pkg/client/informers/informers_generated/internalversion/scheduling/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/scheduling/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//pkg/client/informers/informers_generated/internalversion/internalinterfaces:go_default_library", "//pkg/client/informers/informers_generated/internalversion/scheduling/internalversion:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/scheduling/internalversion/BUILD b/pkg/client/informers/informers_generated/internalversion/scheduling/internalversion/BUILD index de18283d89a..bc4073fa3bc 100644 --- a/pkg/client/informers/informers_generated/internalversion/scheduling/internalversion/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/scheduling/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "interface.go", "priorityclass.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/scheduling:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/settings/BUILD b/pkg/client/informers/informers_generated/internalversion/settings/BUILD index 90dd81154f1..16bf99bdbdd 100644 --- a/pkg/client/informers/informers_generated/internalversion/settings/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/settings/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//pkg/client/informers/informers_generated/internalversion/internalinterfaces:go_default_library", "//pkg/client/informers/informers_generated/internalversion/settings/internalversion:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/settings/internalversion/BUILD b/pkg/client/informers/informers_generated/internalversion/settings/internalversion/BUILD index 2cf2b84cb57..31f3a7e674a 100644 --- a/pkg/client/informers/informers_generated/internalversion/settings/internalversion/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/settings/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "interface.go", "podpreset.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/settings:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/storage/BUILD b/pkg/client/informers/informers_generated/internalversion/storage/BUILD index e02245ead6c..8ab3e991aa7 100644 --- a/pkg/client/informers/informers_generated/internalversion/storage/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//pkg/client/informers/informers_generated/internalversion/internalinterfaces:go_default_library", "//pkg/client/informers/informers_generated/internalversion/storage/internalversion:go_default_library", diff --git a/pkg/client/informers/informers_generated/internalversion/storage/internalversion/BUILD b/pkg/client/informers/informers_generated/internalversion/storage/internalversion/BUILD index 96668716192..2b1800c3848 100644 --- a/pkg/client/informers/informers_generated/internalversion/storage/internalversion/BUILD +++ b/pkg/client/informers/informers_generated/internalversion/storage/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "interface.go", "storageclass.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/storage:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/pkg/client/leaderelectionconfig/BUILD b/pkg/client/leaderelectionconfig/BUILD index 17dc8e1376f..1461769f26e 100644 --- a/pkg/client/leaderelectionconfig/BUILD +++ b/pkg/client/leaderelectionconfig/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["config.go"], - tags = ["automanaged"], deps = [ "//pkg/apis/componentconfig:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/pkg/client/listers/admissionregistration/internalversion/BUILD b/pkg/client/listers/admissionregistration/internalversion/BUILD index 699c45af94f..71e185607f7 100644 --- a/pkg/client/listers/admissionregistration/internalversion/BUILD +++ b/pkg/client/listers/admissionregistration/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "externaladmissionhookconfiguration.go", "initializerconfiguration.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/admissionregistration:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/pkg/client/listers/apps/internalversion/BUILD b/pkg/client/listers/apps/internalversion/BUILD index cf4f3c2a027..42b873d308f 100644 --- a/pkg/client/listers/apps/internalversion/BUILD +++ b/pkg/client/listers/apps/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "statefulset.go", "statefulset_expansion.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/apps:go_default_library", diff --git a/pkg/client/listers/authentication/internalversion/BUILD b/pkg/client/listers/authentication/internalversion/BUILD index 736517f1f12..b1c2d404b77 100644 --- a/pkg/client/listers/authentication/internalversion/BUILD +++ b/pkg/client/listers/authentication/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "tokenreview.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/authentication:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/pkg/client/listers/authorization/internalversion/BUILD b/pkg/client/listers/authorization/internalversion/BUILD index 4014db34bdf..5431899c3dc 100644 --- a/pkg/client/listers/authorization/internalversion/BUILD +++ b/pkg/client/listers/authorization/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "selfsubjectaccessreview.go", "subjectaccessreview.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/authorization:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/pkg/client/listers/autoscaling/internalversion/BUILD b/pkg/client/listers/autoscaling/internalversion/BUILD index 806afcb17c2..a3e269335b0 100644 --- a/pkg/client/listers/autoscaling/internalversion/BUILD +++ b/pkg/client/listers/autoscaling/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "horizontalpodautoscaler.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/autoscaling:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/pkg/client/listers/batch/internalversion/BUILD b/pkg/client/listers/batch/internalversion/BUILD index adeed06e64e..059ae41bb76 100644 --- a/pkg/client/listers/batch/internalversion/BUILD +++ b/pkg/client/listers/batch/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "job.go", "job_expansion.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/batch:go_default_library", @@ -31,7 +28,6 @@ go_test( name = "go_default_test", srcs = ["job_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/batch:go_default_library", diff --git a/pkg/client/listers/certificates/internalversion/BUILD b/pkg/client/listers/certificates/internalversion/BUILD index 1fabb68f9d8..55e71d45b27 100644 --- a/pkg/client/listers/certificates/internalversion/BUILD +++ b/pkg/client/listers/certificates/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "certificatesigningrequest.go", "expansion_generated.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/certificates:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/pkg/client/listers/core/internalversion/BUILD b/pkg/client/listers/core/internalversion/BUILD index e51dc430f06..3561a1f42f1 100644 --- a/pkg/client/listers/core/internalversion/BUILD +++ b/pkg/client/listers/core/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -31,7 +29,6 @@ go_library( "service_expansion.go", "serviceaccount.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/pkg/client/listers/extensions/internalversion/BUILD b/pkg/client/listers/extensions/internalversion/BUILD index 0523715c0ca..acec6253e71 100644 --- a/pkg/client/listers/extensions/internalversion/BUILD +++ b/pkg/client/listers/extensions/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -24,7 +22,6 @@ go_library( "scale.go", "thirdpartyresource.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", @@ -52,7 +49,6 @@ go_test( name = "go_default_test", srcs = ["daemonset_expansion_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/client/listers/imagepolicy/internalversion/BUILD b/pkg/client/listers/imagepolicy/internalversion/BUILD index a0e62b0ee3a..97de7da07e1 100644 --- a/pkg/client/listers/imagepolicy/internalversion/BUILD +++ b/pkg/client/listers/imagepolicy/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "imagereview.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/imagepolicy:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/pkg/client/listers/networking/internalversion/BUILD b/pkg/client/listers/networking/internalversion/BUILD index 2c095eaac97..e6b71d04af1 100644 --- a/pkg/client/listers/networking/internalversion/BUILD +++ b/pkg/client/listers/networking/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "networkpolicy.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/networking:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/pkg/client/listers/policy/internalversion/BUILD b/pkg/client/listers/policy/internalversion/BUILD index 73d79705354..d3b7b56e1b2 100644 --- a/pkg/client/listers/policy/internalversion/BUILD +++ b/pkg/client/listers/policy/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "poddisruptionbudget.go", "poddisruptionbudget_expansion.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/policy:go_default_library", diff --git a/pkg/client/listers/rbac/internalversion/BUILD b/pkg/client/listers/rbac/internalversion/BUILD index c2a7079063d..eaed9273b35 100644 --- a/pkg/client/listers/rbac/internalversion/BUILD +++ b/pkg/client/listers/rbac/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "role.go", "rolebinding.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/rbac:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/pkg/client/listers/scheduling/internalversion/BUILD b/pkg/client/listers/scheduling/internalversion/BUILD index 9e0c679b95b..0933b02331b 100644 --- a/pkg/client/listers/scheduling/internalversion/BUILD +++ b/pkg/client/listers/scheduling/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "priorityclass.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/scheduling:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/pkg/client/listers/settings/internalversion/BUILD b/pkg/client/listers/settings/internalversion/BUILD index d2f73135c91..1d33428cc31 100644 --- a/pkg/client/listers/settings/internalversion/BUILD +++ b/pkg/client/listers/settings/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "podpreset.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/settings:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/pkg/client/listers/storage/internalversion/BUILD b/pkg/client/listers/storage/internalversion/BUILD index 55bf05e84e6..c5f61c2762a 100644 --- a/pkg/client/listers/storage/internalversion/BUILD +++ b/pkg/client/listers/storage/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "storageclass.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/storage:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/pkg/client/metrics/BUILD b/pkg/client/metrics/BUILD index c63d92e8e15..490177eaed5 100644 --- a/pkg/client/metrics/BUILD +++ b/pkg/client/metrics/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["metrics.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/client/metrics/prometheus/BUILD b/pkg/client/metrics/prometheus/BUILD index a55f5dfb73a..519bca71ca3 100644 --- a/pkg/client/metrics/prometheus/BUILD +++ b/pkg/client/metrics/prometheus/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["prometheus.go"], - tags = ["automanaged"], deps = [ "//pkg/client/metrics:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", diff --git a/pkg/client/retry/BUILD b/pkg/client/retry/BUILD index d8688908178..9c9bb048763 100644 --- a/pkg/client/retry/BUILD +++ b/pkg/client/retry/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", @@ -22,7 +19,6 @@ go_test( name = "go_default_test", srcs = ["util_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/pkg/client/tests/BUILD b/pkg/client/tests/BUILD index 555019ffdee..e8626bfdd89 100644 --- a/pkg/client/tests/BUILD +++ b/pkg/client/tests/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_test( "remotecommand_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", @@ -48,7 +45,6 @@ go_test( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/client/unversioned/BUILD b/pkg/client/unversioned/BUILD index 3f1f8e4c9a1..7255f4e0882 100644 --- a/pkg/client/unversioned/BUILD +++ b/pkg/client/unversioned/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "conditions.go", "helper.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/pod:go_default_library", @@ -39,7 +36,6 @@ go_test( name = "go_default_test", srcs = ["helper_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", diff --git a/pkg/client/unversioned/testclient/simple/BUILD b/pkg/client/unversioned/testclient/simple/BUILD index 11831872062..867f9e091f7 100644 --- a/pkg/client/unversioned/testclient/simple/BUILD +++ b/pkg/client/unversioned/testclient/simple/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["simple_testclient.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", diff --git a/pkg/cloudprovider/BUILD b/pkg/cloudprovider/BUILD index cd26b4b3d8f..ee4c9298fac 100644 --- a/pkg/cloudprovider/BUILD +++ b/pkg/cloudprovider/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "plugins.go", ], - tags = ["automanaged"], deps = [ "//pkg/controller:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/pkg/cloudprovider/cloud.go b/pkg/cloudprovider/cloud.go index 409d39a7d13..5c4651f7d3a 100644 --- a/pkg/cloudprovider/cloud.go +++ b/pkg/cloudprovider/cloud.go @@ -45,6 +45,8 @@ type Interface interface { ProviderName() string // ScrubDNS provides an opportunity for cloud-provider-specific code to process DNS settings for pods. ScrubDNS(nameservers, searches []string) (nsOut, srchOut []string) + // HasClusterID returns true if a ClusterID is required and set + HasClusterID() bool } // Clusters is an abstract, pluggable interface for clusters of containers. diff --git a/pkg/cloudprovider/providers/BUILD b/pkg/cloudprovider/providers/BUILD index 3842437c84a..63c7d12f666 100644 --- a/pkg/cloudprovider/providers/BUILD +++ b/pkg/cloudprovider/providers/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["providers.go"], - tags = ["automanaged"], deps = [ "//pkg/cloudprovider/providers/aws:go_default_library", "//pkg/cloudprovider/providers/azure:go_default_library", diff --git a/pkg/cloudprovider/providers/aws/BUILD b/pkg/cloudprovider/providers/aws/BUILD index 6c922291395..8075984fe78 100644 --- a/pkg/cloudprovider/providers/aws/BUILD +++ b/pkg/cloudprovider/providers/aws/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -26,7 +24,6 @@ go_library( "tags.go", "volumes.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/service:go_default_library", "//pkg/cloudprovider:go_default_library", @@ -66,7 +63,6 @@ go_test( "tags_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubelet/apis:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", diff --git a/pkg/cloudprovider/providers/aws/aws.go b/pkg/cloudprovider/providers/aws/aws.go index ebd56a36086..704c5e9966e 100644 --- a/pkg/cloudprovider/providers/aws/aws.go +++ b/pkg/cloudprovider/providers/aws/aws.go @@ -971,6 +971,11 @@ func (c *Cloud) Routes() (cloudprovider.Routes, bool) { return c, true } +// HasClusterID returns true if the cluster has a clusterID +func (c *Cloud) HasClusterID() bool { + return len(c.tagging.clusterID()) > 0 +} + // NodeAddresses is an implementation of Instances.NodeAddresses. func (c *Cloud) NodeAddresses(name types.NodeName) ([]v1.NodeAddress, error) { if c.selfAWSInstance.nodeName == name || len(name) == 0 { diff --git a/pkg/cloudprovider/providers/aws/tags.go b/pkg/cloudprovider/providers/aws/tags.go index 3d051850574..bb63fce2bfd 100644 --- a/pkg/cloudprovider/providers/aws/tags.go +++ b/pkg/cloudprovider/providers/aws/tags.go @@ -276,3 +276,7 @@ func (t *awsTagging) buildTags(lifecycle ResourceLifecycle, additionalTags map[s return tags } + +func (t *awsTagging) clusterID() string { + return t.ClusterID +} diff --git a/pkg/cloudprovider/providers/azure/BUILD b/pkg/cloudprovider/providers/azure/BUILD index 2dc4b7b20e8..2a494f4ff71 100644 --- a/pkg/cloudprovider/providers/azure/BUILD +++ b/pkg/cloudprovider/providers/azure/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -27,7 +25,6 @@ go_library( "azure_wrap.go", "azure_zones.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/service:go_default_library", "//pkg/cloudprovider:go_default_library", @@ -59,7 +56,6 @@ go_test( name = "go_default_test", srcs = ["azure_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api/v1/service:go_default_library", "//vendor/github.com/Azure/azure-sdk-for-go/arm/network:go_default_library", diff --git a/pkg/cloudprovider/providers/azure/azure.go b/pkg/cloudprovider/providers/azure/azure.go index 6d922892ab8..be0e2df4464 100644 --- a/pkg/cloudprovider/providers/azure/azure.go +++ b/pkg/cloudprovider/providers/azure/azure.go @@ -68,6 +68,8 @@ type Config struct { Location string `json:"location" yaml:"location"` // The name of the VNet that the cluster is deployed in VnetName string `json:"vnetName" yaml:"vnetName"` + // The name of the resource group that the Vnet is deployed in + VnetResourceGroup string `json:"vnetResourceGroup" yaml:"vnetResourceGroup"` // The name of the subnet that the cluster is deployed in SubnetName string `json:"subnetName" yaml:"subnetName"` // The name of the security group attached to the cluster's subnet @@ -330,6 +332,11 @@ func NewCloud(configReader io.Reader) (cloudprovider.Interface, error) { // ParseConfig returns a parsed configuration and azure.Environment for an Azure cloudprovider config file func ParseConfig(configReader io.Reader) (*Config, *azure.Environment, error) { var config Config + var env azure.Environment + + if configReader == nil { + return &config, &env, nil + } configContents, err := ioutil.ReadAll(configReader) if err != nil { @@ -340,7 +347,6 @@ func ParseConfig(configReader io.Reader) (*Config, *azure.Environment, error) { return nil, nil, err } - var env azure.Environment if config.Cloud == "" { env = azure.PublicCloud } else { @@ -385,6 +391,11 @@ func (az *Cloud) ScrubDNS(nameservers, searches []string) (nsOut, srchOut []stri return nameservers, searches } +// HasClusterID returns true if the cluster has a clusterID +func (az *Cloud) HasClusterID() bool { + return true +} + // ProviderName returns the cloud provider ID. func (az *Cloud) ProviderName() string { return CloudProviderName diff --git a/pkg/cloudprovider/providers/azure/azure_wrap.go b/pkg/cloudprovider/providers/azure/azure_wrap.go index 7277b8c814f..e9c06dc6fc2 100644 --- a/pkg/cloudprovider/providers/azure/azure_wrap.go +++ b/pkg/cloudprovider/providers/azure/azure_wrap.go @@ -143,10 +143,17 @@ func (az *Cloud) getPublicIPAddress(name string) (pip network.PublicIPAddress, e func (az *Cloud) getSubnet(virtualNetworkName string, subnetName string) (subnet network.Subnet, exists bool, err error) { var realErr error + var rg string + + if len(az.VnetResourceGroup) > 0 { + rg = az.VnetResourceGroup + } else { + rg = az.ResourceGroup + } az.operationPollRateLimiter.Accept() glog.V(10).Infof("SubnetsClient.Get(%s): start", subnetName) - subnet, err = az.SubnetsClient.Get(az.ResourceGroup, virtualNetworkName, subnetName, "") + subnet, err = az.SubnetsClient.Get(rg, virtualNetworkName, subnetName, "") glog.V(10).Infof("SubnetsClient.Get(%s): end", subnetName) exists, realErr = checkResourceExistsFromError(err) diff --git a/pkg/cloudprovider/providers/cloudstack/BUILD b/pkg/cloudprovider/providers/cloudstack/BUILD index c771e4e83e7..ecfe91d5417 100644 --- a/pkg/cloudprovider/providers/cloudstack/BUILD +++ b/pkg/cloudprovider/providers/cloudstack/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "cloudstack.go", "cloudstack_loadbalancer.go", ], - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//pkg/controller:go_default_library", @@ -29,7 +26,6 @@ go_test( name = "go_default_test", srcs = ["cloudstack_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/cloudprovider/providers/cloudstack/cloudstack.go b/pkg/cloudprovider/providers/cloudstack/cloudstack.go index f8e2b3ffb6f..1b86d8243ab 100644 --- a/pkg/cloudprovider/providers/cloudstack/cloudstack.go +++ b/pkg/cloudprovider/providers/cloudstack/cloudstack.go @@ -120,6 +120,11 @@ func (cs *CSCloud) ScrubDNS(nameservers, searches []string) (nsOut, srchOut []st return nameservers, searches } +// HasClusterID returns true if the cluster has a clusterID +func (cs *CSCloud) HasClusterID() bool { + return true +} + // GetZone returns the Zone containing the region that the program is running in. func (cs *CSCloud) GetZone() (cloudprovider.Zone, error) { glog.V(2).Infof("Current zone is %v", cs.zone) diff --git a/pkg/cloudprovider/providers/fake/BUILD b/pkg/cloudprovider/providers/fake/BUILD index fec8ef0e370..fa6e132b800 100644 --- a/pkg/cloudprovider/providers/fake/BUILD +++ b/pkg/cloudprovider/providers/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "fake.go", ], - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//pkg/controller:go_default_library", diff --git a/pkg/cloudprovider/providers/fake/fake.go b/pkg/cloudprovider/providers/fake/fake.go index 77022e2cb8c..05c10c146cc 100644 --- a/pkg/cloudprovider/providers/fake/fake.go +++ b/pkg/cloudprovider/providers/fake/fake.go @@ -111,6 +111,11 @@ func (f *FakeCloud) ScrubDNS(nameservers, searches []string) (nsOut, srchOut []s return nameservers, searches } +// HasClusterID returns true if the cluster has a clusterID +func (f *FakeCloud) HasClusterID() bool { + return true +} + // LoadBalancer returns a fake implementation of LoadBalancer. // Actually it just returns f itself. func (f *FakeCloud) LoadBalancer() (cloudprovider.LoadBalancer, bool) { diff --git a/pkg/cloudprovider/providers/gce/BUILD b/pkg/cloudprovider/providers/gce/BUILD index 62576d352a2..086c4cafa4c 100644 --- a/pkg/cloudprovider/providers/gce/BUILD +++ b/pkg/cloudprovider/providers/gce/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -41,7 +39,6 @@ go_library( "metrics.go", "token_source.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/service:go_default_library", "//pkg/cloudprovider:go_default_library", @@ -87,10 +84,10 @@ go_test( "gce_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//pkg/kubelet/apis:go_default_library", + "//vendor/golang.org/x/oauth2/google:go_default_library", "//vendor/google.golang.org/api/compute/v1:go_default_library", "//vendor/google.golang.org/api/googleapi:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/cloudprovider/providers/gce/gce.go b/pkg/cloudprovider/providers/gce/gce.go index 9652fd4d65a..a4dd5eab159 100644 --- a/pkg/cloudprovider/providers/gce/gce.go +++ b/pkg/cloudprovider/providers/gce/gce.go @@ -133,7 +133,7 @@ type GCEServiceManager struct { gce *GCECloud } -type Config struct { +type ConfigFile struct { Global struct { TokenURL string `gcfg:"token-url"` TokenBody string `gcfg:"token-body"` @@ -145,9 +145,25 @@ type Config struct { Multizone bool `gcfg:"multizone"` // Specifying ApiEndpoint will override the default GCE compute API endpoint. ApiEndpoint string `gcfg:"api-endpoint"` + LocalZone string `gcfg:"local-zone"` } } +// CloudConfig includes all the necessary configuration for creating GCECloud +type CloudConfig struct { + ApiEndpoint string + ProjectID string + Region string + Zone string + ManagedZones []string + NetworkURL string + SubnetworkURL string + NodeTags []string + NodeInstancePrefix string + TokenSource oauth2.TokenSource + UseMetadataServer bool +} + func init() { cloudprovider.RegisterCloudProvider( ProviderName, @@ -172,77 +188,28 @@ func (g *GCECloud) GetProjectID() string { } // newGCECloud creates a new instance of GCECloud. -func newGCECloud(config io.Reader) (*GCECloud, error) { - apiEndpoint := "" - projectID, zone, err := getProjectAndZone() - if err != nil { - return nil, err - } +func newGCECloud(config io.Reader) (gceCloud *GCECloud, err error) { + var cloudConfig *CloudConfig + var configFile *ConfigFile - region, err := GetGCERegion(zone) - if err != nil { - return nil, err - } - - networkName, err := getNetworkNameViaMetadata() - if err != nil { - return nil, err - } - networkURL := gceNetworkURL("", projectID, networkName) - subnetworkURL := "" - - // By default, Kubernetes clusters only run against one zone - managedZones := []string{zone} - - tokenSource := google.ComputeTokenSource("") - var nodeTags []string - var nodeInstancePrefix string if config != nil { - cfg, err := readConfig(config) + configFile, err = readConfig(config) if err != nil { return nil, err } - - glog.Infof("Using GCE provider config %+v", cfg) - if cfg.Global.ApiEndpoint != "" { - apiEndpoint = cfg.Global.ApiEndpoint - } - if cfg.Global.ProjectID != "" { - projectID = cfg.Global.ProjectID - } - - if cfg.Global.NetworkName != "" { - if strings.Contains(cfg.Global.NetworkName, "/") { - networkURL = cfg.Global.NetworkName - } else { - networkURL = gceNetworkURL(apiEndpoint, projectID, cfg.Global.NetworkName) - } - } - - if cfg.Global.SubnetworkName != "" { - if strings.Contains(cfg.Global.SubnetworkName, "/") { - subnetworkURL = cfg.Global.SubnetworkName - } else { - subnetworkURL = gceSubnetworkURL(apiEndpoint, projectID, region, cfg.Global.SubnetworkName) - } - } - - if cfg.Global.TokenURL != "" { - tokenSource = NewAltTokenSource(cfg.Global.TokenURL, cfg.Global.TokenBody) - } - nodeTags = cfg.Global.NodeTags - nodeInstancePrefix = cfg.Global.NodeInstancePrefix - if cfg.Global.Multizone { - managedZones = nil // Use all zones in region - } + glog.Infof("Using GCE provider config %+v", configFile) } - return CreateGCECloud(apiEndpoint, projectID, region, zone, managedZones, networkURL, subnetworkURL, - nodeTags, nodeInstancePrefix, tokenSource, true /* useMetadataServer */) + cloudConfig, err = generateCloudConfig(configFile) + if err != nil { + return nil, err + } + return CreateGCECloud(cloudConfig) + } -func readConfig(reader io.Reader) (*Config, error) { - cfg := &Config{} +func readConfig(reader io.Reader) (*ConfigFile, error) { + cfg := &ConfigFile{} if err := gcfg.FatalOnly(gcfg.ReadInto(cfg, reader)); err != nil { glog.Errorf("Couldn't read config: %v", err) return nil, err @@ -250,14 +217,92 @@ func readConfig(reader io.Reader) (*Config, error) { return cfg, nil } +func generateCloudConfig(configFile *ConfigFile) (cloudConfig *CloudConfig, err error) { + cloudConfig = &CloudConfig{} + // By default, fetch token from GCE metadata server + cloudConfig.TokenSource = google.ComputeTokenSource("") + cloudConfig.UseMetadataServer = true + + if configFile != nil { + if configFile.Global.ApiEndpoint != "" { + cloudConfig.ApiEndpoint = configFile.Global.ApiEndpoint + } + + if configFile.Global.TokenURL != "" { + // if tokenURL is nil, set tokenSource to nil. This will force the OAuth client to fall + // back to use DefaultTokenSource. This allows running gceCloud remotely. + if configFile.Global.TokenURL == "nil" { + cloudConfig.TokenSource = nil + } else { + cloudConfig.TokenSource = NewAltTokenSource(configFile.Global.TokenURL, configFile.Global.TokenBody) + } + } + + cloudConfig.NodeTags = configFile.Global.NodeTags + cloudConfig.NodeInstancePrefix = configFile.Global.NodeInstancePrefix + } + + // retrieve projectID and zone + if configFile == nil || configFile.Global.ProjectID == "" || configFile.Global.LocalZone == "" { + cloudConfig.ProjectID, cloudConfig.Zone, err = getProjectAndZone() + if err != nil { + return nil, err + } + } + if configFile != nil { + if configFile.Global.ProjectID != "" { + cloudConfig.ProjectID = configFile.Global.ProjectID + } + if configFile.Global.LocalZone != "" { + cloudConfig.Zone = configFile.Global.LocalZone + } + } + + // retrieve region + cloudConfig.Region, err = GetGCERegion(cloudConfig.Zone) + if err != nil { + return nil, err + } + + // generate managedZones + cloudConfig.ManagedZones = []string{cloudConfig.Zone} + if configFile != nil && configFile.Global.Multizone { + cloudConfig.ManagedZones = nil // Use all zones in region + } + + // generate networkURL + if configFile != nil && configFile.Global.NetworkName != "" { + if strings.Contains(configFile.Global.NetworkName, "/") { + cloudConfig.NetworkURL = configFile.Global.NetworkName + } else { + cloudConfig.NetworkURL = gceNetworkURL(cloudConfig.ApiEndpoint, cloudConfig.ProjectID, configFile.Global.NetworkName) + } + } else { + networkName, err := getNetworkNameViaMetadata() + if err != nil { + return nil, err + } + cloudConfig.NetworkURL = gceNetworkURL("", cloudConfig.ProjectID, networkName) + } + + // generate subnetworkURL + if configFile != nil && configFile.Global.SubnetworkName != "" { + if strings.Contains(configFile.Global.SubnetworkName, "/") { + cloudConfig.SubnetworkURL = configFile.Global.SubnetworkName + } else { + cloudConfig.SubnetworkURL = gceSubnetworkURL(cloudConfig.ApiEndpoint, cloudConfig.ProjectID, cloudConfig.Region, configFile.Global.SubnetworkName) + } + } + return cloudConfig, err +} + // Creates a GCECloud object using the specified parameters. // If no networkUrl is specified, loads networkName via rest call. // If no tokenSource is specified, uses oauth2.DefaultTokenSource. // If managedZones is nil / empty all zones in the region will be managed. -func CreateGCECloud(apiEndpoint, projectID, region, zone string, managedZones []string, networkURL, subnetworkURL string, nodeTags []string, - nodeInstancePrefix string, tokenSource oauth2.TokenSource, useMetadataServer bool) (*GCECloud, error) { +func CreateGCECloud(config *CloudConfig) (*GCECloud, error) { - client, err := newOauthClient(tokenSource) + client, err := newOauthClient(config.TokenSource) if err != nil { return nil, err } @@ -266,7 +311,7 @@ func CreateGCECloud(apiEndpoint, projectID, region, zone string, managedZones [] return nil, err } - client, err = newOauthClient(tokenSource) + client, err = newOauthClient(config.TokenSource) if err != nil { return nil, err } @@ -275,7 +320,7 @@ func CreateGCECloud(apiEndpoint, projectID, region, zone string, managedZones [] return nil, err } - client, err = newOauthClient(tokenSource) + client, err = newOauthClient(config.TokenSource) if err != nil { return nil, err } @@ -288,10 +333,10 @@ func CreateGCECloud(apiEndpoint, projectID, region, zone string, managedZones [] // Generate alpha and beta api endpoints based on override v1 api endpoint. // For example, // staging API endpoint: https://www.googleapis.com/compute/staging_v1/ - if apiEndpoint != "" { - service.BasePath = fmt.Sprintf("%sprojects/", apiEndpoint) - serviceBeta.BasePath = fmt.Sprintf("%sprojects/", strings.Replace(apiEndpoint, "v1", "beta", -1)) - serviceAlpha.BasePath = fmt.Sprintf("%sprojects/", strings.Replace(apiEndpoint, "v1", "alpha", -1)) + if config.ApiEndpoint != "" { + service.BasePath = fmt.Sprintf("%sprojects/", config.ApiEndpoint) + serviceBeta.BasePath = fmt.Sprintf("%sprojects/", strings.Replace(config.ApiEndpoint, "v1", "beta", -1)) + serviceAlpha.BasePath = fmt.Sprintf("%sprojects/", strings.Replace(config.ApiEndpoint, "v1", "alpha", -1)) } containerService, err := container.New(client) @@ -304,28 +349,28 @@ func CreateGCECloud(apiEndpoint, projectID, region, zone string, managedZones [] return nil, err } - if networkURL == "" { - networkName, err := getNetworkNameViaAPICall(service, projectID) + if config.NetworkURL == "" { + networkName, err := getNetworkNameViaAPICall(service, config.ProjectID) if err != nil { return nil, err } - networkURL = gceNetworkURL(apiEndpoint, projectID, networkName) + config.NetworkURL = gceNetworkURL(config.ApiEndpoint, config.ProjectID, networkName) } - networkProjectID, err := getProjectIDInURL(networkURL) + networkProjectID, err := getProjectIDInURL(config.NetworkURL) if err != nil { return nil, err } - onXPN := networkProjectID != projectID + onXPN := networkProjectID != config.ProjectID - if len(managedZones) == 0 { - managedZones, err = getZonesForRegion(service, projectID, region) + if len(config.ManagedZones) == 0 { + config.ManagedZones, err = getZonesForRegion(service, config.ProjectID, config.Region) if err != nil { return nil, err } } - if len(managedZones) != 1 { - glog.Infof("managing multiple zones: %v", managedZones) + if len(config.ManagedZones) != 1 { + glog.Infof("managing multiple zones: %v", config.ManagedZones) } operationPollRateLimiter := flowcontrol.NewTokenBucketRateLimiter(10, 100) // 10 qps, 100 bucket size. @@ -336,17 +381,17 @@ func CreateGCECloud(apiEndpoint, projectID, region, zone string, managedZones [] serviceBeta: serviceBeta, containerService: containerService, cloudkmsService: cloudkmsService, - projectID: projectID, + projectID: config.ProjectID, networkProjectID: networkProjectID, onXPN: onXPN, - region: region, - localZone: zone, - managedZones: managedZones, - networkURL: networkURL, - subnetworkURL: subnetworkURL, - nodeTags: nodeTags, - nodeInstancePrefix: nodeInstancePrefix, - useMetadataServer: useMetadataServer, + region: config.Region, + localZone: config.Zone, + managedZones: config.ManagedZones, + networkURL: config.NetworkURL, + subnetworkURL: config.SubnetworkURL, + nodeTags: config.NodeTags, + nodeInstancePrefix: config.NodeInstancePrefix, + useMetadataServer: config.UseMetadataServer, operationPollRateLimiter: operationPollRateLimiter, } @@ -424,6 +469,11 @@ func (gce *GCECloud) ScrubDNS(nameservers, searches []string) (nsOut, srchOut [] return nameservers, srchOut } +// HasClusterID returns true if the cluster has a clusterID +func (gce *GCECloud) HasClusterID() bool { + return true +} + // GCECloud implements cloudprovider.Interface. var _ cloudprovider.Interface = (*GCECloud)(nil) diff --git a/pkg/cloudprovider/providers/gce/gce_addresses.go b/pkg/cloudprovider/providers/gce/gce_addresses.go index 3592fcf3b6c..0a7b0d19974 100644 --- a/pkg/cloudprovider/providers/gce/gce_addresses.go +++ b/pkg/cloudprovider/providers/gce/gce_addresses.go @@ -17,8 +17,10 @@ limitations under the License. package gce import ( + "fmt" "time" + "github.com/golang/glog" compute "google.golang.org/api/compute/v1" ) @@ -85,3 +87,30 @@ func (gce *GCECloud) GetRegionAddress(name, region string) (*compute.Address, er v, err := gce.service.Addresses.Get(gce.projectID, region, name).Do() return v, mc.Observe(err) } + +// GetRegionAddressByIP returns the regional address matching the given IP +// address. +func (gce *GCECloud) GetRegionAddressByIP(region, ipAddress string) (*compute.Address, error) { + mc := newAddressMetricContext("list", region) + addrs, err := gce.service.Addresses.List(gce.projectID, region).Filter("address eq " + ipAddress).Do() + // Record the metrics for the call. + mc.Observe(err) + if err != nil { + return nil, err + } + + if len(addrs.Items) > 1 { + // We don't expect more than one match. + addrsToPrint := []compute.Address{} + for _, addr := range addrs.Items { + addrsToPrint = append(addrsToPrint, *addr) + } + glog.Errorf("More than one addresses matching the IP %q: %+v", ipAddress, addrsToPrint) + } + for _, addr := range addrs.Items { + if addr.Address == ipAddress { + return addr, nil + } + } + return nil, makeGoogleAPINotFoundError(fmt.Sprintf("Address with IP %q was not found in region %q", ipAddress, region)) +} diff --git a/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go b/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go index bafb3e9ab0a..156aaeb6d23 100644 --- a/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go +++ b/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go @@ -66,12 +66,25 @@ func (cas *FakeCloudAddressService) ReserveRegionAddress(addr *compute.Address, func (cas *FakeCloudAddressService) GetRegionAddress(name, region string) (*compute.Address, error) { if _, exists := cas.addrsByRegionAndName[region]; !exists { - return nil, &googleapi.Error{Code: http.StatusNotFound} + return nil, makeGoogleAPINotFoundError("") } if addr, exists := cas.addrsByRegionAndName[region][name]; !exists { - return nil, &googleapi.Error{Code: http.StatusNotFound} + return nil, makeGoogleAPINotFoundError("") } else { return addr, nil } } + +func (cas *FakeCloudAddressService) GetRegionAddressByIP(region, ipAddress string) (*compute.Address, error) { + if _, exists := cas.addrsByRegionAndName[region]; !exists { + return nil, makeGoogleAPINotFoundError("") + } + + for _, addr := range cas.addrsByRegionAndName[region] { + if addr.Address == ipAddress { + return addr, nil + } + } + return nil, makeGoogleAPINotFoundError("") +} diff --git a/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go b/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go index e3e9b80212f..f8d3ff4603b 100644 --- a/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go +++ b/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go @@ -127,14 +127,14 @@ func (gce *GCECloud) ensureExternalLoadBalancer(clusterName, clusterID string, a // a different IP, it will be harmlessly abandoned because it was only an // ephemeral IP (or it was a different static IP owned by the user, in which // case we shouldn't delete it anyway). - if isStatic, err := gce.projectOwnsStaticIP(loadBalancerName, gce.region, loadBalancerIP); err != nil { + if existingAddress, err := gce.GetRegionAddressByIP(gce.region, loadBalancerIP); err != nil && !isNotFound(err) { return nil, fmt.Errorf("failed to test if this GCE project owns the static IP %s: %v", loadBalancerIP, err) - } else if isStatic { + } else if err == nil { // The requested IP is a static IP, owned and managed by the user. isUserOwnedIP = true isSafeToReleaseIP = false ipAddress = loadBalancerIP - glog.V(4).Infof("EnsureLoadBalancer(%v(%v)): using user-provided static IP %s", loadBalancerName, serviceName, ipAddress) + glog.V(4).Infof("EnsureLoadBalancer(%v(%v)): using user-provided static IP %s (name: %s)", loadBalancerName, serviceName, ipAddress, existingAddress.Name) } else if loadBalancerIP == fwdRuleIP { // The requested IP is not a static IP, but is currently assigned // to this forwarding rule, so we can keep it. @@ -880,32 +880,6 @@ func (gce *GCECloud) firewallObject(name, region, desc string, sourceRanges nets return firewall, nil } -func (gce *GCECloud) projectOwnsStaticIP(name, region string, ipAddress string) (bool, error) { - pageToken := "" - page := 0 - for ; page == 0 || (pageToken != "" && page < maxPages); page++ { - listCall := gce.service.Addresses.List(gce.projectID, region) - if pageToken != "" { - listCall = listCall.PageToken(pageToken) - } - addresses, err := listCall.Do() - if err != nil { - return false, fmt.Errorf("failed to list gce IP addresses: %v", err) - } - pageToken = addresses.NextPageToken - for _, addr := range addresses.Items { - if addr.Address == ipAddress { - // This project does own the address, so return success. - return true, nil - } - } - } - if page >= maxPages { - glog.Errorf("projectOwnsStaticIP exceeded maxPages=%d for Addresses.List; truncating.", maxPages) - } - return false, nil -} - func ensureStaticIP(s CloudAddressService, name, serviceName, region, existingIP string) (ipAddress string, existing bool, err error) { // If the address doesn't exist, this will create it. // If the existingIP exists but is ephemeral, this will promote it to static. diff --git a/pkg/cloudprovider/providers/gce/gce_test.go b/pkg/cloudprovider/providers/gce/gce_test.go index 0eff53dbdf7..a4ac14734b4 100644 --- a/pkg/cloudprovider/providers/gce/gce_test.go +++ b/pkg/cloudprovider/providers/gce/gce_test.go @@ -17,6 +17,7 @@ limitations under the License. package gce import ( + "golang.org/x/oauth2/google" "reflect" "strings" "testing" @@ -255,3 +256,184 @@ func TestSplitProviderID(t *testing.T) { } } } + +func TestGenerateCloudConfigs(t *testing.T) { + testCases := []struct { + TokenURL string + TokenBody string + ProjectID string + NetworkName string + SubnetworkName string + NodeTags []string + NodeInstancePrefix string + Multizone bool + ApiEndpoint string + LocalZone string + cloudConfig *CloudConfig + }{ + { + TokenURL: "", + TokenBody: "", + ProjectID: "project-id", + NetworkName: "network-name", + SubnetworkName: "subnetwork-name", + NodeTags: []string{"node-tag"}, + NodeInstancePrefix: "node-prefix", + Multizone: false, + ApiEndpoint: "", + LocalZone: "us-central1-a", + cloudConfig: &CloudConfig{ + ApiEndpoint: "", + ProjectID: "project-id", + Region: "us-central1", + Zone: "us-central1-a", + ManagedZones: []string{"us-central1-a"}, + NetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/network-name", + SubnetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/regions/us-central1/subnetworks/subnetwork-name", + NodeTags: []string{"node-tag"}, + NodeInstancePrefix: "node-prefix", + TokenSource: google.ComputeTokenSource(""), + UseMetadataServer: true, + }, + }, + // nil token source + { + TokenURL: "nil", + TokenBody: "", + ProjectID: "project-id", + NetworkName: "network-name", + SubnetworkName: "subnetwork-name", + NodeTags: []string{"node-tag"}, + NodeInstancePrefix: "node-prefix", + Multizone: false, + ApiEndpoint: "", + LocalZone: "us-central1-a", + cloudConfig: &CloudConfig{ + ApiEndpoint: "", + ProjectID: "project-id", + Region: "us-central1", + Zone: "us-central1-a", + ManagedZones: []string{"us-central1-a"}, + NetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/network-name", + SubnetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/regions/us-central1/subnetworks/subnetwork-name", + NodeTags: []string{"node-tag"}, + NodeInstancePrefix: "node-prefix", + TokenSource: nil, + UseMetadataServer: true, + }, + }, + // specified api endpoint + { + TokenURL: "", + TokenBody: "", + ProjectID: "project-id", + NetworkName: "network-name", + SubnetworkName: "subnetwork-name", + NodeTags: []string{"node-tag"}, + NodeInstancePrefix: "node-prefix", + Multizone: false, + ApiEndpoint: "https://www.googleapis.com/compute/staging_v1/", + LocalZone: "us-central1-a", + cloudConfig: &CloudConfig{ + ApiEndpoint: "https://www.googleapis.com/compute/staging_v1/", + ProjectID: "project-id", + Region: "us-central1", + Zone: "us-central1-a", + ManagedZones: []string{"us-central1-a"}, + NetworkURL: "https://www.googleapis.com/compute/staging_v1/projects/project-id/global/networks/network-name", + SubnetworkURL: "https://www.googleapis.com/compute/staging_v1/projects/project-id/regions/us-central1/subnetworks/subnetwork-name", + NodeTags: []string{"node-tag"}, + NodeInstancePrefix: "node-prefix", + TokenSource: google.ComputeTokenSource(""), + UseMetadataServer: true, + }, + }, + // empty subnet-name + { + TokenURL: "", + TokenBody: "", + ProjectID: "project-id", + NetworkName: "network-name", + SubnetworkName: "", + NodeTags: []string{"node-tag"}, + NodeInstancePrefix: "node-prefix", + Multizone: false, + ApiEndpoint: "", + LocalZone: "us-central1-a", + cloudConfig: &CloudConfig{ + ApiEndpoint: "", + ProjectID: "project-id", + Region: "us-central1", + Zone: "us-central1-a", + ManagedZones: []string{"us-central1-a"}, + NetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/network-name", + SubnetworkURL: "", + NodeTags: []string{"node-tag"}, + NodeInstancePrefix: "node-prefix", + TokenSource: google.ComputeTokenSource(""), + UseMetadataServer: true, + }, + }, + // multi zone + { + TokenURL: "", + TokenBody: "", + ProjectID: "project-id", + NetworkName: "network-name", + SubnetworkName: "subnetwork-name", + NodeTags: []string{"node-tag"}, + NodeInstancePrefix: "node-prefix", + Multizone: true, + ApiEndpoint: "", + LocalZone: "us-central1-a", + cloudConfig: &CloudConfig{ + ApiEndpoint: "", + ProjectID: "project-id", + Region: "us-central1", + Zone: "us-central1-a", + ManagedZones: nil, + NetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/network-name", + SubnetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/regions/us-central1/subnetworks/subnetwork-name", + NodeTags: []string{"node-tag"}, + NodeInstancePrefix: "node-prefix", + TokenSource: google.ComputeTokenSource(""), + UseMetadataServer: true, + }, + }, + } + + for _, tc := range testCases { + cloudConfig, err := generateCloudConfig(&ConfigFile{ + Global: struct { + TokenURL string `gcfg:"token-url"` + TokenBody string `gcfg:"token-body"` + ProjectID string `gcfg:"project-id"` + NetworkName string `gcfg:"network-name"` + SubnetworkName string `gcfg:"subnetwork-name"` + NodeTags []string `gcfg:"node-tags"` + NodeInstancePrefix string `gcfg:"node-instance-prefix"` + Multizone bool `gcfg:"multizone"` + ApiEndpoint string `gcfg:"api-endpoint"` + LocalZone string `gcfg:"local-zone"` + }{ + TokenURL: tc.TokenURL, + TokenBody: tc.TokenBody, + ProjectID: tc.ProjectID, + NetworkName: tc.NetworkName, + SubnetworkName: tc.SubnetworkName, + NodeTags: tc.NodeTags, + NodeInstancePrefix: tc.NodeInstancePrefix, + Multizone: tc.Multizone, + ApiEndpoint: tc.ApiEndpoint, + LocalZone: tc.LocalZone, + }, + }) + if err != nil { + t.Fatalf("Unexpect error: %v", err) + } + + if !reflect.DeepEqual(cloudConfig, tc.cloudConfig) { + t.Errorf("Expecting cloud config: %v, but got %v", tc.cloudConfig, cloudConfig) + } + } +} diff --git a/pkg/cloudprovider/providers/gce/gce_util.go b/pkg/cloudprovider/providers/gce/gce_util.go index bcbd523c889..a28fb0d6255 100644 --- a/pkg/cloudprovider/providers/gce/gce_util.go +++ b/pkg/cloudprovider/providers/gce/gce_util.go @@ -149,3 +149,7 @@ func ignoreNotFound(err error) error { func isNotFoundOrInUse(err error) bool { return isNotFound(err) || isInUsedByError(err) } + +func makeGoogleAPINotFoundError(message string) error { + return &googleapi.Error{Code: http.StatusNotFound, Message: message} +} diff --git a/pkg/cloudprovider/providers/openstack/BUILD b/pkg/cloudprovider/providers/openstack/BUILD index a3eff15c99c..2305ea3f90f 100644 --- a/pkg/cloudprovider/providers/openstack/BUILD +++ b/pkg/cloudprovider/providers/openstack/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -20,7 +18,6 @@ go_library( "openstack_routes.go", "openstack_volumes.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/helper:go_default_library", "//pkg/api/v1/service:go_default_library", @@ -73,7 +70,6 @@ go_test( "openstack_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//vendor/github.com/gophercloud/gophercloud:go_default_library", diff --git a/pkg/cloudprovider/providers/openstack/openstack.go b/pkg/cloudprovider/providers/openstack/openstack.go index 15993f6f910..43599ec1b7f 100644 --- a/pkg/cloudprovider/providers/openstack/openstack.go +++ b/pkg/cloudprovider/providers/openstack/openstack.go @@ -458,6 +458,11 @@ func (os *OpenStack) ScrubDNS(nameServers, searches []string) ([]string, []strin return nameServers, searches } +// HasClusterID returns true if the cluster has a clusterID +func (os *OpenStack) HasClusterID() bool { + return true +} + func (os *OpenStack) LoadBalancer() (cloudprovider.LoadBalancer, bool) { glog.V(4).Info("openstack.LoadBalancer() called") diff --git a/pkg/cloudprovider/providers/openstack/openstack_client.go b/pkg/cloudprovider/providers/openstack/openstack_client.go index 71b0078bfd0..916c4a09c56 100644 --- a/pkg/cloudprovider/providers/openstack/openstack_client.go +++ b/pkg/cloudprovider/providers/openstack/openstack_client.go @@ -28,7 +28,7 @@ func (os *OpenStack) NewNetworkV2() (*gophercloud.ServiceClient, error) { Region: os.region, }) if err != nil { - glog.Warningf("Failed to find network v2 endpoint: %v", err) + glog.Warningf("Failed to find network v2 endpoint for region %s: %v", os.region, err) return nil, err } return network, nil @@ -39,7 +39,7 @@ func (os *OpenStack) NewComputeV2() (*gophercloud.ServiceClient, error) { Region: os.region, }) if err != nil { - glog.Warningf("Failed to find compute v2 endpoint: %v", err) + glog.Warningf("Failed to find compute v2 endpoint for region %s: %v", os.region, err) return nil, err } return compute, nil @@ -50,7 +50,7 @@ func (os *OpenStack) NewBlockStorageV1() (*gophercloud.ServiceClient, error) { Region: os.region, }) if err != nil { - glog.Errorf("Unable to initialize cinder v1 client for region: %s", os.region) + glog.Errorf("Unable to initialize cinder v1 client for region %s: %v", os.region, err) return nil, err } return storage, nil @@ -61,7 +61,7 @@ func (os *OpenStack) NewBlockStorageV2() (*gophercloud.ServiceClient, error) { Region: os.region, }) if err != nil { - glog.Errorf("Unable to initialize cinder v2 client for region: %s", os.region) + glog.Errorf("Unable to initialize cinder v2 client for region %s: %v", os.region, err) return nil, err } return storage, nil diff --git a/pkg/cloudprovider/providers/openstack/openstack_volumes.go b/pkg/cloudprovider/providers/openstack/openstack_volumes.go index 7f7b499bb77..b447fe9e965 100644 --- a/pkg/cloudprovider/providers/openstack/openstack_volumes.go +++ b/pkg/cloudprovider/providers/openstack/openstack_volumes.go @@ -215,11 +215,7 @@ func (os *OpenStack) AttachDisk(instanceID, volumeID string) (string, error) { if err != nil { return "", err } - if volume.Status != VolumeAvailableStatus { - errmsg := fmt.Sprintf("volume %s status is %s, not %s, can not be attached to instance %s.", volume.Name, volume.Status, VolumeAvailableStatus, instanceID) - glog.Errorf(errmsg) - return "", errors.New(errmsg) - } + cClient, err := os.NewComputeV2() if err != nil { return "", err @@ -230,11 +226,9 @@ func (os *OpenStack) AttachDisk(instanceID, volumeID string) (string, error) { glog.V(4).Infof("Disk %s is already attached to instance %s", volumeID, instanceID) return volume.ID, nil } - glog.V(2).Infof("Disk %s is attached to a different instance (%s), detaching", volumeID, volume.AttachedServerId) - err = os.DetachDisk(volume.AttachedServerId, volumeID) - if err != nil { - return "", err - } + errmsg := fmt.Sprintf("Disk %s is attached to a different instance (%s)", volumeID, volume.AttachedServerId) + glog.V(2).Infof(errmsg) + return "", errors.New(errmsg) } startTime := time.Now() @@ -258,6 +252,12 @@ func (os *OpenStack) DetachDisk(instanceID, volumeID string) error { if err != nil { return err } + if volume.Status == VolumeAvailableStatus { + // "available" is fine since that means the volume is detached from instance already. + glog.V(2).Infof("volume: %s has been detached from compute: %s ", volume.ID, instanceID) + return nil + } + if volume.Status != VolumeInUseStatus { errmsg := fmt.Sprintf("can not detach volume %s, its status is %s.", volume.Name, volume.Status) glog.Errorf(errmsg) diff --git a/pkg/cloudprovider/providers/ovirt/BUILD b/pkg/cloudprovider/providers/ovirt/BUILD index eecb7632535..ae8652e24ac 100644 --- a/pkg/cloudprovider/providers/ovirt/BUILD +++ b/pkg/cloudprovider/providers/ovirt/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["ovirt.go"], - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//pkg/controller:go_default_library", @@ -25,7 +22,6 @@ go_test( name = "go_default_test", srcs = ["ovirt_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//pkg/cloudprovider:go_default_library"], ) diff --git a/pkg/cloudprovider/providers/ovirt/ovirt.go b/pkg/cloudprovider/providers/ovirt/ovirt.go index 73275262919..fe71113ed0a 100644 --- a/pkg/cloudprovider/providers/ovirt/ovirt.go +++ b/pkg/cloudprovider/providers/ovirt/ovirt.go @@ -134,6 +134,11 @@ func (v *OVirtCloud) ScrubDNS(nameservers, searches []string) (nsOut, srchOut [] return nameservers, searches } +// HasClusterID returns true if the cluster has a clusterID +func (v *OVirtCloud) HasClusterID() bool { + return true +} + // LoadBalancer returns an implementation of LoadBalancer for oVirt cloud func (v *OVirtCloud) LoadBalancer() (cloudprovider.LoadBalancer, bool) { return nil, false diff --git a/pkg/cloudprovider/providers/photon/BUILD b/pkg/cloudprovider/providers/photon/BUILD index be559e6cfa4..d58cc8c07fd 100644 --- a/pkg/cloudprovider/providers/photon/BUILD +++ b/pkg/cloudprovider/providers/photon/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["photon.go"], - tags = ["automanaged"], deps = [ "//pkg/api/v1/helper:go_default_library", "//pkg/cloudprovider:go_default_library", @@ -28,7 +25,6 @@ go_test( name = "go_default_test", srcs = ["photon_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", diff --git a/pkg/cloudprovider/providers/photon/photon.go b/pkg/cloudprovider/providers/photon/photon.go index 8ef0b1dcfcc..87ecc1b160e 100644 --- a/pkg/cloudprovider/providers/photon/photon.go +++ b/pkg/cloudprovider/providers/photon/photon.go @@ -539,6 +539,11 @@ func (pc *PCCloud) ScrubDNS(nameservers, searches []string) (nsOut, srchOut []st return nameservers, searches } +// HasClusterID returns true if the cluster has a clusterID +func (pc *PCCloud) HasClusterID() bool { + return true +} + // Attaches given virtual disk volume to the compute running kubelet. func (pc *PCCloud) AttachDisk(pdID string, nodeName k8stypes.NodeName) error { photonClient, err := getPhotonClient(pc) diff --git a/pkg/cloudprovider/providers/rackspace/BUILD b/pkg/cloudprovider/providers/rackspace/BUILD index ea50988b7b5..e45b4d1d9f1 100644 --- a/pkg/cloudprovider/providers/rackspace/BUILD +++ b/pkg/cloudprovider/providers/rackspace/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["rackspace.go"], - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//pkg/controller:go_default_library", @@ -34,7 +31,6 @@ go_test( name = "go_default_test", srcs = ["rackspace_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/github.com/rackspace/gophercloud:go_default_library"], ) diff --git a/pkg/cloudprovider/providers/rackspace/rackspace.go b/pkg/cloudprovider/providers/rackspace/rackspace.go index 0e04d9407c4..b087bfa4cea 100644 --- a/pkg/cloudprovider/providers/rackspace/rackspace.go +++ b/pkg/cloudprovider/providers/rackspace/rackspace.go @@ -529,6 +529,11 @@ func (os *Rackspace) ScrubDNS(nameservers, searches []string) (nsOut, srchOut [] return nameservers, searches } +// HasClusterID returns true if the cluster has a clusterID +func (os *Rackspace) HasClusterID() bool { + return true +} + func (os *Rackspace) LoadBalancer() (cloudprovider.LoadBalancer, bool) { return nil, false } diff --git a/pkg/cloudprovider/providers/vsphere/BUILD b/pkg/cloudprovider/providers/vsphere/BUILD index 6b0e720f385..b385fa1a2e7 100644 --- a/pkg/cloudprovider/providers/vsphere/BUILD +++ b/pkg/cloudprovider/providers/vsphere/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,32 +10,23 @@ go_library( name = "go_default_library", srcs = [ "vsphere.go", - "vsphere_metrics.go", "vsphere_util.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/helper:go_default_library", "//pkg/cloudprovider:go_default_library", + "//pkg/cloudprovider/providers/vsphere/vclib:go_default_library", + "//pkg/cloudprovider/providers/vsphere/vclib/diskmanagers:go_default_library", "//pkg/controller:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/github.com/vmware/govmomi:go_default_library", - "//vendor/github.com/vmware/govmomi/find:go_default_library", "//vendor/github.com/vmware/govmomi/object:go_default_library", - "//vendor/github.com/vmware/govmomi/pbm:go_default_library", - "//vendor/github.com/vmware/govmomi/pbm/types:go_default_library", - "//vendor/github.com/vmware/govmomi/property:go_default_library", - "//vendor/github.com/vmware/govmomi/session:go_default_library", "//vendor/github.com/vmware/govmomi/vim25:go_default_library", "//vendor/github.com/vmware/govmomi/vim25/mo:go_default_library", - "//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library", - "//vendor/github.com/vmware/govmomi/vim25/types:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", "//vendor/gopkg.in/gcfg.v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", ], ) @@ -45,9 +34,9 @@ go_test( name = "go_default_test", srcs = ["vsphere_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", + "//pkg/cloudprovider/providers/vsphere/vclib:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/rand:go_default_library", @@ -63,6 +52,9 @@ filegroup( filegroup( name = "all-srcs", - srcs = [":package-srcs"], + srcs = [ + ":package-srcs", + "//pkg/cloudprovider/providers/vsphere/vclib:all-srcs", + ], tags = ["automanaged"], ) diff --git a/pkg/cloudprovider/providers/vsphere/vclib/BUILD b/pkg/cloudprovider/providers/vsphere/vclib/BUILD new file mode 100644 index 00000000000..b65aabb11ac --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vclib/BUILD @@ -0,0 +1,56 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = [ + "connection.go", + "constants.go", + "custom_errors.go", + "datacenter.go", + "datastore.go", + "folder.go", + "pbm.go", + "utils.go", + "virtualmachine.go", + "vmoptions.go", + "volumeoptions.go", + "vsphere_metrics.go", + ], + deps = [ + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", + "//vendor/github.com/vmware/govmomi:go_default_library", + "//vendor/github.com/vmware/govmomi/find:go_default_library", + "//vendor/github.com/vmware/govmomi/object:go_default_library", + "//vendor/github.com/vmware/govmomi/pbm:go_default_library", + "//vendor/github.com/vmware/govmomi/pbm/types:go_default_library", + "//vendor/github.com/vmware/govmomi/property:go_default_library", + "//vendor/github.com/vmware/govmomi/session:go_default_library", + "//vendor/github.com/vmware/govmomi/vim25:go_default_library", + "//vendor/github.com/vmware/govmomi/vim25/mo:go_default_library", + "//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library", + "//vendor/github.com/vmware/govmomi/vim25/types:go_default_library", + "//vendor/golang.org/x/net/context:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//pkg/cloudprovider/providers/vsphere/vclib/diskmanagers:all-srcs", + ], + tags = ["automanaged"], +) diff --git a/pkg/cloudprovider/providers/vsphere/vclib/connection.go b/pkg/cloudprovider/providers/vsphere/vclib/connection.go new file mode 100644 index 00000000000..d42a091f17f --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vclib/connection.go @@ -0,0 +1,99 @@ +/* +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 vclib + +import ( + "fmt" + neturl "net/url" + "sync" + + "github.com/golang/glog" + "github.com/vmware/govmomi" + "github.com/vmware/govmomi/session" + "github.com/vmware/govmomi/vim25" + "golang.org/x/net/context" +) + +// VSphereConnection contains information for connecting to vCenter +type VSphereConnection struct { + GoVmomiClient *govmomi.Client + Username string + Password string + Hostname string + Port string + Insecure bool + RoundTripperCount uint +} + +var ( + clientLock sync.Mutex +) + +// Connect makes connection to vCenter and sets VSphereConnection.GoVmomiClient. +// If connection.GoVmomiClient is already set, it obtains the existing user session. +// if user session is not valid, connection.GoVmomiClient will be set to the new client. +func (connection *VSphereConnection) Connect(ctx context.Context) error { + var err error + clientLock.Lock() + defer clientLock.Unlock() + + if connection.GoVmomiClient == nil { + connection.GoVmomiClient, err = connection.NewClient(ctx) + if err != nil { + glog.Errorf("Failed to create govmomi client. err: %+v", err) + return err + } + return nil + } + m := session.NewManager(connection.GoVmomiClient.Client) + userSession, err := m.UserSession(ctx) + if err != nil { + glog.Errorf("Error while obtaining user session. err: %+v", err) + return err + } + if userSession != nil { + return nil + } + glog.Warningf("Creating new client session since the existing session is not valid or not authenticated") + connection.GoVmomiClient.Logout(ctx) + connection.GoVmomiClient, err = connection.NewClient(ctx) + if err != nil { + glog.Errorf("Failed to create govmomi client. err: %+v", err) + return err + } + return nil +} + +// NewClient creates a new govmomi client for the VSphereConnection obj +func (connection *VSphereConnection) NewClient(ctx context.Context) (*govmomi.Client, error) { + url, err := neturl.Parse(fmt.Sprintf("https://%s:%s/sdk", connection.Hostname, connection.Port)) + if err != nil { + glog.Errorf("Failed to parse URL: %s. err: %+v", url, err) + return nil, err + } + url.User = neturl.UserPassword(connection.Username, connection.Password) + client, err := govmomi.NewClient(ctx, url, connection.Insecure) + if err != nil { + glog.Errorf("Failed to create new client. err: %+v", err) + return nil, err + } + if connection.RoundTripperCount == 0 { + connection.RoundTripperCount = RoundTripperDefaultCount + } + client.RoundTripper = vim25.Retry(client.RoundTripper, vim25.TemporaryNetworkError(int(connection.RoundTripperCount))) + return client, nil +} diff --git a/pkg/cloudprovider/providers/vsphere/vclib/constants.go b/pkg/cloudprovider/providers/vsphere/vclib/constants.go new file mode 100644 index 00000000000..812cbe3856d --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vclib/constants.go @@ -0,0 +1,52 @@ +/* +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 vclib + +// Volume Constnts +const ( + ThinDiskType = "thin" + PreallocatedDiskType = "preallocated" + EagerZeroedThickDiskType = "eagerZeroedThick" + ZeroedThickDiskType = "zeroedThick" +) + +// Controller Constants +const ( + SCSIControllerLimit = 4 + SCSIControllerDeviceLimit = 15 + SCSIDeviceSlots = 16 + SCSIReservedSlot = 7 + + SCSIControllerType = "scsi" + LSILogicControllerType = "lsiLogic" + BusLogicControllerType = "busLogic" + LSILogicSASControllerType = "lsiLogic-sas" + PVSCSIControllerType = "pvscsi" +) + +// Other Constants +const ( + LogLevel = 4 + DatastoreProperty = "datastore" + ResourcePoolProperty = "resourcePool" + DatastoreInfoProperty = "info" + VirtualMachineType = "VirtualMachine" + RoundTripperDefaultCount = 3 + VSANDatastoreType = "vsan" + DummyVMPrefixName = "vsphere-k8s" + ActivePowerState = "poweredOn" +) diff --git a/pkg/cloudprovider/providers/vsphere/vclib/custom_errors.go b/pkg/cloudprovider/providers/vsphere/vclib/custom_errors.go new file mode 100644 index 00000000000..391f328f426 --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vclib/custom_errors.go @@ -0,0 +1,37 @@ +/* +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 vclib + +import "errors" + +// Error Messages +const ( + FileAlreadyExistErrMsg = "File requested already exist" + NoDiskUUIDFoundErrMsg = "No disk UUID found" + NoDevicesFoundErrMsg = "No devices found" + DiskNotFoundErrMsg = "No vSphere disk ID found" + InvalidVolumeOptionsErrMsg = "VolumeOptions verification failed" +) + +// Error constants +var ( + ErrFileAlreadyExist = errors.New(FileAlreadyExistErrMsg) + ErrNoDiskUUIDFound = errors.New(NoDiskUUIDFoundErrMsg) + ErrNoDevicesFound = errors.New(NoDevicesFoundErrMsg) + ErrNoDiskIDFound = errors.New(DiskNotFoundErrMsg) + ErrInvalidVolumeOptions = errors.New(InvalidVolumeOptionsErrMsg) +) diff --git a/pkg/cloudprovider/providers/vsphere/vclib/datacenter.go b/pkg/cloudprovider/providers/vsphere/vclib/datacenter.go new file mode 100644 index 00000000000..f4dc1c455ae --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vclib/datacenter.go @@ -0,0 +1,164 @@ +/* +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 vclib + +import ( + "errors" + "fmt" + "strings" + + "github.com/golang/glog" + "github.com/vmware/govmomi/find" + "github.com/vmware/govmomi/object" + "github.com/vmware/govmomi/property" + "github.com/vmware/govmomi/vim25/mo" + "github.com/vmware/govmomi/vim25/types" + "golang.org/x/net/context" +) + +// Datacenter extends the govmomi Datacenter object +type Datacenter struct { + *object.Datacenter +} + +// GetDatacenter returns the DataCenter Object for the given datacenterPath +// If datacenter is located in a folder, include full path to datacenter else just provide the datacenter name +func GetDatacenter(ctx context.Context, connection *VSphereConnection, datacenterPath string) (*Datacenter, error) { + finder := find.NewFinder(connection.GoVmomiClient.Client, true) + datacenter, err := finder.Datacenter(ctx, datacenterPath) + if err != nil { + glog.Errorf("Failed to find the datacenter: %s. err: %+v", datacenterPath, err) + return nil, err + } + dc := Datacenter{datacenter} + return &dc, nil +} + +// GetVMByUUID gets the VM object from the given vmUUID +func (dc *Datacenter) GetVMByUUID(ctx context.Context, vmUUID string) (*VirtualMachine, error) { + s := object.NewSearchIndex(dc.Client()) + vmUUID = strings.ToLower(strings.TrimSpace(vmUUID)) + svm, err := s.FindByUuid(ctx, dc.Datacenter, vmUUID, true, nil) + if err != nil { + glog.Errorf("Failed to find VM by UUID. VM UUID: %s, err: %+v", vmUUID, err) + return nil, err + } + if svm == nil { + glog.Errorf("Unable to find VM by UUID. VM UUID: %s", vmUUID) + return nil, fmt.Errorf("Failed to find VM by UUID: %s", vmUUID) + } + virtualMachine := VirtualMachine{object.NewVirtualMachine(dc.Client(), svm.Reference()), dc} + return &virtualMachine, nil +} + +// GetVMByPath gets the VM object from the given vmPath +// vmPath should be the full path to VM and not just the name +func (dc *Datacenter) GetVMByPath(ctx context.Context, vmPath string) (*VirtualMachine, error) { + finder := getFinder(dc) + vm, err := finder.VirtualMachine(ctx, vmPath) + if err != nil { + glog.Errorf("Failed to find VM by Path. VM Path: %s, err: %+v", vmPath, err) + return nil, err + } + virtualMachine := VirtualMachine{vm, dc} + return &virtualMachine, nil +} + +// GetDatastoreByPath gets the Datastore object from the given vmDiskPath +func (dc *Datacenter) GetDatastoreByPath(ctx context.Context, vmDiskPath string) (*Datastore, error) { + datastorePathObj := new(object.DatastorePath) + isSuccess := datastorePathObj.FromString(vmDiskPath) + if !isSuccess { + glog.Errorf("Failed to parse vmDiskPath: %s", vmDiskPath) + return nil, errors.New("Failed to parse vmDiskPath") + } + finder := getFinder(dc) + ds, err := finder.Datastore(ctx, datastorePathObj.Datastore) + if err != nil { + glog.Errorf("Failed while searching for datastore: %s. err: %+v", datastorePathObj.Datastore, err) + return nil, err + } + datastore := Datastore{ds, dc} + return &datastore, nil +} + +// GetDatastoreByName gets the Datastore object for the given datastore name +func (dc *Datacenter) GetDatastoreByName(ctx context.Context, name string) (*Datastore, error) { + finder := getFinder(dc) + ds, err := finder.Datastore(ctx, name) + if err != nil { + glog.Errorf("Failed while searching for datastore: %s. err: %+v", name, err) + return nil, err + } + datastore := Datastore{ds, dc} + return &datastore, nil +} + +// GetFolderByPath gets the Folder Object from the given folder path +// folderPath should be the full path to folder +func (dc *Datacenter) GetFolderByPath(ctx context.Context, folderPath string) (*Folder, error) { + finder := getFinder(dc) + vmFolder, err := finder.Folder(ctx, folderPath) + if err != nil { + glog.Errorf("Failed to get the folder reference for %s. err: %+v", folderPath, err) + return nil, err + } + folder := Folder{vmFolder, dc} + return &folder, nil +} + +// GetVMMoList gets the VM Managed Objects with the given properties from the VM object +func (dc *Datacenter) GetVMMoList(ctx context.Context, vmObjList []*VirtualMachine, properties []string) ([]mo.VirtualMachine, error) { + var vmMoList []mo.VirtualMachine + var vmRefs []types.ManagedObjectReference + if len(vmObjList) < 1 { + glog.Errorf("VirtualMachine Object list is empty") + return nil, fmt.Errorf("VirtualMachine Object list is empty") + } + + for _, vmObj := range vmObjList { + vmRefs = append(vmRefs, vmObj.Reference()) + } + pc := property.DefaultCollector(dc.Client()) + err := pc.Retrieve(ctx, vmRefs, properties, &vmMoList) + if err != nil { + glog.Errorf("Failed to get VM managed objects from VM objects. vmObjList: %+v, properties: %+v, err: %v", vmObjList, properties, err) + return nil, err + } + return vmMoList, nil +} + +// GetDatastoreMoList gets the Datastore Managed Objects with the given properties from the datastore objects +func (dc *Datacenter) GetDatastoreMoList(ctx context.Context, dsObjList []*Datastore, properties []string) ([]mo.Datastore, error) { + var dsMoList []mo.Datastore + var dsRefs []types.ManagedObjectReference + if len(dsObjList) < 1 { + glog.Errorf("Datastore Object list is empty") + return nil, fmt.Errorf("Datastore Object list is empty") + } + + for _, dsObj := range dsObjList { + dsRefs = append(dsRefs, dsObj.Reference()) + } + pc := property.DefaultCollector(dc.Client()) + err := pc.Retrieve(ctx, dsRefs, properties, &dsMoList) + if err != nil { + glog.Errorf("Failed to get Datastore managed objects from datastore objects. dsObjList: %+v, properties: %+v, err: %v", dsObjList, properties, err) + return nil, err + } + return dsMoList, nil +} diff --git a/pkg/cloudprovider/providers/vsphere/vclib/datastore.go b/pkg/cloudprovider/providers/vsphere/vclib/datastore.go new file mode 100644 index 00000000000..1901af18909 --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vclib/datastore.go @@ -0,0 +1,75 @@ +/* +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 vclib + +import ( + "github.com/golang/glog" + "github.com/vmware/govmomi/object" + "github.com/vmware/govmomi/property" + "github.com/vmware/govmomi/vim25/mo" + "github.com/vmware/govmomi/vim25/soap" + "github.com/vmware/govmomi/vim25/types" + "golang.org/x/net/context" +) + +// Datastore extends the govmomi Datastore object +type Datastore struct { + *object.Datastore + Datacenter *Datacenter +} + +// CreateDirectory creates the directory at location specified by directoryPath. +// If the intermediate level folders do not exist, and the parameter createParents is true, all the non-existent folders are created. +// directoryPath must be in the format "[vsanDatastore] kubevols" +func (ds *Datastore) CreateDirectory(ctx context.Context, directoryPath string, createParents bool) error { + fileManager := object.NewFileManager(ds.Client()) + err := fileManager.MakeDirectory(ctx, directoryPath, ds.Datacenter.Datacenter, createParents) + if err != nil { + if soap.IsSoapFault(err) { + soapFault := soap.ToSoapFault(err) + if _, ok := soapFault.VimFault().(types.FileAlreadyExists); ok { + return ErrFileAlreadyExist + } + } + return err + } + glog.V(LogLevel).Infof("Created dir with path as %+q", directoryPath) + return nil +} + +// GetType returns the type of datastore +func (ds *Datastore) GetType(ctx context.Context) (string, error) { + var dsMo mo.Datastore + pc := property.DefaultCollector(ds.Client()) + err := pc.RetrieveOne(ctx, ds.Datastore.Reference(), []string{"summary"}, &dsMo) + if err != nil { + glog.Errorf("Failed to retrieve datastore summary property. err: %v", err) + return "", err + } + return dsMo.Summary.Type, nil +} + +// IsCompatibleWithStoragePolicy returns true if datastore is compatible with given storage policy else return false +// for not compatible datastore, fault message is also returned +func (ds *Datastore) IsCompatibleWithStoragePolicy(ctx context.Context, storagePolicyID string) (bool, string, error) { + pbmClient, err := NewPbmClient(ctx, ds.Client()) + if err != nil { + glog.Errorf("Failed to get new PbmClient Object. err: %v", err) + return false, "", err + } + return pbmClient.IsDatastoreCompatible(ctx, storagePolicyID, ds) +} diff --git a/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers/BUILD b/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers/BUILD new file mode 100644 index 00000000000..8608c978cad --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers/BUILD @@ -0,0 +1,35 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = [ + "vdm.go", + "virtualdisk.go", + "vmdm.go", + ], + deps = [ + "//pkg/cloudprovider/providers/vsphere/vclib:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/github.com/vmware/govmomi/object:go_default_library", + "//vendor/github.com/vmware/govmomi/vim25/types:go_default_library", + "//vendor/golang.org/x/net/context:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers/vdm.go b/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers/vdm.go new file mode 100644 index 00000000000..50f065fc1b1 --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers/vdm.go @@ -0,0 +1,91 @@ +/* +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 diskmanagers + +import ( + "time" + + "golang.org/x/net/context" + + "github.com/golang/glog" + "github.com/vmware/govmomi/object" + "github.com/vmware/govmomi/vim25/types" + "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib" +) + +// virtualDiskManager implements VirtualDiskProvider Interface for creating and deleting volume using VirtualDiskManager +type virtualDiskManager struct { + diskPath string + volumeOptions *vclib.VolumeOptions +} + +// Create implements Disk's Create interface +// Contains implementation of virtualDiskManager based Provisioning +func (diskManager virtualDiskManager) Create(ctx context.Context, datastore *vclib.Datastore) (err error) { + if diskManager.volumeOptions.SCSIControllerType == "" { + diskManager.volumeOptions.SCSIControllerType = vclib.LSILogicControllerType + } + // Create virtual disk + diskFormat := vclib.DiskFormatValidType[diskManager.volumeOptions.DiskFormat] + // Create a virtual disk manager + vdm := object.NewVirtualDiskManager(datastore.Client()) + // Create specification for new virtual disk + vmDiskSpec := &types.FileBackedVirtualDiskSpec{ + VirtualDiskSpec: types.VirtualDiskSpec{ + AdapterType: diskManager.volumeOptions.SCSIControllerType, + DiskType: diskFormat, + }, + CapacityKb: int64(diskManager.volumeOptions.CapacityKB), + } + requestTime := time.Now() + // Create virtual disk + task, err := vdm.CreateVirtualDisk(ctx, diskManager.diskPath, datastore.Datacenter.Datacenter, vmDiskSpec) + if err != nil { + vclib.RecordvSphereMetric(vclib.APICreateVolume, requestTime, err) + glog.Errorf("Failed to create virtual disk: %s. err: %+v", diskManager.diskPath, err) + return err + } + err = task.Wait(ctx) + vclib.RecordvSphereMetric(vclib.APICreateVolume, requestTime, err) + if err != nil { + glog.Errorf("Failed to create virtual disk: %s. err: %+v", diskManager.diskPath, err) + return err + } + return nil +} + +// Delete implements Disk's Delete interface +func (diskManager virtualDiskManager) Delete(ctx context.Context, datastore *vclib.Datastore) error { + // Create a virtual disk manager + virtualDiskManager := object.NewVirtualDiskManager(datastore.Client()) + diskPath := vclib.RemoveClusterFromVDiskPath(diskManager.diskPath) + requestTime := time.Now() + // Delete virtual disk + task, err := virtualDiskManager.DeleteVirtualDisk(ctx, diskPath, datastore.Datacenter.Datacenter) + if err != nil { + glog.Errorf("Failed to delete virtual disk. err: %v", err) + vclib.RecordvSphereMetric(vclib.APIDeleteVolume, requestTime, err) + return err + } + err = task.Wait(ctx) + vclib.RecordvSphereMetric(vclib.APIDeleteVolume, requestTime, err) + if err != nil { + glog.Errorf("Failed to delete virtual disk. err: %v", err) + return err + } + return nil +} diff --git a/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers/virtualdisk.go b/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers/virtualdisk.go new file mode 100644 index 00000000000..80000da384e --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers/virtualdisk.go @@ -0,0 +1,80 @@ +/* +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 diskmanagers + +import ( + "fmt" + + "github.com/golang/glog" + "golang.org/x/net/context" + "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib" +) + +// VirtualDisk is for the Disk Management +type VirtualDisk struct { + DiskPath string + VolumeOptions *vclib.VolumeOptions + VMOptions *vclib.VMOptions +} + +// VirtualDisk Operations Const +const ( + VirtualDiskCreateOperation = "Create" + VirtualDiskDeleteOperation = "Delete" +) + +// VirtualDiskProvider defines interfaces for creating disk +type VirtualDiskProvider interface { + Create(ctx context.Context, datastore *vclib.Datastore) error + Delete(ctx context.Context, datastore *vclib.Datastore) error +} + +// getDiskManager returns vmDiskManager or vdmDiskManager based on given volumeoptions +func getDiskManager(disk *VirtualDisk, diskOperation string) VirtualDiskProvider { + var diskProvider VirtualDiskProvider + switch diskOperation { + case VirtualDiskDeleteOperation: + diskProvider = virtualDiskManager{disk.DiskPath, disk.VolumeOptions} + case VirtualDiskCreateOperation: + if disk.VolumeOptions.StoragePolicyName != "" || disk.VolumeOptions.VSANStorageProfileData != "" || disk.VolumeOptions.StoragePolicyID != "" { + diskProvider = vmDiskManager{disk.DiskPath, disk.VolumeOptions, disk.VMOptions} + } else { + diskProvider = virtualDiskManager{disk.DiskPath, disk.VolumeOptions} + } + } + return diskProvider +} + +// Create gets appropriate disk manager and calls respective create method +func (virtualDisk *VirtualDisk) Create(ctx context.Context, datastore *vclib.Datastore) error { + if virtualDisk.VolumeOptions.DiskFormat == "" { + virtualDisk.VolumeOptions.DiskFormat = vclib.ThinDiskType + } + if !virtualDisk.VolumeOptions.VerifyVolumeOptions() { + glog.Error("VolumeOptions verification failed. volumeOptions: ", virtualDisk.VolumeOptions) + return vclib.ErrInvalidVolumeOptions + } + if virtualDisk.VolumeOptions.StoragePolicyID != "" && virtualDisk.VolumeOptions.StoragePolicyName != "" { + return fmt.Errorf("Storage Policy ID and Storage Policy Name both set, Please set only one parameter") + } + return getDiskManager(virtualDisk, VirtualDiskCreateOperation).Create(ctx, datastore) +} + +// Delete gets appropriate disk manager and calls respective delete method +func (virtualDisk *VirtualDisk) Delete(ctx context.Context, datastore *vclib.Datastore) error { + return getDiskManager(virtualDisk, VirtualDiskDeleteOperation).Delete(ctx, datastore) +} diff --git a/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers/vmdm.go b/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers/vmdm.go new file mode 100644 index 00000000000..812ad845064 --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers/vmdm.go @@ -0,0 +1,246 @@ +/* +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 diskmanagers + +import ( + "fmt" + "strings" + + "github.com/golang/glog" + "github.com/vmware/govmomi/object" + "github.com/vmware/govmomi/vim25/types" + "golang.org/x/net/context" + "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib" +) + +// vmDiskManager implements VirtualDiskProvider interface for creating volume using Virtual Machine Reconfigure approach +type vmDiskManager struct { + diskPath string + volumeOptions *vclib.VolumeOptions + vmOptions *vclib.VMOptions +} + +// Create implements Disk's Create interface +// Contains implementation of VM based Provisioning to provision disk with SPBM Policy or VSANStorageProfileData +func (vmdisk vmDiskManager) Create(ctx context.Context, datastore *vclib.Datastore) (err error) { + if vmdisk.volumeOptions.SCSIControllerType == "" { + vmdisk.volumeOptions.SCSIControllerType = vclib.PVSCSIControllerType + } + pbmClient, err := vclib.NewPbmClient(ctx, datastore.Client()) + if err != nil { + glog.Errorf("Error occurred while creating new pbmClient, err: %+v", err) + return err + } + + if vmdisk.volumeOptions.StoragePolicyID == "" && vmdisk.volumeOptions.StoragePolicyName != "" { + vmdisk.volumeOptions.StoragePolicyID, err = pbmClient.ProfileIDByName(ctx, vmdisk.volumeOptions.StoragePolicyName) + if err != nil { + glog.Errorf("Error occurred while getting Profile Id from Profile Name: %s, err: %+v", vmdisk.volumeOptions.StoragePolicyName, err) + return err + } + } + if vmdisk.volumeOptions.StoragePolicyID != "" { + compatible, faultMessage, err := datastore.IsCompatibleWithStoragePolicy(ctx, vmdisk.volumeOptions.StoragePolicyID) + if err != nil { + glog.Errorf("Error occurred while checking datastore compatibility with storage policy id: %s, err: %+v", vmdisk.volumeOptions.StoragePolicyID, err) + return err + } + + if !compatible { + glog.Errorf("Datastore: %s is not compatible with Policy: %s", datastore.Name(), vmdisk.volumeOptions.StoragePolicyName) + return fmt.Errorf("User specified datastore is not compatible with the storagePolicy: %q. Failed with faults: %+q", vmdisk.volumeOptions.StoragePolicyName, faultMessage) + } + } + + storageProfileSpec := &types.VirtualMachineDefinedProfileSpec{} + // Is PBM storage policy ID is present, set the storage spec profile ID, + // else, set raw the VSAN policy string. + if vmdisk.volumeOptions.StoragePolicyID != "" { + storageProfileSpec.ProfileId = vmdisk.volumeOptions.StoragePolicyID + } else if vmdisk.volumeOptions.VSANStorageProfileData != "" { + // Check Datastore type - VSANStorageProfileData is only applicable to vSAN Datastore + dsType, err := datastore.GetType(ctx) + if err != nil { + return err + } + if dsType != vclib.VSANDatastoreType { + glog.Errorf("The specified datastore: %q is not a VSAN datastore", datastore.Name()) + return fmt.Errorf("The specified datastore: %q is not a VSAN datastore."+ + " The policy parameters will work only with VSAN Datastore."+ + " So, please specify a valid VSAN datastore in Storage class definition.", datastore.Name()) + } + storageProfileSpec.ProfileId = "" + storageProfileSpec.ProfileData = &types.VirtualMachineProfileRawData{ + ExtensionKey: "com.vmware.vim.sps", + ObjectData: vmdisk.volumeOptions.VSANStorageProfileData, + } + } else { + glog.Errorf("Both volumeOptions.StoragePolicyID and volumeOptions.VSANStorageProfileData are not set. One of them should be set") + return fmt.Errorf("Both volumeOptions.StoragePolicyID and volumeOptions.VSANStorageProfileData are not set. One of them should be set") + } + var dummyVM *vclib.VirtualMachine + // Check if VM already exist in the folder. + // If VM is already present, use it, else create a new dummy VM. + dummyVMFullName := vclib.DummyVMPrefixName + "-" + vmdisk.volumeOptions.Name + dummyVM, err = datastore.Datacenter.GetVMByPath(ctx, vmdisk.vmOptions.VMFolder.InventoryPath+"/"+dummyVMFullName) + if err != nil { + // Create a dummy VM + glog.V(1).Info("Creating Dummy VM: %q", dummyVMFullName) + dummyVM, err = vmdisk.createDummyVM(ctx, datastore.Datacenter, dummyVMFullName) + if err != nil { + glog.Errorf("Failed to create Dummy VM. err: %v", err) + return err + } + } + + // Reconfigure the VM to attach the disk with the VSAN policy configured + virtualMachineConfigSpec := types.VirtualMachineConfigSpec{} + disk, _, err := dummyVM.CreateDiskSpec(ctx, vmdisk.diskPath, datastore, vmdisk.volumeOptions) + if err != nil { + glog.Errorf("Failed to create Disk Spec. err: %v", err) + return err + } + deviceConfigSpec := &types.VirtualDeviceConfigSpec{ + Device: disk, + Operation: types.VirtualDeviceConfigSpecOperationAdd, + FileOperation: types.VirtualDeviceConfigSpecFileOperationCreate, + } + + deviceConfigSpec.Profile = append(deviceConfigSpec.Profile, storageProfileSpec) + virtualMachineConfigSpec.DeviceChange = append(virtualMachineConfigSpec.DeviceChange, deviceConfigSpec) + fileAlreadyExist := false + task, err := dummyVM.Reconfigure(ctx, virtualMachineConfigSpec) + err = task.Wait(ctx) + if err != nil { + fileAlreadyExist = isAlreadyExists(vmdisk.diskPath, err) + if fileAlreadyExist { + //Skip error and continue to detach the disk as the disk was already created on the datastore. + glog.V(vclib.LogLevel).Info("File: %v already exists", vmdisk.diskPath) + } else { + glog.Errorf("Failed to attach the disk to VM: %q with err: %+v", dummyVMFullName, err) + return err + } + } + // Detach the disk from the dummy VM. + err = dummyVM.DetachDisk(ctx, vmdisk.diskPath) + if err != nil { + if vclib.DiskNotFoundErrMsg == err.Error() && fileAlreadyExist { + // Skip error if disk was already detached from the dummy VM but still present on the datastore. + glog.V(vclib.LogLevel).Info("File: %v is already detached", vmdisk.diskPath) + } else { + glog.Errorf("Failed to detach the disk: %q from VM: %q with err: %+v", vmdisk.diskPath, dummyVMFullName, err) + return err + } + } + // Delete the dummy VM + err = dummyVM.DeleteVM(ctx) + if err != nil { + glog.Errorf("Failed to destroy the vm: %q with err: %+v", dummyVMFullName, err) + } + return nil +} + +func (vmdisk vmDiskManager) Delete(ctx context.Context, datastore *vclib.Datastore) error { + return fmt.Errorf("vmDiskManager.Delete is not supported") +} + +// CreateDummyVM create a Dummy VM at specified location with given name. +func (vmdisk vmDiskManager) createDummyVM(ctx context.Context, datacenter *vclib.Datacenter, vmName string) (*vclib.VirtualMachine, error) { + // Create a virtual machine config spec with 1 SCSI adapter. + virtualMachineConfigSpec := types.VirtualMachineConfigSpec{ + Name: vmName, + Files: &types.VirtualMachineFileInfo{ + VmPathName: "[" + vmdisk.volumeOptions.Datastore + "]", + }, + NumCPUs: 1, + MemoryMB: 4, + DeviceChange: []types.BaseVirtualDeviceConfigSpec{ + &types.VirtualDeviceConfigSpec{ + Operation: types.VirtualDeviceConfigSpecOperationAdd, + Device: &types.ParaVirtualSCSIController{ + VirtualSCSIController: types.VirtualSCSIController{ + SharedBus: types.VirtualSCSISharingNoSharing, + VirtualController: types.VirtualController{ + BusNumber: 0, + VirtualDevice: types.VirtualDevice{ + Key: 1000, + }, + }, + }, + }, + }, + }, + } + + task, err := vmdisk.vmOptions.VMFolder.CreateVM(ctx, virtualMachineConfigSpec, vmdisk.vmOptions.VMResourcePool, nil) + if err != nil { + glog.Errorf("Failed to create VM. err: %+v", err) + return nil, err + } + + dummyVMTaskInfo, err := task.WaitForResult(ctx, nil) + if err != nil { + glog.Errorf("Error occurred while waiting for create VM task result. err: %+v", err) + return nil, err + } + + vmRef := dummyVMTaskInfo.Result.(object.Reference) + dummyVM := object.NewVirtualMachine(datacenter.Client(), vmRef.Reference()) + return &vclib.VirtualMachine{VirtualMachine: dummyVM, Datacenter: datacenter}, nil +} + +// CleanUpDummyVMs deletes stale dummyVM's +func CleanUpDummyVMs(ctx context.Context, folder *vclib.Folder, dc *vclib.Datacenter) error { + vmList, err := folder.GetVirtualMachines(ctx) + if err != nil { + glog.V(4).Infof("Failed to get virtual machines in the kubernetes cluster: %s, err: %+v", folder.InventoryPath, err) + return err + } + if vmList == nil || len(vmList) == 0 { + glog.Errorf("No virtual machines found in the kubernetes cluster: %s", folder.InventoryPath) + return fmt.Errorf("No virtual machines found in the kubernetes cluster: %s", folder.InventoryPath) + } + var dummyVMList []*vclib.VirtualMachine + // Loop through VM's in the Kubernetes cluster to find dummy VM's + for _, vm := range vmList { + vmName, err := vm.ObjectName(ctx) + if err != nil { + glog.V(4).Infof("Unable to get name from VM with err: %+v", err) + continue + } + if strings.HasPrefix(vmName, vclib.DummyVMPrefixName) { + vmObj := vclib.VirtualMachine{VirtualMachine: object.NewVirtualMachine(dc.Client(), vm.Reference()), Datacenter: dc} + dummyVMList = append(dummyVMList, &vmObj) + } + } + for _, vm := range dummyVMList { + err = vm.DeleteVM(ctx) + if err != nil { + glog.V(4).Infof("Unable to delete dummy VM with err: %+v", err) + continue + } + } + return nil +} + +func isAlreadyExists(path string, err error) bool { + errorMessage := fmt.Sprintf("Cannot complete the operation because the file or folder %s already exists", path) + if errorMessage == err.Error() { + return true + } + return false +} diff --git a/pkg/cloudprovider/providers/vsphere/vclib/folder.go b/pkg/cloudprovider/providers/vsphere/vclib/folder.go new file mode 100644 index 00000000000..35294b5d4a5 --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vclib/folder.go @@ -0,0 +1,46 @@ +/* +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 vclib + +import ( + "github.com/golang/glog" + "github.com/vmware/govmomi/object" + "golang.org/x/net/context" +) + +// Folder extends the govmomi Folder object +type Folder struct { + *object.Folder + Datacenter *Datacenter +} + +// GetVirtualMachines returns list of VirtualMachine inside a folder. +func (folder *Folder) GetVirtualMachines(ctx context.Context) ([]*VirtualMachine, error) { + vmFolders, err := folder.Children(ctx) + if err != nil { + glog.Errorf("Failed to get children from Folder: %s. err: %+v", folder.InventoryPath, err) + return nil, err + } + var vmObjList []*VirtualMachine + for _, vmFolder := range vmFolders { + if vmFolder.Reference().Type == VirtualMachineType { + vmObj := VirtualMachine{object.NewVirtualMachine(folder.Client(), vmFolder.Reference()), folder.Datacenter} + vmObjList = append(vmObjList, &vmObj) + } + } + return vmObjList, nil +} diff --git a/pkg/cloudprovider/providers/vsphere/vclib/pbm.go b/pkg/cloudprovider/providers/vsphere/vclib/pbm.go new file mode 100644 index 00000000000..df749fb8966 --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vclib/pbm.go @@ -0,0 +1,169 @@ +/* +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 vclib + +import ( + "fmt" + + "github.com/golang/glog" + "github.com/vmware/govmomi/pbm" + "golang.org/x/net/context" + + pbmtypes "github.com/vmware/govmomi/pbm/types" + "github.com/vmware/govmomi/vim25" +) + +// PbmClient is extending govmomi pbm, and provides functions to get compatible list of datastore for given policy +type PbmClient struct { + *pbm.Client +} + +// NewPbmClient returns a new PBM Client object +func NewPbmClient(ctx context.Context, client *vim25.Client) (*PbmClient, error) { + pbmClient, err := pbm.NewClient(ctx, client) + if err != nil { + glog.Errorf("Failed to create new Pbm Client. err: %+v", err) + return nil, err + } + return &PbmClient{pbmClient}, nil +} + +// IsDatastoreCompatible check if the datastores is compatible for given storage policy id +// if datastore is not compatible with policy, fault message with the Datastore Name is returned +func (pbmClient *PbmClient) IsDatastoreCompatible(ctx context.Context, storagePolicyID string, datastore *Datastore) (bool, string, error) { + faultMessage := "" + placementHub := pbmtypes.PbmPlacementHub{ + HubType: datastore.Reference().Type, + HubId: datastore.Reference().Value, + } + hubs := []pbmtypes.PbmPlacementHub{placementHub} + req := []pbmtypes.BasePbmPlacementRequirement{ + &pbmtypes.PbmPlacementCapabilityProfileRequirement{ + ProfileId: pbmtypes.PbmProfileId{ + UniqueId: storagePolicyID, + }, + }, + } + compatibilityResult, err := pbmClient.CheckRequirements(ctx, hubs, nil, req) + if err != nil { + glog.Errorf("Error occurred for CheckRequirements call. err %+v", err) + return false, "", err + } + if compatibilityResult != nil && len(compatibilityResult) > 0 { + compatibleHubs := compatibilityResult.CompatibleDatastores() + if compatibleHubs != nil && len(compatibleHubs) > 0 { + return true, "", nil + } + dsName, err := datastore.ObjectName(ctx) + if err != nil { + glog.Errorf("Failed to get datastore ObjectName") + return false, "", err + } + if compatibilityResult[0].Error[0].LocalizedMessage == "" { + faultMessage = "Datastore: " + dsName + " is not compatible with the storage policy." + } else { + faultMessage = "Datastore: " + dsName + " is not compatible with the storage policy. LocalizedMessage: " + compatibilityResult[0].Error[0].LocalizedMessage + "\n" + } + return false, faultMessage, nil + } + return false, "", fmt.Errorf("compatibilityResult is nil or empty") +} + +// GetCompatibleDatastores filters and returns compatible list of datastores for given storage policy id +// For Non Compatible Datastores, fault message with the Datastore Name is also returned +func (pbmClient *PbmClient) GetCompatibleDatastores(ctx context.Context, storagePolicyID string, datastores []*Datastore) ([]*Datastore, string, error) { + var ( + dsMorNameMap = getDsMorNameMap(ctx, datastores) + localizedMessagesForNotCompatibleDatastores = "" + ) + compatibilityResult, err := pbmClient.GetPlacementCompatibilityResult(ctx, storagePolicyID, datastores) + if err != nil { + glog.Errorf("Error occurred while retrieving placement compatibility result for datastores: %+v with storagePolicyID: %s. err: %+v", datastores, storagePolicyID, err) + return nil, "", err + } + compatibleHubs := compatibilityResult.CompatibleDatastores() + var compatibleDatastoreList []*Datastore + for _, hub := range compatibleHubs { + compatibleDatastoreList = append(compatibleDatastoreList, getDatastoreFromPlacementHub(datastores, hub)) + } + for _, res := range compatibilityResult { + for _, err := range res.Error { + dsName := dsMorNameMap[res.Hub.HubId] + localizedMessage := "" + if err.LocalizedMessage != "" { + localizedMessage = "Datastore: " + dsName + " not compatible with the storage policy. LocalizedMessage: " + err.LocalizedMessage + "\n" + } else { + localizedMessage = "Datastore: " + dsName + " not compatible with the storage policy. \n" + } + localizedMessagesForNotCompatibleDatastores += localizedMessage + } + } + // Return an error if there are no compatible datastores. + if len(compatibleHubs) < 1 { + glog.Errorf("No compatible datastores found that satisfy the storage policy requirements: %s", storagePolicyID) + return nil, localizedMessagesForNotCompatibleDatastores, fmt.Errorf("No compatible datastores found that satisfy the storage policy requirements") + } + return compatibleDatastoreList, localizedMessagesForNotCompatibleDatastores, nil +} + +// GetPlacementCompatibilityResult gets placement compatibility result based on storage policy requirements. +func (pbmClient *PbmClient) GetPlacementCompatibilityResult(ctx context.Context, storagePolicyID string, datastore []*Datastore) (pbm.PlacementCompatibilityResult, error) { + var hubs []pbmtypes.PbmPlacementHub + for _, ds := range datastore { + hubs = append(hubs, pbmtypes.PbmPlacementHub{ + HubType: ds.Reference().Type, + HubId: ds.Reference().Value, + }) + } + req := []pbmtypes.BasePbmPlacementRequirement{ + &pbmtypes.PbmPlacementCapabilityProfileRequirement{ + ProfileId: pbmtypes.PbmProfileId{ + UniqueId: storagePolicyID, + }, + }, + } + res, err := pbmClient.CheckRequirements(ctx, hubs, nil, req) + if err != nil { + glog.Errorf("Error occurred for CheckRequirements call. err: %+v", err) + return nil, err + } + return res, nil +} + +// getDataStoreForPlacementHub returns matching datastore associated with given pbmPlacementHub +func getDatastoreFromPlacementHub(datastore []*Datastore, pbmPlacementHub pbmtypes.PbmPlacementHub) *Datastore { + for _, ds := range datastore { + if ds.Reference().Type == pbmPlacementHub.HubType && ds.Reference().Value == pbmPlacementHub.HubId { + return ds + } + } + return nil +} + +// getDsMorNameMap returns map of ds Mor and Datastore Object Name +func getDsMorNameMap(ctx context.Context, datastores []*Datastore) map[string]string { + dsMorNameMap := make(map[string]string) + for _, ds := range datastores { + dsObjectName, err := ds.ObjectName(ctx) + if err == nil { + dsMorNameMap[ds.Reference().Value] = dsObjectName + } else { + glog.Errorf("Error occurred while getting datastore object name. err: %+v", err) + } + } + return dsMorNameMap +} diff --git a/pkg/cloudprovider/providers/vsphere/vclib/utils.go b/pkg/cloudprovider/providers/vsphere/vclib/utils.go new file mode 100644 index 00000000000..8b80b4a4482 --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vclib/utils.go @@ -0,0 +1,117 @@ +/* +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 vclib + +import ( + "fmt" + "path/filepath" + "regexp" + "strings" + + "github.com/vmware/govmomi/find" + "github.com/vmware/govmomi/object" + "github.com/vmware/govmomi/vim25/types" +) + +func getFinder(dc *Datacenter) *find.Finder { + finder := find.NewFinder(dc.Client(), true) + finder.SetDatacenter(dc.Datacenter) + return finder +} + +// formatVirtualDiskUUID removes any spaces and hyphens in UUID +// Example UUID input is 42375390-71f9-43a3-a770-56803bcd7baa and output after format is 4237539071f943a3a77056803bcd7baa +func formatVirtualDiskUUID(uuid string) string { + uuidwithNoSpace := strings.Replace(uuid, " ", "", -1) + uuidWithNoHypens := strings.Replace(uuidwithNoSpace, "-", "", -1) + return strings.ToLower(uuidWithNoHypens) +} + +// getSCSIControllersOfType filters specific type of Controller device from given list of Virtual Machine Devices +func getSCSIControllersOfType(vmDevices object.VirtualDeviceList, scsiType string) []*types.VirtualController { + // get virtual scsi controllers of passed argument type + var scsiControllers []*types.VirtualController + for _, device := range vmDevices { + devType := vmDevices.Type(device) + if devType == scsiType { + if c, ok := device.(types.BaseVirtualController); ok { + scsiControllers = append(scsiControllers, c.GetVirtualController()) + } + } + } + return scsiControllers +} + +// getAvailableSCSIController gets available SCSI Controller from list of given controllers, which has less than 15 disk devices. +func getAvailableSCSIController(scsiControllers []*types.VirtualController) *types.VirtualController { + // get SCSI controller which has space for adding more devices + for _, controller := range scsiControllers { + if len(controller.Device) < SCSIControllerDeviceLimit { + return controller + } + } + return nil +} + +// getNextUnitNumber gets the next available SCSI controller unit number from given list of Controller Device List +func getNextUnitNumber(devices object.VirtualDeviceList, c types.BaseVirtualController) (int32, error) { + var takenUnitNumbers [SCSIDeviceSlots]bool + takenUnitNumbers[SCSIReservedSlot] = true + key := c.GetVirtualController().Key + + for _, device := range devices { + d := device.GetVirtualDevice() + if d.ControllerKey == key { + if d.UnitNumber != nil { + takenUnitNumbers[*d.UnitNumber] = true + } + } + } + for unitNumber, takenUnitNumber := range takenUnitNumbers { + if !takenUnitNumber { + return int32(unitNumber), nil + } + } + return -1, fmt.Errorf("SCSI Controller with key=%d does not have any available slots", key) +} + +// getSCSIControllers filters and return list of Controller Devices from given list of Virtual Machine Devices. +func getSCSIControllers(vmDevices object.VirtualDeviceList) []*types.VirtualController { + // get all virtual scsi controllers + var scsiControllers []*types.VirtualController + for _, device := range vmDevices { + devType := vmDevices.Type(device) + switch devType { + case SCSIControllerType, strings.ToLower(LSILogicControllerType), strings.ToLower(BusLogicControllerType), PVSCSIControllerType, strings.ToLower(LSILogicSASControllerType): + if c, ok := device.(types.BaseVirtualController); ok { + scsiControllers = append(scsiControllers, c.GetVirtualController()) + } + } + } + return scsiControllers +} + +// RemoveClusterFromVDiskPath removes the cluster or folder path from the vDiskPath +// for vDiskPath [DatastoreCluster/sharedVmfs-0] kubevols/e2e-vmdk-1234.vmdk, return value is [sharedVmfs-0] kubevols/e2e-vmdk-1234.vmdk +// for vDiskPath [sharedVmfs-0] kubevols/e2e-vmdk-1234.vmdk, return value remains same [sharedVmfs-0] kubevols/e2e-vmdk-1234.vmdk +func RemoveClusterFromVDiskPath(vDiskPath string) string { + datastore := regexp.MustCompile("\\[(.*?)\\]").FindStringSubmatch(vDiskPath)[1] + if filepath.Base(datastore) != datastore { + vDiskPath = strings.Replace(vDiskPath, datastore, filepath.Base(datastore), 1) + } + return vDiskPath +} diff --git a/pkg/cloudprovider/providers/vsphere/vclib/virtualmachine.go b/pkg/cloudprovider/providers/vsphere/vclib/virtualmachine.go new file mode 100644 index 00000000000..aed47f3c566 --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vclib/virtualmachine.go @@ -0,0 +1,368 @@ +/* +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 vclib + +import ( + "context" + "fmt" + "path/filepath" + "time" + + "github.com/golang/glog" + "github.com/vmware/govmomi/object" + "github.com/vmware/govmomi/vim25/mo" + "github.com/vmware/govmomi/vim25/types" +) + +// VirtualMachine extends the govmomi VirtualMachine object +type VirtualMachine struct { + *object.VirtualMachine + Datacenter *Datacenter +} + +// IsDiskAttached checks if disk is attached to the VM. +func (vm *VirtualMachine) IsDiskAttached(ctx context.Context, diskPath string) (bool, error) { + device, err := vm.getVirtualDeviceByPath(ctx, diskPath) + if err != nil { + return false, err + } + if device != nil { + return true, nil + } + return false, nil +} + +// GetVirtualDiskPage83Data gets the virtual disk UUID by diskPath +func (vm *VirtualMachine) GetVirtualDiskPage83Data(ctx context.Context, diskPath string) (string, error) { + if len(diskPath) > 0 && filepath.Ext(diskPath) != ".vmdk" { + diskPath += ".vmdk" + } + vdm := object.NewVirtualDiskManager(vm.Client()) + // Returns uuid of vmdk virtual disk + diskUUID, err := vdm.QueryVirtualDiskUuid(ctx, diskPath, vm.Datacenter.Datacenter) + + if err != nil { + glog.Errorf("QueryVirtualDiskUuid failed for diskPath: %q on VM: %q. err: %+v", diskPath, vm.InventoryPath, err) + return "", ErrNoDiskUUIDFound + } + diskUUID = formatVirtualDiskUUID(diskUUID) + return diskUUID, nil +} + +// DeleteVM deletes the VM. +func (vm *VirtualMachine) DeleteVM(ctx context.Context) error { + destroyTask, err := vm.Destroy(ctx) + if err != nil { + glog.Errorf("Failed to delete the VM: %q. err: %+v", vm.InventoryPath, err) + return err + } + return destroyTask.Wait(ctx) +} + +// AttachDisk attaches the disk at location - vmDiskPath from Datastore - dsObj to the Virtual Machine +// Additionally the disk can be configured with SPBM policy if volumeOptions.StoragePolicyID is non-empty. +func (vm *VirtualMachine) AttachDisk(ctx context.Context, vmDiskPath string, volumeOptions *VolumeOptions) (string, error) { + // Check if the diskControllerType is valid + if !CheckControllerSupported(volumeOptions.SCSIControllerType) { + return "", fmt.Errorf("Not a valid SCSI Controller Type. Valid options are %q", SCSIControllerTypeValidOptions()) + } + vmDiskPathCopy := vmDiskPath + vmDiskPath = RemoveClusterFromVDiskPath(vmDiskPath) + attached, err := vm.IsDiskAttached(ctx, vmDiskPath) + if err != nil { + glog.Errorf("Error occurred while checking if disk is attached on VM: %q. vmDiskPath: %q, err: %+v", vm.InventoryPath, vmDiskPath, err) + return "", err + } + // If disk is already attached, return the disk UUID + if attached { + diskUUID, _ := vm.GetVirtualDiskPage83Data(ctx, vmDiskPath) + return diskUUID, nil + } + + dsObj, err := vm.Datacenter.GetDatastoreByPath(ctx, vmDiskPathCopy) + if err != nil { + glog.Errorf("Failed to get datastore from vmDiskPath: %q. err: %+v", vmDiskPath, err) + return "", err + } + // If disk is not attached, create a disk spec for disk to be attached to the VM. + disk, newSCSIController, err := vm.CreateDiskSpec(ctx, vmDiskPath, dsObj, volumeOptions) + if err != nil { + glog.Errorf("Error occurred while creating disk spec. err: %+v", err) + return "", err + } + vmDevices, err := vm.Device(ctx) + if err != nil { + glog.Errorf("Failed to retrieve VM devices for VM: %q. err: %+v", vm.InventoryPath, err) + return "", err + } + virtualMachineConfigSpec := types.VirtualMachineConfigSpec{} + deviceConfigSpec := &types.VirtualDeviceConfigSpec{ + Device: disk, + Operation: types.VirtualDeviceConfigSpecOperationAdd, + } + // Configure the disk with the SPBM profile only if ProfileID is not empty. + if volumeOptions.StoragePolicyID != "" { + profileSpec := &types.VirtualMachineDefinedProfileSpec{ + ProfileId: volumeOptions.StoragePolicyID, + } + deviceConfigSpec.Profile = append(deviceConfigSpec.Profile, profileSpec) + } + virtualMachineConfigSpec.DeviceChange = append(virtualMachineConfigSpec.DeviceChange, deviceConfigSpec) + requestTime := time.Now() + task, err := vm.Reconfigure(ctx, virtualMachineConfigSpec) + if err != nil { + RecordvSphereMetric(APIAttachVolume, requestTime, err) + glog.Errorf("Failed to attach the disk with storagePolicy: %q on VM: %q. err - %+v", volumeOptions.StoragePolicyID, vm.InventoryPath, err) + if newSCSIController != nil { + vm.deleteController(ctx, newSCSIController, vmDevices) + } + return "", err + } + err = task.Wait(ctx) + RecordvSphereMetric(APIAttachVolume, requestTime, err) + if err != nil { + glog.Errorf("Failed to attach the disk with storagePolicy: %+q on VM: %q. err - %+v", volumeOptions.StoragePolicyID, vm.InventoryPath, err) + if newSCSIController != nil { + vm.deleteController(ctx, newSCSIController, vmDevices) + } + return "", err + } + + // Once disk is attached, get the disk UUID. + diskUUID, err := vm.GetVirtualDiskPage83Data(ctx, vmDiskPath) + if err != nil { + glog.Errorf("Error occurred while getting Disk Info from VM: %q. err: %v", vm.InventoryPath, err) + vm.DetachDisk(ctx, vmDiskPath) + if newSCSIController != nil { + vm.deleteController(ctx, newSCSIController, vmDevices) + } + return "", err + } + return diskUUID, nil +} + +// DetachDisk detaches the disk specified by vmDiskPath +func (vm *VirtualMachine) DetachDisk(ctx context.Context, vmDiskPath string) error { + vmDiskPath = RemoveClusterFromVDiskPath(vmDiskPath) + device, err := vm.getVirtualDeviceByPath(ctx, vmDiskPath) + if err != nil { + glog.Errorf("Disk ID not found for VM: %q with diskPath: %q", vm.InventoryPath, vmDiskPath) + return err + } + if device == nil { + glog.Errorf("No virtual device found with diskPath: %q on VM: %q", vmDiskPath, vm.InventoryPath) + return fmt.Errorf("No virtual device found with diskPath: %q on VM: %q", vmDiskPath, vm.InventoryPath) + } + // Detach disk from VM + requestTime := time.Now() + err = vm.RemoveDevice(ctx, true, device) + RecordvSphereMetric(APIDetachVolume, requestTime, err) + if err != nil { + glog.Errorf("Error occurred while removing disk device for VM: %q. err: %v", vm.InventoryPath, err) + return err + } + return nil +} + +// GetResourcePool gets the resource pool for VM. +func (vm *VirtualMachine) GetResourcePool(ctx context.Context) (*object.ResourcePool, error) { + vmMoList, err := vm.Datacenter.GetVMMoList(ctx, []*VirtualMachine{vm}, []string{"resourcePool"}) + if err != nil { + glog.Errorf("Failed to get resource pool from VM: %q. err: %+v", vm.InventoryPath, err) + return nil, err + } + return object.NewResourcePool(vm.Client(), vmMoList[0].ResourcePool.Reference()), nil +} + +// Exists checks if the VM exists. +// Returns false if VM doesn't exist or VM is in powerOff state. +func (vm *VirtualMachine) Exists(ctx context.Context) (bool, error) { + vmMoList, err := vm.Datacenter.GetVMMoList(ctx, []*VirtualMachine{vm}, []string{"summary"}) + if err != nil { + glog.Errorf("Failed to get VM Managed object with property summary. err: +%v", err) + return false, err + } + if vmMoList[0].Summary.Runtime.PowerState == ActivePowerState { + return true, nil + } + if vmMoList[0].Summary.Config.Template == false { + glog.Warningf("VM is not in %s state", ActivePowerState) + } else { + glog.Warningf("VM is a template") + } + return false, nil +} + +// GetAllAccessibleDatastores gets the list of accessible Datastores for the given Virtual Machine +func (vm *VirtualMachine) GetAllAccessibleDatastores(ctx context.Context) ([]*Datastore, error) { + host, err := vm.HostSystem(ctx) + if err != nil { + glog.Errorf("Failed to get host system for VM: %q. err: %+v", vm.InventoryPath, err) + return nil, err + } + var hostSystemMo mo.HostSystem + s := object.NewSearchIndex(vm.Client()) + err = s.Properties(ctx, host.Reference(), []string{DatastoreProperty}, &hostSystemMo) + if err != nil { + glog.Errorf("Failed to retrieve datastores for host: %+v. err: %+v", host, err) + return nil, err + } + var dsObjList []*Datastore + for _, dsRef := range hostSystemMo.Datastore { + dsObjList = append(dsObjList, &Datastore{object.NewDatastore(vm.Client(), dsRef), vm.Datacenter}) + } + return dsObjList, nil +} + +// CreateDiskSpec creates a disk spec for disk +func (vm *VirtualMachine) CreateDiskSpec(ctx context.Context, diskPath string, dsObj *Datastore, volumeOptions *VolumeOptions) (*types.VirtualDisk, types.BaseVirtualDevice, error) { + var newSCSIController types.BaseVirtualDevice + vmDevices, err := vm.Device(ctx) + if err != nil { + glog.Errorf("Failed to retrieve VM devices. err: %+v", err) + return nil, nil, err + } + // find SCSI controller of particular type from VM devices + scsiControllersOfRequiredType := getSCSIControllersOfType(vmDevices, volumeOptions.SCSIControllerType) + scsiController := getAvailableSCSIController(scsiControllersOfRequiredType) + if scsiController == nil { + newSCSIController, err = vm.createAndAttachSCSIController(ctx, volumeOptions.SCSIControllerType) + if err != nil { + glog.Errorf("Failed to create SCSI controller for VM :%q with err: %+v", vm.InventoryPath, err) + return nil, nil, err + } + // Get VM device list + vmDevices, err := vm.Device(ctx) + if err != nil { + glog.Errorf("Failed to retrieve VM devices. err: %v", err) + return nil, nil, err + } + // verify scsi controller in virtual machine + scsiControllersOfRequiredType := getSCSIControllersOfType(vmDevices, volumeOptions.SCSIControllerType) + scsiController = getAvailableSCSIController(scsiControllersOfRequiredType) + if scsiController == nil { + glog.Errorf("Cannot find SCSI controller of type: %q in VM", volumeOptions.SCSIControllerType) + // attempt clean up of scsi controller + vm.deleteController(ctx, newSCSIController, vmDevices) + return nil, nil, fmt.Errorf("Cannot find SCSI controller of type: %q in VM", volumeOptions.SCSIControllerType) + } + } + disk := vmDevices.CreateDisk(scsiController, dsObj.Reference(), diskPath) + unitNumber, err := getNextUnitNumber(vmDevices, scsiController) + if err != nil { + glog.Errorf("Cannot attach disk to VM, unitNumber limit reached - %+v.", err) + return nil, nil, err + } + *disk.UnitNumber = unitNumber + backing := disk.Backing.(*types.VirtualDiskFlatVer2BackingInfo) + backing.DiskMode = string(types.VirtualDiskModeIndependent_persistent) + + if volumeOptions.CapacityKB != 0 { + disk.CapacityInKB = int64(volumeOptions.CapacityKB) + } + if volumeOptions.DiskFormat != "" { + var diskFormat string + diskFormat = DiskFormatValidType[volumeOptions.DiskFormat] + switch diskFormat { + case ThinDiskType: + backing.ThinProvisioned = types.NewBool(true) + case EagerZeroedThickDiskType: + backing.EagerlyScrub = types.NewBool(true) + default: + backing.ThinProvisioned = types.NewBool(false) + } + } + return disk, newSCSIController, nil +} + +// createAndAttachSCSIController creates and attachs the SCSI controller to the VM. +func (vm *VirtualMachine) createAndAttachSCSIController(ctx context.Context, diskControllerType string) (types.BaseVirtualDevice, error) { + // Get VM device list + vmDevices, err := vm.Device(ctx) + if err != nil { + glog.Errorf("Failed to retrieve VM devices for VM: %q. err: %+v", vm.InventoryPath, err) + return nil, err + } + allSCSIControllers := getSCSIControllers(vmDevices) + if len(allSCSIControllers) >= SCSIControllerLimit { + // we reached the maximum number of controllers we can attach + glog.Errorf("SCSI Controller Limit of %d has been reached, cannot create another SCSI controller", SCSIControllerLimit) + return nil, fmt.Errorf("SCSI Controller Limit of %d has been reached, cannot create another SCSI controller", SCSIControllerLimit) + } + newSCSIController, err := vmDevices.CreateSCSIController(diskControllerType) + if err != nil { + glog.Errorf("Failed to create new SCSI controller on VM: %q. err: %+v", vm.InventoryPath, err) + return nil, err + } + configNewSCSIController := newSCSIController.(types.BaseVirtualSCSIController).GetVirtualSCSIController() + hotAndRemove := true + configNewSCSIController.HotAddRemove = &hotAndRemove + configNewSCSIController.SharedBus = types.VirtualSCSISharing(types.VirtualSCSISharingNoSharing) + + // add the scsi controller to virtual machine + err = vm.AddDevice(context.TODO(), newSCSIController) + if err != nil { + glog.V(LogLevel).Infof("Cannot add SCSI controller to VM: %q. err: %+v", vm.InventoryPath, err) + // attempt clean up of scsi controller + vm.deleteController(ctx, newSCSIController, vmDevices) + return nil, err + } + return newSCSIController, nil +} + +// getVirtualDeviceByPath gets the virtual device by path +func (vm *VirtualMachine) getVirtualDeviceByPath(ctx context.Context, diskPath string) (types.BaseVirtualDevice, error) { + var diskUUID string + vmDevices, err := vm.Device(ctx) + if err != nil { + glog.Errorf("Failed to get the devices for VM: %q. err: %+v", vm.InventoryPath, err) + return nil, err + } + volumeUUID, err := vm.GetVirtualDiskPage83Data(ctx, diskPath) + if err != nil { + glog.Errorf("Failed to get disk UUID for path: %q on VM: %q. err: %+v", diskPath, vm.InventoryPath, err) + return nil, err + } + // filter vm devices to retrieve device for the given vmdk file identified by disk path + for _, device := range vmDevices { + if vmDevices.TypeName(device) == "VirtualDisk" { + virtualDevice := device.GetVirtualDevice() + if backing, ok := virtualDevice.Backing.(*types.VirtualDiskFlatVer2BackingInfo); ok { + diskUUID = formatVirtualDiskUUID(backing.Uuid) + if diskUUID == volumeUUID { + return device, nil + } + } + } + } + return nil, nil +} + +// deleteController removes latest added SCSI controller from VM. +func (vm *VirtualMachine) deleteController(ctx context.Context, controllerDevice types.BaseVirtualDevice, vmDevices object.VirtualDeviceList) error { + controllerDeviceList := vmDevices.SelectByType(controllerDevice) + if len(controllerDeviceList) < 1 { + return ErrNoDevicesFound + } + device := controllerDeviceList[len(controllerDeviceList)-1] + err := vm.RemoveDevice(ctx, true, device) + if err != nil { + glog.Errorf("Error occurred while removing device on VM: %q. err: %+v", vm.InventoryPath, err) + return err + } + return nil +} diff --git a/pkg/cloudprovider/providers/vsphere/vclib/vmoptions.go b/pkg/cloudprovider/providers/vsphere/vclib/vmoptions.go new file mode 100644 index 00000000000..2648d85e22a --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vclib/vmoptions.go @@ -0,0 +1,27 @@ +/* +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 vclib + +import ( + "github.com/vmware/govmomi/object" +) + +// VMOptions provides helper objects for provisioning volume with SPBM Policy +type VMOptions struct { + VMFolder *Folder + VMResourcePool *object.ResourcePool +} diff --git a/pkg/cloudprovider/providers/vsphere/vclib/volumeoptions.go b/pkg/cloudprovider/providers/vsphere/vclib/volumeoptions.go new file mode 100644 index 00000000000..75dadb437ee --- /dev/null +++ b/pkg/cloudprovider/providers/vsphere/vclib/volumeoptions.go @@ -0,0 +1,107 @@ +/* +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 vclib + +import ( + "strings" + + "github.com/golang/glog" +) + +// VolumeOptions specifies various options for a volume. +type VolumeOptions struct { + CapacityKB int + Tags map[string]string + Name string + DiskFormat string + Datastore string + VSANStorageProfileData string + StoragePolicyName string + StoragePolicyID string + SCSIControllerType string +} + +var ( + // DiskFormatValidType specifies the valid disk formats + DiskFormatValidType = map[string]string{ + ThinDiskType: ThinDiskType, + strings.ToLower(EagerZeroedThickDiskType): EagerZeroedThickDiskType, + strings.ToLower(ZeroedThickDiskType): PreallocatedDiskType, + } + // SCSIControllerValidType specifies the supported SCSI controllers + SCSIControllerValidType = []string{LSILogicControllerType, LSILogicSASControllerType, PVSCSIControllerType} +) + +// DiskformatValidOptions generates Valid Options for Diskformat +func DiskformatValidOptions() string { + validopts := "" + for diskformat := range DiskFormatValidType { + validopts += diskformat + ", " + } + validopts = strings.TrimSuffix(validopts, ", ") + return validopts +} + +// CheckDiskFormatSupported checks if the diskFormat is valid +func CheckDiskFormatSupported(diskFormat string) bool { + if DiskFormatValidType[diskFormat] == "" { + glog.Errorf("Not a valid Disk Format. Valid options are %+q", DiskformatValidOptions()) + return false + } + return true +} + +// SCSIControllerTypeValidOptions generates valid options for SCSIControllerType +func SCSIControllerTypeValidOptions() string { + validopts := "" + for _, controllerType := range SCSIControllerValidType { + validopts += (controllerType + ", ") + } + validopts = strings.TrimSuffix(validopts, ", ") + return validopts +} + +// CheckControllerSupported checks if the given controller type is valid +func CheckControllerSupported(ctrlType string) bool { + for _, c := range SCSIControllerValidType { + if ctrlType == c { + return true + } + } + glog.Errorf("Not a valid SCSI Controller Type. Valid options are %q", SCSIControllerTypeValidOptions()) + return false +} + +// VerifyVolumeOptions checks if volumeOptions.SCIControllerType is valid controller type +func (volumeOptions VolumeOptions) VerifyVolumeOptions() bool { + // Validate only if SCSIControllerType is set by user. + // Default value is set later in virtualDiskManager.Create and vmDiskManager.Create + if volumeOptions.SCSIControllerType != "" { + isValid := CheckControllerSupported(volumeOptions.SCSIControllerType) + if !isValid { + return false + } + } + // ThinDiskType is the default, so skip the validation. + if volumeOptions.DiskFormat != ThinDiskType { + isValid := CheckDiskFormatSupported(volumeOptions.DiskFormat) + if !isValid { + return false + } + } + return true +} diff --git a/pkg/cloudprovider/providers/vsphere/vsphere_metrics.go b/pkg/cloudprovider/providers/vsphere/vclib/vsphere_metrics.go similarity index 59% rename from pkg/cloudprovider/providers/vsphere/vsphere_metrics.go rename to pkg/cloudprovider/providers/vsphere/vclib/vsphere_metrics.go index 81beb0b4a8d..ab5b45f87f9 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere_metrics.go +++ b/pkg/cloudprovider/providers/vsphere/vclib/vsphere_metrics.go @@ -14,33 +14,36 @@ See the License for the specific language governing permissions and limitations under the License. */ -package vsphere +package vclib import ( - "github.com/prometheus/client_golang/prometheus" "time" + + "github.com/prometheus/client_golang/prometheus" ) +// Cloud Provider API constants const ( - api_createvolume = "CreateVolume" - api_deletevolume = "DeleteVolume" - api_attachvolume = "AttachVolume" - api_detachvolume = "DetachVolume" + APICreateVolume = "CreateVolume" + APIDeleteVolume = "DeleteVolume" + APIAttachVolume = "AttachVolume" + APIDetachVolume = "DetachVolume" ) +// Cloud Provider Operation constants const ( - operation_deletevolume = "DeleteVolumeOperation" - operation_attachvolume = "AttachVolumeOperation" - operation_detachvolume = "DetachVolumeOperation" - operation_diskIsAttached = "DiskIsAttachedOperation" - operation_disksAreAttached = "DisksAreAttachedOperation" - operation_createvolume = "CreateVolumeOperation" - operation_createvolume_with_policy = "CreateVolumeWithPolicyOperation" - operation_createvolume_with_raw_vsan_policy = "CreateVolumeWithRawVSANPolicyOperation" + OperationDeleteVolume = "DeleteVolumeOperation" + OperationAttachVolume = "AttachVolumeOperation" + OperationDetachVolume = "DetachVolumeOperation" + OperationDiskIsAttached = "DiskIsAttachedOperation" + OperationDisksAreAttached = "DisksAreAttachedOperation" + OperationCreateVolume = "CreateVolumeOperation" + OperationCreateVolumeWithPolicy = "CreateVolumeWithPolicyOperation" + OperationCreateVolumeWithRawVSANPolicy = "CreateVolumeWithRawVSANPolicyOperation" ) -// vsphereApiMetric is for recording latency of Single API Call. -var vsphereApiMetric = prometheus.NewHistogramVec( +// vsphereAPIMetric is for recording latency of Single API Call. +var vsphereAPIMetric = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "cloudprovider_vsphere_api_request_duration_seconds", Help: "Latency of vsphere api call", @@ -48,7 +51,7 @@ var vsphereApiMetric = prometheus.NewHistogramVec( []string{"request"}, ) -var vsphereApiErrorMetric = prometheus.NewCounterVec( +var vsphereAPIErrorMetric = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "cloudprovider_vsphere_api_request_errors", Help: "vsphere Api errors", @@ -73,16 +76,18 @@ var vsphereOperationErrorMetric = prometheus.NewCounterVec( []string{"operation"}, ) -func registerMetrics() { - prometheus.MustRegister(vsphereApiMetric) - prometheus.MustRegister(vsphereApiErrorMetric) +// RegisterMetrics registers all the API and Operation metrics +func RegisterMetrics() { + prometheus.MustRegister(vsphereAPIMetric) + prometheus.MustRegister(vsphereAPIErrorMetric) prometheus.MustRegister(vsphereOperationMetric) prometheus.MustRegister(vsphereOperationErrorMetric) } -func recordvSphereMetric(actionName string, requestTime time.Time, err error) { +// RecordvSphereMetric records the vSphere API and Operation metrics +func RecordvSphereMetric(actionName string, requestTime time.Time, err error) { switch actionName { - case api_createvolume, api_deletevolume, api_attachvolume, api_detachvolume: + case APICreateVolume, APIDeleteVolume, APIAttachVolume, APIDetachVolume: recordvSphereAPIMetric(actionName, requestTime, err) default: recordvSphereOperationMetric(actionName, requestTime, err) @@ -91,9 +96,9 @@ func recordvSphereMetric(actionName string, requestTime time.Time, err error) { func recordvSphereAPIMetric(actionName string, requestTime time.Time, err error) { if err != nil { - vsphereApiErrorMetric.With(prometheus.Labels{"request": actionName}).Inc() + vsphereAPIErrorMetric.With(prometheus.Labels{"request": actionName}).Inc() } else { - vsphereApiMetric.With(prometheus.Labels{"request": actionName}).Observe(calculateTimeTaken(requestTime)) + vsphereAPIMetric.With(prometheus.Labels{"request": actionName}).Observe(calculateTimeTaken(requestTime)) } } @@ -105,16 +110,17 @@ func recordvSphereOperationMetric(actionName string, requestTime time.Time, err } } -func recordCreateVolumeMetric(volumeOptions *VolumeOptions, requestTime time.Time, err error) { +// RecordCreateVolumeMetric records the Create Volume metric +func RecordCreateVolumeMetric(volumeOptions *VolumeOptions, requestTime time.Time, err error) { var actionName string if volumeOptions.StoragePolicyName != "" { - actionName = operation_createvolume_with_policy + actionName = OperationCreateVolumeWithPolicy } else if volumeOptions.VSANStorageProfileData != "" { - actionName = operation_createvolume_with_raw_vsan_policy + actionName = OperationCreateVolumeWithRawVSANPolicy } else { - actionName = operation_createvolume + actionName = OperationCreateVolume } - recordvSphereMetric(actionName, requestTime, err) + RecordvSphereMetric(actionName, requestTime, err) } func calculateTimeTaken(requestBeginTime time.Time) (timeTaken float64) { diff --git a/pkg/cloudprovider/providers/vsphere/vsphere.go b/pkg/cloudprovider/providers/vsphere/vsphere.go index 91f8e3734b7..60086d52297 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere.go @@ -20,12 +20,9 @@ import ( "errors" "fmt" "io" - "io/ioutil" "net" - "net/url" "path" "path/filepath" - "regexp" "runtime" "strings" "sync" @@ -34,96 +31,45 @@ import ( "gopkg.in/gcfg.v1" "github.com/golang/glog" - "github.com/vmware/govmomi" - "github.com/vmware/govmomi/find" - "github.com/vmware/govmomi/object" - "github.com/vmware/govmomi/property" - "github.com/vmware/govmomi/session" - "github.com/vmware/govmomi/vim25" - "github.com/vmware/govmomi/vim25/mo" - "github.com/vmware/govmomi/vim25/soap" - "github.com/vmware/govmomi/vim25/types" "golang.org/x/net/context" - - pbm "github.com/vmware/govmomi/pbm" "k8s.io/api/core/v1" k8stypes "k8s.io/apimachinery/pkg/types" - k8runtime "k8s.io/apimachinery/pkg/util/runtime" v1helper "k8s.io/kubernetes/pkg/api/v1/helper" "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib" + "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers" "k8s.io/kubernetes/pkg/controller" ) +// VSphere Cloud Provider constants const ( - ProviderName = "vsphere" - ActivePowerState = "poweredOn" - SCSIControllerType = "scsi" - LSILogicControllerType = "lsiLogic" - BusLogicControllerType = "busLogic" - PVSCSIControllerType = "pvscsi" - LSILogicSASControllerType = "lsiLogic-sas" - SCSIControllerLimit = 4 - SCSIControllerDeviceLimit = 15 - SCSIDeviceSlots = 16 - SCSIReservedSlot = 7 - ThinDiskType = "thin" - PreallocatedDiskType = "preallocated" - EagerZeroedThickDiskType = "eagerZeroedThick" - ZeroedThickDiskType = "zeroedThick" - VolDir = "kubevols" - RoundTripperDefaultCount = 3 - DummyVMPrefixName = "vsphere-k8s" - VSANDatastoreType = "vsan" - MAC_OUI_VC = "00:50:56" - MAC_OUI_ESX = "00:0c:29" - DiskNotFoundErrMsg = "No vSphere disk ID found" - NoDiskUUIDFoundErrMsg = "No disk UUID found" - NoDevicesFoundErrMsg = "No devices found" - NonSupportedControllerTypeErrMsg = "Disk is attached to non-supported controller type" - FileAlreadyExistErrMsg = "File requested already exist" - CleanUpDummyVMRoutine_Interval = 5 - UUIDPath = "/sys/class/dmi/id/product_serial" - UUIDPrefix = "VMware-" - NameProperty = "name" + ProviderName = "vsphere" + VolDir = "kubevols" + RoundTripperDefaultCount = 3 + DummyVMPrefixName = "vsphere-k8s" + VSANDatastoreType = "vsan" + MacOuiVC = "00:50:56" + MacOuiEsx = "00:0c:29" + CleanUpDummyVMRoutineInterval = 5 + UUIDPath = "/sys/class/dmi/id/product_serial" + UUIDPrefix = "VMware-" ) -// Controller types that are currently supported for hot attach of disks -// lsilogic driver type is currently not supported because,when a device gets detached -// it fails to remove the device from the /dev path (which should be manually done) -// making the subsequent attaches to the node to fail. -// TODO: Add support for lsilogic driver type -var supportedSCSIControllerType = []string{strings.ToLower(LSILogicSASControllerType), PVSCSIControllerType} - -// Maps user options to API parameters. -// Keeping user options consistent with docker volume plugin for vSphere. -// API: http://pubs.vmware.com/vsphere-60/index.jsp#com.vmware.wssdk.apiref.doc/vim.VirtualDiskManager.VirtualDiskType.html -var diskFormatValidType = map[string]string{ - ThinDiskType: ThinDiskType, - strings.ToLower(EagerZeroedThickDiskType): EagerZeroedThickDiskType, - strings.ToLower(ZeroedThickDiskType): PreallocatedDiskType, -} - -var DiskformatValidOptions = generateDiskFormatValidOptions() var cleanUpRoutineInitialized = false -var ErrNoDiskUUIDFound = errors.New(NoDiskUUIDFoundErrMsg) -var ErrNoDiskIDFound = errors.New(DiskNotFoundErrMsg) -var ErrNoDevicesFound = errors.New(NoDevicesFoundErrMsg) -var ErrNonSupportedControllerType = errors.New(NonSupportedControllerTypeErrMsg) -var ErrFileAlreadyExist = errors.New(FileAlreadyExistErrMsg) - var clientLock sync.Mutex var cleanUpRoutineInitLock sync.Mutex var cleanUpDummyVMLock sync.RWMutex // VSphere is an implementation of cloud provider Interface for VSphere. type VSphere struct { - client *govmomi.Client - cfg *VSphereConfig + conn *vclib.VSphereConnection + cfg *VSphereConfig // InstanceID of the server where this VSphere object is instantiated. localInstanceID string } +// VSphereConfig information that is used by vSphere Cloud Provider to connect to VC type VSphereConfig struct { Global struct { // vCenter username. @@ -168,7 +114,7 @@ type VSphereConfig struct { type Volumes interface { // AttachDisk attaches given disk to given node. Current node // is used when nodeName is empty string. - AttachDisk(vmDiskPath string, storagePolicyID string, nodeName k8stypes.NodeName) (diskID string, diskUUID string, err error) + AttachDisk(vmDiskPath string, storagePolicyID string, nodeName k8stypes.NodeName) (diskUUID string, err error) // DetachDisk detaches given disk to given node. Current node // is used when nodeName is empty string. @@ -184,34 +130,12 @@ type Volumes interface { DisksAreAttached(volPath []string, nodeName k8stypes.NodeName) (map[string]bool, error) // CreateVolume creates a new vmdk with specified parameters. - CreateVolume(volumeOptions *VolumeOptions) (volumePath string, err error) + CreateVolume(volumeOptions *vclib.VolumeOptions) (volumePath string, err error) // DeleteVolume deletes vmdk. DeleteVolume(vmDiskPath string) error } -// VolumeOptions specifies capacity, tags, name and diskFormat for a volume. -type VolumeOptions struct { - CapacityKB int - Tags map[string]string - Name string - DiskFormat string - Datastore string - VSANStorageProfileData string - StoragePolicyName string - StoragePolicyID string -} - -// Generates Valid Options for Diskformat -func generateDiskFormatValidOptions() string { - validopts := "" - for diskformat := range diskFormatValidType { - validopts += (diskformat + ", ") - } - validopts = strings.TrimSuffix(validopts, ", ") - return validopts -} - // Parses vSphere cloud config file and stores it into VSphereConfig. func readConfig(config io.Reader) (VSphereConfig, error) { if config == nil { @@ -225,7 +149,7 @@ func readConfig(config io.Reader) (VSphereConfig, error) { } func init() { - registerMetrics() + vclib.RegisterMetrics() cloudprovider.RegisterCloudProvider(ProviderName, func(config io.Reader) (cloudprovider.Interface, error) { cfg, err := readConfig(config) if err != nil { @@ -238,96 +162,16 @@ func init() { // Initialize passes a Kubernetes clientBuilder interface to the cloud provider func (vs *VSphere) Initialize(clientBuilder controller.ControllerClientBuilder) {} -// UUID gets the BIOS UUID via the sys interface. This UUID is known by vsphere -func getvmUUID() (string, error) { - id, err := ioutil.ReadFile(UUIDPath) - if err != nil { - return "", fmt.Errorf("error retrieving vm uuid: %s", err) - } - uuidFromFile := string(id[:]) - //strip leading and trailing white space and new line char - uuid := strings.TrimSpace(uuidFromFile) - // check the uuid starts with "VMware-" - if !strings.HasPrefix(uuid, UUIDPrefix) { - return "", fmt.Errorf("Failed to match Prefix, UUID read from the file is %v", uuidFromFile) - } - // Strip the prefix and while spaces and - - uuid = strings.Replace(uuid[len(UUIDPrefix):(len(uuid))], " ", "", -1) - uuid = strings.Replace(uuid, "-", "", -1) - if len(uuid) != 32 { - return "", fmt.Errorf("Length check failed, UUID read from the file is %v", uuidFromFile) - } - // need to add dashes, e.g. "564d395e-d807-e18a-cb25-b79f65eb2b9f" - uuid = fmt.Sprintf("%s-%s-%s-%s-%s", uuid[0:8], uuid[8:12], uuid[12:16], uuid[16:20], uuid[20:32]) - return uuid, nil -} - -// Returns the name of the VM on which this code is running. -// Will attempt to determine the machine's name via it's UUID in this precedence order, failing if neither have a UUID: -// * cloud config value VMUUID -// * sysfs entry -func getVMName(client *govmomi.Client, cfg *VSphereConfig) (string, error) { - var vmUUID string - var err error - - if cfg.Global.VMUUID != "" { - vmUUID = cfg.Global.VMUUID - } else { - // This needs root privileges on the host, and will fail otherwise. - vmUUID, err = getvmUUID() - if err != nil { - return "", err - } - cfg.Global.VMUUID = vmUUID - } - - if vmUUID == "" { - return "", fmt.Errorf("unable to determine machine ID from cloud configuration or sysfs") - } - - // Create context - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // Create a new finder - f := find.NewFinder(client.Client, true) - - // Fetch and set data center - dc, err := f.Datacenter(ctx, cfg.Global.Datacenter) - if err != nil { - return "", err - } - f.SetDatacenter(dc) - - s := object.NewSearchIndex(client.Client) - - svm, err := s.FindByUuid(ctx, dc, strings.ToLower(strings.TrimSpace(vmUUID)), true, nil) - if err != nil { - return "", err - } - - if svm == nil { - return "", fmt.Errorf("unable to find machine reference by UUID") - } - - var vm mo.VirtualMachine - err = s.Properties(ctx, svm.Reference(), []string{"name"}, &vm) - if err != nil { - return "", err - } - - return vm.Name, nil -} - func newVSphere(cfg VSphereConfig) (*VSphere, error) { + var err error if cfg.Disk.SCSIControllerType == "" { - cfg.Disk.SCSIControllerType = PVSCSIControllerType - } else if !checkControllerSupported(cfg.Disk.SCSIControllerType) { + cfg.Disk.SCSIControllerType = vclib.PVSCSIControllerType + } else if !vclib.CheckControllerSupported(cfg.Disk.SCSIControllerType) { glog.Errorf("%v is not a supported SCSI Controller type. Please configure 'lsilogic-sas' OR 'pvscsi'", cfg.Disk.SCSIControllerType) return nil, errors.New("Controller type not supported. Please configure 'lsilogic-sas' OR 'pvscsi'") } if cfg.Global.WorkingDir != "" { - cfg.Global.WorkingDir = path.Clean(cfg.Global.WorkingDir) + "/" + cfg.Global.WorkingDir = path.Clean(cfg.Global.WorkingDir) } if cfg.Global.RoundTripperCount == 0 { cfg.Global.RoundTripperCount = RoundTripperDefaultCount @@ -335,133 +179,66 @@ func newVSphere(cfg VSphereConfig) (*VSphere, error) { if cfg.Global.VCenterPort == "" { cfg.Global.VCenterPort = "443" } + if cfg.Global.VMUUID == "" { + // This needs root privileges on the host, and will fail otherwise. + cfg.Global.VMUUID, err = getvmUUID() + if err != nil { + glog.Errorf("Failed to get VM UUID. err: %+v", err) + return nil, err + } + } + vSphereConn := vclib.VSphereConnection{ + Username: cfg.Global.User, + Password: cfg.Global.Password, + Hostname: cfg.Global.VCenterIP, + Insecure: cfg.Global.InsecureFlag, + RoundTripperCount: cfg.Global.RoundTripperCount, + Port: cfg.Global.VCenterPort, + } + var instanceID string - var c *govmomi.Client - var id string if cfg.Global.VMName == "" { // if VMName is not set in the cloud config file, each nodes (including worker nodes) need credentials to obtain VMName from vCenter glog.V(4).Infof("Cannot find VMName from cloud config file, start obtaining it from vCenter") - c, err := newClient(context.TODO(), &cfg) + // Create context + ctx, cancel := context.WithCancel(context.TODO()) + defer cancel() + err = vSphereConn.Connect(ctx) + if err != nil { + glog.Errorf("Failed to connect to vSphere") + return nil, err + } + dc, err := vclib.GetDatacenter(ctx, &vSphereConn, cfg.Global.Datacenter) if err != nil { return nil, err } - - id, err = getVMName(c, &cfg) + vm, err := dc.GetVMByUUID(ctx, cfg.Global.VMUUID) if err != nil { return nil, err } + vmName, err := vm.ObjectName(ctx) + if err != nil { + return nil, err + } + instanceID = vmName } else { - id = cfg.Global.VMName + instanceID = cfg.Global.VMName } - vs := VSphere{ - client: c, + conn: &vSphereConn, cfg: &cfg, - localInstanceID: id, + localInstanceID: instanceID, } runtime.SetFinalizer(&vs, logout) - return &vs, nil } -// Returns if the given controller type is supported by the plugin -func checkControllerSupported(ctrlType string) bool { - for _, c := range supportedSCSIControllerType { - if ctrlType == c { - return true - } - } - return false -} - func logout(vs *VSphere) { - if vs.client != nil { - vs.client.Logout(context.TODO()) + if vs.conn.GoVmomiClient != nil { + vs.conn.GoVmomiClient.Logout(context.TODO()) } } -func newClient(ctx context.Context, cfg *VSphereConfig) (*govmomi.Client, error) { - // Parse URL from string - u, err := url.Parse(fmt.Sprintf("https://%s:%s/sdk", cfg.Global.VCenterIP, cfg.Global.VCenterPort)) - if err != nil { - return nil, err - } - // set username and password for the URL - u.User = url.UserPassword(cfg.Global.User, cfg.Global.Password) - - // Connect and log in to ESX or vCenter - c, err := govmomi.NewClient(ctx, u, cfg.Global.InsecureFlag) - if err != nil { - return nil, err - } - - // Add retry functionality - c.RoundTripper = vim25.Retry(c.RoundTripper, vim25.TemporaryNetworkError(int(cfg.Global.RoundTripperCount))) - - return c, nil -} - -// Returns a client which communicates with vCenter. -// This client can used to perform further vCenter operations. -func vSphereLogin(ctx context.Context, vs *VSphere) error { - var err error - clientLock.Lock() - defer clientLock.Unlock() - if vs.client == nil { - vs.client, err = newClient(ctx, vs.cfg) - if err != nil { - return err - } - return nil - } - - m := session.NewManager(vs.client.Client) - // retrieve client's current session - u, err := m.UserSession(ctx) - if err != nil { - glog.Errorf("Error while obtaining user session. err: %q", err) - return err - } - if u != nil { - return nil - } - - glog.Warningf("Creating new client session since the existing session is not valid or not authenticated") - vs.client.Logout(ctx) - vs.client, err = newClient(ctx, vs.cfg) - if err != nil { - return err - } - - return nil -} - -// Returns vSphere object `virtual machine` by its name. -func getVirtualMachineByName(ctx context.Context, cfg *VSphereConfig, c *govmomi.Client, nodeName k8stypes.NodeName) (*object.VirtualMachine, error) { - name := nodeNameToVMName(nodeName) - - // Create a new finder - f := find.NewFinder(c.Client, true) - - // Fetch and set data center - dc, err := f.Datacenter(ctx, cfg.Global.Datacenter) - if err != nil { - return nil, err - } - f.SetDatacenter(dc) - - vmRegex := cfg.Global.WorkingDir + name - - // Retrieve vm by name - //TODO: also look for vm inside subfolders - vm, err := f.VirtualMachine(ctx, vmRegex) - if err != nil { - return nil, err - } - - return vm, nil -} - // Instances returns an implementation of Instances for vSphere. func (vs *VSphere) Instances() (cloudprovider.Instances, bool) { return vs, true @@ -469,13 +246,11 @@ func (vs *VSphere) Instances() (cloudprovider.Instances, bool) { func getLocalIP() ([]v1.NodeAddress, error) { addrs := []v1.NodeAddress{} - ifaces, err := net.Interfaces() if err != nil { glog.Errorf("net.Interfaces() failed for NodeAddresses - %v", err) return nil, err } - for _, i := range ifaces { localAddrs, err := i.Addrs() if err != nil { @@ -486,8 +261,8 @@ func getLocalIP() ([]v1.NodeAddress, error) { if ipnet.IP.To4() != nil { // Filter external IP by MAC address OUIs from vCenter and from ESX var addressType v1.NodeAddressType - if strings.HasPrefix(i.HardwareAddr.String(), MAC_OUI_VC) || - strings.HasPrefix(i.HardwareAddr.String(), MAC_OUI_ESX) { + if strings.HasPrefix(i.HardwareAddr.String(), MacOuiVC) || + strings.HasPrefix(i.HardwareAddr.String(), MacOuiEsx) { v1helper.AddToNodeAddresses(&addrs, v1.NodeAddress{ Type: v1.NodeExternalIP, @@ -508,55 +283,47 @@ func getLocalIP() ([]v1.NodeAddress, error) { return addrs, nil } -// getVMandMO returns the VM object and required field from the VM object -func (vs *VSphere) getVMandMO(ctx context.Context, nodeName k8stypes.NodeName, field string) (vm *object.VirtualMachine, mvm *mo.VirtualMachine, err error) { - // Ensure client is logged in and session is valid - err = vSphereLogin(ctx, vs) +// Get the VM Managed Object instance by from the node +func (vs *VSphere) getVMByName(ctx context.Context, nodeName k8stypes.NodeName) (*vclib.VirtualMachine, error) { + dc, err := vclib.GetDatacenter(ctx, vs.conn, vs.cfg.Global.Datacenter) if err != nil { - glog.Errorf("Failed to login into vCenter - %v", err) - return nil, nil, err + return nil, err } - - vm, err = getVirtualMachineByName(ctx, vs.cfg, vs.client, nodeName) + vmPath := vs.cfg.Global.WorkingDir + "/" + nodeNameToVMName(nodeName) + vm, err := dc.GetVMByPath(ctx, vmPath) if err != nil { - if _, ok := err.(*find.NotFoundError); ok { - return nil, nil, cloudprovider.InstanceNotFound - } - return nil, nil, err + return nil, err } - - // Retrieve required field from VM object - var movm mo.VirtualMachine - collector := property.DefaultCollector(vs.client.Client) - err = collector.RetrieveOne(ctx, vm.Reference(), []string{field}, &movm) - if err != nil { - return nil, nil, err - } - - return vm, &movm, nil + return vm, nil } // NodeAddresses is an implementation of Instances.NodeAddresses. func (vs *VSphere) NodeAddresses(nodeName k8stypes.NodeName) ([]v1.NodeAddress, error) { + // Get local IP addresses if node is local node if vs.localInstanceID == nodeNameToVMName(nodeName) { - /* Get local IP addresses if node is local node */ return getLocalIP() } - addrs := []v1.NodeAddress{} - // Create context ctx, cancel := context.WithCancel(context.Background()) defer cancel() - - _, mvm, err := vs.getVMandMO(ctx, nodeName, "guest.net") + // Ensure client is logged in and session is valid + err := vs.conn.Connect(ctx) if err != nil { - glog.Errorf("Failed to getVMandMO for NodeAddresses: err %v", err) - return addrs, err + return nil, err + } + vm, err := vs.getVMByName(ctx, nodeName) + if err != nil { + glog.Errorf("Failed to get VM object for node: %q. err: +%v", nodeNameToVMName(nodeName), err) + return nil, err + } + vmMoList, err := vm.Datacenter.GetVMMoList(ctx, []*vclib.VirtualMachine{vm}, []string{"guest.net"}) + if err != nil { + glog.Errorf("Failed to get VM Managed object with property guest.net for node: %q. err: +%v", nodeNameToVMName(nodeName), err) + return nil, err } - // retrieve VM's ip(s) - for _, v := range mvm.Guest.Net { + for _, v := range vmMoList[0].Guest.Net { if vs.cfg.Network.PublicNetwork == v.Network { for _, ip := range v.IpAddress { if net.ParseIP(ip).To4() != nil { @@ -584,10 +351,12 @@ func (vs *VSphere) NodeAddressesByProviderID(providerID string) ([]v1.NodeAddres return vs.NodeAddresses(vmNameToNodeName(vmName)) } +// AddSSHKeyToAllInstances add SSH key to all instances func (vs *VSphere) AddSSHKeyToAllInstances(user string, keyData []byte) error { return errors.New("unimplemented") } +// CurrentNodeName gives the current node name func (vs *VSphere) CurrentNodeName(hostname string) (k8stypes.NodeName, error) { return vmNameToNodeName(vs.localInstanceID), nil } @@ -604,59 +373,35 @@ func vmNameToNodeName(vmName string) k8stypes.NodeName { // ExternalID returns the cloud provider ID of the node with the specified Name (deprecated). func (vs *VSphere) ExternalID(nodeName k8stypes.NodeName) (string, error) { - if vs.localInstanceID == nodeNameToVMName(nodeName) { - return vs.cfg.Global.WorkingDir + vs.localInstanceID, nil - } - - // Create context - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - vm, mvm, err := vs.getVMandMO(ctx, nodeName, "summary") - if err != nil { - glog.Errorf("Failed to getVMandMO for ExternalID: err %v", err) - return "", err - } - - if mvm.Summary.Runtime.PowerState == ActivePowerState { - return vm.InventoryPath, nil - } - - if mvm.Summary.Config.Template == false { - glog.Warningf("VM %s, is not in %s state", nodeName, ActivePowerState) - } else { - glog.Warningf("VM %s, is a template", nodeName) - } - - return "", cloudprovider.InstanceNotFound + return vs.InstanceID(nodeName) } // InstanceID returns the cloud provider ID of the node with the specified Name. func (vs *VSphere) InstanceID(nodeName k8stypes.NodeName) (string, error) { if vs.localInstanceID == nodeNameToVMName(nodeName) { - return vs.cfg.Global.WorkingDir + vs.localInstanceID, nil + return vs.cfg.Global.WorkingDir + "/" + vs.localInstanceID, nil } - // Create context ctx, cancel := context.WithCancel(context.Background()) defer cancel() - - vm, mvm, err := vs.getVMandMO(ctx, nodeName, "summary") + // Ensure client is logged in and session is valid + err := vs.conn.Connect(ctx) if err != nil { - glog.Errorf("Failed to getVMandMO for InstanceID: err %v", err) return "", err } - - if mvm.Summary.Runtime.PowerState == ActivePowerState { + vm, err := vs.getVMByName(ctx, nodeName) + if err != nil { + glog.Errorf("Failed to get VM object for node: %q. err: +%v", nodeNameToVMName(nodeName), err) + return "", err + } + nodeExist, err := vm.Exists(ctx) + if err != nil { + glog.Errorf("Failed to check whether node %q exist. err: %+v.", nodeNameToVMName(nodeName), err) + return "", err + } + if nodeExist { return "/" + vm.InventoryPath, nil } - - if mvm.Summary.Config.Template == false { - glog.Warningf("VM %s, is not in %s state", nodeName, ActivePowerState) - } else { - glog.Warningf("VM %s, is a template", nodeName) - } - return "", cloudprovider.InstanceNotFound } @@ -688,7 +433,6 @@ func (vs *VSphere) LoadBalancer() (cloudprovider.LoadBalancer, bool) { // Zones returns an implementation of Zones for Google vSphere. func (vs *VSphere) Zones() (cloudprovider.Zones, bool) { glog.V(1).Info("The vSphere cloud provider does not support zones") - return nil, false } @@ -702,308 +446,73 @@ func (vs *VSphere) ScrubDNS(nameservers, searches []string) (nsOut, srchOut []st return nameservers, searches } -// Returns vSphere objects virtual machine, virtual device list, datastore and datacenter. -func getVirtualMachineDevices(ctx context.Context, cfg *VSphereConfig, c *govmomi.Client, name string) (*object.VirtualMachine, object.VirtualDeviceList, *object.Datacenter, error) { - // Create a new finder - f := find.NewFinder(c.Client, true) - - // Fetch and set data center - dc, err := f.Datacenter(ctx, cfg.Global.Datacenter) - if err != nil { - return nil, nil, nil, err - } - f.SetDatacenter(dc) - - vmRegex := cfg.Global.WorkingDir + name - - vm, err := f.VirtualMachine(ctx, vmRegex) - if err != nil { - return nil, nil, nil, err - } - - // Get devices from VM - vmDevices, err := vm.Device(ctx) - if err != nil { - return nil, nil, nil, err - } - return vm, vmDevices, dc, nil -} - -// Removes SCSI controller which is latest attached to VM. -func cleanUpController(ctx context.Context, newSCSIController types.BaseVirtualDevice, vmDevices object.VirtualDeviceList, vm *object.VirtualMachine) error { - if newSCSIController == nil || vmDevices == nil || vm == nil { - return nil - } - ctls := vmDevices.SelectByType(newSCSIController) - if len(ctls) < 1 { - return ErrNoDevicesFound - } - newScsi := ctls[len(ctls)-1] - err := vm.RemoveDevice(ctx, true, newScsi) - if err != nil { - return err - } - return nil -} - -// Attaches given virtual disk volume to the compute running kubelet. -func (vs *VSphere) AttachDisk(vmDiskPath string, storagePolicyID string, nodeName k8stypes.NodeName) (diskID string, diskUUID string, err error) { - attachDiskInternal := func(vmDiskPath string, storagePolicyID string, nodeName k8stypes.NodeName) (diskID string, diskUUID string, err error) { - var newSCSIController types.BaseVirtualDevice - +// AttachDisk attaches given virtual disk volume to the compute running kubelet. +func (vs *VSphere) AttachDisk(vmDiskPath string, storagePolicyID string, nodeName k8stypes.NodeName) (diskUUID string, err error) { + attachDiskInternal := func(vmDiskPath string, storagePolicyID string, nodeName k8stypes.NodeName) (diskUUID string, err error) { + if nodeName == "" { + nodeName = vmNameToNodeName(vs.localInstanceID) + } // Create context ctx, cancel := context.WithCancel(context.Background()) defer cancel() - // Ensure client is logged in and session is valid - err = vSphereLogin(ctx, vs) + err = vs.conn.Connect(ctx) if err != nil { - glog.Errorf("Failed to login into vCenter - %v", err) - return "", "", err + return "", err } - - // Find virtual machine to attach disk to - var vSphereInstance string - if nodeName == "" { - vSphereInstance = vs.localInstanceID - nodeName = vmNameToNodeName(vSphereInstance) - } else { - vSphereInstance = nodeNameToVMName(nodeName) - } - - // Get VM device list - vm, vmDevices, dc, err := getVirtualMachineDevices(ctx, vs.cfg, vs.client, vSphereInstance) + vm, err := vs.getVMByName(ctx, nodeName) if err != nil { - return "", "", err + glog.Errorf("Failed to get VM object for node: %q. err: +%v", nodeNameToVMName(nodeName), err) + return "", err } - - attached, err := checkDiskAttached(vmDiskPath, vmDevices, dc, vs.client) + diskUUID, err = vm.AttachDisk(ctx, vmDiskPath, &vclib.VolumeOptions{SCSIControllerType: vclib.PVSCSIControllerType, StoragePolicyID: storagePolicyID}) if err != nil { - return "", "", err + glog.Errorf("Failed to attach disk: %s for node: %s. err: +%v", vmDiskPath, nodeNameToVMName(nodeName), err) + return "", err } - if attached { - diskID, _ = getVirtualDiskID(vmDiskPath, vmDevices, dc, vs.client) - diskUUID, _ = getVirtualDiskUUIDByPath(vmDiskPath, dc, vs.client) - return diskID, diskUUID, nil - } - - var diskControllerType = vs.cfg.Disk.SCSIControllerType - // find SCSI controller of particular type from VM devices - scsiControllersOfRequiredType := getSCSIControllersOfType(vmDevices, diskControllerType) - scsiController := getAvailableSCSIController(scsiControllersOfRequiredType) - newSCSICreated := false - if scsiController == nil { - newSCSIController, err = createAndAttachSCSIControllerToVM(ctx, vm, diskControllerType) - if err != nil { - glog.Errorf("Failed to create SCSI controller for VM :%q with err: %+v", vm.Name(), err) - return "", "", err - } - - // Get VM device list - _, vmDevices, _, err := getVirtualMachineDevices(ctx, vs.cfg, vs.client, vSphereInstance) - if err != nil { - glog.Errorf("cannot get vmDevices for VM err=%s", err) - return "", "", fmt.Errorf("cannot get vmDevices for VM err=%s", err) - } - - scsiControllersOfRequiredType := getSCSIControllersOfType(vmDevices, diskControllerType) - scsiController := getAvailableSCSIController(scsiControllersOfRequiredType) - if scsiController == nil { - glog.Errorf("cannot find SCSI controller in VM") - // attempt clean up of scsi controller - cleanUpController(ctx, newSCSIController, vmDevices, vm) - return "", "", fmt.Errorf("cannot find SCSI controller in VM") - } - newSCSICreated = true - } - - // Create a new finder - f := find.NewFinder(vs.client.Client, true) - // Set data center - f.SetDatacenter(dc) - - datastorePathObj := new(object.DatastorePath) - isSuccess := datastorePathObj.FromString(vmDiskPath) - if !isSuccess { - glog.Errorf("Failed to parse vmDiskPath: %+q", vmDiskPath) - return "", "", errors.New("Failed to parse vmDiskPath") - } - ds, err := f.Datastore(ctx, datastorePathObj.Datastore) - if err != nil { - glog.Errorf("Failed while searching for datastore %+q. err %s", datastorePathObj.Datastore, err) - return "", "", err - } - vmDiskPath = removeClusterFromVDiskPath(vmDiskPath) - disk := vmDevices.CreateDisk(scsiController, ds.Reference(), vmDiskPath) - unitNumber, err := getNextUnitNumber(vmDevices, scsiController) - if err != nil { - glog.Errorf("cannot attach disk to VM, limit reached - %v.", err) - return "", "", err - } - *disk.UnitNumber = unitNumber - - backing := disk.Backing.(*types.VirtualDiskFlatVer2BackingInfo) - backing.DiskMode = string(types.VirtualDiskModeIndependent_persistent) - - virtualMachineConfigSpec := types.VirtualMachineConfigSpec{} - deviceConfigSpec := &types.VirtualDeviceConfigSpec{ - Device: disk, - Operation: types.VirtualDeviceConfigSpecOperationAdd, - } - // Configure the disk with the SPBM profile only if ProfileID is not empty. - if storagePolicyID != "" { - profileSpec := &types.VirtualMachineDefinedProfileSpec{ - ProfileId: storagePolicyID, - } - deviceConfigSpec.Profile = append(deviceConfigSpec.Profile, profileSpec) - } - virtualMachineConfigSpec.DeviceChange = append(virtualMachineConfigSpec.DeviceChange, deviceConfigSpec) - requestTime := time.Now() - task, err := vm.Reconfigure(ctx, virtualMachineConfigSpec) - if err != nil { - recordvSphereMetric(api_attachvolume, requestTime, err) - glog.Errorf("Failed to attach the disk with storagePolicy: %+q with err - %v", storagePolicyID, err) - if newSCSICreated { - cleanUpController(ctx, newSCSIController, vmDevices, vm) - } - return "", "", err - } - err = task.Wait(ctx) - recordvSphereMetric(api_attachvolume, requestTime, err) - if err != nil { - glog.Errorf("Failed to attach the disk with storagePolicy: %+q with err - %v", storagePolicyID, err) - if newSCSICreated { - cleanUpController(ctx, newSCSIController, vmDevices, vm) - } - return "", "", err - } - - deviceName, diskUUID, err := getVMDiskInfo(ctx, vm, disk) - if err != nil { - if newSCSICreated { - cleanUpController(ctx, newSCSIController, vmDevices, vm) - } - vs.DetachDisk(deviceName, nodeName) - return "", "", err - } - return deviceName, diskUUID, nil + return diskUUID, nil } requestTime := time.Now() - diskID, diskUUID, err = attachDiskInternal(vmDiskPath, storagePolicyID, nodeName) - recordvSphereMetric(operation_attachvolume, requestTime, err) - return diskID, diskUUID, err + diskUUID, err = attachDiskInternal(vmDiskPath, storagePolicyID, nodeName) + vclib.RecordvSphereMetric(vclib.OperationAttachVolume, requestTime, err) + return diskUUID, err } -func getVMDiskInfo(ctx context.Context, vm *object.VirtualMachine, disk *types.VirtualDisk) (string, string, error) { - vmDevices, err := vm.Device(ctx) - if err != nil { - return "", "", err - } - devices := vmDevices.SelectByType(disk) - if len(devices) < 1 { - return "", "", ErrNoDevicesFound - } - - // get new disk id - newDevice := devices[len(devices)-1] - deviceName := devices.Name(newDevice) - - // get device uuid - diskUUID, err := getVirtualDiskUUID(newDevice) - if err != nil { - return "", "", err - } - - return deviceName, diskUUID, nil -} -func getNextUnitNumber(devices object.VirtualDeviceList, c types.BaseVirtualController) (int32, error) { - // get next available SCSI controller unit number - var takenUnitNumbers [SCSIDeviceSlots]bool - takenUnitNumbers[SCSIReservedSlot] = true - key := c.GetVirtualController().Key - - for _, device := range devices { - d := device.GetVirtualDevice() - if d.ControllerKey == key { - if d.UnitNumber != nil { - takenUnitNumbers[*d.UnitNumber] = true - } +// DetachDisk detaches given virtual disk volume from the compute running kubelet. +func (vs *VSphere) DetachDisk(volPath string, nodeName k8stypes.NodeName) error { + detachDiskInternal := func(volPath string, nodeName k8stypes.NodeName) error { + if nodeName == "" { + nodeName = vmNameToNodeName(vs.localInstanceID) } - } - for unitNumber, takenUnitNumber := range takenUnitNumbers { - if !takenUnitNumber { - return int32(unitNumber), nil + // Create context + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + // Ensure client is logged in and session is valid + err := vs.conn.Connect(ctx) + if err != nil { + return err } - } - return -1, fmt.Errorf("SCSI Controller with key=%d does not have any available slots (LUN).", key) -} - -func getSCSIController(vmDevices object.VirtualDeviceList, scsiType string) *types.VirtualController { - // get virtual scsi controller of passed argument type - for _, device := range vmDevices { - devType := vmDevices.Type(device) - if devType == scsiType { - if c, ok := device.(types.BaseVirtualController); ok { - return c.GetVirtualController() - } + vm, err := vs.getVMByName(ctx, nodeName) + if err != nil { + glog.Errorf("Failed to get VM object for node: %q. err: +%v", nodeNameToVMName(nodeName), err) + return err } - } - return nil -} - -func getSCSIControllersOfType(vmDevices object.VirtualDeviceList, scsiType string) []*types.VirtualController { - // get virtual scsi controllers of passed argument type - var scsiControllers []*types.VirtualController - for _, device := range vmDevices { - devType := vmDevices.Type(device) - if devType == scsiType { - if c, ok := device.(types.BaseVirtualController); ok { - scsiControllers = append(scsiControllers, c.GetVirtualController()) - } + err = vm.DetachDisk(ctx, volPath) + if err != nil { + glog.Errorf("Failed to detach disk: %s for node: %s. err: +%v", volPath, nodeNameToVMName(nodeName), err) + return err } + return nil } - return scsiControllers -} - -func getSCSIControllers(vmDevices object.VirtualDeviceList) []*types.VirtualController { - // get all virtual scsi controllers - var scsiControllers []*types.VirtualController - for _, device := range vmDevices { - devType := vmDevices.Type(device) - switch devType { - case SCSIControllerType, strings.ToLower(LSILogicControllerType), strings.ToLower(BusLogicControllerType), PVSCSIControllerType, strings.ToLower(LSILogicSASControllerType): - if c, ok := device.(types.BaseVirtualController); ok { - scsiControllers = append(scsiControllers, c.GetVirtualController()) - } - } - } - return scsiControllers -} - -func getAvailableSCSIController(scsiControllers []*types.VirtualController) *types.VirtualController { - // get SCSI controller which has space for adding more devices - for _, controller := range scsiControllers { - if len(controller.Device) < SCSIControllerDeviceLimit { - return controller - } - } - return nil + requestTime := time.Now() + err := detachDiskInternal(volPath, nodeName) + vclib.RecordvSphereMetric(vclib.OperationDetachVolume, requestTime, nil) + return err } // DiskIsAttached returns if disk is attached to the VM using controllers supported by the plugin. func (vs *VSphere) DiskIsAttached(volPath string, nodeName k8stypes.NodeName) (bool, error) { diskIsAttachedInternal := func(volPath string, nodeName k8stypes.NodeName) (bool, error) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // Ensure client is logged in and session is valid - err := vSphereLogin(ctx, vs) - if err != nil { - glog.Errorf("Failed to login into vCenter - %v", err) - return false, err - } - - // Find VM to detach disk from var vSphereInstance string if nodeName == "" { vSphereInstance = vs.localInstanceID @@ -1011,52 +520,53 @@ func (vs *VSphere) DiskIsAttached(volPath string, nodeName k8stypes.NodeName) (b } else { vSphereInstance = nodeNameToVMName(nodeName) } - - nodeExist, err := vs.NodeExists(nodeName) + // Create context + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + // Ensure client is logged in and session is valid + err := vs.conn.Connect(ctx) if err != nil { - glog.Errorf("Failed to check whether node exist. err: %s.", err) return false, err } - + vm, err := vs.getVMByName(ctx, nodeName) + if err != nil { + glog.Errorf("Failed to get VM object for node: %q. err: +%v", vSphereInstance, err) + return false, err + } + nodeExist, err := vm.Exists(ctx) + if err != nil { + glog.Errorf("Failed to check whether node %q exist. err: %+v", vSphereInstance, err) + return false, err + } if !nodeExist { - glog.Errorf("DiskIsAttached failed to determine whether disk %q is still attached: node %q does not exist", + glog.Errorf("DiskIsAttached failed to determine whether disk %q is still attached: node %q is powered off", volPath, vSphereInstance) - return false, fmt.Errorf("DiskIsAttached failed to determine whether disk %q is still attached: node %q does not exist", + return false, fmt.Errorf("DiskIsAttached failed to determine whether disk %q is still attached: node %q is powered off", volPath, vSphereInstance) } - - // Get VM device list - _, vmDevices, dc, err := getVirtualMachineDevices(ctx, vs.cfg, vs.client, vSphereInstance) + attached, err := vm.IsDiskAttached(ctx, volPath) if err != nil { - glog.Errorf("Failed to get VM devices for VM %#q. err: %s", vSphereInstance, err) - return false, err + glog.Errorf("DiskIsAttached failed to determine whether disk %q is still attached on node %q", + volPath, + vSphereInstance) } - - attached, err := checkDiskAttached(volPath, vmDevices, dc, vs.client) return attached, err } requestTime := time.Now() isAttached, err := diskIsAttachedInternal(volPath, nodeName) - recordvSphereMetric(operation_diskIsAttached, requestTime, err) + vclib.RecordvSphereMetric(vclib.OperationDiskIsAttached, requestTime, err) return isAttached, err } // DisksAreAttached returns if disks are attached to the VM using controllers supported by the plugin. func (vs *VSphere) DisksAreAttached(volPaths []string, nodeName k8stypes.NodeName) (map[string]bool, error) { disksAreAttachedInternal := func(volPaths []string, nodeName k8stypes.NodeName) (map[string]bool, error) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // Create vSphere client - err := vSphereLogin(ctx, vs) - if err != nil { - glog.Errorf("Failed to login into vCenter, err: %v", err) - return nil, err + attached := make(map[string]bool) + if len(volPaths) == 0 { + return attached, nil } - - // Find VM to detach disk from var vSphereInstance string if nodeName == "" { vSphereInstance = vs.localInstanceID @@ -1064,14 +574,24 @@ func (vs *VSphere) DisksAreAttached(volPaths []string, nodeName k8stypes.NodeNam } else { vSphereInstance = nodeNameToVMName(nodeName) } - - nodeExist, err := vs.NodeExists(nodeName) - + // Create context + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + // Ensure client is logged in and session is valid + err := vs.conn.Connect(ctx) if err != nil { - glog.Errorf("Failed to check whether node exist. err: %s.", err) return nil, err } - + vm, err := vs.getVMByName(ctx, nodeName) + if err != nil { + glog.Errorf("Failed to get VM object for node: %q. err: +%v", vSphereInstance, err) + return nil, err + } + nodeExist, err := vm.Exists(ctx) + if err != nil { + glog.Errorf("Failed to check whether node %q exist. err: %+v", vSphereInstance, err) + return nil, err + } if !nodeExist { glog.Errorf("DisksAreAttached failed to determine whether disks %v are still attached: node %q does not exist", volPaths, @@ -1080,17 +600,8 @@ func (vs *VSphere) DisksAreAttached(volPaths []string, nodeName k8stypes.NodeNam volPaths, vSphereInstance) } - - // Get VM device list - _, vmDevices, dc, err := getVirtualMachineDevices(ctx, vs.cfg, vs.client, vSphereInstance) - if err != nil { - glog.Errorf("Failed to get VM devices for VM %#q. err: %s", vSphereInstance, err) - return nil, err - } - - attached := make(map[string]bool) for _, volPath := range volPaths { - result, err := checkDiskAttached(volPath, vmDevices, dc, vs.client) + result, err := vm.IsDiskAttached(ctx, volPath) if err == nil { if result { attached[volPath] = true @@ -1098,6 +609,10 @@ func (vs *VSphere) DisksAreAttached(volPaths []string, nodeName k8stypes.NodeNam attached[volPath] = false } } else { + glog.Errorf("DisksAreAttached failed to determine whether disk %q from volPaths %+v is still attached on node %q", + volPath, + volPaths, + vSphereInstance) return nil, err } } @@ -1105,829 +620,135 @@ func (vs *VSphere) DisksAreAttached(volPaths []string, nodeName k8stypes.NodeNam } requestTime := time.Now() attached, err := disksAreAttachedInternal(volPaths, nodeName) - recordvSphereMetric(operation_disksAreAttached, requestTime, err) + vclib.RecordvSphereMetric(vclib.OperationDisksAreAttached, requestTime, err) return attached, err } -func checkDiskAttached(volPath string, vmdevices object.VirtualDeviceList, dc *object.Datacenter, client *govmomi.Client) (bool, error) { - _, err := getVirtualDiskControllerKey(volPath, vmdevices, dc, client) - if err != nil { - if err == ErrNoDevicesFound { - return false, nil - } - glog.Errorf("Failed to check whether disk is attached. err: %s", err) - return false, err - } - return true, nil -} - -// Returns the object key that denotes the controller object to which vmdk is attached. -func getVirtualDiskControllerKey(volPath string, vmDevices object.VirtualDeviceList, dc *object.Datacenter, client *govmomi.Client) (int32, error) { - volPath = removeClusterFromVDiskPath(volPath) - volumeUUID, err := getVirtualDiskUUIDByPath(volPath, dc, client) - - if err != nil { - glog.Errorf("disk uuid not found for %v. err: %s", volPath, err) - return -1, err - } - - // filter vm devices to retrieve disk ID for the given vmdk file - for _, device := range vmDevices { - if vmDevices.TypeName(device) == "VirtualDisk" { - diskUUID, _ := getVirtualDiskUUID(device) - if diskUUID == volumeUUID { - return device.GetVirtualDevice().ControllerKey, nil - } - } - } - return -1, ErrNoDevicesFound -} - -// Returns key of the controller. -// Key is unique id that distinguishes one device from other devices in the same virtual machine. -func getControllerKey(scsiType string, vmDevices object.VirtualDeviceList) (int32, error) { - for _, device := range vmDevices { - devType := vmDevices.Type(device) - if devType == scsiType { - if c, ok := device.(types.BaseVirtualController); ok { - return c.GetVirtualController().Key, nil - } - } - } - return -1, ErrNoDevicesFound -} - -// Returns formatted UUID for a virtual disk device. -func getVirtualDiskUUID(newDevice types.BaseVirtualDevice) (string, error) { - vd := newDevice.GetVirtualDevice() - - if b, ok := vd.Backing.(*types.VirtualDiskFlatVer2BackingInfo); ok { - uuid := formatVirtualDiskUUID(b.Uuid) - return uuid, nil - } - return "", ErrNoDiskUUIDFound -} - -func formatVirtualDiskUUID(uuid string) string { - uuidwithNoSpace := strings.Replace(uuid, " ", "", -1) - uuidWithNoHypens := strings.Replace(uuidwithNoSpace, "-", "", -1) - return strings.ToLower(uuidWithNoHypens) -} - -// Gets virtual disk UUID by datastore (namespace) path -// -// volPath can be namespace path (e.g. "[vsanDatastore] volumes/test.vmdk") or -// uuid path (e.g. "[vsanDatastore] 59427457-6c5a-a917-7997-0200103eedbc/test.vmdk"). -// `volumes` in this case would be a symlink to -// `59427457-6c5a-a917-7997-0200103eedbc`. -// -// We want users to use namespace path. It is good for attaching the disk, -// but for detaching the API requires uuid path. Hence, to detach the right -// device we have to convert the namespace path to uuid path. -func getVirtualDiskUUIDByPath(volPath string, dc *object.Datacenter, client *govmomi.Client) (string, error) { - if len(volPath) > 0 && filepath.Ext(volPath) != ".vmdk" { - volPath += ".vmdk" - } - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // VirtualDiskManager provides a way to manage and manipulate virtual disks on vmware datastores. - vdm := object.NewVirtualDiskManager(client.Client) - // Returns uuid of vmdk virtual disk - diskUUID, err := vdm.QueryVirtualDiskUuid(ctx, volPath, dc) - - if err != nil { - return "", ErrNoDiskUUIDFound - } - - diskUUID = formatVirtualDiskUUID(diskUUID) - - return diskUUID, nil -} - -// Returns a device id which is internal vSphere API identifier for the attached virtual disk. -func getVirtualDiskID(volPath string, vmDevices object.VirtualDeviceList, dc *object.Datacenter, client *govmomi.Client) (string, error) { - volumeUUID, err := getVirtualDiskUUIDByPath(volPath, dc, client) - - if err != nil { - glog.Warningf("disk uuid not found for %v ", volPath) - return "", err - } - - // filter vm devices to retrieve disk ID for the given vmdk file - for _, device := range vmDevices { - if vmDevices.TypeName(device) == "VirtualDisk" { - diskUUID, _ := getVirtualDiskUUID(device) - if diskUUID == volumeUUID { - return vmDevices.Name(device), nil - } - } - } - return "", ErrNoDiskIDFound -} - -// DetachDisk detaches given virtual disk volume from the compute running kubelet. -func (vs *VSphere) DetachDisk(volPath string, nodeName k8stypes.NodeName) error { - detachDiskInternal := func(volPath string, nodeName k8stypes.NodeName) error { - // Create context - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // Ensure client is logged in and session is valid - err := vSphereLogin(ctx, vs) - if err != nil { - glog.Errorf("Failed to login into vCenter - %v", err) - return err - } - - // Find virtual machine to attach disk to - var vSphereInstance string - if nodeName == "" { - vSphereInstance = vs.localInstanceID - nodeName = vmNameToNodeName(vSphereInstance) - } else { - vSphereInstance = nodeNameToVMName(nodeName) - } - - vm, vmDevices, dc, err := getVirtualMachineDevices(ctx, vs.cfg, vs.client, vSphereInstance) - - if err != nil { - return err - } - volPath = removeClusterFromVDiskPath(volPath) - diskID, err := getVirtualDiskID(volPath, vmDevices, dc, vs.client) - if err != nil { - glog.Warningf("disk ID not found for %v ", volPath) - return err - } - - // Gets virtual disk device - device := vmDevices.Find(diskID) - if device == nil { - return fmt.Errorf("device '%s' not found", diskID) - } - - // Detach disk from VM - requestTime := time.Now() - err = vm.RemoveDevice(ctx, true, device) - recordvSphereMetric(api_detachvolume, requestTime, err) - if err != nil { - return err - } - return nil - } - requestTime := time.Now() - err := detachDiskInternal(volPath, nodeName) - recordvSphereMetric(operation_detachvolume, requestTime, nil) - return err -} - -// CreateVolume creates a volume of given size (in KiB). -func (vs *VSphere) CreateVolume(volumeOptions *VolumeOptions) (volumePath string, err error) { - createVolumeInternal := func(volumeOptions *VolumeOptions) (volumePath string, err error) { +// CreateVolume creates a volume of given size (in KiB) and return the volume path. +// If the volumeOptions.Datastore is part of datastore cluster for example - [DatastoreCluster/sharedVmfs-0] then +// return value will be [DatastoreCluster/sharedVmfs-0] kubevols/.vmdk +// else return value will be [sharedVmfs-0] kubevols/.vmdk +func (vs *VSphere) CreateVolume(volumeOptions *vclib.VolumeOptions) (volumePath string, err error) { + glog.V(1).Infof("Starting to create a vSphere volume with volumeOptions: %+v", volumeOptions) + createVolumeInternal := func(volumeOptions *vclib.VolumeOptions) (volumePath string, err error) { var datastore string - var destVolPath string - - // Default datastore is the datastore in the vSphere config file that is used initialize vSphere cloud provider. + // Default datastore is the datastore in the vSphere config file that is used to initialize vSphere cloud provider. if volumeOptions.Datastore == "" { datastore = vs.cfg.Global.Datastore } else { datastore = volumeOptions.Datastore } - - // Default diskformat as 'thin' - if volumeOptions.DiskFormat == "" { - volumeOptions.DiskFormat = ThinDiskType - } - - if _, ok := diskFormatValidType[volumeOptions.DiskFormat]; !ok { - return "", fmt.Errorf("Cannot create disk. Error diskformat %+q."+ - " Valid options are %s.", volumeOptions.DiskFormat, DiskformatValidOptions) - } - // Create context ctx, cancel := context.WithCancel(context.Background()) defer cancel() - // Ensure client is logged in and session is valid - err = vSphereLogin(ctx, vs) + err = vs.conn.Connect(ctx) if err != nil { - glog.Errorf("Failed to login into vCenter - %v", err) return "", err } - - // Create a new finder - f := find.NewFinder(vs.client.Client, true) - - // Fetch and set data center - dc, err := f.Datacenter(ctx, vs.cfg.Global.Datacenter) - f.SetDatacenter(dc) - - if volumeOptions.StoragePolicyName != "" { - // Get the pbm client - pbmClient, err := pbm.NewClient(ctx, vs.client.Client) - if err != nil { - return "", err - } - volumeOptions.StoragePolicyID, err = pbmClient.ProfileIDByName(ctx, volumeOptions.StoragePolicyName) - if err != nil { - recordvSphereMetric(operation_createvolume_with_policy, time.Time{}, err) - return "", err - } - - compatibilityResult, err := vs.GetPlacementCompatibilityResult(ctx, pbmClient, volumeOptions.StoragePolicyID) - if err != nil { - return "", err - } - if len(compatibilityResult) < 1 { - return "", fmt.Errorf("There are no compatible datastores that satisfy the storage policy: %+q requirements", volumeOptions.StoragePolicyID) - } - - if volumeOptions.Datastore != "" { - ok, nonCompatibleDsref := vs.IsUserSpecifiedDatastoreNonCompatible(ctx, compatibilityResult, volumeOptions.Datastore) - if ok { - faultMsg := GetNonCompatibleDatastoreFaultMsg(compatibilityResult, *nonCompatibleDsref) - return "", fmt.Errorf("User specified datastore: %q is not compatible with the storagePolicy: %q. Failed with faults: %+q", volumeOptions.Datastore, volumeOptions.StoragePolicyName, faultMsg) - } - } else { - dsMoList, err := vs.GetCompatibleDatastoresMo(ctx, compatibilityResult) - if err != nil { - recordvSphereMetric(operation_createvolume_with_raw_vsan_policy, time.Time{}, err) - return "", err - } - dsMo := GetMostFreeDatastore(dsMoList) - datastore = dsMo.Info.GetDatastoreInfo().Name - } - } - ds, err := f.Datastore(ctx, datastore) + dc, err := vclib.GetDatacenter(ctx, vs.conn, vs.cfg.Global.Datacenter) if err != nil { - glog.Errorf("Failed while searching for datastore %+q. err %s", datastore, err) return "", err } - - if volumeOptions.VSANStorageProfileData != "" { - // Check if the datastore is VSAN if any capability requirements are specified. - // VSphere cloud provider now only supports VSAN capabilities requirements - ok, err := checkIfDatastoreTypeIsVSAN(vs.client, ds) - if err != nil { - return "", fmt.Errorf("Failed while determining whether the datastore: %q"+ - " is VSAN or not.", datastore) - } - if !ok { - return "", fmt.Errorf("The specified datastore: %q is not a VSAN datastore."+ - " The policy parameters will work only with VSAN Datastore."+ - " So, please specify a valid VSAN datastore in Storage class definition.", datastore) - } - } - // Create a disk with the VSAN storage capabilities specified in the volumeOptions.VSANStorageProfileData. - // This is achieved by following steps: - // 1. Create dummy VM if not already present. - // 2. Add a new disk to the VM by performing VM reconfigure. - // 3. Detach the new disk from the dummy VM. - // 4. Delete the dummy VM. + var vmOptions *vclib.VMOptions if volumeOptions.VSANStorageProfileData != "" || volumeOptions.StoragePolicyName != "" { // Acquire a read lock to ensure multiple PVC requests can be processed simultaneously. cleanUpDummyVMLock.RLock() defer cleanUpDummyVMLock.RUnlock() - // Create a new background routine that will delete any dummy VM's that are left stale. // This routine will get executed for every 5 minutes and gets initiated only once in its entire lifetime. cleanUpRoutineInitLock.Lock() if !cleanUpRoutineInitialized { + glog.V(1).Infof("Starting a clean up routine to remove stale dummy VM's") go vs.cleanUpDummyVMs(DummyVMPrefixName) cleanUpRoutineInitialized = true } cleanUpRoutineInitLock.Unlock() - - // Check if the VM exists in kubernetes cluster folder. - // The kubernetes cluster folder - vs.cfg.Global.WorkingDir is where all the nodes in the kubernetes cluster are created. - dummyVMFullName := DummyVMPrefixName + "-" + volumeOptions.Name - vmRegex := vs.cfg.Global.WorkingDir + dummyVMFullName - dummyVM, err := f.VirtualMachine(ctx, vmRegex) + vmOptions, err = vs.setVMOptions(ctx, dc) if err != nil { - // 1. Create a dummy VM and return the VM reference. - dummyVM, err = vs.createDummyVM(ctx, dc, ds, dummyVMFullName) - if err != nil { - return "", err - } - } - - // 2. Reconfigure the VM to attach the disk with the VSAN policy configured. - vmDiskPath, err := vs.createVirtualDiskWithPolicy(ctx, dc, ds, dummyVM, volumeOptions) - fileAlreadyExist := false - if err != nil { - vmDiskPath = filepath.Clean(ds.Path(VolDir)) + "/" + volumeOptions.Name + ".vmdk" - errorMessage := fmt.Sprintf("Cannot complete the operation because the file or folder %s already exists", vmDiskPath) - if errorMessage == err.Error() { - //Skip error and continue to detach the disk as the disk was already created on the datastore. - fileAlreadyExist = true - glog.V(1).Infof("File: %v already exists", vmDiskPath) - } else { - glog.Errorf("Failed to attach the disk to VM: %q with err: %+v", dummyVMFullName, err) - return "", err - } - } - - dummyVMNodeName := vmNameToNodeName(dummyVMFullName) - // 3. Detach the disk from the dummy VM. - err = vs.DetachDisk(vmDiskPath, dummyVMNodeName) - if err != nil { - if DiskNotFoundErrMsg == err.Error() && fileAlreadyExist { - // Skip error if disk was already detached from the dummy VM but still present on the datastore. - glog.V(1).Infof("File: %v is already detached", vmDiskPath) - } else { - glog.Errorf("Failed to detach the disk: %q from VM: %q with err: %+v", vmDiskPath, dummyVMFullName, err) - return "", fmt.Errorf("Failed to create the volume: %q with err: %+v", volumeOptions.Name, err) - } - } - - // 4. Delete the dummy VM - err = deleteVM(ctx, dummyVM) - if err != nil { - return "", fmt.Errorf("Failed to destroy the vm: %q with err: %+v", dummyVMFullName, err) - } - destVolPath = vmDiskPath - } else { - // Create a virtual disk directly if no VSAN storage capabilities are specified by the user. - destVolPath, err = createVirtualDisk(ctx, vs.client, dc, ds, volumeOptions) - if err != nil { - return "", fmt.Errorf("Failed to create the virtual disk having name: %+q with err: %+v", destVolPath, err) + glog.Errorf("Failed to set VM options requires to create a vsphere volume. err: %+v", err) + return "", err } } - + if volumeOptions.StoragePolicyName != "" && volumeOptions.Datastore == "" { + datastore, err = getPbmCompatibleDatastore(ctx, dc.Client(), volumeOptions.StoragePolicyName, vmOptions.VMFolder) + if err != nil { + glog.Errorf("Failed to get pbm compatible datastore with storagePolicy: %s. err: %+v", volumeOptions.StoragePolicyName, err) + return "", err + } + } + ds, err := dc.GetDatastoreByName(ctx, datastore) + if err != nil { + return "", err + } + volumeOptions.Datastore = datastore + kubeVolsPath := filepath.Clean(ds.Path(VolDir)) + "/" + err = ds.CreateDirectory(ctx, kubeVolsPath, false) + if err != nil && err != vclib.ErrFileAlreadyExist { + glog.Errorf("Cannot create dir %#v. err %s", kubeVolsPath, err) + return "", err + } + volumePath = kubeVolsPath + volumeOptions.Name + ".vmdk" + disk := diskmanagers.VirtualDisk{ + DiskPath: volumePath, + VolumeOptions: volumeOptions, + VMOptions: vmOptions, + } + err = disk.Create(ctx, ds) + if err != nil { + glog.Errorf("Failed to create a vsphere volume with volumeOptions: %+v on datastore: %s. err: %+v", volumeOptions, datastore, err) + return "", err + } if filepath.Base(datastore) != datastore { - // If Datastore is within cluster, add cluster path to the destVolPath - destVolPath = strings.Replace(destVolPath, filepath.Base(datastore), datastore, 1) + // If datastore is within cluster, add cluster path to the volumePath + volumePath = strings.Replace(volumePath, filepath.Base(datastore), datastore, 1) } - glog.V(1).Infof("VM Disk path is %+q", destVolPath) - return destVolPath, nil + return volumePath, nil } requestTime := time.Now() volumePath, err = createVolumeInternal(volumeOptions) - recordCreateVolumeMetric(volumeOptions, requestTime, err) - if err != nil { - return "", err - } - return volumePath, nil + vclib.RecordCreateVolumeMetric(volumeOptions, requestTime, err) + return volumePath, err } // DeleteVolume deletes a volume given volume name. -// Also, deletes the folder where the volume resides. func (vs *VSphere) DeleteVolume(vmDiskPath string) error { + glog.V(1).Infof("Starting to delete vSphere volume with vmDiskPath: %s", vmDiskPath) deleteVolumeInternal := func(vmDiskPath string) error { // Create context ctx, cancel := context.WithCancel(context.Background()) defer cancel() - // Ensure client is logged in and session is valid - err := vSphereLogin(ctx, vs) + err := vs.conn.Connect(ctx) if err != nil { - glog.Errorf("Failed to login into vCenter - %v", err) return err } - - // Create a new finder - f := find.NewFinder(vs.client.Client, true) - - // Fetch and set data center - dc, err := f.Datacenter(ctx, vs.cfg.Global.Datacenter) - f.SetDatacenter(dc) - - // Create a virtual disk manager - virtualDiskManager := object.NewVirtualDiskManager(vs.client.Client) - - if filepath.Ext(vmDiskPath) != ".vmdk" { - vmDiskPath += ".vmdk" - } - - // Get the vmDisk Name - diskNameWithExt := path.Base(vmDiskPath) - diskName := strings.TrimSuffix(diskNameWithExt, filepath.Ext(diskNameWithExt)) - - // Search for the dummyVM if present and delete it. - dummyVMFullName := DummyVMPrefixName + "-" + diskName - vmRegex := vs.cfg.Global.WorkingDir + dummyVMFullName - dummyVM, err := f.VirtualMachine(ctx, vmRegex) - if err == nil { - err = deleteVM(ctx, dummyVM) - if err != nil { - return fmt.Errorf("Failed to destroy the vm: %q with err: %+v", dummyVMFullName, err) - } - } - - // Delete virtual disk - vmDiskPath = removeClusterFromVDiskPath(vmDiskPath) - requestTime := time.Now() - task, err := virtualDiskManager.DeleteVirtualDisk(ctx, vmDiskPath, dc) + dc, err := vclib.GetDatacenter(ctx, vs.conn, vs.cfg.Global.Datacenter) if err != nil { - recordvSphereMetric(api_deletevolume, requestTime, err) return err } - err = task.Wait(ctx) - recordvSphereMetric(api_deletevolume, requestTime, err) + ds, err := dc.GetDatastoreByName(ctx, vs.cfg.Global.Datastore) + if err != nil { + return err + } + disk := diskmanagers.VirtualDisk{ + DiskPath: vmDiskPath, + VolumeOptions: &vclib.VolumeOptions{}, + VMOptions: &vclib.VMOptions{}, + } + err = disk.Delete(ctx, ds) + if err != nil { + glog.Errorf("Failed to delete vsphere volume with vmDiskPath: %s. err: %+v", vmDiskPath, err) + } return err } requestTime := time.Now() err := deleteVolumeInternal(vmDiskPath) - recordvSphereMetric(operation_deletevolume, requestTime, err) + vclib.RecordvSphereMetric(vclib.OperationDeleteVolume, requestTime, err) return err } -// NodeExists checks if the node with given nodeName exist. -// Returns false if VM doesn't exist or VM is in powerOff state. -func (vs *VSphere) NodeExists(nodeName k8stypes.NodeName) (bool, error) { - if nodeName == "" { - return false, nil - } - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - _, mvm, err := vs.getVMandMO(ctx, nodeName, "summary") - if err != nil { - glog.Errorf("Failed to getVMandMO for NodeExists: err %v", err) - return false, err - } - - if mvm.Summary.Runtime.PowerState == ActivePowerState { - return true, nil - } - - if mvm.Summary.Config.Template == false { - glog.Warningf("VM %s, is not in %s state", nodeName, ActivePowerState) - } else { - glog.Warningf("VM %s, is a template", nodeName) - } - - return false, nil -} - -// A background routine which will be responsible for deleting stale dummy VM's. -func (vs *VSphere) cleanUpDummyVMs(dummyVMPrefix string) { - // Create context - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - for { - time.Sleep(CleanUpDummyVMRoutine_Interval * time.Minute) - // Ensure client is logged in and session is valid - err := vSphereLogin(ctx, vs) - if err != nil { - glog.V(4).Infof("[cleanUpDummyVMs] Unable to login to vSphere with err: %+v", err) - continue - } - - // Create a new finder - f := find.NewFinder(vs.client.Client, true) - - // Fetch and set data center - dc, err := f.Datacenter(ctx, vs.cfg.Global.Datacenter) - if err != nil { - glog.V(4).Infof("[cleanUpDummyVMs] Unable to fetch the datacenter: %q with err: %+v", vs.cfg.Global.Datacenter, err) - continue - } - f.SetDatacenter(dc) - - // Get the folder reference for global working directory where the dummy VM needs to be created. - vmFolder, err := f.Folder(ctx, strings.TrimSuffix(vs.cfg.Global.WorkingDir, "/")) - if err != nil { - glog.V(4).Infof("[cleanUpDummyVMs] Unable to get the kubernetes folder: %q reference with err: %+v", vs.cfg.Global.WorkingDir, err) - continue - } - - // A write lock is acquired to make sure the cleanUp routine doesn't delete any VM's created by ongoing PVC requests. - cleanUpDummyVMLock.Lock() - vmMoList, err := vs.GetVMsInsideFolder(ctx, vmFolder, []string{NameProperty}) - if err != nil { - glog.V(4).Infof("[cleanUpDummyVMs] Unable to get VM list in the kubernetes cluster: %q reference with err: %+v", vs.cfg.Global.WorkingDir, err) - cleanUpDummyVMLock.Unlock() - continue - } - var dummyVMRefList []*object.VirtualMachine - for _, vmMo := range vmMoList { - if strings.HasPrefix(vmMo.Name, dummyVMPrefix) { - dummyVMRefList = append(dummyVMRefList, object.NewVirtualMachine(vs.client.Client, vmMo.Reference())) - } - } - - for _, dummyVMRef := range dummyVMRefList { - err = deleteVM(ctx, dummyVMRef) - if err != nil { - glog.V(4).Infof("[cleanUpDummyVMs] Unable to delete dummy VM: %q with err: %+v", dummyVMRef.Name(), err) - continue - } - } - cleanUpDummyVMLock.Unlock() - } -} - -func (vs *VSphere) createDummyVM(ctx context.Context, datacenter *object.Datacenter, datastore *object.Datastore, vmName string) (*object.VirtualMachine, error) { - // Create a virtual machine config spec with 1 SCSI adapter. - virtualMachineConfigSpec := types.VirtualMachineConfigSpec{ - Name: vmName, - Files: &types.VirtualMachineFileInfo{ - VmPathName: "[" + datastore.Name() + "]", - }, - NumCPUs: 1, - MemoryMB: 4, - DeviceChange: []types.BaseVirtualDeviceConfigSpec{ - &types.VirtualDeviceConfigSpec{ - Operation: types.VirtualDeviceConfigSpecOperationAdd, - Device: &types.ParaVirtualSCSIController{ - VirtualSCSIController: types.VirtualSCSIController{ - SharedBus: types.VirtualSCSISharingNoSharing, - VirtualController: types.VirtualController{ - BusNumber: 0, - VirtualDevice: types.VirtualDevice{ - Key: 1000, - }, - }, - }, - }, - }, - }, - } - - // Get the resource pool for current node. This is where dummy VM will be created. - resourcePool, err := vs.getCurrentNodeResourcePool(ctx, datacenter) - if err != nil { - return nil, err - } - // Get the folder reference for global working directory where the dummy VM needs to be created. - f := find.NewFinder(vs.client.Client, true) - dc, err := f.Datacenter(ctx, vs.cfg.Global.Datacenter) - f.SetDatacenter(dc) - vmFolder, err := f.Folder(ctx, strings.TrimSuffix(vs.cfg.Global.WorkingDir, "/")) - if err != nil { - return nil, fmt.Errorf("Failed to get the folder reference for %q with err: %+v", vs.cfg.Global.WorkingDir, err) - } - task, err := vmFolder.CreateVM(ctx, virtualMachineConfigSpec, resourcePool, nil) - if err != nil { - return nil, err - } - - dummyVMTaskInfo, err := task.WaitForResult(ctx, nil) - if err != nil { - return nil, err - } - - vmRef := dummyVMTaskInfo.Result.(object.Reference) - dummyVM := object.NewVirtualMachine(vs.client.Client, vmRef.Reference()) - return dummyVM, nil -} - -func (vs *VSphere) getCurrentNodeResourcePool(ctx context.Context, datacenter *object.Datacenter) (*object.ResourcePool, error) { - // Create a new finder - f := find.NewFinder(vs.client.Client, true) - f.SetDatacenter(datacenter) - - vmRegex := vs.cfg.Global.WorkingDir + vs.localInstanceID - currentVM, err := f.VirtualMachine(ctx, vmRegex) - if err != nil { - return nil, err - } - - currentVMHost, err := currentVM.HostSystem(ctx) - if err != nil { - return nil, err - } - - // Get the resource pool for the current node. - // We create the dummy VM in the same resource pool as current node. - resourcePool, err := currentVMHost.ResourcePool(ctx) - if err != nil { - return nil, err - } - - return resourcePool, nil -} - -// Creates a virtual disk with the policy configured to the disk. -// A call to this function is made only when a user specifies VSAN storage capabilties in the storage class definition. -func (vs *VSphere) createVirtualDiskWithPolicy(ctx context.Context, datacenter *object.Datacenter, datastore *object.Datastore, virtualMachine *object.VirtualMachine, volumeOptions *VolumeOptions) (string, error) { - var diskFormat string - diskFormat = diskFormatValidType[volumeOptions.DiskFormat] - - vmDevices, err := virtualMachine.Device(ctx) - if err != nil { - return "", err - } - var diskControllerType = vs.cfg.Disk.SCSIControllerType - // find SCSI controller of particular type from VM devices - scsiControllersOfRequiredType := getSCSIControllersOfType(vmDevices, diskControllerType) - scsiController := scsiControllersOfRequiredType[0] - - kubeVolsPath := filepath.Clean(datastore.Path(VolDir)) + "/" - // Create a kubevols directory in the datastore if one doesn't exist. - err = makeDirectoryInDatastore(vs.client, datacenter, kubeVolsPath, false) - if err != nil && err != ErrFileAlreadyExist { - glog.Errorf("Cannot create dir %#v. err %s", kubeVolsPath, err) - return "", err - } - - glog.V(4).Infof("Created dir with path as %+q", kubeVolsPath) - - vmDiskPath := kubeVolsPath + volumeOptions.Name + ".vmdk" - disk := vmDevices.CreateDisk(scsiController, datastore.Reference(), vmDiskPath) - unitNumber, err := getNextUnitNumber(vmDevices, scsiController) - if err != nil { - glog.Errorf("cannot attach disk to VM, limit reached - %v.", err) - return "", err - } - *disk.UnitNumber = unitNumber - disk.CapacityInKB = int64(volumeOptions.CapacityKB) - - backing := disk.Backing.(*types.VirtualDiskFlatVer2BackingInfo) - backing.DiskMode = string(types.VirtualDiskModeIndependent_persistent) - - switch diskFormat { - case ThinDiskType: - backing.ThinProvisioned = types.NewBool(true) - case EagerZeroedThickDiskType: - backing.EagerlyScrub = types.NewBool(true) - default: - backing.ThinProvisioned = types.NewBool(false) - } - - // Reconfigure VM - virtualMachineConfigSpec := types.VirtualMachineConfigSpec{} - deviceConfigSpec := &types.VirtualDeviceConfigSpec{ - Device: disk, - Operation: types.VirtualDeviceConfigSpecOperationAdd, - FileOperation: types.VirtualDeviceConfigSpecFileOperationCreate, - } - - storageProfileSpec := &types.VirtualMachineDefinedProfileSpec{} - // Is PBM storage policy ID is present, set the storage spec profile ID, - // else, set raw the VSAN policy string. - if volumeOptions.StoragePolicyID != "" { - storageProfileSpec.ProfileId = volumeOptions.StoragePolicyID - } else if volumeOptions.VSANStorageProfileData != "" { - storageProfileSpec.ProfileId = "" - storageProfileSpec.ProfileData = &types.VirtualMachineProfileRawData{ - ExtensionKey: "com.vmware.vim.sps", - ObjectData: volumeOptions.VSANStorageProfileData, - } - } - - deviceConfigSpec.Profile = append(deviceConfigSpec.Profile, storageProfileSpec) - virtualMachineConfigSpec.DeviceChange = append(virtualMachineConfigSpec.DeviceChange, deviceConfigSpec) - task, err := virtualMachine.Reconfigure(ctx, virtualMachineConfigSpec) - if err != nil { - glog.Errorf("Failed to reconfigure the VM with the disk with err - %v.", err) - return "", err - } - - err = task.Wait(ctx) - if err != nil { - glog.Errorf("Failed to reconfigure the VM with the disk with err - %v.", err) - return "", err - } - - return vmDiskPath, nil -} - -// creating a scsi controller as there is none found. -func createAndAttachSCSIControllerToVM(ctx context.Context, vm *object.VirtualMachine, diskControllerType string) (types.BaseVirtualDevice, error) { - // Get VM device list - vmDevices, err := vm.Device(ctx) - if err != nil { - return nil, err - } - allSCSIControllers := getSCSIControllers(vmDevices) - if len(allSCSIControllers) >= SCSIControllerLimit { - // we reached the maximum number of controllers we can attach - return nil, fmt.Errorf("SCSI Controller Limit of %d has been reached, cannot create another SCSI controller", SCSIControllerLimit) - } - newSCSIController, err := vmDevices.CreateSCSIController(diskControllerType) - if err != nil { - k8runtime.HandleError(fmt.Errorf("error creating new SCSI controller: %v", err)) - return nil, err - } - configNewSCSIController := newSCSIController.(types.BaseVirtualSCSIController).GetVirtualSCSIController() - hotAndRemove := true - configNewSCSIController.HotAddRemove = &hotAndRemove - configNewSCSIController.SharedBus = types.VirtualSCSISharing(types.VirtualSCSISharingNoSharing) - - // add the scsi controller to virtual machine - err = vm.AddDevice(context.TODO(), newSCSIController) - if err != nil { - glog.V(1).Infof("cannot add SCSI controller to vm - %v", err) - // attempt clean up of scsi controller - if vmDevices, err := vm.Device(ctx); err == nil { - cleanUpController(ctx, newSCSIController, vmDevices, vm) - } - return nil, err - } - return newSCSIController, nil -} - -// Create a virtual disk. -func createVirtualDisk(ctx context.Context, c *govmomi.Client, dc *object.Datacenter, ds *object.Datastore, volumeOptions *VolumeOptions) (string, error) { - kubeVolsPath := filepath.Clean(ds.Path(VolDir)) + "/" - // Create a kubevols directory in the datastore if one doesn't exist. - err := makeDirectoryInDatastore(c, dc, kubeVolsPath, false) - if err != nil && err != ErrFileAlreadyExist { - glog.Errorf("Cannot create dir %#v. err %s", kubeVolsPath, err) - return "", err - } - - glog.V(4).Infof("Created dir with path as %+q", kubeVolsPath) - vmDiskPath := kubeVolsPath + volumeOptions.Name + ".vmdk" - - diskFormat := diskFormatValidType[volumeOptions.DiskFormat] - - // Create a virtual disk manager - virtualDiskManager := object.NewVirtualDiskManager(c.Client) - - // Create specification for new virtual disk - vmDiskSpec := &types.FileBackedVirtualDiskSpec{ - VirtualDiskSpec: types.VirtualDiskSpec{ - AdapterType: LSILogicControllerType, - DiskType: diskFormat, - }, - CapacityKb: int64(volumeOptions.CapacityKB), - } - - // Create virtual disk - requestTime := time.Now() - task, err := virtualDiskManager.CreateVirtualDisk(ctx, vmDiskPath, dc, vmDiskSpec) - if err != nil { - recordvSphereMetric(api_createvolume, requestTime, err) - return "", err - } - err = task.Wait(ctx) - recordvSphereMetric(api_createvolume, requestTime, err) - return vmDiskPath, err -} - -// Check if the provided datastore is VSAN -func checkIfDatastoreTypeIsVSAN(c *govmomi.Client, datastore *object.Datastore) (bool, error) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - pc := property.DefaultCollector(c.Client) - - // Convert datastores into list of references - var dsRefs []types.ManagedObjectReference - dsRefs = append(dsRefs, datastore.Reference()) - - // Retrieve summary property for the given datastore - var dsMorefs []mo.Datastore - err := pc.Retrieve(ctx, dsRefs, []string{"summary"}, &dsMorefs) - if err != nil { - return false, err - } - - for _, ds := range dsMorefs { - if ds.Summary.Type == VSANDatastoreType { - return true, nil - } - } - return false, nil -} - -// Creates a folder using the specified name. -// If the intermediate level folders do not exist, -// and the parameter createParents is true, -// all the non-existent folders are created. -func makeDirectoryInDatastore(c *govmomi.Client, dc *object.Datacenter, path string, createParents bool) error { - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - fileManager := object.NewFileManager(c.Client) - err := fileManager.MakeDirectory(ctx, path, dc, createParents) - if err != nil { - if soap.IsSoapFault(err) { - soapFault := soap.ToSoapFault(err) - if _, ok := soapFault.VimFault().(types.FileAlreadyExists); ok { - return ErrFileAlreadyExist - } - } - } - - return err -} - -// Delete the VM. -func deleteVM(ctx context.Context, vm *object.VirtualMachine) error { - destroyTask, err := vm.Destroy(ctx) - if err != nil { - return err - } - return destroyTask.Wait(ctx) -} - -// Remove the cluster or folder path from the vDiskPath -// for vDiskPath [DatastoreCluster/sharedVmfs-0] kubevols/e2e-vmdk-1234.vmdk, return value is [sharedVmfs-0] kubevols/e2e-vmdk-1234.vmdk -// for vDiskPath [sharedVmfs-0] kubevols/e2e-vmdk-1234.vmdk, return value remains same [sharedVmfs-0] kubevols/e2e-vmdk-1234.vmdk - -func removeClusterFromVDiskPath(vDiskPath string) string { - datastore := regexp.MustCompile("\\[(.*?)\\]").FindStringSubmatch(vDiskPath)[1] - if filepath.Base(datastore) != datastore { - vDiskPath = strings.Replace(vDiskPath, datastore, filepath.Base(datastore), 1) - } - return vDiskPath +// HasClusterID returns true if the cluster has a clusterID +func (vs *VSphere) HasClusterID() bool { + return true } diff --git a/pkg/cloudprovider/providers/vsphere/vsphere_test.go b/pkg/cloudprovider/providers/vsphere/vsphere_test.go index 4dd44a6e7b2..b8b54e99aef 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere_test.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere_test.go @@ -27,6 +27,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/rand" "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib" ) func configFromEnv() (cfg VSphereConfig, ok bool) { @@ -125,11 +126,11 @@ func TestVSphereLogin(t *testing.T) { defer cancel() // Create vSphere client - err = vSphereLogin(ctx, vs) + err = vs.conn.Connect(ctx) if err != nil { - t.Errorf("Failed to create vSpere client: %s", err) + t.Errorf("Failed to connect to vSphere: %s", err) } - defer vs.client.Logout(ctx) + defer vs.conn.GoVmomiClient.Logout(ctx) } func TestZones(t *testing.T) { @@ -168,14 +169,14 @@ func TestInstances(t *testing.T) { t.Fatalf("CurrentNodeName() failed: %s", err) } - externalId, err := i.ExternalID(nodeName) + externalID, err := i.ExternalID(nodeName) if err != nil { t.Fatalf("Instances.ExternalID(%s) failed: %s", nodeName, err) } - t.Logf("Found ExternalID(%s) = %s\n", nodeName, externalId) + t.Logf("Found ExternalID(%s) = %s\n", nodeName, externalID) nonExistingVM := types.NodeName(rand.String(15)) - externalId, err = i.ExternalID(nonExistingVM) + externalID, err = i.ExternalID(nonExistingVM) if err == cloudprovider.InstanceNotFound { t.Logf("VM %s was not found as expected\n", nonExistingVM) } else if err == nil { @@ -184,13 +185,13 @@ func TestInstances(t *testing.T) { t.Fatalf("Instances.ExternalID did not fail as expected, err: %v", err) } - instanceId, err := i.InstanceID(nodeName) + instanceID, err := i.InstanceID(nodeName) if err != nil { t.Fatalf("Instances.InstanceID(%s) failed: %s", nodeName, err) } - t.Logf("Found InstanceID(%s) = %s\n", nodeName, instanceId) + t.Logf("Found InstanceID(%s) = %s\n", nodeName, instanceID) - instanceId, err = i.InstanceID(nonExistingVM) + instanceID, err = i.InstanceID(nonExistingVM) if err == cloudprovider.InstanceNotFound { t.Logf("VM %s was not found as expected\n", nonExistingVM) } else if err == nil { @@ -222,7 +223,7 @@ func TestVolumes(t *testing.T) { t.Fatalf("CurrentNodeName() failed: %s", err) } - volumeOptions := &VolumeOptions{ + volumeOptions := &vclib.VolumeOptions{ CapacityKB: 1 * 1024 * 1024, Tags: nil, Name: "kubernetes-test-volume-" + rand.String(10), @@ -233,7 +234,7 @@ func TestVolumes(t *testing.T) { t.Fatalf("Cannot create a new VMDK volume: %v", err) } - _, _, err = vs.AttachDisk(volPath, "", "") + _, err = vs.AttachDisk(volPath, "", "") if err != nil { t.Fatalf("Cannot attach volume(%s) to VM(%s): %v", volPath, nodeName, err) } @@ -249,36 +250,3 @@ func TestVolumes(t *testing.T) { // t.Fatalf("Cannot delete VMDK volume %s: %v", volPath, err) // } } - -func TestGetVMName(t *testing.T) { - cfg, ok := configFromEnv() - if !ok { - t.Skipf("No config found in environment") - } - - // Create vSphere configuration object - vs, err := newVSphere(cfg) - if err != nil { - t.Fatalf("Failed to construct/authenticate vSphere: %s", err) - } - - // Create context - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // Create vSphere client - err = vSphereLogin(ctx, vs) - if err != nil { - t.Errorf("Failed to create vSpere client: %s", err) - } - defer vs.client.Logout(ctx) - - // Get VM name - vmName, err := getVMName(vs.client, &cfg) - if err != nil { - t.Fatalf("Failed to get VM name: %s", err) - } - if vmName != "vmname" { - t.Errorf("Expect VM name 'vmname', got: %s", vmName) - } -} diff --git a/pkg/cloudprovider/providers/vsphere/vsphere_util.go b/pkg/cloudprovider/providers/vsphere/vsphere_util.go index a5bd63b15c5..54e09cd7d56 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere_util.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere_util.go @@ -18,21 +18,23 @@ package vsphere import ( "context" + "errors" + "io/ioutil" "os" "runtime" "strings" + "time" + + "github.com/golang/glog" + "github.com/vmware/govmomi" + "github.com/vmware/govmomi/object" + "github.com/vmware/govmomi/vim25" + "github.com/vmware/govmomi/vim25/mo" "fmt" - "github.com/vmware/govmomi" - "github.com/vmware/govmomi/find" - "github.com/vmware/govmomi/object" - "github.com/vmware/govmomi/pbm" - "github.com/vmware/govmomi/property" - "github.com/vmware/govmomi/vim25/mo" - "github.com/vmware/govmomi/vim25/types" - - pbmtypes "github.com/vmware/govmomi/pbm/types" + "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib" + "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers" ) const ( @@ -42,15 +44,17 @@ const ( VirtualMachine = "VirtualMachine" ) -// Reads vSphere configuration from system environment and construct vSphere object +// GetVSphere reads vSphere configuration from system environment and construct vSphere object func GetVSphere() (*VSphere, error) { cfg := getVSphereConfig() - client, err := GetgovmomiClient(cfg) + vSphereConn := getVSphereConn(cfg) + client, err := GetgovmomiClient(vSphereConn) if err != nil { return nil, err } + vSphereConn.GoVmomiClient = client vs := &VSphere{ - client: client, + conn: vSphereConn, cfg: cfg, localInstanceID: "", } @@ -75,233 +79,217 @@ func getVSphereConfig() *VSphereConfig { return &cfg } -func GetgovmomiClient(cfg *VSphereConfig) (*govmomi.Client, error) { - if cfg == nil { - cfg = getVSphereConfig() +func getVSphereConn(cfg *VSphereConfig) *vclib.VSphereConnection { + vSphereConn := &vclib.VSphereConnection{ + Username: cfg.Global.User, + Password: cfg.Global.Password, + Hostname: cfg.Global.VCenterIP, + Insecure: cfg.Global.InsecureFlag, + RoundTripperCount: cfg.Global.RoundTripperCount, + Port: cfg.Global.VCenterPort, } - client, err := newClient(context.TODO(), cfg) + return vSphereConn +} + +// GetgovmomiClient gets the goVMOMI client for the vsphere connection object +func GetgovmomiClient(conn *vclib.VSphereConnection) (*govmomi.Client, error) { + if conn == nil { + cfg := getVSphereConfig() + conn = getVSphereConn(cfg) + } + client, err := conn.NewClient(context.TODO()) return client, err } -// Get placement compatibility result based on storage policy requirements. -func (vs *VSphere) GetPlacementCompatibilityResult(ctx context.Context, pbmClient *pbm.Client, storagePolicyID string) (pbm.PlacementCompatibilityResult, error) { - datastores, err := vs.getSharedDatastoresInK8SCluster(ctx) +// getvmUUID gets the BIOS UUID via the sys interface. This UUID is known by vsphere +func getvmUUID() (string, error) { + id, err := ioutil.ReadFile(UUIDPath) if err != nil { - return nil, err + return "", fmt.Errorf("error retrieving vm uuid: %s", err) } - var hubs []pbmtypes.PbmPlacementHub - for _, ds := range datastores { - hubs = append(hubs, pbmtypes.PbmPlacementHub{ - HubType: ds.Type, - HubId: ds.Value, - }) + uuidFromFile := string(id[:]) + //strip leading and trailing white space and new line char + uuid := strings.TrimSpace(uuidFromFile) + // check the uuid starts with "VMware-" + if !strings.HasPrefix(uuid, UUIDPrefix) { + return "", fmt.Errorf("Failed to match Prefix, UUID read from the file is %v", uuidFromFile) } - req := []pbmtypes.BasePbmPlacementRequirement{ - &pbmtypes.PbmPlacementCapabilityProfileRequirement{ - ProfileId: pbmtypes.PbmProfileId{ - UniqueId: storagePolicyID, - }, - }, + // Strip the prefix and while spaces and - + uuid = strings.Replace(uuid[len(UUIDPrefix):(len(uuid))], " ", "", -1) + uuid = strings.Replace(uuid, "-", "", -1) + if len(uuid) != 32 { + return "", fmt.Errorf("Length check failed, UUID read from the file is %v", uuidFromFile) } - res, err := pbmClient.CheckRequirements(ctx, hubs, nil, req) - if err != nil { - return nil, err - } - return res, nil -} - -// Verify if the user specified datastore is in the list of non-compatible datastores. -// If yes, return the non compatible datastore reference. -func (vs *VSphere) IsUserSpecifiedDatastoreNonCompatible(ctx context.Context, compatibilityResult pbm.PlacementCompatibilityResult, dsName string) (bool, *types.ManagedObjectReference) { - dsMoList := vs.GetNonCompatibleDatastoresMo(ctx, compatibilityResult) - for _, ds := range dsMoList { - if ds.Info.GetDatastoreInfo().Name == dsName { - dsMoRef := ds.Reference() - return true, &dsMoRef - } - } - return false, nil -} - -func GetNonCompatibleDatastoreFaultMsg(compatibilityResult pbm.PlacementCompatibilityResult, dsMoref types.ManagedObjectReference) string { - var faultMsg string - for _, res := range compatibilityResult { - if res.Hub.HubId == dsMoref.Value { - for _, err := range res.Error { - faultMsg = faultMsg + err.LocalizedMessage - } - } - } - return faultMsg -} - -// Get the best fit compatible datastore by free space. -func GetMostFreeDatastore(dsMo []mo.Datastore) mo.Datastore { - var curMax int64 - curMax = -1 - var index int - for i, ds := range dsMo { - dsFreeSpace := ds.Info.GetDatastoreInfo().FreeSpace - if dsFreeSpace > curMax { - curMax = dsFreeSpace - index = i - } - } - return dsMo[index] -} - -func (vs *VSphere) GetCompatibleDatastoresMo(ctx context.Context, compatibilityResult pbm.PlacementCompatibilityResult) ([]mo.Datastore, error) { - compatibleHubs := compatibilityResult.CompatibleDatastores() - // Return an error if there are no compatible datastores. - if len(compatibleHubs) < 1 { - return nil, fmt.Errorf("There are no compatible datastores that satisfy the storage policy requirements") - } - dsMoList, err := vs.getDatastoreMo(ctx, compatibleHubs) - if err != nil { - return nil, err - } - return dsMoList, nil -} - -func (vs *VSphere) GetNonCompatibleDatastoresMo(ctx context.Context, compatibilityResult pbm.PlacementCompatibilityResult) []mo.Datastore { - nonCompatibleHubs := compatibilityResult.NonCompatibleDatastores() - // Return an error if there are no compatible datastores. - if len(nonCompatibleHubs) < 1 { - return nil - } - dsMoList, err := vs.getDatastoreMo(ctx, nonCompatibleHubs) - if err != nil { - return nil - } - return dsMoList -} - -// Get the datastore managed objects for the place hubs using property collector. -func (vs *VSphere) getDatastoreMo(ctx context.Context, hubs []pbmtypes.PbmPlacementHub) ([]mo.Datastore, error) { - var dsMoRefs []types.ManagedObjectReference - for _, hub := range hubs { - dsMoRefs = append(dsMoRefs, types.ManagedObjectReference{ - Type: hub.HubType, - Value: hub.HubId, - }) - } - - pc := property.DefaultCollector(vs.client.Client) - var dsMoList []mo.Datastore - err := pc.Retrieve(ctx, dsMoRefs, []string{DatastoreInfoProperty}, &dsMoList) - if err != nil { - return nil, err - } - return dsMoList, nil + // need to add dashes, e.g. "564d395e-d807-e18a-cb25-b79f65eb2b9f" + uuid = fmt.Sprintf("%s-%s-%s-%s-%s", uuid[0:8], uuid[8:12], uuid[12:16], uuid[16:20], uuid[20:32]) + return uuid, nil } // Get all datastores accessible for the virtual machine object. -func (vs *VSphere) getSharedDatastoresInK8SCluster(ctx context.Context) ([]types.ManagedObjectReference, error) { - f := find.NewFinder(vs.client.Client, true) - dc, err := f.Datacenter(ctx, vs.cfg.Global.Datacenter) - f.SetDatacenter(dc) - vmFolder, err := f.Folder(ctx, strings.TrimSuffix(vs.cfg.Global.WorkingDir, "/")) +func getSharedDatastoresInK8SCluster(ctx context.Context, folder *vclib.Folder) ([]*vclib.Datastore, error) { + vmList, err := folder.GetVirtualMachines(ctx) if err != nil { + glog.Errorf("Failed to get virtual machines in the kubernetes cluster: %s, err: %+v", folder.InventoryPath, err) return nil, err } - vmMoList, err := vs.GetVMsInsideFolder(ctx, vmFolder, []string{NameProperty}) - if err != nil { - return nil, err + if vmList == nil || len(vmList) == 0 { + glog.Errorf("No virtual machines found in the kubernetes cluster: %s", folder.InventoryPath) + return nil, fmt.Errorf("No virtual machines found in the kubernetes cluster: %s", folder.InventoryPath) } index := 0 - var sharedDs []string - for _, vmMo := range vmMoList { - if !strings.HasPrefix(vmMo.Name, DummyVMPrefixName) { - accessibleDatastores, err := vs.getAllAccessibleDatastores(ctx, vmMo) + var sharedDatastores []*vclib.Datastore + for _, vm := range vmList { + vmName, err := vm.ObjectName(ctx) + if err != nil { + return nil, err + } + if !strings.HasPrefix(vmName, DummyVMPrefixName) { + accessibleDatastores, err := vm.GetAllAccessibleDatastores(ctx) if err != nil { return nil, err } if index == 0 { - sharedDs = accessibleDatastores + sharedDatastores = accessibleDatastores } else { - sharedDs = intersect(sharedDs, accessibleDatastores) - if len(sharedDs) == 0 { - return nil, fmt.Errorf("No shared datastores found in the Kubernetes cluster") + sharedDatastores = intersect(sharedDatastores, accessibleDatastores) + if len(sharedDatastores) == 0 { + return nil, fmt.Errorf("No shared datastores found in the Kubernetes cluster: %s", folder.InventoryPath) } } index++ } } - var sharedDSMorefs []types.ManagedObjectReference - for _, ds := range sharedDs { - sharedDSMorefs = append(sharedDSMorefs, types.ManagedObjectReference{ - Value: ds, - Type: "Datastore", - }) - } - return sharedDSMorefs, nil + return sharedDatastores, nil } -func intersect(list1 []string, list2 []string) []string { - var sharedList []string +func intersect(list1 []*vclib.Datastore, list2 []*vclib.Datastore) []*vclib.Datastore { + var sharedDs []*vclib.Datastore for _, val1 := range list1 { // Check if val1 is found in list2 for _, val2 := range list2 { - if val1 == val2 { - sharedList = append(sharedList, val1) + if val1.Reference().Value == val2.Reference().Value { + sharedDs = append(sharedDs, val1) break } } } - return sharedList -} - -// Get the VM list inside a folder. -func (vs *VSphere) GetVMsInsideFolder(ctx context.Context, vmFolder *object.Folder, properties []string) ([]mo.VirtualMachine, error) { - vmFolders, err := vmFolder.Children(ctx) - if err != nil { - return nil, err - } - - pc := property.DefaultCollector(vs.client.Client) - var vmRefs []types.ManagedObjectReference - var vmMoList []mo.VirtualMachine - for _, vmFolder := range vmFolders { - if vmFolder.Reference().Type == VirtualMachine { - vmRefs = append(vmRefs, vmFolder.Reference()) - } - } - err = pc.Retrieve(ctx, vmRefs, properties, &vmMoList) - if err != nil { - return nil, err - } - return vmMoList, nil + return sharedDs } // Get the datastores accessible for the virtual machine object. -func (vs *VSphere) getAllAccessibleDatastores(ctx context.Context, vmMo mo.VirtualMachine) ([]string, error) { - f := find.NewFinder(vs.client.Client, true) - dc, err := f.Datacenter(ctx, vs.cfg.Global.Datacenter) - if err != nil { - return nil, err +func getAllAccessibleDatastores(ctx context.Context, client *vim25.Client, vmMo mo.VirtualMachine) ([]string, error) { + host := vmMo.Summary.Runtime.Host + if host == nil { + return nil, errors.New("VM doesn't have a HostSystem") } - f.SetDatacenter(dc) - vmRegex := vs.cfg.Global.WorkingDir + vmMo.Name - vmObj, err := f.VirtualMachine(ctx, vmRegex) - if err != nil { - return nil, err - } - - host, err := vmObj.HostSystem(ctx) - if err != nil { - return nil, err - } - var hostSystemMo mo.HostSystem - s := object.NewSearchIndex(vs.client.Client) - err = s.Properties(ctx, host.Reference(), []string{DatastoreProperty}, &hostSystemMo) + s := object.NewSearchIndex(client) + err := s.Properties(ctx, host.Reference(), []string{DatastoreProperty}, &hostSystemMo) if err != nil { return nil, err } - var dsRefValues []string for _, dsRef := range hostSystemMo.Datastore { dsRefValues = append(dsRefValues, dsRef.Value) } return dsRefValues, nil } + +// getMostFreeDatastore gets the best fit compatible datastore by free space. +func getMostFreeDatastoreName(ctx context.Context, client *vim25.Client, dsObjList []*vclib.Datastore) (string, error) { + dsMoList, err := dsObjList[0].Datacenter.GetDatastoreMoList(ctx, dsObjList, []string{DatastoreInfoProperty}) + if err != nil { + return "", err + } + var curMax int64 + curMax = -1 + var index int + for i, dsMo := range dsMoList { + dsFreeSpace := dsMo.Info.GetDatastoreInfo().FreeSpace + if dsFreeSpace > curMax { + curMax = dsFreeSpace + index = i + } + } + return dsMoList[index].Info.GetDatastoreInfo().Name, nil +} + +func getPbmCompatibleDatastore(ctx context.Context, client *vim25.Client, storagePolicyName string, folder *vclib.Folder) (string, error) { + pbmClient, err := vclib.NewPbmClient(ctx, client) + if err != nil { + return "", err + } + storagePolicyID, err := pbmClient.ProfileIDByName(ctx, storagePolicyName) + if err != nil { + glog.Errorf("Failed to get Profile ID by name: %s. err: %+v", storagePolicyName, err) + return "", err + } + sharedDsList, err := getSharedDatastoresInK8SCluster(ctx, folder) + if err != nil { + glog.Errorf("Failed to get shared datastores from kubernetes cluster: %s. err: %+v", folder.InventoryPath, err) + return "", err + } + compatibleDatastores, _, err := pbmClient.GetCompatibleDatastores(ctx, storagePolicyID, sharedDsList) + if err != nil { + glog.Errorf("Failed to get compatible datastores from datastores : %+v with storagePolicy: %s. err: %+v", sharedDsList, storagePolicyID, err) + return "", err + } + datastore, err := getMostFreeDatastoreName(ctx, client, compatibleDatastores) + if err != nil { + glog.Errorf("Failed to get most free datastore from compatible datastores: %+v. err: %+v", compatibleDatastores, err) + return "", err + } + return datastore, err +} + +func (vs *VSphere) setVMOptions(ctx context.Context, dc *vclib.Datacenter) (*vclib.VMOptions, error) { + var vmOptions vclib.VMOptions + vm, err := dc.GetVMByPath(ctx, vs.cfg.Global.WorkingDir+"/"+vs.localInstanceID) + if err != nil { + return nil, err + } + resourcePool, err := vm.GetResourcePool(ctx) + if err != nil { + return nil, err + } + folder, err := dc.GetFolderByPath(ctx, vs.cfg.Global.WorkingDir) + if err != nil { + return nil, err + } + vmOptions.VMFolder = folder + vmOptions.VMResourcePool = resourcePool + return &vmOptions, nil +} + +// A background routine which will be responsible for deleting stale dummy VM's. +func (vs *VSphere) cleanUpDummyVMs(dummyVMPrefix string) { + // Create context + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + for { + time.Sleep(CleanUpDummyVMRoutineInterval * time.Minute) + // Ensure client is logged in and session is valid + err := vs.conn.Connect(ctx) + if err != nil { + glog.V(4).Infof("Failed to connect to VC with err: %+v. Retrying again...", err) + continue + } + dc, err := vclib.GetDatacenter(ctx, vs.conn, vs.cfg.Global.Datacenter) + if err != nil { + glog.V(4).Infof("Failed to get the datacenter: %s from VC. err: %+v", vs.cfg.Global.Datacenter, err) + continue + } + // Get the folder reference for global working directory where the dummy VM needs to be created. + vmFolder, err := dc.GetFolderByPath(ctx, vs.cfg.Global.WorkingDir) + if err != nil { + glog.V(4).Infof("Unable to get the kubernetes folder: %q reference. err: %+v", vs.cfg.Global.WorkingDir, err) + continue + } + // A write lock is acquired to make sure the cleanUp routine doesn't delete any VM's created by ongoing PVC requests. + defer cleanUpDummyVMLock.Lock() + err = diskmanagers.CleanUpDummyVMs(ctx, vmFolder, dc) + if err != nil { + glog.V(4).Infof("Unable to clean up dummy VM's in the kubernetes cluster: %q. err: %+v", vs.cfg.Global.WorkingDir, err) + } + } +} diff --git a/pkg/controller/BUILD b/pkg/controller/BUILD index 4d2d889d8ee..d334b43d5f7 100644 --- a/pkg/controller/BUILD +++ b/pkg/controller/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,10 +13,11 @@ go_test( "controller_utils_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", + "//pkg/api/install:go_default_library", "//pkg/api/testapi:go_default_library", + "//pkg/controller/testutil:go_default_library", "//pkg/securitycontext:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", @@ -32,6 +31,7 @@ go_test( "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", "//vendor/k8s.io/client-go/tools/record:go_default_library", @@ -48,7 +48,6 @@ go_library( "doc.go", "lookup_cache.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", @@ -125,6 +124,7 @@ filegroup( "//pkg/controller/service:all-srcs", "//pkg/controller/serviceaccount:all-srcs", "//pkg/controller/statefulset:all-srcs", + "//pkg/controller/testutil:all-srcs", "//pkg/controller/ttl:all-srcs", "//pkg/controller/volume/attachdetach:all-srcs", "//pkg/controller/volume/events:all-srcs", diff --git a/pkg/controller/bootstrap/BUILD b/pkg/controller/bootstrap/BUILD index d552d5ecc37..254f511cc68 100644 --- a/pkg/controller/bootstrap/BUILD +++ b/pkg/controller/bootstrap/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_test( "util_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", @@ -42,7 +39,6 @@ go_library( "tokencleaner.go", "util.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/bootstrap/api:go_default_library", diff --git a/pkg/controller/certificates/BUILD b/pkg/controller/certificates/BUILD index af0354bae00..f3f36d6c396 100644 --- a/pkg/controller/certificates/BUILD +++ b/pkg/controller/certificates/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_library( "certificate_controller.go", "certificate_controller_utils.go", ], - tags = ["automanaged"], visibility = [ ":__subpackages__", "//cmd/gke-certificates-controller:__subpackages__", @@ -59,7 +56,6 @@ go_test( name = "go_default_test", srcs = ["certificate_controller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/controller:go_default_library", "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", diff --git a/pkg/controller/certificates/approver/BUILD b/pkg/controller/certificates/approver/BUILD index 3a0c77d752c..eac5be6944e 100644 --- a/pkg/controller/certificates/approver/BUILD +++ b/pkg/controller/certificates/approver/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["sarapprove_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/certificates/v1beta1:go_default_library", "//vendor/k8s.io/api/authorization/v1beta1:go_default_library", @@ -27,7 +24,6 @@ go_test( go_library( name = "go_default_library", srcs = ["sarapprove.go"], - tags = ["automanaged"], deps = [ "//pkg/apis/certificates/v1beta1:go_default_library", "//pkg/controller/certificates:go_default_library", diff --git a/pkg/controller/certificates/approver/sarapprove.go b/pkg/controller/certificates/approver/sarapprove.go index 3e79d624165..d2eb5ac5efc 100644 --- a/pkg/controller/certificates/approver/sarapprove.go +++ b/pkg/controller/certificates/approver/sarapprove.go @@ -91,10 +91,15 @@ func (a *sarApprover) handle(csr *capi.CertificateSigningRequest) error { return fmt.Errorf("unable to parse csr %q: %v", csr.Name, err) } + tried := []string{} + for _, r := range a.recognizers { if !r.recognize(csr, x509cr) { continue } + + tried = append(tried, r.permission.Subresource) + approved, err := a.authorize(csr, r.permission) if err != nil { return err @@ -108,6 +113,11 @@ func (a *sarApprover) handle(csr *capi.CertificateSigningRequest) error { return nil } } + + if len(tried) != 0 { + return fmt.Errorf("recognized csr %q as %v but subject access review was not approved", csr.Name, tried) + } + return nil } diff --git a/pkg/controller/certificates/approver/sarapprove_test.go b/pkg/controller/certificates/approver/sarapprove_test.go index 3dcc1d044fa..f17b9cebec4 100644 --- a/pkg/controller/certificates/approver/sarapprove_test.go +++ b/pkg/controller/certificates/approver/sarapprove_test.go @@ -89,6 +89,7 @@ func TestHandle(t *testing.T) { message string allowed bool recognized bool + err bool verify func(*testing.T, []testclient.Action) }{ { @@ -119,6 +120,7 @@ func TestHandle(t *testing.T) { } _ = as[0].(testclient.CreateActionImpl) }, + err: true, }, { recognized: true, @@ -155,7 +157,7 @@ func TestHandle(t *testing.T) { } for _, c := range cases { - t.Run(fmt.Sprintf("recognized:%v,allowed: %v", c.recognized, c.allowed), func(t *testing.T) { + t.Run(fmt.Sprintf("recognized:%v,allowed: %v,err: %v", c.recognized, c.allowed, c.err), func(t *testing.T) { client := &fake.Clientset{} client.AddReactor("create", "subjectaccessreviews", func(action testclient.Action) (handled bool, ret runtime.Object, err error) { return true, &authorization.SubjectAccessReview{ @@ -177,7 +179,7 @@ func TestHandle(t *testing.T) { }, } csr := makeTestCsr() - if err := approver.handle(csr); err != nil { + if err := approver.handle(csr); err != nil && !c.err { t.Errorf("unexpected err: %v", err) } c.verify(t, client.Actions()) diff --git a/pkg/controller/certificates/signer/BUILD b/pkg/controller/certificates/signer/BUILD index 0ff94966757..c29d2d132c0 100644 --- a/pkg/controller/certificates/signer/BUILD +++ b/pkg/controller/certificates/signer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_test( "testdata/kubelet.csr", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", "//vendor/k8s.io/client-go/util/cert:go_default_library", @@ -27,7 +24,6 @@ go_test( go_library( name = "go_default_library", srcs = ["cfssl_signer.go"], - tags = ["automanaged"], deps = [ "//pkg/controller/certificates:go_default_library", "//vendor/github.com/cloudflare/cfssl/config:go_default_library", diff --git a/pkg/controller/cloud/BUILD b/pkg/controller/cloud/BUILD index dd5392b721b..e303cef4992 100644 --- a/pkg/controller/cloud/BUILD +++ b/pkg/controller/cloud/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["node_controller.go"], - tags = ["automanaged"], deps = [ "//pkg/api/v1/node:go_default_library", "//pkg/client/retry:go_default_library", @@ -38,12 +35,11 @@ go_test( name = "go_default_test", srcs = ["node_controller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//pkg/cloudprovider/providers/fake:go_default_library", "//pkg/controller:go_default_library", - "//pkg/controller/node/testutil:go_default_library", + "//pkg/controller/testutil:go_default_library", "//pkg/kubelet/apis:go_default_library", "//plugin/pkg/scheduler/algorithm:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/pkg/controller/cloud/node_controller_test.go b/pkg/controller/cloud/node_controller_test.go index 333081af2f6..033dbe90889 100644 --- a/pkg/controller/cloud/node_controller_test.go +++ b/pkg/controller/cloud/node_controller_test.go @@ -34,7 +34,7 @@ import ( "k8s.io/kubernetes/pkg/cloudprovider" fakecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/fake" "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/controller/node/testutil" + "k8s.io/kubernetes/pkg/controller/testutil" kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis" "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm" ) diff --git a/pkg/controller/controller_ref_manager.go b/pkg/controller/controller_ref_manager.go index 64d6b8c0a62..564a67ca549 100644 --- a/pkg/controller/controller_ref_manager.go +++ b/pkg/controller/controller_ref_manager.go @@ -31,19 +31,6 @@ import ( utilerrors "k8s.io/apimachinery/pkg/util/errors" ) -// GetControllerOf returns the controllerRef if controllee has a controller, -// otherwise returns nil. -func GetControllerOf(controllee metav1.Object) *metav1.OwnerReference { - ownerRefs := controllee.GetOwnerReferences() - for i := range ownerRefs { - owner := &ownerRefs[i] - if owner.Controller != nil && *owner.Controller == true { - return owner - } - } - return nil -} - type BaseControllerRefManager struct { Controller metav1.Object Selector labels.Selector @@ -78,7 +65,7 @@ func (m *BaseControllerRefManager) CanAdopt() error { // // No reconciliation will be attempted if the controller is being deleted. func (m *BaseControllerRefManager) ClaimObject(obj metav1.Object, match func(metav1.Object) bool, adopt, release func(metav1.Object) error) (bool, error) { - controllerRef := GetControllerOf(obj) + controllerRef := metav1.GetControllerOf(obj) if controllerRef != nil { if controllerRef.UID != m.Controller.GetUID() { // Owned by someone else. Ignore. diff --git a/pkg/controller/controller_ref_manager_test.go b/pkg/controller/controller_ref_manager_test.go index 368385f771b..1af203af8d8 100644 --- a/pkg/controller/controller_ref_manager_test.go +++ b/pkg/controller/controller_ref_manager_test.go @@ -36,20 +36,6 @@ var ( controllerUID = "123" ) -func newControllerRef(controller metav1.Object) *metav1.OwnerReference { - var controllerKind = v1beta1.SchemeGroupVersion.WithKind("Fake") - blockOwnerDeletion := true - isController := true - return &metav1.OwnerReference{ - APIVersion: controllerKind.GroupVersion().String(), - Kind: controllerKind.Kind, - Name: "Fake", - UID: controller.GetUID(), - BlockOwnerDeletion: &blockOwnerDeletion, - Controller: &isController, - } -} - func newPod(podName string, label map[string]string, owner metav1.Object) *v1.Pod { pod := &v1.Pod{ ObjectMeta: metav1.ObjectMeta{ @@ -66,7 +52,7 @@ func newPod(podName string, label map[string]string, owner metav1.Object) *v1.Po }, } if owner != nil { - pod.OwnerReferences = []metav1.OwnerReference{*newControllerRef(owner)} + pod.OwnerReferences = []metav1.OwnerReference{*metav1.NewControllerRef(owner, v1beta1.SchemeGroupVersion.WithKind("Fake"))} } return pod } diff --git a/pkg/controller/controller_utils.go b/pkg/controller/controller_utils.go index bfb35279d24..03fe214a3e0 100644 --- a/pkg/controller/controller_utils.go +++ b/pkg/controller/controller_utils.go @@ -885,50 +885,11 @@ func (o ReplicaSetsBySizeNewer) Less(i, j int) bool { return *(o[i].Spec.Replicas) > *(o[j].Spec.Replicas) } -func AddOrUpdateTaintOnNode(c clientset.Interface, nodeName string, taint *v1.Taint) error { - firstTry := true - return clientretry.RetryOnConflict(UpdateTaintBackoff, func() error { - var err error - var oldNode *v1.Node - // First we try getting node from the API server cache, as it's cheaper. If it fails - // we get it from etcd to be sure to have fresh data. - if firstTry { - oldNode, err = c.Core().Nodes().Get(nodeName, metav1.GetOptions{ResourceVersion: "0"}) - firstTry = false - } else { - oldNode, err = c.Core().Nodes().Get(nodeName, metav1.GetOptions{}) - } - if err != nil { - return err - } - newNode, ok, err := taintutils.AddOrUpdateTaint(oldNode, taint) - if err != nil { - return fmt.Errorf("Failed to update taint annotation!") - } - if !ok { - return nil - } - return PatchNodeTaints(c, nodeName, oldNode, newNode) - }) -} - -// RemoveTaintOffNode is for cleaning up taints temporarily added to node, -// won't fail if target taint doesn't exist or has been removed. -// If passed a node it'll check if there's anything to be done, if taint is not present it won't issue -// any API calls. -func RemoveTaintOffNode(c clientset.Interface, nodeName string, taint *v1.Taint, node *v1.Node) error { - // Short circuit for limiting amount of API calls. - if node != nil { - match := false - for i := range node.Spec.Taints { - if node.Spec.Taints[i].MatchTaint(taint) { - match = true - break - } - } - if !match { - return nil - } +// AddOrUpdateTaintOnNode add taints to the node. If taint was added into node, it'll issue API calls +// to update nodes; otherwise, no API calls. Return error if any. +func AddOrUpdateTaintOnNode(c clientset.Interface, nodeName string, taints ...*v1.Taint) error { + if len(taints) == 0 { + return nil } firstTry := true return clientretry.RetryOnConflict(UpdateTaintBackoff, func() error { @@ -945,11 +906,77 @@ func RemoveTaintOffNode(c clientset.Interface, nodeName string, taint *v1.Taint, if err != nil { return err } - newNode, ok, err := taintutils.RemoveTaint(oldNode, taint) - if err != nil { - return fmt.Errorf("Failed to update taint annotation!") + + var newNode *v1.Node + oldNodeCopy := oldNode + updated := false + for _, taint := range taints { + curNewNode, ok, err := taintutils.AddOrUpdateTaint(oldNodeCopy, taint) + if err != nil { + return fmt.Errorf("Failed to update taint of node!") + } + updated = updated || ok + newNode = curNewNode + oldNodeCopy = curNewNode } - if !ok { + if !updated { + return nil + } + return PatchNodeTaints(c, nodeName, oldNode, newNode) + }) +} + +// RemoveTaintOffNode is for cleaning up taints temporarily added to node, +// won't fail if target taint doesn't exist or has been removed. +// If passed a node it'll check if there's anything to be done, if taint is not present it won't issue +// any API calls. +func RemoveTaintOffNode(c clientset.Interface, nodeName string, node *v1.Node, taints ...*v1.Taint) error { + if len(taints) == 0 { + return nil + } + // Short circuit for limiting amount of API calls. + if node != nil { + match := false + for _, taint := range taints { + if taintutils.TaintExists(node.Spec.Taints, taint) { + match = true + break + } + } + if !match { + return nil + } + } + + firstTry := true + return clientretry.RetryOnConflict(UpdateTaintBackoff, func() error { + var err error + var oldNode *v1.Node + // First we try getting node from the API server cache, as it's cheaper. If it fails + // we get it from etcd to be sure to have fresh data. + if firstTry { + oldNode, err = c.Core().Nodes().Get(nodeName, metav1.GetOptions{ResourceVersion: "0"}) + firstTry = false + } else { + oldNode, err = c.Core().Nodes().Get(nodeName, metav1.GetOptions{}) + } + if err != nil { + return err + } + + var newNode *v1.Node + oldNodeCopy := oldNode + updated := false + for _, taint := range taints { + curNewNode, ok, err := taintutils.RemoveTaint(oldNodeCopy, taint) + if err != nil { + return fmt.Errorf("Failed to remove taint of node!") + } + updated = updated || ok + newNode = curNewNode + oldNodeCopy = curNewNode + } + if !updated { return nil } return PatchNodeTaints(c, nodeName, oldNode, newNode) diff --git a/pkg/controller/controller_utils_test.go b/pkg/controller/controller_utils_test.go index 0e4fdd3fa21..bd82e48e703 100644 --- a/pkg/controller/controller_utils_test.go +++ b/pkg/controller/controller_utils_test.go @@ -37,12 +37,15 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/uuid" clientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/kubernetes/fake" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/record" utiltesting "k8s.io/client-go/util/testing" "k8s.io/kubernetes/pkg/api" + _ "k8s.io/kubernetes/pkg/api/install" "k8s.io/kubernetes/pkg/api/testapi" + "k8s.io/kubernetes/pkg/controller/testutil" "k8s.io/kubernetes/pkg/securitycontext" ) @@ -479,3 +482,358 @@ func TestComputeHash(t *testing.T) { } } } + +func TestRemoveTaintOffNode(t *testing.T) { + tests := []struct { + name string + nodeHandler *testutil.FakeNodeHandler + nodeName string + taintsToRemove []*v1.Taint + expectedTaints []v1.Taint + requestCount int + }{ + { + name: "remove one taint from node", + nodeHandler: &testutil.FakeNodeHandler{ + Existing: []*v1.Node{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node1", + }, + Spec: v1.NodeSpec{ + Taints: []v1.Taint{ + {Key: "key1", Value: "value1", Effect: "NoSchedule"}, + {Key: "key2", Value: "value2", Effect: "NoExecute"}, + }, + }, + }, + }, + Clientset: fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testutil.NewPod("pod0", "node0")}}), + }, + nodeName: "node1", + taintsToRemove: []*v1.Taint{ + {Key: "key2", Value: "value2", Effect: "NoExecute"}, + }, + expectedTaints: []v1.Taint{ + {Key: "key1", Value: "value1", Effect: "NoSchedule"}, + }, + requestCount: 4, + }, + { + name: "remove multiple taints from node", + nodeHandler: &testutil.FakeNodeHandler{ + Existing: []*v1.Node{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node1", + }, + Spec: v1.NodeSpec{ + Taints: []v1.Taint{ + {Key: "key1", Value: "value1", Effect: "NoSchedule"}, + {Key: "key2", Value: "value2", Effect: "NoExecute"}, + {Key: "key3", Value: "value3", Effect: "NoSchedule"}, + {Key: "key4", Value: "value4", Effect: "NoExecute"}, + }, + }, + }, + }, + Clientset: fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testutil.NewPod("pod0", "node0")}}), + }, + nodeName: "node1", + taintsToRemove: []*v1.Taint{ + {Key: "key2", Value: "value2", Effect: "NoExecute"}, + {Key: "key3", Value: "value3", Effect: "NoSchedule"}, + }, + expectedTaints: []v1.Taint{ + {Key: "key1", Value: "value1", Effect: "NoSchedule"}, + {Key: "key4", Value: "value4", Effect: "NoExecute"}, + }, + requestCount: 4, + }, + { + name: "remove no-exist taints from node", + nodeHandler: &testutil.FakeNodeHandler{ + Existing: []*v1.Node{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node1", + }, + Spec: v1.NodeSpec{ + Taints: []v1.Taint{ + {Key: "key1", Value: "value1", Effect: "NoSchedule"}, + {Key: "key2", Value: "value2", Effect: "NoExecute"}, + }, + }, + }, + }, + Clientset: fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testutil.NewPod("pod0", "node0")}}), + }, + nodeName: "node1", + taintsToRemove: []*v1.Taint{ + {Key: "key3", Value: "value3", Effect: "NoSchedule"}, + }, + expectedTaints: []v1.Taint{ + {Key: "key1", Value: "value1", Effect: "NoSchedule"}, + {Key: "key2", Value: "value2", Effect: "NoExecute"}, + }, + requestCount: 2, + }, + { + name: "remove taint from node without taints", + nodeHandler: &testutil.FakeNodeHandler{ + Existing: []*v1.Node{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node1", + }, + }, + }, + Clientset: fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testutil.NewPod("pod0", "node0")}}), + }, + nodeName: "node1", + taintsToRemove: []*v1.Taint{ + {Key: "key3", Value: "value3", Effect: "NoSchedule"}, + }, + expectedTaints: nil, + requestCount: 2, + }, + { + name: "remove empty taint list from node without taints", + nodeHandler: &testutil.FakeNodeHandler{ + Existing: []*v1.Node{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node1", + }, + }, + }, + Clientset: fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testutil.NewPod("pod0", "node0")}}), + }, + nodeName: "node1", + taintsToRemove: []*v1.Taint{}, + expectedTaints: nil, + requestCount: 2, + }, + { + name: "remove empty taint list from node", + nodeHandler: &testutil.FakeNodeHandler{ + Existing: []*v1.Node{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node1", + }, + Spec: v1.NodeSpec{ + Taints: []v1.Taint{ + {Key: "key1", Value: "value1", Effect: "NoSchedule"}, + {Key: "key2", Value: "value2", Effect: "NoExecute"}, + }, + }, + }, + }, + Clientset: fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testutil.NewPod("pod0", "node0")}}), + }, + nodeName: "node1", + taintsToRemove: []*v1.Taint{}, + expectedTaints: []v1.Taint{ + {Key: "key1", Value: "value1", Effect: "NoSchedule"}, + {Key: "key2", Value: "value2", Effect: "NoExecute"}, + }, + requestCount: 2, + }, + } + for _, test := range tests { + node, _ := test.nodeHandler.Get(test.nodeName, metav1.GetOptions{}) + 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{}) + 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) + } + + if test.nodeHandler.RequestCount != test.requestCount { + t.Errorf("%s: unexpected request count: expected %+v, got %+v", + test.name, test.requestCount, test.nodeHandler.RequestCount) + } + } +} + +func TestAddOrUpdateTaintOnNode(t *testing.T) { + tests := []struct { + name string + nodeHandler *testutil.FakeNodeHandler + nodeName string + taintsToAdd []*v1.Taint + expectedTaints []v1.Taint + requestCount int + }{ + { + name: "add one taint on node", + nodeHandler: &testutil.FakeNodeHandler{ + Existing: []*v1.Node{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node1", + }, + Spec: v1.NodeSpec{ + Taints: []v1.Taint{ + {Key: "key1", Value: "value1", Effect: "NoSchedule"}, + }, + }, + }, + }, + Clientset: fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testutil.NewPod("pod0", "node0")}}), + }, + nodeName: "node1", + taintsToAdd: []*v1.Taint{ + {Key: "key2", Value: "value2", Effect: "NoExecute"}, + }, + expectedTaints: []v1.Taint{ + {Key: "key1", Value: "value1", Effect: "NoSchedule"}, + {Key: "key2", Value: "value2", Effect: "NoExecute"}, + }, + requestCount: 3, + }, + { + name: "add multiple taints to node", + nodeHandler: &testutil.FakeNodeHandler{ + Existing: []*v1.Node{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node1", + }, + Spec: v1.NodeSpec{ + Taints: []v1.Taint{ + {Key: "key1", Value: "value1", Effect: "NoSchedule"}, + {Key: "key2", Value: "value2", Effect: "NoExecute"}, + }, + }, + }, + }, + Clientset: fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testutil.NewPod("pod0", "node0")}}), + }, + nodeName: "node1", + taintsToAdd: []*v1.Taint{ + {Key: "key3", Value: "value3", Effect: "NoSchedule"}, + {Key: "key4", Value: "value4", Effect: "NoExecute"}, + }, + expectedTaints: []v1.Taint{ + {Key: "key1", Value: "value1", Effect: "NoSchedule"}, + {Key: "key2", Value: "value2", Effect: "NoExecute"}, + {Key: "key3", Value: "value3", Effect: "NoSchedule"}, + {Key: "key4", Value: "value4", Effect: "NoExecute"}, + }, + requestCount: 3, + }, + { + name: "add exist taints to node", + nodeHandler: &testutil.FakeNodeHandler{ + Existing: []*v1.Node{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node1", + }, + Spec: v1.NodeSpec{ + Taints: []v1.Taint{ + {Key: "key1", Value: "value1", Effect: "NoSchedule"}, + {Key: "key2", Value: "value2", Effect: "NoExecute"}, + }, + }, + }, + }, + Clientset: fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testutil.NewPod("pod0", "node0")}}), + }, + nodeName: "node1", + taintsToAdd: []*v1.Taint{ + {Key: "key2", Value: "value2", Effect: "NoExecute"}, + }, + expectedTaints: []v1.Taint{ + {Key: "key1", Value: "value1", Effect: "NoSchedule"}, + {Key: "key2", Value: "value2", Effect: "NoExecute"}, + }, + requestCount: 3, + }, + { + name: "add taint to node without taints", + nodeHandler: &testutil.FakeNodeHandler{ + Existing: []*v1.Node{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node1", + }, + }, + }, + Clientset: fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testutil.NewPod("pod0", "node0")}}), + }, + nodeName: "node1", + taintsToAdd: []*v1.Taint{ + {Key: "key3", Value: "value3", Effect: "NoSchedule"}, + }, + expectedTaints: []v1.Taint{ + {Key: "key3", Value: "value3", Effect: "NoSchedule"}, + }, + requestCount: 3, + }, + { + name: "add empty taint list to node without taints", + nodeHandler: &testutil.FakeNodeHandler{ + Existing: []*v1.Node{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node1", + }, + }, + }, + Clientset: fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testutil.NewPod("pod0", "node0")}}), + }, + nodeName: "node1", + taintsToAdd: []*v1.Taint{}, + expectedTaints: nil, + requestCount: 1, + }, + { + name: "add empty taint list to node", + nodeHandler: &testutil.FakeNodeHandler{ + Existing: []*v1.Node{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node1", + }, + Spec: v1.NodeSpec{ + Taints: []v1.Taint{ + {Key: "key1", Value: "value1", Effect: "NoSchedule"}, + {Key: "key2", Value: "value2", Effect: "NoExecute"}, + }, + }, + }, + }, + Clientset: fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testutil.NewPod("pod0", "node0")}}), + }, + nodeName: "node1", + taintsToAdd: []*v1.Taint{}, + expectedTaints: []v1.Taint{ + {Key: "key1", Value: "value1", Effect: "NoSchedule"}, + {Key: "key2", Value: "value2", Effect: "NoExecute"}, + }, + requestCount: 1, + }, + } + for _, test := range tests { + 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{}) + 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) + } + + if test.nodeHandler.RequestCount != test.requestCount { + t.Errorf("%s: unexpected request count: expected %+v, got %+v", + test.name, test.requestCount, test.nodeHandler.RequestCount) + } + } +} diff --git a/pkg/controller/cronjob/BUILD b/pkg/controller/cronjob/BUILD index b0b0d7dd770..8a12acd522d 100644 --- a/pkg/controller/cronjob/BUILD +++ b/pkg/controller/cronjob/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,10 +14,8 @@ go_library( "injection.go", "utils.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", - "//pkg/controller:go_default_library", "//pkg/util/metrics:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/robfig/cron:go_default_library", @@ -50,11 +46,9 @@ go_test( "utils_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api/install:go_default_library", "//pkg/apis/batch/install:go_default_library", - "//pkg/controller:go_default_library", "//vendor/k8s.io/api/batch/v1:go_default_library", "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/controller/cronjob/cronjob_controller_test.go b/pkg/controller/cronjob/cronjob_controller_test.go index 4e3a0feee2a..e5f22cfda06 100644 --- a/pkg/controller/cronjob/cronjob_controller_test.go +++ b/pkg/controller/cronjob/cronjob_controller_test.go @@ -32,7 +32,6 @@ import ( // For the cronjob controller to do conversions. _ "k8s.io/kubernetes/pkg/api/install" _ "k8s.io/kubernetes/pkg/apis/batch/install" - "k8s.io/kubernetes/pkg/controller" ) // schedule is hourly on the hour @@ -295,7 +294,7 @@ func TestSyncOne_RunOrNot(t *testing.T) { } for i := range jc.Jobs { job := &jc.Jobs[i] - controllerRef := controller.GetControllerOf(job) + controllerRef := metav1.GetControllerOf(job) if controllerRef == nil { t.Errorf("%s: expected job to have ControllerRef: %#v", name, job) } else { diff --git a/pkg/controller/cronjob/utils.go b/pkg/controller/cronjob/utils.go index ee5d75f4575..dbdd8dd96c8 100644 --- a/pkg/controller/cronjob/utils.go +++ b/pkg/controller/cronjob/utils.go @@ -32,7 +32,6 @@ import ( "k8s.io/apimachinery/pkg/types" ref "k8s.io/client-go/tools/reference" "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/controller" ) // Utilities for dealing with Jobs and CronJobs and time. @@ -61,7 +60,7 @@ func deleteFromActiveList(sj *batchv2alpha1.CronJob, uid types.UID) { // getParentUIDFromJob extracts UID of job's parent and whether it was found func getParentUIDFromJob(j batchv1.Job) (types.UID, bool) { - controllerRef := controller.GetControllerOf(&j) + controllerRef := metav1.GetControllerOf(&j) if controllerRef == nil { return types.UID(""), false @@ -170,19 +169,6 @@ func getRecentUnmetScheduleTimes(sj batchv2alpha1.CronJob, now time.Time) ([]tim return starts, nil } -func newControllerRef(sj *batchv2alpha1.CronJob) *metav1.OwnerReference { - blockOwnerDeletion := true - isController := true - return &metav1.OwnerReference{ - APIVersion: controllerKind.GroupVersion().String(), - Kind: controllerKind.Kind, - Name: sj.Name, - UID: sj.UID, - BlockOwnerDeletion: &blockOwnerDeletion, - Controller: &isController, - } -} - // XXX unit test this // getJobFromTemplate makes a Job from a CronJob @@ -205,7 +191,7 @@ func getJobFromTemplate(sj *batchv2alpha1.CronJob, scheduledTime time.Time) (*ba Labels: labels, Annotations: annotations, Name: name, - OwnerReferences: []metav1.OwnerReference{*newControllerRef(sj)}, + OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(sj, controllerKind)}, }, } if err := api.Scheme.Convert(&sj.Spec.JobTemplate.Spec, &job.Spec, nil); err != nil { diff --git a/pkg/controller/daemon/BUILD b/pkg/controller/daemon/BUILD index ce90c100cef..acf6eb0d66e 100644 --- a/pkg/controller/daemon/BUILD +++ b/pkg/controller/daemon/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "doc.go", "update.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/helper:go_default_library", "//pkg/api/v1/pod:go_default_library", @@ -40,6 +37,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_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/informers/apps/v1beta1:go_default_library", @@ -65,7 +63,6 @@ go_test( "update_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", diff --git a/pkg/controller/daemon/daemon_controller.go b/pkg/controller/daemon/daemon_controller.go index 17a41364516..93673f07766 100644 --- a/pkg/controller/daemon/daemon_controller.go +++ b/pkg/controller/daemon/daemon_controller.go @@ -31,6 +31,7 @@ import ( "k8s.io/apimachinery/pkg/labels" utilerrors "k8s.io/apimachinery/pkg/util/errors" utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" utilfeature "k8s.io/apiserver/pkg/util/feature" appsinformers "k8s.io/client-go/informers/apps/v1beta1" @@ -94,7 +95,8 @@ type DaemonSetsController struct { // To allow injection of syncDaemonSet for testing. syncHandler func(dsKey string) error // used for unit testing - enqueueDaemonSet func(ds *extensions.DaemonSet) + enqueueDaemonSet func(ds *extensions.DaemonSet) + enqueueDaemonSetRateLimited func(ds *extensions.DaemonSet) // A TTLCache of pod creates/deletes each ds expects to see expectations controller.ControllerExpectationsInterface // dsLister can list/get daemonsets from the shared informer's store @@ -120,6 +122,11 @@ type DaemonSetsController struct { // DaemonSet keys that need to be synced. queue workqueue.RateLimitingInterface + + // The DaemonSet that has suspended pods on nodes; the key is node name, the value + // is DaemonSet set that want to run pods but can't schedule in latest syncup cycle. + suspendedDaemonPodsMutex sync.Mutex + suspendedDaemonPods map[string]sets.String } func NewDaemonSetsController(daemonSetInformer extensionsinformers.DaemonSetInformer, historyInformer appsinformers.ControllerRevisionInformer, podInformer coreinformers.PodInformer, nodeInformer coreinformers.NodeInformer, kubeClient clientset.Interface) *DaemonSetsController { @@ -141,9 +148,10 @@ func NewDaemonSetsController(daemonSetInformer extensionsinformers.DaemonSetInfo crControl: controller.RealControllerRevisionControl{ KubeClient: kubeClient, }, - burstReplicas: BurstReplicas, - expectations: controller.NewControllerExpectations(), - queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "daemonset"), + burstReplicas: BurstReplicas, + expectations: controller.NewControllerExpectations(), + queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "daemonset"), + suspendedDaemonPods: map[string]sets.String{}, } daemonSetInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ @@ -191,6 +199,7 @@ func NewDaemonSetsController(daemonSetInformer extensionsinformers.DaemonSetInfo dsc.syncHandler = dsc.syncDaemonSet dsc.enqueueDaemonSet = dsc.enqueue + dsc.enqueueDaemonSetRateLimited = dsc.enqueueRateLimited return dsc } @@ -267,6 +276,16 @@ func (dsc *DaemonSetsController) enqueue(ds *extensions.DaemonSet) { dsc.queue.Add(key) } +func (dsc *DaemonSetsController) enqueueRateLimited(ds *extensions.DaemonSet) { + key, err := controller.KeyFunc(ds) + if err != nil { + utilruntime.HandleError(fmt.Errorf("Couldn't get key for object %#v: %v", ds, err)) + return + } + + dsc.queue.AddRateLimited(key) +} + func (dsc *DaemonSetsController) enqueueDaemonSetAfter(obj interface{}, after time.Duration) { key, err := controller.KeyFunc(obj) if err != nil { @@ -320,7 +339,7 @@ func (dsc *DaemonSetsController) addHistory(obj interface{}) { } // If it has a ControllerRef, that's all that matters. - if controllerRef := controller.GetControllerOf(history); controllerRef != nil { + if controllerRef := metav1.GetControllerOf(history); controllerRef != nil { ds := dsc.resolveControllerRef(history.Namespace, controllerRef) if ds == nil { return @@ -352,8 +371,8 @@ func (dsc *DaemonSetsController) updateHistory(old, cur interface{}) { return } - curControllerRef := controller.GetControllerOf(curHistory) - oldControllerRef := controller.GetControllerOf(oldHistory) + curControllerRef := metav1.GetControllerOf(curHistory) + oldControllerRef := metav1.GetControllerOf(oldHistory) controllerRefChanged := !reflect.DeepEqual(curControllerRef, oldControllerRef) if controllerRefChanged && oldControllerRef != nil { // The ControllerRef was changed. Sync the old controller, if any. @@ -411,7 +430,7 @@ func (dsc *DaemonSetsController) deleteHistory(obj interface{}) { } } - controllerRef := controller.GetControllerOf(history) + controllerRef := metav1.GetControllerOf(history) if controllerRef == nil { // No controller should care about orphans being deleted. return @@ -435,7 +454,7 @@ func (dsc *DaemonSetsController) addPod(obj interface{}) { } // If it has a ControllerRef, that's all that matters. - if controllerRef := controller.GetControllerOf(pod); controllerRef != nil { + if controllerRef := metav1.GetControllerOf(pod); controllerRef != nil { ds := dsc.resolveControllerRef(pod.Namespace, controllerRef) if ds == nil { return @@ -478,8 +497,8 @@ func (dsc *DaemonSetsController) updatePod(old, cur interface{}) { changedToReady := !podutil.IsPodReady(oldPod) && podutil.IsPodReady(curPod) labelChanged := !reflect.DeepEqual(curPod.Labels, oldPod.Labels) - curControllerRef := controller.GetControllerOf(curPod) - oldControllerRef := controller.GetControllerOf(oldPod) + curControllerRef := metav1.GetControllerOf(curPod) + oldControllerRef := metav1.GetControllerOf(oldPod) controllerRefChanged := !reflect.DeepEqual(curControllerRef, oldControllerRef) if controllerRefChanged && oldControllerRef != nil { // The ControllerRef was changed. Sync the old controller, if any. @@ -519,6 +538,67 @@ func (dsc *DaemonSetsController) updatePod(old, cur interface{}) { } } +// listSuspendedDaemonPods lists the Daemon pods that 'want to run, but should not schedule' +// for the node. +func (dsc *DaemonSetsController) listSuspendedDaemonPods(node string) (dss []string) { + dsc.suspendedDaemonPodsMutex.Lock() + defer dsc.suspendedDaemonPodsMutex.Unlock() + + if _, found := dsc.suspendedDaemonPods[node]; !found { + return nil + } + + for k := range dsc.suspendedDaemonPods[node] { + dss = append(dss, k) + } + return +} + +// requeueSuspendedDaemonPods enqueues all DaemonSets which has pods that 'want to run, +// but should not schedule' for the node; so DaemonSetController will sync up them again. +func (dsc *DaemonSetsController) requeueSuspendedDaemonPods(node string) { + dss := dsc.listSuspendedDaemonPods(node) + for _, dsKey := range dss { + if ns, name, err := cache.SplitMetaNamespaceKey(dsKey); err != nil { + glog.Errorf("Failed to get DaemonSet's namespace and name from %s: %v", dsKey, err) + continue + } else if ds, err := dsc.dsLister.DaemonSets(ns).Get(name); err != nil { + glog.Errorf("Failed to get DaemonSet %s/%s: %v", ns, name, err) + continue + } else { + dsc.enqueueDaemonSetRateLimited(ds) + } + } +} + +// addSuspendedDaemonPods adds DaemonSet which has pods that 'want to run, +// but should not schedule' for the node to the suspended queue. +func (dsc *DaemonSetsController) addSuspendedDaemonPods(node, ds string) { + dsc.suspendedDaemonPodsMutex.Lock() + defer dsc.suspendedDaemonPodsMutex.Unlock() + + if _, found := dsc.suspendedDaemonPods[node]; !found { + dsc.suspendedDaemonPods[node] = sets.NewString() + } + dsc.suspendedDaemonPods[node].Insert(ds) +} + +// removeSuspendedDaemonPods removes DaemonSet which has pods that 'want to run, +// but should not schedule' for the node from suspended queue. +func (dsc *DaemonSetsController) removeSuspendedDaemonPods(node, ds string) { + dsc.suspendedDaemonPodsMutex.Lock() + defer dsc.suspendedDaemonPodsMutex.Unlock() + + if _, found := dsc.suspendedDaemonPods[node]; !found { + return + } + dsc.suspendedDaemonPods[node].Delete(ds) + + if len(dsc.suspendedDaemonPods[node]) == 0 { + delete(dsc.suspendedDaemonPods, node) + } +} + func (dsc *DaemonSetsController) deletePod(obj interface{}) { pod, ok := obj.(*v1.Pod) // When a delete is dropped, the relist will notice a pod in the store not @@ -539,13 +619,21 @@ func (dsc *DaemonSetsController) deletePod(obj interface{}) { } } - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { // No controller should care about orphans being deleted. + if len(pod.Spec.NodeName) != 0 { + // If scheduled pods were deleted, requeue suspended daemon pods. + dsc.requeueSuspendedDaemonPods(pod.Spec.NodeName) + } return } ds := dsc.resolveControllerRef(pod.Namespace, controllerRef) if ds == nil { + if len(pod.Spec.NodeName) != 0 { + // If scheduled pods were deleted, requeue suspended daemon pods. + dsc.requeueSuspendedDaemonPods(pod.Spec.NodeName) + } return } dsKey, err := controller.KeyFunc(ds) @@ -729,20 +817,25 @@ func (dsc *DaemonSetsController) manage(ds *extensions.DaemonSet, hash string) e var nodesNeedingDaemonPods, podsToDelete []string var failedPodsObserved int for _, node := range nodeList { - _, shouldSchedule, shouldContinueRunning, err := dsc.nodeShouldRunDaemonPod(node, ds) + wantToRun, shouldSchedule, shouldContinueRunning, err := dsc.nodeShouldRunDaemonPod(node, ds) if err != nil { continue } daemonPods, exists := nodeToDaemonPods[node.Name] + dsKey, _ := cache.MetaNamespaceKeyFunc(ds) + dsc.removeSuspendedDaemonPods(node.Name, dsKey) switch { + case wantToRun && !shouldSchedule: + // If daemon pod is supposed to run, but can not be scheduled, add to suspended list. + dsc.addSuspendedDaemonPods(node.Name, dsKey) case shouldSchedule && !exists: // If daemon pod is supposed to be running on node, but isn't, create daemon pod. nodesNeedingDaemonPods = append(nodesNeedingDaemonPods, node.Name) case shouldContinueRunning: // If a daemon pod failed, delete it - // If there's no daemon pods left on this node, we will create it in the next sync loop + // If there's non-daemon pods left on this node, we will create it in the next sync loop var daemonPodsRunning []*v1.Pod for _, pod := range daemonPods { if pod.Status.Phase == v1.PodFailed { @@ -816,7 +909,7 @@ func (dsc *DaemonSetsController) syncNodes(ds *extensions.DaemonSet, podsToDelet for i := 0; i < createDiff; i++ { go func(ix int) { defer createWait.Done() - err := dsc.podControl.CreatePodsOnNode(nodesNeedingDaemonPods[ix], ds.Namespace, &template, ds, newControllerRef(ds)) + err := dsc.podControl.CreatePodsOnNode(nodesNeedingDaemonPods[ix], ds.Namespace, &template, ds, metav1.NewControllerRef(ds, controllerKind)) if err != nil && errors.IsTimeout(err) { // Pod is created but its initialization has timed out. // If the initialization is successful eventually, the @@ -1053,6 +1146,30 @@ func (dsc *DaemonSetsController) simulate(newPod *v1.Pod, node *v1.Node, ds *ext Effect: v1.TaintEffectNoExecute, }) + // According to TaintNodesByCondition, all DaemonSet pods should tolerate + // MemoryPressure and DisPressure taints, and the critical pods should tolerate + // OutOfDisk taint additional. + v1helper.AddOrUpdateTolerationInPod(newPod, &v1.Toleration{ + Key: algorithm.TaintNodeDiskPressure, + Operator: v1.TolerationOpExists, + Effect: v1.TaintEffectNoSchedule, + }) + + v1helper.AddOrUpdateTolerationInPod(newPod, &v1.Toleration{ + Key: algorithm.TaintNodeMemoryPressure, + Operator: v1.TolerationOpExists, + Effect: v1.TaintEffectNoSchedule, + }) + + if utilfeature.DefaultFeatureGate.Enabled(features.ExperimentalCriticalPodAnnotation) && + kubelettypes.IsCriticalPod(newPod) { + v1helper.AddOrUpdateTolerationInPod(newPod, &v1.Toleration{ + Key: algorithm.TaintNodeOutOfDisk, + Operator: v1.TolerationOpExists, + Effect: v1.TaintEffectNoSchedule, + }) + } + pods := []*v1.Pod{} podList, err := dsc.podLister.List(labels.Everything()) @@ -1068,7 +1185,7 @@ func (dsc *DaemonSetsController) simulate(newPod *v1.Pod, node *v1.Node, ds *ext } // ignore pods that belong to the daemonset when taking into account whether // a daemonset should bind to a node. - if controllerRef := controller.GetControllerOf(pod); controllerRef != nil && controllerRef.UID == ds.UID { + if metav1.IsControlledBy(pod, ds) { continue } pods = append(pods, pod) @@ -1225,6 +1342,11 @@ func Predicates(pod *v1.Pod, nodeInfo *schedulercache.NodeInfo) (bool, []algorit func NodeConditionPredicates(nodeInfo *schedulercache.NodeInfo) (bool, []algorithm.PredicateFailureReason) { reasons := []algorithm.PredicateFailureReason{} + // If TaintNodesByCondition feature was enabled, account PodToleratesNodeTaints predicates. + if utilfeature.DefaultFeatureGate.Enabled(features.TaintNodesByCondition) { + return true, nil + } + for _, c := range nodeInfo.Node().Status.Conditions { // TODO: There are other node status that the DaemonSet should ideally respect too, // e.g. MemoryPressure, and DiskPressure @@ -1237,20 +1359,6 @@ func NodeConditionPredicates(nodeInfo *schedulercache.NodeInfo) (bool, []algorit return len(reasons) == 0, reasons } -// newControllerRef creates a ControllerRef pointing to the given DaemonSet. -func newControllerRef(ds *extensions.DaemonSet) *metav1.OwnerReference { - blockOwnerDeletion := true - isController := true - return &metav1.OwnerReference{ - APIVersion: controllerKind.GroupVersion().String(), - Kind: controllerKind.Kind, - Name: ds.Name, - UID: ds.UID, - BlockOwnerDeletion: &blockOwnerDeletion, - Controller: &isController, - } -} - // byCreationTimestamp sorts a list by creation timestamp, using their names as a tie breaker. type byCreationTimestamp []*extensions.DaemonSet diff --git a/pkg/controller/daemon/daemon_controller_test.go b/pkg/controller/daemon/daemon_controller_test.go index 921cd6fc3dd..f8e49d48854 100644 --- a/pkg/controller/daemon/daemon_controller_test.go +++ b/pkg/controller/daemon/daemon_controller_test.go @@ -201,7 +201,7 @@ func newPod(podName string, nodeName string, label map[string]string, ds *extens } pod.Name = names.SimpleNameGenerator.GenerateName(podName) if ds != nil { - pod.OwnerReferences = []metav1.OwnerReference{*newControllerRef(ds)} + pod.OwnerReferences = []metav1.OwnerReference{*metav1.NewControllerRef(ds, controllerKind)} } return pod } @@ -1251,6 +1251,68 @@ func TestOutOfDiskNodeDaemonLaunchesCriticalPod(t *testing.T) { } } +// DaemonSet should launch a critical pod even when the node with OutOfDisk taints. +func TestTaintOutOfDiskNodeDaemonLaunchesCriticalPod(t *testing.T) { + for _, strategy := range updateStrategies() { + ds := newDaemonSet("critical") + ds.Spec.UpdateStrategy = *strategy + setDaemonSetCritical(ds) + manager, podControl, _ := newTestController(ds) + + node := newNode("not-enough-disk", nil) + node.Status.Conditions = []v1.NodeCondition{{Type: v1.NodeOutOfDisk, Status: v1.ConditionTrue}} + node.Spec.Taints = []v1.Taint{{Key: algorithm.TaintNodeOutOfDisk, Effect: v1.TaintEffectNoSchedule}} + manager.nodeStore.Add(node) + + // NOTE: Whether or not TaintNodesByCondition is enabled, it'll add toleration to DaemonSet pods. + + // Without enabling critical pod annotation feature gate, we shouldn't create critical pod + utilfeature.DefaultFeatureGate.Set("ExperimentalCriticalPodAnnotation=False") + utilfeature.DefaultFeatureGate.Set("TaintNodesByCondition=True") + manager.dsStore.Add(ds) + syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0, 0) + + // With enabling critical pod annotation feature gate, we will create critical pod + utilfeature.DefaultFeatureGate.Set("ExperimentalCriticalPodAnnotation=True") + utilfeature.DefaultFeatureGate.Set("TaintNodesByCondition=False") + manager.dsStore.Add(ds) + syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0, 0) + + // Rollback feature gate to false. + utilfeature.DefaultFeatureGate.Set("TaintNodesByCondition=False") + utilfeature.DefaultFeatureGate.Set("ExperimentalCriticalPodAnnotation=False") + } +} + +// DaemonSet should launch a pod even when the node with MemoryPressure/DiskPressure taints. +func TestTaintPressureNodeDaemonLaunchesPod(t *testing.T) { + for _, strategy := range updateStrategies() { + ds := newDaemonSet("critical") + ds.Spec.UpdateStrategy = *strategy + setDaemonSetCritical(ds) + manager, podControl, _ := newTestController(ds) + + node := newNode("resources-pressure", nil) + node.Status.Conditions = []v1.NodeCondition{ + {Type: v1.NodeDiskPressure, Status: v1.ConditionTrue}, + {Type: v1.NodeMemoryPressure, Status: v1.ConditionTrue}, + } + node.Spec.Taints = []v1.Taint{ + {Key: algorithm.TaintNodeDiskPressure, Effect: v1.TaintEffectNoSchedule}, + {Key: algorithm.TaintNodeMemoryPressure, Effect: v1.TaintEffectNoSchedule}, + } + manager.nodeStore.Add(node) + + // Enabling critical pod and taint nodes by condition feature gate should create critical pod + utilfeature.DefaultFeatureGate.Set("TaintNodesByCondition=True") + manager.dsStore.Add(ds) + syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0, 0) + + // Rollback feature gate to false. + utilfeature.DefaultFeatureGate.Set("TaintNodesByCondition=False") + } +} + // DaemonSet should launch a critical pod even when the node has insufficient free resource. func TestInsufficientCapacityNodeDaemonLaunchesCriticalPod(t *testing.T) { for _, strategy := range updateStrategies() { @@ -1514,7 +1576,6 @@ func TestUpdateNode(t *testing.T) { {Type: v1.NodeMemoryPressure, Status: v1.ConditionFalse}, {Type: v1.NodeDiskPressure, Status: v1.ConditionFalse}, {Type: v1.NodeNetworkUnavailable, Status: v1.ConditionFalse}, - {Type: v1.NodeInodePressure, Status: v1.ConditionFalse}, } return node }(), @@ -1522,7 +1583,6 @@ func TestUpdateNode(t *testing.T) { node := newNode("node1", nil) node.Status.Conditions = []v1.NodeCondition{ {Type: v1.NodeOutOfDisk, Status: v1.ConditionTrue}, - {Type: v1.NodeInodePressure, Status: v1.ConditionFalse}, } return node }(), @@ -1553,6 +1613,179 @@ func TestUpdateNode(t *testing.T) { } } +// DaemonSets should be resynced when non-daemon pods was deleted. +func TestDeleteNoDaemonPod(t *testing.T) { + var enqueued bool + + cases := []struct { + test string + node *v1.Node + existPods []*v1.Pod + deletedPod *v1.Pod + ds *extensions.DaemonSet + shouldEnqueue bool + }{ + { + test: "Deleted non-daemon pods to release resources", + node: func() *v1.Node { + node := newNode("node1", nil) + node.Status.Conditions = []v1.NodeCondition{ + {Type: v1.NodeReady, Status: v1.ConditionTrue}, + } + node.Status.Allocatable = allocatableResources("200M", "200m") + return node + }(), + existPods: func() []*v1.Pod { + pods := []*v1.Pod{} + for i := 0; i < 4; i++ { + podSpec := resourcePodSpec("node1", "50M", "50m") + pods = append(pods, &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: fmt.Sprintf("pod_%d", i), + }, + Spec: podSpec, + }) + } + return pods + }(), + deletedPod: func() *v1.Pod { + podSpec := resourcePodSpec("node1", "50M", "50m") + return &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod_0", + }, + Spec: podSpec, + } + }(), + ds: func() *extensions.DaemonSet { + ds := newDaemonSet("ds") + ds.Spec.Template.Spec = resourcePodSpec("", "50M", "50m") + return ds + }(), + shouldEnqueue: true, + }, + { + test: "Deleted non-daemon pods (with controller) to release resources", + node: func() *v1.Node { + node := newNode("node1", nil) + node.Status.Conditions = []v1.NodeCondition{ + {Type: v1.NodeReady, Status: v1.ConditionTrue}, + } + node.Status.Allocatable = allocatableResources("200M", "200m") + return node + }(), + existPods: func() []*v1.Pod { + pods := []*v1.Pod{} + for i := 0; i < 4; i++ { + podSpec := resourcePodSpec("node1", "50M", "50m") + pods = append(pods, &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: fmt.Sprintf("pod_%d", i), + OwnerReferences: []metav1.OwnerReference{ + {Controller: func() *bool { res := true; return &res }()}, + }, + }, + Spec: podSpec, + }) + } + return pods + }(), + deletedPod: func() *v1.Pod { + podSpec := resourcePodSpec("node1", "50M", "50m") + return &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod_0", + OwnerReferences: []metav1.OwnerReference{ + {Controller: func() *bool { res := true; return &res }()}, + }, + }, + Spec: podSpec, + } + }(), + ds: func() *extensions.DaemonSet { + ds := newDaemonSet("ds") + ds.Spec.Template.Spec = resourcePodSpec("", "50M", "50m") + return ds + }(), + shouldEnqueue: true, + }, + { + test: "Deleted no scheduled pods", + node: func() *v1.Node { + node := newNode("node1", nil) + node.Status.Conditions = []v1.NodeCondition{ + {Type: v1.NodeReady, Status: v1.ConditionTrue}, + } + node.Status.Allocatable = allocatableResources("200M", "200m") + return node + }(), + existPods: func() []*v1.Pod { + pods := []*v1.Pod{} + for i := 0; i < 4; i++ { + podSpec := resourcePodSpec("node1", "50M", "50m") + pods = append(pods, &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: fmt.Sprintf("pod_%d", i), + OwnerReferences: []metav1.OwnerReference{ + {Controller: func() *bool { res := true; return &res }()}, + }, + }, + Spec: podSpec, + }) + } + return pods + }(), + deletedPod: func() *v1.Pod { + podSpec := resourcePodSpec("", "50M", "50m") + return &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod_5", + }, + Spec: podSpec, + } + }(), + ds: func() *extensions.DaemonSet { + ds := newDaemonSet("ds") + ds.Spec.Template.Spec = resourcePodSpec("", "50M", "50m") + return ds + }(), + shouldEnqueue: false, + }, + } + + for _, c := range cases { + for _, strategy := range updateStrategies() { + manager, podControl, _ := newTestController() + manager.nodeStore.Add(c.node) + c.ds.Spec.UpdateStrategy = *strategy + manager.dsStore.Add(c.ds) + for _, pod := range c.existPods { + manager.podStore.Add(pod) + } + switch strategy.Type { + case extensions.OnDeleteDaemonSetStrategyType: + syncAndValidateDaemonSets(t, manager, c.ds, podControl, 0, 0, 2) + case extensions.RollingUpdateDaemonSetStrategyType: + syncAndValidateDaemonSets(t, manager, c.ds, podControl, 0, 0, 3) + default: + t.Fatalf("unexpected UpdateStrategy %+v", strategy) + } + + manager.enqueueDaemonSetRateLimited = func(ds *extensions.DaemonSet) { + if ds.Name == "ds" { + enqueued = true + } + } + + enqueued = false + manager.deletePod(c.deletedPod) + if enqueued != c.shouldEnqueue { + t.Errorf("Test case: '%s', expected: %t, got: %t", c.test, c.shouldEnqueue, enqueued) + } + } + } +} + func TestGetNodesToDaemonPods(t *testing.T) { for _, strategy := range updateStrategies() { ds := newDaemonSet("foo") @@ -1808,7 +2041,7 @@ func TestUpdatePodChangeControllerRef(t *testing.T) { pod := newPod("pod1-", "node-0", simpleDaemonSetLabel, ds1) prev := *pod - prev.OwnerReferences = []metav1.OwnerReference{*newControllerRef(ds2)} + prev.OwnerReferences = []metav1.OwnerReference{*metav1.NewControllerRef(ds2, controllerKind)} bumpResourceVersion(pod) manager.updatePod(&prev, pod) if got, want := manager.queue.Len(), 2; got != want { diff --git a/pkg/controller/daemon/update.go b/pkg/controller/daemon/update.go index 6c765d0da69..72486594f0e 100644 --- a/pkg/controller/daemon/update.go +++ b/pkg/controller/daemon/update.go @@ -339,7 +339,7 @@ func (dsc *DaemonSetsController) snapshot(ds *extensions.DaemonSet, revision int Namespace: ds.Namespace, Labels: labelsutil.CloneAndAddLabel(ds.Spec.Template.Labels, extensions.DefaultDaemonSetUniqueLabelKey, hash), Annotations: ds.Annotations, - OwnerReferences: []metav1.OwnerReference{*newControllerRef(ds)}, + OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(ds, controllerKind)}, }, Data: runtime.RawExtension{Raw: patch}, Revision: revision, diff --git a/pkg/controller/daemon/util/BUILD b/pkg/controller/daemon/util/BUILD index a14a6b39c07..ef9e766ab26 100644 --- a/pkg/controller/daemon/util/BUILD +++ b/pkg/controller/daemon/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,15 +9,17 @@ load( go_library( name = "go_default_library", srcs = ["daemonset_util.go"], - tags = ["automanaged"], deps = [ "//pkg/api/v1/helper:go_default_library", "//pkg/api/v1/pod:go_default_library", + "//pkg/features:go_default_library", + "//pkg/kubelet/types:go_default_library", "//pkg/util/labels:go_default_library", "//plugin/pkg/scheduler/algorithm: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/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", ], ) @@ -41,7 +41,6 @@ go_test( name = "go_default_test", srcs = ["daemonset_util_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api/testapi:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/controller/daemon/util/daemonset_util.go b/pkg/controller/daemon/util/daemonset_util.go index 8c0bc1aaa32..ebb8f86a18b 100644 --- a/pkg/controller/daemon/util/daemonset_util.go +++ b/pkg/controller/daemon/util/daemonset_util.go @@ -22,9 +22,12 @@ import ( "k8s.io/api/core/v1" extensions "k8s.io/api/extensions/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/kubernetes/scheme" v1helper "k8s.io/kubernetes/pkg/api/v1/helper" podutil "k8s.io/kubernetes/pkg/api/v1/pod" + "k8s.io/kubernetes/pkg/features" + kubelettypes "k8s.io/kubernetes/pkg/kubelet/types" labelsutil "k8s.io/kubernetes/pkg/util/labels" "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm" ) @@ -55,6 +58,30 @@ func CreatePodTemplate(template v1.PodTemplateSpec, generation int64, hash strin Effect: v1.TaintEffectNoExecute, }) + // According to TaintNodesByCondition feature, all DaemonSet pods should tolerate + // MemoryPressure and DisPressure taints, and the critical pods should tolerate + // OutOfDisk taint. + v1helper.AddOrUpdateTolerationInPodSpec(&newTemplate.Spec, &v1.Toleration{ + Key: algorithm.TaintNodeDiskPressure, + Operator: v1.TolerationOpExists, + Effect: v1.TaintEffectNoSchedule, + }) + + v1helper.AddOrUpdateTolerationInPodSpec(&newTemplate.Spec, &v1.Toleration{ + Key: algorithm.TaintNodeMemoryPressure, + Operator: v1.TolerationOpExists, + Effect: v1.TaintEffectNoSchedule, + }) + + if utilfeature.DefaultFeatureGate.Enabled(features.ExperimentalCriticalPodAnnotation) && + kubelettypes.IsCritical(newTemplate.Namespace, newTemplate.Annotations) { + v1helper.AddOrUpdateTolerationInPodSpec(&newTemplate.Spec, &v1.Toleration{ + Key: algorithm.TaintNodeOutOfDisk, + Operator: v1.TolerationOpExists, + Effect: v1.TaintEffectNoExecute, + }) + } + templateGenerationStr := fmt.Sprint(generation) newTemplate.ObjectMeta.Labels = labelsutil.CloneAndAddLabel( template.ObjectMeta.Labels, diff --git a/pkg/controller/deployment/BUILD b/pkg/controller/deployment/BUILD index 311c3c0ddfb..1165b0b405d 100644 --- a/pkg/controller/deployment/BUILD +++ b/pkg/controller/deployment/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "rolling.go", "sync.go", ], - tags = ["automanaged"], deps = [ "//pkg/controller:go_default_library", "//pkg/controller/deployment/util:go_default_library", @@ -58,7 +55,6 @@ go_test( "sync_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", diff --git a/pkg/controller/deployment/deployment_controller.go b/pkg/controller/deployment/deployment_controller.go index f9c2f0ad26e..5dc5a8a773e 100644 --- a/pkg/controller/deployment/deployment_controller.go +++ b/pkg/controller/deployment/deployment_controller.go @@ -205,7 +205,7 @@ func (dc *DeploymentController) addReplicaSet(obj interface{}) { } // If it has a ControllerRef, that's all that matters. - if controllerRef := controller.GetControllerOf(rs); controllerRef != nil { + if controllerRef := metav1.GetControllerOf(rs); controllerRef != nil { d := dc.resolveControllerRef(rs.Namespace, controllerRef) if d == nil { return @@ -260,8 +260,8 @@ func (dc *DeploymentController) updateReplicaSet(old, cur interface{}) { return } - curControllerRef := controller.GetControllerOf(curRS) - oldControllerRef := controller.GetControllerOf(oldRS) + curControllerRef := metav1.GetControllerOf(curRS) + oldControllerRef := metav1.GetControllerOf(oldRS) controllerRefChanged := !reflect.DeepEqual(curControllerRef, oldControllerRef) if controllerRefChanged && oldControllerRef != nil { // The ControllerRef was changed. Sync the old controller, if any. @@ -319,7 +319,7 @@ func (dc *DeploymentController) deleteReplicaSet(obj interface{}) { } } - controllerRef := controller.GetControllerOf(rs) + controllerRef := metav1.GetControllerOf(rs) if controllerRef == nil { // No controller should care about orphans being deleted. return @@ -409,7 +409,7 @@ func (dc *DeploymentController) getDeploymentForPod(pod *v1.Pod) *extensions.Dep // Find the owning replica set var rs *extensions.ReplicaSet var err error - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { // No controller owns this Pod. return nil @@ -425,7 +425,7 @@ func (dc *DeploymentController) getDeploymentForPod(pod *v1.Pod) *extensions.Dep } // Now find the Deployment that owns that ReplicaSet. - controllerRef = controller.GetControllerOf(rs) + controllerRef = metav1.GetControllerOf(rs) if controllerRef == nil { return nil } @@ -542,7 +542,7 @@ func (dc *DeploymentController) getPodMapForDeployment(d *extensions.Deployment, for _, pod := range pods { // Do not ignore inactive Pods because Recreate Deployments need to verify that no // Pods from older versions are running before spinning up new Pods. - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { continue } diff --git a/pkg/controller/deployment/deployment_controller_test.go b/pkg/controller/deployment/deployment_controller_test.go index 9298e53e6d6..6fbc0de699f 100644 --- a/pkg/controller/deployment/deployment_controller_test.go +++ b/pkg/controller/deployment/deployment_controller_test.go @@ -126,7 +126,7 @@ func newReplicaSet(d *extensions.Deployment, name string, replicas int) *extensi UID: uuid.NewUUID(), Namespace: metav1.NamespaceDefault, Labels: d.Spec.Selector.MatchLabels, - OwnerReferences: []metav1.OwnerReference{*newControllerRef(d)}, + OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(d, controllerKind)}, }, Spec: extensions.ReplicaSetSpec{ Selector: d.Spec.Selector, @@ -810,7 +810,7 @@ func TestUpdateReplicaSetChangeControllerRef(t *testing.T) { // Change ControllerRef and expect both old and new to queue. prev := *rs - prev.OwnerReferences = []metav1.OwnerReference{*newControllerRef(d2)} + prev.OwnerReferences = []metav1.OwnerReference{*metav1.NewControllerRef(d2, controllerKind)} next := *rs bumpResourceVersion(&next) dc.updateReplicaSet(&prev, &next) diff --git a/pkg/controller/deployment/sync.go b/pkg/controller/deployment/sync.go index cb0e993ec62..a1a85a5a8f7 100644 --- a/pkg/controller/deployment/sync.go +++ b/pkg/controller/deployment/sync.go @@ -306,7 +306,7 @@ func (dc *DeploymentController) getNewReplicaSet(d *extensions.Deployment, rsLis // Make the name deterministic, to ensure idempotence Name: d.Name + "-" + podTemplateSpecHash, Namespace: d.Namespace, - OwnerReferences: []metav1.OwnerReference{*newControllerRef(d)}, + OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(d, controllerKind)}, }, Spec: extensions.ReplicaSetSpec{ Replicas: new(int32), @@ -651,17 +651,3 @@ func (dc *DeploymentController) isScalingEvent(d *extensions.Deployment, rsList } return false, nil } - -// newControllerRef returns a ControllerRef pointing to the deployment. -func newControllerRef(d *extensions.Deployment) *metav1.OwnerReference { - blockOwnerDeletion := true - isController := true - return &metav1.OwnerReference{ - APIVersion: controllerKind.GroupVersion().String(), - Kind: controllerKind.Kind, - Name: d.Name, - UID: d.UID, - BlockOwnerDeletion: &blockOwnerDeletion, - Controller: &isController, - } -} diff --git a/pkg/controller/deployment/util/BUILD b/pkg/controller/deployment/util/BUILD index e50adc15cf7..f08e5006afa 100644 --- a/pkg/controller/deployment/util/BUILD +++ b/pkg/controller/deployment/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "pod_util.go", "replicaset_util.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/extensions:go_default_library", "//pkg/client/retry:go_default_library", @@ -49,7 +46,6 @@ go_test( "hash_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api/v1:go_default_library", "//pkg/controller:go_default_library", diff --git a/pkg/controller/deployment/util/deployment_util.go b/pkg/controller/deployment/util/deployment_util.go index 47eea5d3c39..9e825e38502 100644 --- a/pkg/controller/deployment/util/deployment_util.go +++ b/pkg/controller/deployment/util/deployment_util.go @@ -580,8 +580,7 @@ func ListReplicaSets(deployment *extensions.Deployment, getRSList RsListFunc) ([ // Only include those whose ControllerRef matches the Deployment. owned := make([]*extensions.ReplicaSet, 0, len(all)) for _, rs := range all { - controllerRef := controller.GetControllerOf(rs) - if controllerRef != nil && controllerRef.UID == deployment.UID { + if metav1.IsControlledBy(rs, deployment) { owned = append(owned, rs) } } @@ -604,8 +603,7 @@ func ListReplicaSetsInternal(deployment *internalextensions.Deployment, getRSLis // Only include those whose ControllerRef matches the Deployment. filtered := make([]*internalextensions.ReplicaSet, 0, len(all)) for _, rs := range all { - controllerRef := controller.GetControllerOf(rs) - if controllerRef != nil && controllerRef.UID == deployment.UID { + if metav1.IsControlledBy(rs, deployment) { filtered = append(filtered, rs) } } @@ -638,7 +636,7 @@ func ListPods(deployment *extensions.Deployment, rsList []*extensions.ReplicaSet owned := &v1.PodList{Items: make([]v1.Pod, 0, len(all.Items))} for i := range all.Items { pod := &all.Items[i] - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef != nil && rsMap[controllerRef.UID] { owned.Items = append(owned.Items, *pod) } diff --git a/pkg/controller/deployment/util/deployment_util_test.go b/pkg/controller/deployment/util/deployment_util_test.go index 3540198a918..cd45519f0ce 100644 --- a/pkg/controller/deployment/util/deployment_util_test.go +++ b/pkg/controller/deployment/util/deployment_util_test.go @@ -35,7 +35,7 @@ import ( "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/scheme" core "k8s.io/client-go/testing" - k8s_api_v1 "k8s.io/kubernetes/pkg/api/v1" + apiv1 "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/controller" ) @@ -147,7 +147,7 @@ func generatePod(labels map[string]string, image string) v1.Pod { func generateRSWithLabel(labels map[string]string, image string) extensions.ReplicaSet { return extensions.ReplicaSet{ ObjectMeta: metav1.ObjectMeta{ - Name: k8s_api_v1.SimpleNameGenerator.GenerateName("replicaset"), + Name: apiv1.SimpleNameGenerator.GenerateName("replicaset"), Labels: labels, }, Spec: extensions.ReplicaSetSpec{ @@ -190,7 +190,7 @@ func generateRS(deployment extensions.Deployment) extensions.ReplicaSet { return extensions.ReplicaSet{ ObjectMeta: metav1.ObjectMeta{ UID: randomUID(), - Name: k8s_api_v1.SimpleNameGenerator.GenerateName("replicaset"), + Name: apiv1.SimpleNameGenerator.GenerateName("replicaset"), Labels: template.Labels, OwnerReferences: []metav1.OwnerReference{*newDControllerRef(&deployment)}, }, diff --git a/pkg/controller/disruption/BUILD b/pkg/controller/disruption/BUILD index efde431a2a8..0a804cabb16 100644 --- a/pkg/controller/disruption/BUILD +++ b/pkg/controller/disruption/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["disruption.go"], - tags = ["automanaged"], deps = [ "//pkg/api/v1/pod:go_default_library", "//pkg/controller:go_default_library", @@ -48,7 +45,6 @@ go_test( name = "go_default_test", srcs = ["disruption_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", diff --git a/pkg/controller/disruption/disruption.go b/pkg/controller/disruption/disruption.go index 3755641865c..0f27683d982 100644 --- a/pkg/controller/disruption/disruption.go +++ b/pkg/controller/disruption/disruption.go @@ -184,7 +184,7 @@ var ( // getPodReplicaSets finds replicasets which have no matching deployments. func (dc *DisruptionController) getPodReplicaSets(pod *v1.Pod) ([]controllerAndScale, error) { var casSlice []controllerAndScale - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { return nil, nil } @@ -199,7 +199,7 @@ func (dc *DisruptionController) getPodReplicaSets(pod *v1.Pod) ([]controllerAndS if rs.UID != controllerRef.UID { return nil, nil } - controllerRef = controller.GetControllerOf(rs) + controllerRef = metav1.GetControllerOf(rs) if controllerRef != nil && controllerRef.Kind == controllerKindDep.Kind { // Skip RS if it's controlled by a Deployment. return nil, nil @@ -211,7 +211,7 @@ func (dc *DisruptionController) getPodReplicaSets(pod *v1.Pod) ([]controllerAndS // getPodStatefulSet returns the statefulset managing the given pod. func (dc *DisruptionController) getPodStatefulSets(pod *v1.Pod) ([]controllerAndScale, error) { var casSlice []controllerAndScale - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { return nil, nil } @@ -234,7 +234,7 @@ func (dc *DisruptionController) getPodStatefulSets(pod *v1.Pod) ([]controllerAnd // getPodDeployments finds deployments for any replicasets which are being managed by deployments. func (dc *DisruptionController) getPodDeployments(pod *v1.Pod) ([]controllerAndScale, error) { var casSlice []controllerAndScale - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { return nil, nil } @@ -249,7 +249,7 @@ func (dc *DisruptionController) getPodDeployments(pod *v1.Pod) ([]controllerAndS if rs.UID != controllerRef.UID { return nil, nil } - controllerRef = controller.GetControllerOf(rs) + controllerRef = metav1.GetControllerOf(rs) if controllerRef == nil { return nil, nil } @@ -270,7 +270,7 @@ func (dc *DisruptionController) getPodDeployments(pod *v1.Pod) ([]controllerAndS func (dc *DisruptionController) getPodReplicationControllers(pod *v1.Pod) ([]controllerAndScale, error) { var casSlice []controllerAndScale - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { return nil, nil } diff --git a/pkg/controller/endpoint/BUILD b/pkg/controller/endpoint/BUILD index 80e14e0fa13..b38b5bb113b 100644 --- a/pkg/controller/endpoint/BUILD +++ b/pkg/controller/endpoint/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "endpoints_controller.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1/endpoints:go_default_library", @@ -43,7 +40,6 @@ go_test( name = "go_default_test", srcs = ["endpoints_controller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", diff --git a/pkg/controller/endpoint/OWNERS b/pkg/controller/endpoint/OWNERS index 3bb8ef23f46..d830b4e1b29 100755 --- a/pkg/controller/endpoint/OWNERS +++ b/pkg/controller/endpoint/OWNERS @@ -2,4 +2,4 @@ reviewers: - bowei - MrHohn - thockin -- mrubin +- matchstick diff --git a/pkg/controller/endpoint/endpoints_controller.go b/pkg/controller/endpoint/endpoints_controller.go index fcc0991d412..78bdf615d3f 100644 --- a/pkg/controller/endpoint/endpoints_controller.go +++ b/pkg/controller/endpoint/endpoints_controller.go @@ -63,6 +63,8 @@ const ( // receiving traffic for the Service from the moment the kubelet starts all // containers in the pod and marks it "Running", till the kubelet stops all // containers and deletes the pod from the apiserver. + // This field is deprecated. v1.Service.PublishNotReadyAddresses will replace it + // subsequent releases. TolerateUnreadyEndpointsAnnotation = "service.alpha.kubernetes.io/tolerate-unready-endpoints" ) @@ -328,12 +330,6 @@ func (e *EndpointController) syncService(key string) error { // service is deleted. However, if we're down at the time when // the service is deleted, we will miss that deletion, so this // doesn't completely solve the problem. See #6877. - namespace, name, err := cache.SplitMetaNamespaceKey(key) - if err != nil { - utilruntime.HandleError(fmt.Errorf("Need to delete endpoint with key %q, but couldn't understand the key: %v", key, err)) - // Don't retry, as the key isn't going to magically become understandable. - return nil - } err = e.client.Core().Endpoints(namespace).Delete(name, nil) if err != nil && !errors.IsNotFound(err) { return err diff --git a/pkg/controller/garbagecollector/BUILD b/pkg/controller/garbagecollector/BUILD index 9e83bf044bb..2e29fd0f477 100644 --- a/pkg/controller/garbagecollector/BUILD +++ b/pkg/controller/garbagecollector/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -20,7 +18,6 @@ go_library( "rate_limiter_helper.go", "uid_cache.go", ], - tags = ["automanaged"], deps = [ "//pkg/client/retry:go_default_library", "//pkg/controller:go_default_library", @@ -55,7 +52,6 @@ go_test( name = "go_default_test", srcs = ["garbagecollector_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", diff --git a/pkg/controller/garbagecollector/garbagecollector.go b/pkg/controller/garbagecollector/garbagecollector.go index 8732078fa8d..efffc5a91fd 100644 --- a/pkg/controller/garbagecollector/garbagecollector.go +++ b/pkg/controller/garbagecollector/garbagecollector.go @@ -18,6 +18,7 @@ package garbagecollector import ( "fmt" + "reflect" "sync" "time" @@ -59,7 +60,7 @@ const ResourceResyncTime time.Duration = 0 // ensures that the garbage collector operates with a graph that is at least as // up to date as the notification is sent. type GarbageCollector struct { - restMapper meta.RESTMapper + restMapper resettableRESTMapper // clientPool uses the regular dynamicCodec. We need it to update // finalizers. It can be removed if we support patching finalizers. clientPool dynamic.ClientPool @@ -81,7 +82,7 @@ type GarbageCollector struct { func NewGarbageCollector( metaOnlyClientPool dynamic.ClientPool, clientPool dynamic.ClientPool, - mapper meta.RESTMapper, + mapper resettableRESTMapper, deletableResources map[schema.GroupVersionResource]struct{}, ignoredResources map[schema.GroupResource]struct{}, sharedInformers informers.SharedInformerFactory, @@ -162,25 +163,59 @@ type resettableRESTMapper interface { Reset() } -// Sync periodically resyncs the garbage collector monitors with resources -// returned found via the discoveryClient. Sync blocks, continuing to sync until -// a message is received on stopCh. +// Sync periodically resyncs the garbage collector when new resources are +// observed from discovery. When new resources are detected, Sync will stop all +// GC workers, reset gc.restMapper, and resync the monitors. // -// The discoveryClient should be the same client which underlies restMapper. -func (gc *GarbageCollector) Sync(restMapper resettableRESTMapper, discoveryClient discovery.DiscoveryInterface, period time.Duration, stopCh <-chan struct{}) { +// Note that discoveryClient should NOT be shared with gc.restMapper, otherwise +// the mapper's underlying discovery client will be unnecessarily reset during +// the course of detecting new resources. +func (gc *GarbageCollector) Sync(discoveryClient discovery.DiscoveryInterface, period time.Duration, stopCh <-chan struct{}) { + oldResources := make(map[schema.GroupVersionResource]struct{}) wait.Until(func() { + // Get the current resource list from discovery. + newResources, err := GetDeletableResources(discoveryClient) + if err != nil { + utilruntime.HandleError(err) + return + } + + // Detect first or abnormal sync and try again later. + if oldResources == nil || len(oldResources) == 0 { + oldResources = newResources + return + } + + // Decide whether discovery has reported a change. + if reflect.DeepEqual(oldResources, newResources) { + glog.V(5).Infof("no resource updates from discovery, skipping garbage collector sync") + return + } + + // Something has changed, so track the new state and perform a sync. + glog.V(2).Infof("syncing garbage collector with updated resources from discovery: %v", newResources) + oldResources = newResources + // Ensure workers are paused to avoid processing events before informers // have resynced. gc.workerLock.Lock() defer gc.workerLock.Unlock() - restMapper.Reset() - deletableResources, err := GetDeletableResources(discoveryClient) - if err != nil { - utilruntime.HandleError(err) - return - } - if err := gc.resyncMonitors(deletableResources); err != nil { + // Resetting the REST mapper will also invalidate the underlying discovery + // client. This is a leaky abstraction and assumes behavior about the REST + // mapper, but we'll deal with it for now. + gc.restMapper.Reset() + + // Perform the monitor resync and wait for controllers to report cache sync. + // + // NOTE: It's possible that newResources will diverge from the resources + // discovered by restMapper during the call to Reset, since they are + // distinct discovery clients invalidated at different times. For example, + // newResources may contain resources not returned in the restMapper's + // discovery call if the resources appeared inbetween the calls. In that + // case, the restMapper will fail to map some of newResources until the next + // sync period. + if err := gc.resyncMonitors(newResources); err != nil { utilruntime.HandleError(fmt.Errorf("failed to sync resource monitors: %v", err)) return } diff --git a/pkg/controller/garbagecollector/garbagecollector_test.go b/pkg/controller/garbagecollector/garbagecollector_test.go index 37fcd20069a..4ba3c90c8cc 100644 --- a/pkg/controller/garbagecollector/garbagecollector_test.go +++ b/pkg/controller/garbagecollector/garbagecollector_test.go @@ -46,11 +46,17 @@ import ( "k8s.io/kubernetes/pkg/controller/garbagecollector/metaonly" ) +type testRESTMapper struct { + meta.RESTMapper +} + +func (_ *testRESTMapper) Reset() {} + func TestGarbageCollectorConstruction(t *testing.T) { config := &restclient.Config{} config.ContentConfig.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: metaonly.NewMetadataCodecFactory()} tweakableRM := meta.NewDefaultRESTMapper(nil, nil) - rm := meta.MultiRESTMapper{tweakableRM, api.Registry.RESTMapper()} + rm := &testRESTMapper{meta.MultiRESTMapper{tweakableRM, api.Registry.RESTMapper()}} metaOnlyClientPool := dynamic.NewClientPool(config, rm, dynamic.LegacyAPIPathResolverFunc) config.ContentConfig.NegotiatedSerializer = nil clientPool := dynamic.NewClientPool(config, rm, dynamic.LegacyAPIPathResolverFunc) @@ -168,7 +174,7 @@ func setupGC(t *testing.T, config *restclient.Config) garbageCollector { podResource := map[schema.GroupVersionResource]struct{}{{Version: "v1", Resource: "pods"}: {}} client := fake.NewSimpleClientset() sharedInformers := informers.NewSharedInformerFactory(client, 0) - gc, err := NewGarbageCollector(metaOnlyClientPool, clientPool, api.Registry.RESTMapper(), podResource, ignoredResources, sharedInformers) + gc, err := NewGarbageCollector(metaOnlyClientPool, clientPool, &testRESTMapper{api.Registry.RESTMapper()}, podResource, ignoredResources, sharedInformers) if err != nil { t.Fatal(err) } diff --git a/pkg/controller/garbagecollector/metaonly/BUILD b/pkg/controller/garbagecollector/metaonly/BUILD index 590f99120da..38c8ec5f75f 100644 --- a/pkg/controller/garbagecollector/metaonly/BUILD +++ b/pkg/controller/garbagecollector/metaonly/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/github.com/ugorji/go/codec:go_default_library", @@ -33,7 +30,6 @@ go_test( name = "go_default_test", srcs = ["metaonly_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api/install:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/controller/history/BUILD b/pkg/controller/history/BUILD index a451a15c3d9..dee62672b23 100644 --- a/pkg/controller/history/BUILD +++ b/pkg/controller/history/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["controller_history_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api/testapi:go_default_library", "//pkg/controller:go_default_library", @@ -34,10 +31,8 @@ go_test( go_library( name = "go_default_library", srcs = ["controller_history.go"], - tags = ["automanaged"], deps = [ "//pkg/client/retry:go_default_library", - "//pkg/controller:go_default_library", "//pkg/util/hash:go_default_library", "//vendor/k8s.io/api/apps/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", diff --git a/pkg/controller/history/controller_history.go b/pkg/controller/history/controller_history.go index f9d461fc6fc..da77be2c217 100644 --- a/pkg/controller/history/controller_history.go +++ b/pkg/controller/history/controller_history.go @@ -27,7 +27,6 @@ import ( appsinformers "k8s.io/client-go/informers/apps/v1beta1" clientset "k8s.io/client-go/kubernetes" appslisters "k8s.io/client-go/listers/apps/v1beta1" - "k8s.io/kubernetes/pkg/controller" hashutil "k8s.io/kubernetes/pkg/util/hash" apiequality "k8s.io/apimachinery/pkg/api/equality" @@ -225,7 +224,7 @@ func (rh *realHistory) ListControllerRevisions(parent metav1.Object, selector la } var owned []*apps.ControllerRevision for i := range history { - ref := controller.GetControllerOf(history[i]) + ref := metav1.GetControllerOf(history[i]) if ref == nil || ref.UID == parent.GetUID() { owned = append(owned, history[i]) } @@ -302,7 +301,7 @@ func (rh *realHistory) DeleteControllerRevision(revision *apps.ControllerRevisio func (rh *realHistory) AdoptControllerRevision(parent metav1.Object, parentKind schema.GroupVersionKind, revision *apps.ControllerRevision) (*apps.ControllerRevision, error) { // Return an error if the parent does not own the revision - if owner := controller.GetControllerOf(revision); owner != nil { + if owner := metav1.GetControllerOf(revision); owner != nil { return nil, fmt.Errorf("attempt to adopt revision owned by %v", owner) } // Use strategic merge patch to add an owner reference indicating a controller ref @@ -346,7 +345,7 @@ func (fh *fakeHistory) ListControllerRevisions(parent metav1.Object, selector la var owned []*apps.ControllerRevision for i := range history { - ref := controller.GetControllerOf(history[i]) + ref := metav1.GetControllerOf(history[i]) if ref == nil || ref.UID == parent.GetUID() { owned = append(owned, history[i]) } @@ -431,7 +430,7 @@ func (fh *fakeHistory) UpdateControllerRevision(revision *apps.ControllerRevisio func (fh *fakeHistory) AdoptControllerRevision(parent metav1.Object, parentKind schema.GroupVersionKind, revision *apps.ControllerRevision) (*apps.ControllerRevision, error) { blockOwnerDeletion := true isController := true - if owner := controller.GetControllerOf(revision); owner != nil { + if owner := metav1.GetControllerOf(revision); owner != nil { return nil, fmt.Errorf("attempt to adopt revision owned by %v", owner) } key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(revision) diff --git a/pkg/controller/history/controller_history_test.go b/pkg/controller/history/controller_history_test.go index ce78a3db860..ab5845eb342 100644 --- a/pkg/controller/history/controller_history_test.go +++ b/pkg/controller/history/controller_history_test.go @@ -992,7 +992,7 @@ func TestRealHistory_AdoptControllerRevision(t *testing.T) { if !test.err && err != nil { t.Errorf("%s: %s", test.name, err) } - if !test.err && controller.GetControllerOf(adopted).UID != test.parent.GetUID() { + if !test.err && !metav1.IsControlledBy(adopted, test.parent) { t.Errorf("%s: adoption failed", test.name) } if test.err && err == nil { @@ -1103,7 +1103,7 @@ func TestFakeHistory_AdoptControllerRevision(t *testing.T) { if !test.err && err != nil { t.Errorf("%s: %s", test.name, err) } - if !test.err && controller.GetControllerOf(adopted).UID != test.parent.GetUID() { + if !test.err && !metav1.IsControlledBy(adopted, test.parent) { t.Errorf("%s: adoption failed", test.name) } if test.err && err == nil { @@ -1211,8 +1211,7 @@ func TestRealHistory_ReleaseControllerRevision(t *testing.T) { if found == nil { return true, nil, errors.NewNotFound(apps.Resource("controllerrevisions"), test.revision.Name) } - if foundParent := controller.GetControllerOf(test.revision); foundParent == nil || - foundParent.UID != test.parent.GetUID() { + if !metav1.IsControlledBy(test.revision, test.parent) { return true, nil, errors.NewInvalid( test.revision.GroupVersionKind().GroupKind(), test.revision.Name, nil) } @@ -1258,7 +1257,7 @@ func TestRealHistory_ReleaseControllerRevision(t *testing.T) { if adopted == nil { return } - if owner := controller.GetControllerOf(adopted); owner != nil && owner.UID == test.parent.GetUID() { + if metav1.IsControlledBy(adopted, test.parent) { t.Errorf("%s: release failed", test.name) } } @@ -1386,7 +1385,7 @@ func TestFakeHistory_ReleaseControllerRevision(t *testing.T) { if adopted == nil { return } - if owner := controller.GetControllerOf(adopted); owner != nil && owner.UID == test.parent.GetUID() { + if metav1.IsControlledBy(adopted, test.parent) { t.Errorf("%s: release failed", test.name) } } diff --git a/pkg/controller/job/BUILD b/pkg/controller/job/BUILD index b86b3daec36..fb07cf0ee3d 100644 --- a/pkg/controller/job/BUILD +++ b/pkg/controller/job/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "job_controller.go", "utils.go", ], - tags = ["automanaged"], deps = [ "//pkg/controller:go_default_library", "//pkg/util/metrics:go_default_library", @@ -47,7 +44,6 @@ go_test( "utils_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", diff --git a/pkg/controller/job/job_controller.go b/pkg/controller/job/job_controller.go index 50e4f7ad151..6ed99e36d63 100644 --- a/pkg/controller/job/job_controller.go +++ b/pkg/controller/job/job_controller.go @@ -193,7 +193,7 @@ func (jm *JobController) addPod(obj interface{}) { } // If it has a ControllerRef, that's all that matters. - if controllerRef := controller.GetControllerOf(pod); controllerRef != nil { + if controllerRef := metav1.GetControllerOf(pod); controllerRef != nil { job := jm.resolveControllerRef(pod.Namespace, controllerRef) if job == nil { return @@ -238,8 +238,8 @@ func (jm *JobController) updatePod(old, cur interface{}) { labelChanged := !reflect.DeepEqual(curPod.Labels, oldPod.Labels) - curControllerRef := controller.GetControllerOf(curPod) - oldControllerRef := controller.GetControllerOf(oldPod) + curControllerRef := metav1.GetControllerOf(curPod) + oldControllerRef := metav1.GetControllerOf(oldPod) controllerRefChanged := !reflect.DeepEqual(curControllerRef, oldControllerRef) if controllerRefChanged && oldControllerRef != nil { // The ControllerRef was changed. Sync the old controller, if any. @@ -289,7 +289,7 @@ func (jm *JobController) deletePod(obj interface{}) { } } - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { // No controller should care about orphans being deleted. return @@ -624,7 +624,7 @@ func (jm *JobController) manageJob(activePods []*v1.Pod, succeeded int32, job *b for i := int32(0); i < diff; i++ { go func() { defer wait.Done() - err := jm.podControl.CreatePodsWithControllerRef(job.Namespace, &job.Spec.Template, job, newControllerRef(job)) + err := jm.podControl.CreatePodsWithControllerRef(job.Namespace, &job.Spec.Template, job, metav1.NewControllerRef(job, controllerKind)) if err != nil && errors.IsTimeout(err) { // Pod is created but its initialization has timed out. // If the initialization is successful eventually, the diff --git a/pkg/controller/job/job_controller_test.go b/pkg/controller/job/job_controller_test.go index 9559ff502e3..51e909a9364 100644 --- a/pkg/controller/job/job_controller_test.go +++ b/pkg/controller/job/job_controller_test.go @@ -109,7 +109,7 @@ func newPodList(count int32, status v1.PodPhase, job *batch.Job) []v1.Pod { Name: fmt.Sprintf("pod-%v", rand.String(10)), Labels: job.Spec.Selector.MatchLabels, Namespace: job.Namespace, - OwnerReferences: []metav1.OwnerReference{*newControllerRef(job)}, + OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(job, controllerKind)}, }, Status: v1.PodStatus{Phase: status}, } @@ -634,7 +634,7 @@ func newPod(name string, job *batch.Job) *v1.Pod { Name: name, Labels: job.Spec.Selector.MatchLabels, Namespace: job.Namespace, - OwnerReferences: []metav1.OwnerReference{*newControllerRef(job)}, + OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(job, controllerKind)}, }, } } @@ -971,7 +971,7 @@ func TestUpdatePodChangeControllerRef(t *testing.T) { // Changed ControllerRef. Expect both old and new to queue. prev := *pod1 - prev.OwnerReferences = []metav1.OwnerReference{*newControllerRef(job2)} + prev.OwnerReferences = []metav1.OwnerReference{*metav1.NewControllerRef(job2, controllerKind)} bumpResourceVersion(pod1) jm.updatePod(&prev, pod1) if got, want := jm.queue.Len(), 2; got != want { diff --git a/pkg/controller/job/utils.go b/pkg/controller/job/utils.go index 438a5e01041..25c3d08c908 100644 --- a/pkg/controller/job/utils.go +++ b/pkg/controller/job/utils.go @@ -19,7 +19,6 @@ package job import ( batch "k8s.io/api/batch/v1" "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) func IsJobFinished(j *batch.Job) bool { @@ -30,16 +29,3 @@ func IsJobFinished(j *batch.Job) bool { } return false } - -func newControllerRef(j *batch.Job) *metav1.OwnerReference { - blockOwnerDeletion := true - isController := true - return &metav1.OwnerReference{ - APIVersion: controllerKind.GroupVersion().String(), - Kind: controllerKind.Kind, - Name: j.Name, - UID: j.UID, - BlockOwnerDeletion: &blockOwnerDeletion, - Controller: &isController, - } -} diff --git a/pkg/controller/namespace/BUILD b/pkg/controller/namespace/BUILD index d0aaca53e9a..1ca4e65349f 100644 --- a/pkg/controller/namespace/BUILD +++ b/pkg/controller/namespace/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "namespace_controller.go", ], - tags = ["automanaged"], deps = [ "//pkg/controller:go_default_library", "//pkg/controller/namespace/deletion:go_default_library", diff --git a/pkg/controller/namespace/deletion/BUILD b/pkg/controller/namespace/deletion/BUILD index 8e7845164e4..fc6e9641018 100644 --- a/pkg/controller/namespace/deletion/BUILD +++ b/pkg/controller/namespace/deletion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["namespaced_resources_deleter.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -32,7 +29,6 @@ go_test( name = "go_default_test", srcs = ["namespaced_resources_deleter_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/controller/node/BUILD b/pkg/controller/node/BUILD index a48ebc072c7..a0833388d63 100644 --- a/pkg/controller/node/BUILD +++ b/pkg/controller/node/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,25 +8,19 @@ load( go_test( name = "go_default_test", - srcs = [ - "cidr_allocator_test.go", - "cidr_set_test.go", - "nodecontroller_test.go", - "rate_limited_queue_test.go", - "taint_controller_test.go", - "timed_workers_test.go", - ], + srcs = ["nodecontroller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//pkg/cloudprovider/providers/fake:go_default_library", "//pkg/controller:go_default_library", - "//pkg/controller/node/testutil:go_default_library", + "//pkg/controller/node/ipam:go_default_library", + "//pkg/controller/node/scheduler:go_default_library", + "//pkg/controller/node/util:go_default_library", + "//pkg/controller/testutil:go_default_library", "//pkg/kubelet/apis:go_default_library", "//pkg/util/node:go_default_library", "//pkg/util/taints:go_default_library", - "//vendor/github.com/golang/glog: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", @@ -36,7 +28,6 @@ go_test( "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/sets:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/client-go/informers:go_default_library", "//vendor/k8s.io/client-go/informers/core/v1:go_default_library", @@ -44,35 +35,23 @@ go_test( "//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", "//vendor/k8s.io/client-go/testing:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", ], ) go_library( name = "go_default_library", srcs = [ - "cidr_allocator.go", - "cidr_set.go", - "cloud_cidr_allocator.go", - "controller_utils.go", "doc.go", "metrics.go", "node_controller.go", - "range_allocator.go", - "rate_limited_queue.go", - "taint_controller.go", - "timed_workers.go", ], - tags = ["automanaged"], deps = [ - "//pkg/api:go_default_library", - "//pkg/api/helper:go_default_library", - "//pkg/api/v1/helper:go_default_library", "//pkg/api/v1/node:go_default_library", "//pkg/cloudprovider:go_default_library", - "//pkg/cloudprovider/providers/gce:go_default_library", "//pkg/controller:go_default_library", - "//pkg/kubelet/util/format:go_default_library", + "//pkg/controller/node/ipam:go_default_library", + "//pkg/controller/node/scheduler:go_default_library", + "//pkg/controller/node/util:go_default_library", "//pkg/util/metrics:go_default_library", "//pkg/util/node:go_default_library", "//pkg/util/system:go_default_library", @@ -88,9 +67,7 @@ go_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", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/client-go/informers/core/v1:go_default_library", "//vendor/k8s.io/client-go/informers/extensions/v1beta1:go_default_library", @@ -102,7 +79,6 @@ go_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/util/flowcontrol:go_default_library", - "//vendor/k8s.io/client-go/util/workqueue:go_default_library", ], ) @@ -117,7 +93,9 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//pkg/controller/node/testutil:all-srcs", + "//pkg/controller/node/ipam:all-srcs", + "//pkg/controller/node/scheduler:all-srcs", + "//pkg/controller/node/util:all-srcs", ], tags = ["automanaged"], ) diff --git a/pkg/controller/node/ipam/BUILD b/pkg/controller/node/ipam/BUILD new file mode 100644 index 00000000000..4c231fb0608 --- /dev/null +++ b/pkg/controller/node/ipam/BUILD @@ -0,0 +1,64 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = ["cidr_allocator_test.go"], + library = ":go_default_library", + deps = [ + "//pkg/controller/testutil:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", + ], +) + +go_library( + name = "go_default_library", + srcs = [ + "cidr_allocator.go", + "cloud_cidr_allocator.go", + "range_allocator.go", + ], + deps = [ + "//pkg/api:go_default_library", + "//pkg/cloudprovider:go_default_library", + "//pkg/cloudprovider/providers/gce:go_default_library", + "//pkg/controller/node/ipam/cidrset:go_default_library", + "//pkg/controller/node/util:go_default_library", + "//pkg/util/node:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/wait: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/tools/record:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//pkg/controller/node/ipam/cidrset:all-srcs", + ], + tags = ["automanaged"], +) diff --git a/pkg/controller/node/ipam/OWNERS b/pkg/controller/node/ipam/OWNERS new file mode 100755 index 00000000000..8164b49a07a --- /dev/null +++ b/pkg/controller/node/ipam/OWNERS @@ -0,0 +1,7 @@ +approvers: +- bowei +- dnardo +reviewers: +- bowei +- dnardo +- freehan diff --git a/pkg/controller/node/cidr_allocator.go b/pkg/controller/node/ipam/cidr_allocator.go similarity index 84% rename from pkg/controller/node/cidr_allocator.go rename to pkg/controller/node/ipam/cidr_allocator.go index cfc30c7b28f..e6c7f47869c 100644 --- a/pkg/controller/node/cidr_allocator.go +++ b/pkg/controller/node/ipam/cidr_allocator.go @@ -14,18 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. */ -package node +package ipam import ( - "errors" "net" v1 "k8s.io/api/core/v1" ) -var errCIDRRangeNoCIDRsRemaining = errors.New( - "CIDR allocation failed; there are no remaining CIDRs left to allocate in the accepted range") - type nodeAndCIDR struct { cidr *net.IPNet nodeName string @@ -35,7 +31,11 @@ type nodeAndCIDR struct { type CIDRAllocatorType string const ( + // RangeAllocatorType is the allocator that uses an internal CIDR + // range allocator to do node CIDR range allocations. RangeAllocatorType CIDRAllocatorType = "RangeAllocator" + // CloudAllocatorType is the allocator that uses cloud platform + // support to do node CIDR range allocations. CloudAllocatorType CIDRAllocatorType = "CloudAllocator" ) diff --git a/pkg/controller/node/cidr_allocator_test.go b/pkg/controller/node/ipam/cidr_allocator_test.go similarity index 98% rename from pkg/controller/node/cidr_allocator_test.go rename to pkg/controller/node/ipam/cidr_allocator_test.go index 3fc5d4d8ef9..3f911a899b3 100644 --- a/pkg/controller/node/cidr_allocator_test.go +++ b/pkg/controller/node/ipam/cidr_allocator_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package node +package ipam import ( "net" @@ -25,7 +25,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/kubernetes/fake" - "k8s.io/kubernetes/pkg/controller/node/testutil" + "k8s.io/kubernetes/pkg/controller/testutil" ) const ( @@ -143,7 +143,7 @@ func TestAllocateOrOccupyCIDRSuccess(t *testing.T) { return } rangeAllocator.recorder = testutil.NewFakeRecorder() - if err = rangeAllocator.cidrs.occupy(cidr); err != nil { + if err = rangeAllocator.cidrs.Occupy(cidr); err != nil { t.Fatalf("%v: unexpected error when occupying CIDR %v: %v", tc.description, allocated, err) } } @@ -225,7 +225,7 @@ func TestAllocateOrOccupyCIDRFailure(t *testing.T) { return } rangeAllocator.recorder = testutil.NewFakeRecorder() - err = rangeAllocator.cidrs.occupy(cidr) + err = rangeAllocator.cidrs.Occupy(cidr) if err != nil { t.Fatalf("%v: unexpected error when occupying CIDR %v: %v", tc.description, allocated, err) } @@ -337,7 +337,7 @@ func TestReleaseCIDRSuccess(t *testing.T) { return } rangeAllocator.recorder = testutil.NewFakeRecorder() - err = rangeAllocator.cidrs.occupy(cidr) + err = rangeAllocator.cidrs.Occupy(cidr) if err != nil { t.Fatalf("%v: unexpected error when occupying CIDR %v: %v", tc.description, allocated, err) } diff --git a/pkg/controller/node/ipam/cidrset/BUILD b/pkg/controller/node/ipam/cidrset/BUILD new file mode 100644 index 00000000000..fdad775f2d9 --- /dev/null +++ b/pkg/controller/node/ipam/cidrset/BUILD @@ -0,0 +1,32 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = ["cidr_set_test.go"], + library = ":go_default_library", + deps = ["//vendor/github.com/golang/glog:go_default_library"], +) + +go_library( + name = "go_default_library", + srcs = ["cidr_set.go"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/controller/node/cidr_set.go b/pkg/controller/node/ipam/cidrset/cidr_set.go similarity index 82% rename from pkg/controller/node/cidr_set.go rename to pkg/controller/node/ipam/cidrset/cidr_set.go index 6da63d4281d..ce08dd8af3f 100644 --- a/pkg/controller/node/cidr_set.go +++ b/pkg/controller/node/ipam/cidrset/cidr_set.go @@ -14,17 +14,20 @@ See the License for the specific language governing permissions and limitations under the License. */ -package node +package cidrset import ( "encoding/binary" + "errors" "fmt" "math/big" "net" "sync" ) -type cidrSet struct { +// CidrSet manages a set of CIDR ranges from which blocks of IPs can +// be allocated from. +type CidrSet struct { sync.Mutex clusterCIDR *net.IPNet clusterIP net.IP @@ -44,7 +47,15 @@ const ( maxPrefixLength = 64 ) -func newCIDRSet(clusterCIDR *net.IPNet, subNetMaskSize int) *cidrSet { +var ( + // ErrCIDRRangeNoCIDRsRemaining occurs when there are no more space + // to allocate CIDR ranges. + ErrCIDRRangeNoCIDRsRemaining = errors.New( + "CIDR allocation failed; there are no remaining CIDRs left to allocate in the accepted range") +) + +// NewCIDRSet creates a new CidrSet. +func NewCIDRSet(clusterCIDR *net.IPNet, subNetMaskSize int) *CidrSet { clusterMask := clusterCIDR.Mask clusterMaskSize, _ := clusterMask.Size() @@ -54,7 +65,7 @@ func newCIDRSet(clusterCIDR *net.IPNet, subNetMaskSize int) *cidrSet { } else { maxCIDRs = 1 << uint32(subNetMaskSize-clusterMaskSize) } - return &cidrSet{ + return &CidrSet{ clusterCIDR: clusterCIDR, clusterIP: clusterCIDR.IP, clusterMaskSize: clusterMaskSize, @@ -63,7 +74,7 @@ func newCIDRSet(clusterCIDR *net.IPNet, subNetMaskSize int) *cidrSet { } } -func (s *cidrSet) indexToCIDRBlock(index int) *net.IPNet { +func (s *CidrSet) indexToCIDRBlock(index int) *net.IPNet { var ip []byte var mask int switch /*v4 or v6*/ { @@ -91,7 +102,8 @@ func (s *cidrSet) indexToCIDRBlock(index int) *net.IPNet { } } -func (s *cidrSet) allocateNext() (*net.IPNet, error) { +// AllocateNext allocates the next free CIDR range. +func (s *CidrSet) AllocateNext() (*net.IPNet, error) { s.Lock() defer s.Unlock() @@ -104,7 +116,7 @@ func (s *cidrSet) allocateNext() (*net.IPNet, error) { } } if nextUnused == -1 { - return nil, errCIDRRangeNoCIDRsRemaining + return nil, ErrCIDRRangeNoCIDRsRemaining } s.nextCandidate = (nextUnused + 1) % s.maxCIDRs @@ -113,7 +125,7 @@ func (s *cidrSet) allocateNext() (*net.IPNet, error) { return s.indexToCIDRBlock(nextUnused), nil } -func (s *cidrSet) getBeginingAndEndIndices(cidr *net.IPNet) (begin, end int, err error) { +func (s *CidrSet) getBeginingAndEndIndices(cidr *net.IPNet) (begin, end int, err error) { begin, end = 0, s.maxCIDRs-1 cidrMask := cidr.Mask maskSize, _ := cidrMask.Size() @@ -160,7 +172,8 @@ func (s *cidrSet) getBeginingAndEndIndices(cidr *net.IPNet) (begin, end int, err return begin, end, nil } -func (s *cidrSet) release(cidr *net.IPNet) error { +// Release releases the given CIDR range. +func (s *CidrSet) Release(cidr *net.IPNet) error { begin, end, err := s.getBeginingAndEndIndices(cidr) if err != nil { return err @@ -173,7 +186,8 @@ func (s *cidrSet) release(cidr *net.IPNet) error { return nil } -func (s *cidrSet) occupy(cidr *net.IPNet) (err error) { +// Occupy marks the given CIDR range as used. +func (s *CidrSet) Occupy(cidr *net.IPNet) (err error) { begin, end, err := s.getBeginingAndEndIndices(cidr) if err != nil { return err @@ -188,7 +202,7 @@ func (s *cidrSet) occupy(cidr *net.IPNet) (err error) { return nil } -func (s *cidrSet) getIndexForCIDR(cidr *net.IPNet) (int, error) { +func (s *CidrSet) getIndexForCIDR(cidr *net.IPNet) (int, error) { var cidrIndex uint32 if cidr.IP.To4() != nil { cidrIndex = (binary.BigEndian.Uint32(s.clusterIP) ^ binary.BigEndian.Uint32(cidr.IP.To4())) >> uint32(32-s.subNetMaskSize) diff --git a/pkg/controller/node/cidr_set_test.go b/pkg/controller/node/ipam/cidrset/cidr_set_test.go similarity index 93% rename from pkg/controller/node/cidr_set_test.go rename to pkg/controller/node/ipam/cidrset/cidr_set_test.go index 6c9f6c54d87..fbd9886e53d 100644 --- a/pkg/controller/node/cidr_set_test.go +++ b/pkg/controller/node/ipam/cidrset/cidr_set_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package node +package cidrset import ( "math/big" @@ -47,9 +47,9 @@ func TestCIDRSetFullyAllocated(t *testing.T) { } for _, tc := range cases { _, clusterCIDR, _ := net.ParseCIDR(tc.clusterCIDRStr) - a := newCIDRSet(clusterCIDR, tc.subNetMaskSize) + a := NewCIDRSet(clusterCIDR, tc.subNetMaskSize) - p, err := a.allocateNext() + p, err := a.AllocateNext() if err != nil { t.Fatalf("unexpected error: %v for %v", err, tc.description) } @@ -58,14 +58,14 @@ func TestCIDRSetFullyAllocated(t *testing.T) { p.String(), tc.expectedCIDR, tc.description) } - _, err = a.allocateNext() + _, err = a.AllocateNext() if err == nil { t.Fatalf("expected error because of fully-allocated range for %v", tc.description) } - a.release(p) + a.Release(p) - p, err = a.allocateNext() + p, err = a.AllocateNext() if err != nil { t.Fatalf("unexpected error: %v for %v", err, tc.description) } @@ -73,7 +73,7 @@ func TestCIDRSetFullyAllocated(t *testing.T) { t.Fatalf("unexpected allocated cidr: %v, expecting %v for %v", p.String(), tc.expectedCIDR, tc.description) } - _, err = a.allocateNext() + _, err = a.AllocateNext() if err == nil { t.Fatalf("expected error because of fully-allocated range for %v", tc.description) } @@ -133,7 +133,7 @@ func TestIndexToCIDRBlock(t *testing.T) { } for _, tc := range cases { _, clusterCIDR, _ := net.ParseCIDR(tc.clusterCIDRStr) - a := newCIDRSet(clusterCIDR, tc.subnetMaskSize) + a := NewCIDRSet(clusterCIDR, tc.subnetMaskSize) cidr := a.indexToCIDRBlock(tc.index) if cidr.String() != tc.CIDRBlock { t.Fatalf("error for %v index %d %s", tc.description, tc.index, cidr.String()) @@ -157,12 +157,12 @@ func TestCIDRSet_RandomishAllocation(t *testing.T) { } for _, tc := range cases { _, clusterCIDR, _ := net.ParseCIDR(tc.clusterCIDRStr) - a := newCIDRSet(clusterCIDR, 24) + a := NewCIDRSet(clusterCIDR, 24) // allocate all the CIDRs var cidrs []*net.IPNet for i := 0; i < 256; i++ { - if c, err := a.allocateNext(); err == nil { + if c, err := a.AllocateNext(); err == nil { cidrs = append(cidrs, c) } else { t.Fatalf("unexpected error: %v for %v", err, tc.description) @@ -170,25 +170,25 @@ func TestCIDRSet_RandomishAllocation(t *testing.T) { } var err error - _, err = a.allocateNext() + _, err = a.AllocateNext() if err == nil { t.Fatalf("expected error because of fully-allocated range for %v", tc.description) } // release them all for i := 0; i < len(cidrs); i++ { - a.release(cidrs[i]) + a.Release(cidrs[i]) } // allocate the CIDRs again var rcidrs []*net.IPNet for i := 0; i < 256; i++ { - if c, err := a.allocateNext(); err == nil { + if c, err := a.AllocateNext(); err == nil { rcidrs = append(rcidrs, c) } else { t.Fatalf("unexpected error: %d, %v for %v", i, err, tc.description) } } - _, err = a.allocateNext() + _, err = a.AllocateNext() if err == nil { t.Fatalf("expected error because of fully-allocated range for %v", tc.description) } @@ -215,14 +215,14 @@ func TestCIDRSet_AllocationOccupied(t *testing.T) { } for _, tc := range cases { _, clusterCIDR, _ := net.ParseCIDR(tc.clusterCIDRStr) - a := newCIDRSet(clusterCIDR, 24) + a := NewCIDRSet(clusterCIDR, 24) // allocate all the CIDRs var cidrs []*net.IPNet - var num_cidrs = 256 + var numCIDRs = 256 - for i := 0; i < num_cidrs; i++ { - if c, err := a.allocateNext(); err == nil { + for i := 0; i < numCIDRs; i++ { + if c, err := a.AllocateNext(); err == nil { cidrs = append(cidrs, c) } else { t.Fatalf("unexpected error: %v for %v", err, tc.description) @@ -230,35 +230,35 @@ func TestCIDRSet_AllocationOccupied(t *testing.T) { } var err error - _, err = a.allocateNext() + _, err = a.AllocateNext() if err == nil { t.Fatalf("expected error because of fully-allocated range for %v", tc.description) } // release them all for i := 0; i < len(cidrs); i++ { - a.release(cidrs[i]) + a.Release(cidrs[i]) } // occupy the last 128 CIDRs - for i := num_cidrs / 2; i < num_cidrs; i++ { - a.occupy(cidrs[i]) + for i := numCIDRs / 2; i < numCIDRs; i++ { + a.Occupy(cidrs[i]) } // allocate the first 128 CIDRs again var rcidrs []*net.IPNet - for i := 0; i < num_cidrs/2; i++ { - if c, err := a.allocateNext(); err == nil { + for i := 0; i < numCIDRs/2; i++ { + if c, err := a.AllocateNext(); err == nil { rcidrs = append(rcidrs, c) } else { t.Fatalf("unexpected error: %d, %v for %v", i, err, tc.description) } } - _, err = a.allocateNext() + _, err = a.AllocateNext() if err == nil { t.Fatalf("expected error because of fully-allocated range for %v", tc.description) } // check Occupy() work properly - for i := num_cidrs / 2; i < num_cidrs; i++ { + for i := numCIDRs / 2; i < numCIDRs; i++ { rcidrs = append(rcidrs, cidrs[i]) } if !reflect.DeepEqual(cidrs, rcidrs) { @@ -394,7 +394,7 @@ func TestGetBitforCIDR(t *testing.T) { t.Fatalf("unexpected error: %v for %v", err, tc.description) } - cs := newCIDRSet(clusterCIDR, tc.subNetMaskSize) + cs := NewCIDRSet(clusterCIDR, tc.subNetMaskSize) _, subnetCIDR, err := net.ParseCIDR(tc.subNetCIDRStr) if err != nil { @@ -562,14 +562,14 @@ func TestOccupy(t *testing.T) { t.Fatalf("unexpected error: %v for %v", err, tc.description) } - cs := newCIDRSet(clusterCIDR, tc.subNetMaskSize) + cs := NewCIDRSet(clusterCIDR, tc.subNetMaskSize) _, subnetCIDR, err := net.ParseCIDR(tc.subNetCIDRStr) if err != nil { t.Fatalf("unexpected error: %v for %v", err, tc.description) } - err = cs.occupy(subnetCIDR) + err = cs.Occupy(subnetCIDR) if err == nil && tc.expectErr { t.Errorf("expected error but got none for %v", tc.description) continue @@ -629,9 +629,9 @@ func TestCIDRSetv6(t *testing.T) { } for _, tc := range cases { _, clusterCIDR, _ := net.ParseCIDR(tc.clusterCIDRStr) - a := newCIDRSet(clusterCIDR, tc.subNetMaskSize) + a := NewCIDRSet(clusterCIDR, tc.subNetMaskSize) - p, err := a.allocateNext() + p, err := a.AllocateNext() if err == nil && tc.expectErr { t.Errorf("expected error but got none for %v", tc.description) continue @@ -645,7 +645,7 @@ func TestCIDRSetv6(t *testing.T) { t.Fatalf("unexpected allocated cidr: %s for %v", p.String(), tc.description) } } - p2, err := a.allocateNext() + p2, err := a.AllocateNext() if !tc.expectErr { if p2.String() != tc.expectedCIDR2 { t.Fatalf("unexpected allocated cidr: %s for %v", p2.String(), tc.description) diff --git a/pkg/controller/node/cloud_cidr_allocator.go b/pkg/controller/node/ipam/cloud_cidr_allocator.go similarity index 94% rename from pkg/controller/node/cloud_cidr_allocator.go rename to pkg/controller/node/ipam/cloud_cidr_allocator.go index 85b4c9e8439..9dfb9543f83 100644 --- a/pkg/controller/node/cloud_cidr_allocator.go +++ b/pkg/controller/node/ipam/cloud_cidr_allocator.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package node +package ipam import ( "fmt" @@ -32,6 +32,7 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/cloudprovider/providers/gce" + "k8s.io/kubernetes/pkg/controller/node/util" nodeutil "k8s.io/kubernetes/pkg/util/node" ) @@ -50,6 +51,7 @@ type cloudCIDRAllocator struct { var _ CIDRAllocator = (*cloudCIDRAllocator)(nil) +// NewCloudCIDRAllocator creates a new cloud CIDR allocator. func NewCloudCIDRAllocator( client clientset.Interface, cloud cloudprovider.Interface) (ca CIDRAllocator, err error) { @@ -79,12 +81,12 @@ func (ca *cloudCIDRAllocator) AllocateOrOccupyCIDR(node *v1.Node) error { cidrs, err := ca.cloud.AliasRanges(types.NodeName(node.Name)) if err != nil { - recordNodeStatusChange(ca.recorder, node, "CIDRNotAvailable") + util.RecordNodeStatusChange(ca.recorder, node, "CIDRNotAvailable") return fmt.Errorf("failed to allocate cidr: %v", err) } if len(cidrs) == 0 { - recordNodeStatusChange(ca.recorder, node, "CIDRNotAvailable") + util.RecordNodeStatusChange(ca.recorder, node, "CIDRNotAvailable") glog.V(2).Infof("Node %v has no CIDRs", node.Name) return fmt.Errorf("failed to allocate cidr (none exist)") } diff --git a/pkg/controller/node/range_allocator.go b/pkg/controller/node/ipam/range_allocator.go similarity index 92% rename from pkg/controller/node/range_allocator.go rename to pkg/controller/node/ipam/range_allocator.go index f5910417e4a..0f150a761a8 100644 --- a/pkg/controller/node/range_allocator.go +++ b/pkg/controller/node/ipam/range_allocator.go @@ -14,13 +14,15 @@ See the License for the specific language governing permissions and limitations under the License. */ -package node +package ipam import ( "fmt" "net" "sync" + "github.com/golang/glog" + "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -31,7 +33,8 @@ import ( v1core "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/tools/record" - "github.com/golang/glog" + "k8s.io/kubernetes/pkg/controller/node/ipam/cidrset" + "k8s.io/kubernetes/pkg/controller/node/util" ) // TODO: figure out the good setting for those constants. @@ -45,7 +48,7 @@ const ( type rangeAllocator struct { client clientset.Interface - cidrs *cidrSet + cidrs *cidrset.CidrSet clusterCIDR *net.IPNet maxCIDRs int // Channel that is used to pass updating Nodes with assigned CIDRs to the background @@ -74,7 +77,7 @@ func NewCIDRRangeAllocator(client clientset.Interface, clusterCIDR *net.IPNet, s ra := &rangeAllocator{ client: client, - cidrs: newCIDRSet(clusterCIDR, subNetMaskSize), + cidrs: cidrset.NewCIDRSet(clusterCIDR, subNetMaskSize), clusterCIDR: clusterCIDR, nodeCIDRUpdateChannel: make(chan nodeAndCIDR, cidrUpdateQueueSize), recorder: recorder, @@ -150,7 +153,7 @@ func (r *rangeAllocator) occupyCIDR(node *v1.Node) error { if err != nil { return fmt.Errorf("failed to parse node %s, CIDR %s", node.Name, node.Spec.PodCIDR) } - if err := r.cidrs.occupy(podCIDR); err != nil { + if err := r.cidrs.Occupy(podCIDR); err != nil { return fmt.Errorf("failed to mark cidr as occupied: %v", err) } return nil @@ -169,10 +172,10 @@ func (r *rangeAllocator) AllocateOrOccupyCIDR(node *v1.Node) error { if node.Spec.PodCIDR != "" { return r.occupyCIDR(node) } - podCIDR, err := r.cidrs.allocateNext() + podCIDR, err := r.cidrs.AllocateNext() if err != nil { r.removeNodeFromProcessing(node.Name) - recordNodeStatusChange(r.recorder, node, "CIDRNotAvailable") + util.RecordNodeStatusChange(r.recorder, node, "CIDRNotAvailable") return fmt.Errorf("failed to allocate cidr: %v", err) } @@ -194,7 +197,7 @@ func (r *rangeAllocator) ReleaseCIDR(node *v1.Node) error { } glog.V(4).Infof("release CIDR %s", node.Spec.PodCIDR) - if err = r.cidrs.release(podCIDR); err != nil { + if err = r.cidrs.Release(podCIDR); err != nil { return fmt.Errorf("Error when releasing CIDR %v: %v", node.Spec.PodCIDR, err) } return err @@ -212,7 +215,7 @@ func (r *rangeAllocator) filterOutServiceRange(serviceCIDR *net.IPNet) { return } - if err := r.cidrs.occupy(serviceCIDR); err != nil { + if err := r.cidrs.Occupy(serviceCIDR); err != nil { glog.Errorf("Error filtering out service cidr %v: %v", serviceCIDR, err) } } @@ -232,7 +235,7 @@ func (r *rangeAllocator) updateCIDRAllocation(data nodeAndCIDR) error { if node.Spec.PodCIDR != "" { glog.Errorf("Node %v already has allocated CIDR %v. Releasing assigned one if different.", node.Name, node.Spec.PodCIDR) if node.Spec.PodCIDR != data.cidr.String() { - if err := r.cidrs.release(data.cidr); err != nil { + if err := r.cidrs.Release(data.cidr); err != nil { glog.Errorf("Error when releasing CIDR %v", data.cidr.String()) } } @@ -246,13 +249,13 @@ func (r *rangeAllocator) updateCIDRAllocation(data nodeAndCIDR) error { } } if err != nil { - recordNodeStatusChange(r.recorder, node, "CIDRAssignmentFailed") + util.RecordNodeStatusChange(r.recorder, node, "CIDRAssignmentFailed") // We accept the fact that we may leek CIDRs here. This is safer than releasing // them in case when we don't know if request went through. // NodeController restart will return all falsely allocated CIDRs to the pool. if !apierrors.IsServerTimeout(err) { glog.Errorf("CIDR assignment for node %v failed: %v. Releasing allocated CIDR", data.nodeName, err) - if releaseErr := r.cidrs.release(data.cidr); releaseErr != nil { + if releaseErr := r.cidrs.Release(data.cidr); releaseErr != nil { glog.Errorf("Error releasing allocated CIDR for node %v: %v", data.nodeName, releaseErr) } } diff --git a/pkg/controller/node/node_controller.go b/pkg/controller/node/node_controller.go index 1df7d2d2c3e..f2725a832c2 100644 --- a/pkg/controller/node/node_controller.go +++ b/pkg/controller/node/node_controller.go @@ -17,12 +17,13 @@ limitations under the License. package node import ( - "errors" "fmt" "net" "sync" "time" + "github.com/golang/glog" + apiequality "k8s.io/apimachinery/pkg/api/equality" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -47,14 +48,15 @@ import ( v1node "k8s.io/kubernetes/pkg/api/v1/node" "k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/controller" + "k8s.io/kubernetes/pkg/controller/node/ipam" + "k8s.io/kubernetes/pkg/controller/node/scheduler" + "k8s.io/kubernetes/pkg/controller/node/util" "k8s.io/kubernetes/pkg/util/metrics" utilnode "k8s.io/kubernetes/pkg/util/node" "k8s.io/kubernetes/pkg/util/system" taintutils "k8s.io/kubernetes/pkg/util/taints" utilversion "k8s.io/kubernetes/pkg/util/version" "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm" - - "github.com/golang/glog" ) func init() { @@ -63,13 +65,8 @@ func init() { } var ( - ErrCloudInstance = errors.New("cloud provider doesn't support instances.") gracefulDeletionVersion = utilversion.MustParseSemantic("v1.1.0") - // The minimum kubelet version for which the nodecontroller - // can safely flip pod.Status to NotReady. - podStatusReconciliationVersion = utilversion.MustParseSemantic("v1.2.0") - UnreachableTaintTemplate = &v1.Taint{ Key: algorithm.TaintNodeUnreachable, Effect: v1.TaintEffectNoExecute, @@ -82,12 +79,6 @@ var ( ) const ( - // nodeStatusUpdateRetry controls the number of retries of writing NodeStatus update. - nodeStatusUpdateRetry = 5 - // controls how often NodeController will try to evict Pods from non-responsive Nodes. - nodeEvictionPeriod = 100 * time.Millisecond - // Burst value for all eviction rate limiters - evictionRateLimiterBurst = 1 // The amount of time the nodecontroller polls on the list nodes endpoint. apiserverStartupGracePeriod = 10 * time.Minute // The amount of time the nodecontroller should sleep between retrying NodeStatus updates @@ -111,7 +102,7 @@ type nodeStatusData struct { type NodeController struct { allocateNodeCIDRs bool - allocatorType CIDRAllocatorType + allocatorType ipam.CIDRAllocatorType cloud cloudprovider.Interface clusterCIDR *net.IPNet @@ -150,9 +141,9 @@ type NodeController struct { // Lock to access evictor workers evictorLock sync.Mutex // workers that evicts pods from unresponsive nodes. - zonePodEvictor map[string]*RateLimitedTimedQueue + zonePodEvictor map[string]*scheduler.RateLimitedTimedQueue // workers that are responsible for tainting nodes. - zoneNoExecuteTainer map[string]*RateLimitedTimedQueue + zoneNoExecuteTainer map[string]*scheduler.RateLimitedTimedQueue podEvictionTimeout time.Duration // The maximum duration before a pod evicted from a node can be forcefully terminated. maximumGracePeriod time.Duration @@ -166,9 +157,9 @@ type NodeController struct { podInformerSynced cache.InformerSynced - cidrAllocator CIDRAllocator + cidrAllocator ipam.CIDRAllocator - taintManager *NoExecuteTaintManager + taintManager *scheduler.NoExecuteTaintManager forcefullyDeletePod func(*v1.Pod) error nodeExistsInCloudProvider func(types.NodeName) (bool, error) @@ -213,7 +204,7 @@ func NewNodeController( serviceCIDR *net.IPNet, nodeCIDRMaskSize int, allocateNodeCIDRs bool, - allocatorType CIDRAllocatorType, + allocatorType ipam.CIDRAllocatorType, runTaintManager bool, useTaintBasedEvictions bool) (*NodeController, error) { eventBroadcaster := record.NewBroadcaster() @@ -247,8 +238,8 @@ func NewNodeController( recorder: recorder, podEvictionTimeout: podEvictionTimeout, maximumGracePeriod: 5 * time.Minute, - zonePodEvictor: make(map[string]*RateLimitedTimedQueue), - zoneNoExecuteTainer: make(map[string]*RateLimitedTimedQueue), + zonePodEvictor: make(map[string]*scheduler.RateLimitedTimedQueue), + zoneNoExecuteTainer: make(map[string]*scheduler.RateLimitedTimedQueue), nodeStatusMap: make(map[string]nodeStatusData), nodeMonitorGracePeriod: nodeMonitorGracePeriod, nodeMonitorPeriod: nodeMonitorPeriod, @@ -259,8 +250,8 @@ func NewNodeController( serviceCIDR: serviceCIDR, allocateNodeCIDRs: allocateNodeCIDRs, allocatorType: allocatorType, - forcefullyDeletePod: func(p *v1.Pod) error { return forcefullyDeletePod(kubeClient, p) }, - nodeExistsInCloudProvider: func(nodeName types.NodeName) (bool, error) { return nodeExistsInCloudProvider(cloud, nodeName) }, + forcefullyDeletePod: func(p *v1.Pod) error { return util.ForcefullyDeletePod(kubeClient, p) }, + nodeExistsInCloudProvider: func(nodeName types.NodeName) (bool, error) { return util.NodeExistsInCloudProvider(cloud, nodeName) }, evictionLimiterQPS: evictionLimiterQPS, secondaryEvictionLimiterQPS: secondaryEvictionLimiterQPS, largeClusterThreshold: largeClusterThreshold, @@ -334,11 +325,11 @@ func NewNodeController( } switch nc.allocatorType { - case RangeAllocatorType: - nc.cidrAllocator, err = NewCIDRRangeAllocator( + case ipam.RangeAllocatorType: + nc.cidrAllocator, err = ipam.NewCIDRRangeAllocator( kubeClient, clusterCIDR, serviceCIDR, nodeCIDRMaskSize, nodeList) - case CloudAllocatorType: - nc.cidrAllocator, err = NewCloudCIDRAllocator(kubeClient, cloud) + case ipam.CloudAllocatorType: + nc.cidrAllocator, err = ipam.NewCloudCIDRAllocator(kubeClient, cloud) default: return nil, fmt.Errorf("Invalid CIDR allocator type: %v", nc.allocatorType) } @@ -348,8 +339,8 @@ func NewNodeController( } nodeInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: createAddNodeHandler(nc.cidrAllocator.AllocateOrOccupyCIDR), - UpdateFunc: createUpdateNodeHandler(func(_, newNode *v1.Node) error { + AddFunc: util.CreateAddNodeHandler(nc.cidrAllocator.AllocateOrOccupyCIDR), + UpdateFunc: util.CreateUpdateNodeHandler(func(_, newNode *v1.Node) error { // If the PodCIDR is not empty we either: // - already processed a Node that already had a CIDR after NC restarted // (cidr is marked as used), @@ -374,26 +365,26 @@ func NewNodeController( } return nil }), - DeleteFunc: createDeleteNodeHandler(nc.cidrAllocator.ReleaseCIDR), + DeleteFunc: util.CreateDeleteNodeHandler(nc.cidrAllocator.ReleaseCIDR), }) } if nc.runTaintManager { nodeInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: createAddNodeHandler(func(node *v1.Node) error { + AddFunc: util.CreateAddNodeHandler(func(node *v1.Node) error { nc.taintManager.NodeUpdated(nil, node) return nil }), - UpdateFunc: createUpdateNodeHandler(func(oldNode, newNode *v1.Node) error { + UpdateFunc: util.CreateUpdateNodeHandler(func(oldNode, newNode *v1.Node) error { nc.taintManager.NodeUpdated(oldNode, newNode) return nil }), - DeleteFunc: createDeleteNodeHandler(func(node *v1.Node) error { + DeleteFunc: util.CreateDeleteNodeHandler(func(node *v1.Node) error { nc.taintManager.NodeUpdated(node, nil) return nil }), }) - nc.taintManager = NewNoExecuteTaintManager(kubeClient) + nc.taintManager = scheduler.NewNoExecuteTaintManager(kubeClient) } nc.nodeLister = nodeInformer.Lister() @@ -410,7 +401,7 @@ func (nc *NodeController) doEvictionPass() { defer nc.evictorLock.Unlock() for k := range nc.zonePodEvictor { // Function should return 'false' and a time after which it should be retried, or 'true' if it shouldn't (it succeeded). - nc.zonePodEvictor[k].Try(func(value TimedValue) (bool, time.Duration) { + nc.zonePodEvictor[k].Try(func(value scheduler.TimedValue) (bool, time.Duration) { node, err := nc.nodeLister.Get(value.Value) if apierrors.IsNotFound(err) { glog.Warningf("Node %v no longer present in nodeLister!", value.Value) @@ -421,7 +412,7 @@ func (nc *NodeController) doEvictionPass() { EvictionsNumber.WithLabelValues(zone).Inc() } nodeUid, _ := value.UID.(string) - remaining, err := deletePods(nc.kubeClient, nc.recorder, value.Value, nodeUid, nc.daemonSetStore) + remaining, err := util.DeletePods(nc.kubeClient, nc.recorder, value.Value, nodeUid, nc.daemonSetStore) if err != nil { utilruntime.HandleError(fmt.Errorf("unable to evict node %q: %v", value.Value, err)) return false, 0 @@ -439,7 +430,7 @@ func (nc *NodeController) doNoExecuteTaintingPass() { defer nc.evictorLock.Unlock() for k := range nc.zoneNoExecuteTainer { // Function should return 'false' and a time after which it should be retried, or 'true' if it shouldn't (it succeeded). - nc.zoneNoExecuteTainer[k].Try(func(value TimedValue) (bool, time.Duration) { + nc.zoneNoExecuteTainer[k].Try(func(value scheduler.TimedValue) (bool, time.Duration) { node, err := nc.nodeLister.Get(value.Value) if apierrors.IsNotFound(err) { glog.Warningf("Node %v no longer present in nodeLister!", value.Value) @@ -468,7 +459,7 @@ func (nc *NodeController) doNoExecuteTaintingPass() { return true, 0 } - return swapNodeControllerTaint(nc.kubeClient, &taintToAdd, &oppositeTaint, node), 0 + return util.SwapNodeControllerTaint(nc.kubeClient, &taintToAdd, &oppositeTaint, node), 0 }) } } @@ -498,12 +489,12 @@ func (nc *NodeController) Run(stopCh <-chan struct{}) { if nc.useTaintBasedEvictions { // Handling taint based evictions. Because we don't want a dedicated logic in TaintManager for NC-originated // taints and we normally don't rate limit evictions caused by taints, we need to rate limit adding taints. - go wait.Until(nc.doNoExecuteTaintingPass, nodeEvictionPeriod, wait.NeverStop) + go wait.Until(nc.doNoExecuteTaintingPass, scheduler.NodeEvictionPeriod, wait.NeverStop) } else { // Managing eviction of nodes: // When we delete pods off a node, if the node was not empty at the time we then // queue an eviction watcher. If we hit an error, retry deletion. - go wait.Until(nc.doEvictionPass, nodeEvictionPeriod, wait.NeverStop) + go wait.Until(nc.doEvictionPass, scheduler.NodeEvictionPeriod, wait.NeverStop) } <-stopCh @@ -516,12 +507,12 @@ func (nc *NodeController) addPodEvictorForNewZone(node *v1.Node) { nc.zoneStates[zone] = stateInitial if !nc.useTaintBasedEvictions { nc.zonePodEvictor[zone] = - NewRateLimitedTimedQueue( - flowcontrol.NewTokenBucketRateLimiter(nc.evictionLimiterQPS, evictionRateLimiterBurst)) + scheduler.NewRateLimitedTimedQueue( + flowcontrol.NewTokenBucketRateLimiter(nc.evictionLimiterQPS, scheduler.EvictionRateLimiterBurst)) } else { nc.zoneNoExecuteTainer[zone] = - NewRateLimitedTimedQueue( - flowcontrol.NewTokenBucketRateLimiter(nc.evictionLimiterQPS, evictionRateLimiterBurst)) + scheduler.NewRateLimitedTimedQueue( + flowcontrol.NewTokenBucketRateLimiter(nc.evictionLimiterQPS, scheduler.EvictionRateLimiterBurst)) } // Init the metric for the new zone. glog.Infof("Initializing eviction metric for zone: %v", zone) @@ -547,7 +538,7 @@ func (nc *NodeController) monitorNodeStatus() error { for i := range added { glog.V(1).Infof("NodeController observed a new Node: %#v", added[i].Name) - recordNodeEvent(nc.recorder, added[i].Name, string(added[i].UID), v1.EventTypeNormal, "RegisteredNode", fmt.Sprintf("Registered Node %v in NodeController", added[i].Name)) + util.RecordNodeEvent(nc.recorder, added[i].Name, string(added[i].UID), v1.EventTypeNormal, "RegisteredNode", fmt.Sprintf("Registered Node %v in NodeController", added[i].Name)) nc.knownNodeSet[added[i].Name] = added[i] nc.addPodEvictorForNewZone(added[i]) if nc.useTaintBasedEvictions { @@ -559,7 +550,7 @@ func (nc *NodeController) monitorNodeStatus() error { for i := range deleted { glog.V(1).Infof("NodeController observed a Node deletion: %v", deleted[i].Name) - recordNodeEvent(nc.recorder, deleted[i].Name, string(deleted[i].UID), v1.EventTypeNormal, "RemovingNode", fmt.Sprintf("Removing Node %v from NodeController", deleted[i].Name)) + util.RecordNodeEvent(nc.recorder, deleted[i].Name, string(deleted[i].UID), v1.EventTypeNormal, "RemovingNode", fmt.Sprintf("Removing Node %v from NodeController", deleted[i].Name)) delete(nc.knownNodeSet, deleted[i].Name) } @@ -574,7 +565,7 @@ func (nc *NodeController) monitorNodeStatus() error { continue } node := nodeCopy.(*v1.Node) - if err := wait.PollImmediate(retrySleepTime, retrySleepTime*nodeStatusUpdateRetry, func() (bool, error) { + if err := wait.PollImmediate(retrySleepTime, retrySleepTime*scheduler.NodeStatusUpdateRetry, func() (bool, error) { gracePeriod, observedReadyCondition, currentReadyCondition, err = nc.tryUpdateNodeStatus(node) if err == nil { return true, nil @@ -605,7 +596,7 @@ func (nc *NodeController) monitorNodeStatus() error { // We want to update the taint straight away if Node is already tainted with the UnreachableTaint if taintutils.TaintExists(node.Spec.Taints, UnreachableTaintTemplate) { taintToAdd := *NotReadyTaintTemplate - if !swapNodeControllerTaint(nc.kubeClient, &taintToAdd, UnreachableTaintTemplate, node) { + if !util.SwapNodeControllerTaint(nc.kubeClient, &taintToAdd, UnreachableTaintTemplate, node) { glog.Errorf("Failed to instantly swap UnreachableTaint to NotReadyTaint. Will try again in the next cycle.") } } else if nc.markNodeForTainting(node) { @@ -632,7 +623,7 @@ func (nc *NodeController) monitorNodeStatus() error { // We want to update the taint straight away if Node is already tainted with the UnreachableTaint if taintutils.TaintExists(node.Spec.Taints, NotReadyTaintTemplate) { taintToAdd := *UnreachableTaintTemplate - if !swapNodeControllerTaint(nc.kubeClient, &taintToAdd, NotReadyTaintTemplate, node) { + if !util.SwapNodeControllerTaint(nc.kubeClient, &taintToAdd, NotReadyTaintTemplate, node) { glog.Errorf("Failed to instantly swap UnreachableTaint to NotReadyTaint. Will try again in the next cycle.") } } else if nc.markNodeForTainting(node) { @@ -672,8 +663,8 @@ func (nc *NodeController) monitorNodeStatus() error { // Report node event. if currentReadyCondition.Status != v1.ConditionTrue && observedReadyCondition.Status == v1.ConditionTrue { - recordNodeStatusChange(nc.recorder, node, "NodeNotReady") - if err = markAllPodsNotReady(nc.kubeClient, node); err != nil { + util.RecordNodeStatusChange(nc.recorder, node, "NodeNotReady") + if err = util.MarkAllPodsNotReady(nc.kubeClient, node); err != nil { utilruntime.HandleError(fmt.Errorf("Unable to mark all pods NotReady on node %v: %v", node.Name, err)) } } @@ -688,13 +679,13 @@ func (nc *NodeController) monitorNodeStatus() error { } if !exists { glog.V(2).Infof("Deleting node (no longer present in cloud provider): %s", node.Name) - recordNodeEvent(nc.recorder, node.Name, string(node.UID), v1.EventTypeNormal, "DeletingNode", fmt.Sprintf("Deleting Node %v because it's not present according to cloud provider", node.Name)) + util.RecordNodeEvent(nc.recorder, node.Name, string(node.UID), v1.EventTypeNormal, "DeletingNode", fmt.Sprintf("Deleting Node %v because it's not present according to cloud provider", node.Name)) go func(nodeName string) { defer utilruntime.HandleCrash() // Kubelet is not reporting and Cloud Provider says node // is gone. Delete it without worrying about grace // periods. - if err := forcefullyDeleteNode(nc.kubeClient, nodeName); err != nil { + if err := util.ForcefullyDeleteNode(nc.kubeClient, nodeName); err != nil { glog.Errorf("Unable to forcefully delete node %q: %v", nodeName, err) } }(node.Name) @@ -1072,12 +1063,12 @@ func (nc *NodeController) markNodeForTainting(node *v1.Node) bool { func (nc *NodeController) markNodeAsHealthy(node *v1.Node) (bool, error) { nc.evictorLock.Lock() defer nc.evictorLock.Unlock() - err := controller.RemoveTaintOffNode(nc.kubeClient, node.Name, UnreachableTaintTemplate, node) + err := controller.RemoveTaintOffNode(nc.kubeClient, node.Name, node, UnreachableTaintTemplate) if err != nil { glog.Errorf("Failed to remove taint from node %v: %v", node.Name, err) return false, err } - err = controller.RemoveTaintOffNode(nc.kubeClient, node.Name, NotReadyTaintTemplate, node) + err = controller.RemoveTaintOffNode(nc.kubeClient, node.Name, node, NotReadyTaintTemplate) if err != nil { glog.Errorf("Failed to remove taint from node %v: %v", node.Name, err) return false, err @@ -1122,3 +1113,55 @@ func (nc *NodeController) ComputeZoneState(nodeReadyConditions []*v1.NodeConditi return notReadyNodes, stateNormal } } + +// maybeDeleteTerminatingPod non-gracefully deletes pods that are terminating +// that should not be gracefully terminated. +func (nc *NodeController) maybeDeleteTerminatingPod(obj interface{}) { + pod, ok := obj.(*v1.Pod) + if !ok { + tombstone, ok := obj.(cache.DeletedFinalStateUnknown) + if !ok { + glog.Errorf("Couldn't get object from tombstone %#v", obj) + return + } + pod, ok = tombstone.Obj.(*v1.Pod) + if !ok { + glog.Errorf("Tombstone contained object that is not a Pod %#v", obj) + return + } + } + + // consider only terminating pods + if pod.DeletionTimestamp == nil { + return + } + + node, err := nc.nodeLister.Get(pod.Spec.NodeName) + // if there is no such node, do nothing and let the podGC clean it up. + if apierrors.IsNotFound(err) { + return + } + if err != nil { + // this can only happen if the Store.KeyFunc has a problem creating + // a key for the pod. If it happens once, it will happen again so + // don't bother requeuing the pod. + utilruntime.HandleError(err) + return + } + + // delete terminating pods that have been scheduled on + // nodes that do not support graceful termination + // TODO(mikedanese): this can be removed when we no longer + // guarantee backwards compatibility of master API to kubelets with + // versions less than 1.1.0 + v, err := utilversion.ParseSemantic(node.Status.NodeInfo.KubeletVersion) + if err != nil { + glog.V(0).Infof("Couldn't parse version %q of node: %v", node.Status.NodeInfo.KubeletVersion, err) + utilruntime.HandleError(nc.forcefullyDeletePod(pod)) + return + } + if v.LessThan(gracefulDeletionVersion) { + utilruntime.HandleError(nc.forcefullyDeletePod(pod)) + return + } +} diff --git a/pkg/controller/node/nodecontroller_test.go b/pkg/controller/node/nodecontroller_test.go index 34d78faaed1..33fcb911f04 100644 --- a/pkg/controller/node/nodecontroller_test.go +++ b/pkg/controller/node/nodecontroller_test.go @@ -39,7 +39,10 @@ import ( "k8s.io/kubernetes/pkg/cloudprovider" fakecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/fake" "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/controller/node/testutil" + "k8s.io/kubernetes/pkg/controller/node/ipam" + "k8s.io/kubernetes/pkg/controller/node/scheduler" + "k8s.io/kubernetes/pkg/controller/node/util" + "k8s.io/kubernetes/pkg/controller/testutil" kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis" "k8s.io/kubernetes/pkg/util/node" taintutils "k8s.io/kubernetes/pkg/util/taints" @@ -103,7 +106,7 @@ func NewNodeControllerFromClient( serviceCIDR, nodeCIDRMaskSize, allocateNodeCIDRs, - RangeAllocatorType, + ipam.RangeAllocatorType, useTaints, useTaints, ) @@ -637,9 +640,9 @@ func TestMonitorNodeStatusEvictPods(t *testing.T) { zones := testutil.GetZones(item.fakeNodeHandler) for _, zone := range zones { if _, ok := nodeController.zonePodEvictor[zone]; ok { - nodeController.zonePodEvictor[zone].Try(func(value TimedValue) (bool, time.Duration) { + nodeController.zonePodEvictor[zone].Try(func(value scheduler.TimedValue) (bool, time.Duration) { nodeUid, _ := value.UID.(string) - deletePods(item.fakeNodeHandler, nodeController.recorder, value.Value, nodeUid, nodeController.daemonSetInformer.Lister()) + util.DeletePods(item.fakeNodeHandler, nodeController.recorder, value.Value, nodeUid, nodeController.daemonSetInformer.Lister()) return true, 0 }) } else { @@ -782,9 +785,9 @@ func TestPodStatusChange(t *testing.T) { } zones := testutil.GetZones(item.fakeNodeHandler) for _, zone := range zones { - nodeController.zonePodEvictor[zone].Try(func(value TimedValue) (bool, time.Duration) { + nodeController.zonePodEvictor[zone].Try(func(value scheduler.TimedValue) (bool, time.Duration) { nodeUid, _ := value.UID.(string) - deletePods(item.fakeNodeHandler, nodeController.recorder, value.Value, nodeUid, nodeController.daemonSetStore) + util.DeletePods(item.fakeNodeHandler, nodeController.recorder, value.Value, nodeUid, nodeController.daemonSetStore) return true, 0 }) } @@ -1337,9 +1340,9 @@ func (nc *nodeController) doEviction(fakeNodeHandler *testutil.FakeNodeHandler) var podEvicted bool zones := testutil.GetZones(fakeNodeHandler) for _, zone := range zones { - nc.zonePodEvictor[zone].Try(func(value TimedValue) (bool, time.Duration) { + nc.zonePodEvictor[zone].Try(func(value scheduler.TimedValue) (bool, time.Duration) { uid, _ := value.UID.(string) - deletePods(fakeNodeHandler, nc.recorder, value.Value, uid, nc.daemonSetStore) + util.DeletePods(fakeNodeHandler, nc.recorder, value.Value, uid, nc.daemonSetStore) return true, 0 }) } @@ -2310,7 +2313,7 @@ func TestCheckNodeKubeletVersionParsing(t *testing.T) { }, }, } - isOutdated := nodeRunningOutdatedKubelet(n) + isOutdated := util.NodeRunningOutdatedKubelet(n) if ov.outdated != isOutdated { t.Errorf("Version %v doesn't match test expectation. Expected outdated %v got %v", n.Status.NodeInfo.KubeletVersion, ov.outdated, isOutdated) } else { diff --git a/pkg/controller/node/scheduler/BUILD b/pkg/controller/node/scheduler/BUILD new file mode 100644 index 00000000000..563fcefd032 --- /dev/null +++ b/pkg/controller/node/scheduler/BUILD @@ -0,0 +1,65 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = [ + "rate_limited_queue_test.go", + "taint_controller_test.go", + "timed_workers_test.go", + ], + library = ":go_default_library", + deps = [ + "//pkg/controller/testutil:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", + "//vendor/k8s.io/client-go/testing:go_default_library", + "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", + ], +) + +go_library( + name = "go_default_library", + srcs = [ + "rate_limited_queue.go", + "taint_controller.go", + "timed_workers.go", + ], + deps = [ + "//pkg/api/helper:go_default_library", + "//pkg/api/v1/helper:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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", + "//vendor/k8s.io/apimachinery/pkg/util/sets: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/tools/record:go_default_library", + "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", + "//vendor/k8s.io/client-go/util/workqueue:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/controller/node/rate_limited_queue.go b/pkg/controller/node/scheduler/rate_limited_queue.go similarity index 67% rename from pkg/controller/node/rate_limited_queue.go rename to pkg/controller/node/scheduler/rate_limited_queue.go index 05a1273f3d7..984443ff52b 100644 --- a/pkg/controller/node/rate_limited_queue.go +++ b/pkg/controller/node/scheduler/rate_limited_queue.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package node +package scheduler import ( "container/heap" @@ -27,6 +27,18 @@ import ( "github.com/golang/glog" ) +const ( + // NodeStatusUpdateRetry controls the number of retries of writing + // NodeStatus update. + NodeStatusUpdateRetry = 5 + // NodeEvictionPeriod controls how often NodeController will try to + // evict Pods from non-responsive Nodes. + NodeEvictionPeriod = 100 * time.Millisecond + // EvictionRateLimiterBurst is the burst value for all eviction rate + // limiters + EvictionRateLimiterBurst = 1 +) + // TimedValue is a value that should be processed at a designated time. type TimedValue struct { Value string @@ -37,19 +49,26 @@ type TimedValue struct { } // now is used to test time -var now func() time.Time = time.Now +var now = time.Now // TimedQueue is a priority heap where the lowest ProcessAt is at the front of the queue type TimedQueue []*TimedValue -func (h TimedQueue) Len() int { return len(h) } -func (h TimedQueue) Less(i, j int) bool { return h[i].ProcessAt.Before(h[j].ProcessAt) } -func (h TimedQueue) Swap(i, j int) { h[i], h[j] = h[j], h[i] } +// Len is the length of the queue. +func (h TimedQueue) Len() int { return len(h) } +// Less returns true if queue[i] < queue[j]. +func (h TimedQueue) Less(i, j int) bool { return h[i].ProcessAt.Before(h[j].ProcessAt) } + +// Swap swaps index i and j. +func (h TimedQueue) Swap(i, j int) { h[i], h[j] = h[j], h[i] } + +// Push a new TimedValue on to the queue. func (h *TimedQueue) Push(x interface{}) { *h = append(*h, x.(*TimedValue)) } +// Pop the lowest ProcessAt item. func (h *TimedQueue) Pop() interface{} { old := *h n := len(old) @@ -58,16 +77,17 @@ func (h *TimedQueue) Pop() interface{} { return x } -// A FIFO queue which additionally guarantees that any element can be added only once until -// it is removed. +// UniqueQueue is a FIFO queue which additionally guarantees that any +// element can be added only once until it is removed. type UniqueQueue struct { lock sync.Mutex queue TimedQueue set sets.String } -// Adds a new value to the queue if it wasn't added before, or was explicitly removed by the -// Remove call. Returns true if new value was added. +// Add a new value to the queue if it wasn't added before, or was +// explicitly removed by the Remove call. Returns true if new value +// was added. func (q *UniqueQueue) Add(value TimedValue) bool { q.lock.Lock() defer q.lock.Unlock() @@ -80,8 +100,9 @@ func (q *UniqueQueue) Add(value TimedValue) bool { return true } -// Replace replaces an existing value in the queue if it already exists, otherwise it does nothing. -// Returns true if the item was found. +// Replace replaces an existing value in the queue if it already +// exists, otherwise it does nothing. Returns true if the item was +// found. func (q *UniqueQueue) Replace(value TimedValue) bool { q.lock.Lock() defer q.lock.Unlock() @@ -97,8 +118,9 @@ func (q *UniqueQueue) Replace(value TimedValue) bool { return false } -// Removes the value from the queue, but keeps it in the set, so it won't be added second time. -// Returns true if something was removed. +// RemoveFromQueue the value from the queue, but keeps it in the set, +// so it won't be added second time. Returns true if something was +// removed. func (q *UniqueQueue) RemoveFromQueue(value string) bool { q.lock.Lock() defer q.lock.Unlock() @@ -115,8 +137,9 @@ func (q *UniqueQueue) RemoveFromQueue(value string) bool { return false } -// Removes the value from the queue, so Get() call won't return it, and allow subsequent addition -// of the given value. If the value is not present does nothing and returns false. +// Remove the value from the queue, so Get() call won't return it, and +// allow subsequent addition of the given value. If the value is not +// present does nothing and returns false. func (q *UniqueQueue) Remove(value string) bool { q.lock.Lock() defer q.lock.Unlock() @@ -134,7 +157,7 @@ func (q *UniqueQueue) Remove(value string) bool { return true } -// Returns the oldest added value that wasn't returned yet. +// Get returns the oldest added value that wasn't returned yet. func (q *UniqueQueue) Get() (TimedValue, bool) { q.lock.Lock() defer q.lock.Unlock() @@ -146,7 +169,8 @@ func (q *UniqueQueue) Get() (TimedValue, bool) { return *result, true } -// Head returns the oldest added value that wasn't returned yet without removing it. +// Head returns the oldest added value that wasn't returned yet +// without removing it. func (q *UniqueQueue) Head() (TimedValue, bool) { q.lock.Lock() defer q.lock.Unlock() @@ -157,7 +181,8 @@ func (q *UniqueQueue) Head() (TimedValue, bool) { return *result, true } -// Clear removes all items from the queue and duplication preventing set. +// Clear removes all items from the queue and duplication preventing +// set. func (q *UniqueQueue) Clear() { q.lock.Lock() defer q.lock.Unlock() @@ -169,15 +194,16 @@ func (q *UniqueQueue) Clear() { } } -// RateLimitedTimedQueue is a unique item priority queue ordered by the expected next time -// of execution. It is also rate limited. +// RateLimitedTimedQueue is a unique item priority queue ordered by +// the expected next time of execution. It is also rate limited. type RateLimitedTimedQueue struct { queue UniqueQueue limiterLock sync.Mutex limiter flowcontrol.RateLimiter } -// Creates new queue which will use given RateLimiter to oversee execution. +// NewRateLimitedTimedQueue creates new queue which will use given +// RateLimiter to oversee execution. func NewRateLimitedTimedQueue(limiter flowcontrol.RateLimiter) *RateLimitedTimedQueue { return &RateLimitedTimedQueue{ queue: UniqueQueue{ @@ -188,18 +214,21 @@ func NewRateLimitedTimedQueue(limiter flowcontrol.RateLimiter) *RateLimitedTimed } } -// ActionFunc takes a timed value and returns false if the item must be retried, with an optional -// time.Duration if some minimum wait interval should be used. +// ActionFunc takes a timed value and returns false if the item must +// be retried, with an optional time.Duration if some minimum wait +// interval should be used. type ActionFunc func(TimedValue) (bool, time.Duration) -// Try processes the queue. Ends prematurely if RateLimiter forbids an action and leak is true. -// Otherwise, requeues the item to be processed. Each value is processed once if fn returns true, -// otherwise it is added back to the queue. The returned remaining is used to identify the minimum -// time to execute the next item in the queue. The same value is processed only once unless -// Remove is explicitly called on it (it's done by the cancelPodEviction function in NodeController -// when Node becomes Ready again) -// TODO: figure out a good way to do garbage collection for all Nodes that were removed from -// the cluster. +// Try processes the queue.Ends prematurely if RateLimiter forbids an +// action and leak is true. Otherwise, requeues the item to be +// processed. Each value is processed once if fn returns true, +// otherwise it is added back to the queue. The returned remaining is +// used to identify the minimum time to execute the next item in the +// queue. The same value is processed only once unless Remove is +// explicitly called on it (it's done by the cancelPodEviction +// function in NodeController when Node becomes Ready again) TODO: +// figure out a good way to do garbage collection for all Nodes that +// were removed from the cluster. func (q *RateLimitedTimedQueue) Try(fn ActionFunc) { val, ok := q.queue.Head() q.limiterLock.Lock() @@ -227,8 +256,9 @@ func (q *RateLimitedTimedQueue) Try(fn ActionFunc) { } } -// Adds value to the queue to be processed. Won't add the same value(comparsion by value) a second time -// if it was already added and not removed. +// Add value to the queue to be processed. Won't add the same +// value(comparsion by value) a second time if it was already added +// and not removed. func (q *RateLimitedTimedQueue) Add(value string, uid interface{}) bool { now := now() return q.queue.Add(TimedValue{ @@ -239,17 +269,19 @@ func (q *RateLimitedTimedQueue) Add(value string, uid interface{}) bool { }) } -// Removes Node from the Evictor. The Node won't be processed until added again. +// Remove Node from the Evictor. The Node won't be processed until +// added again. func (q *RateLimitedTimedQueue) Remove(value string) bool { return q.queue.Remove(value) } -// Removes all items from the queue +// Clear removes all items from the queue func (q *RateLimitedTimedQueue) Clear() { q.queue.Clear() } -// SwapLimiter safely swaps current limiter for this queue with the passed one if capacities or qps's differ. +// SwapLimiter safely swaps current limiter for this queue with the +// passed one if capacities or qps's differ. func (q *RateLimitedTimedQueue) SwapLimiter(newQPS float32) { q.limiterLock.Lock() defer q.limiterLock.Unlock() @@ -260,7 +292,7 @@ func (q *RateLimitedTimedQueue) SwapLimiter(newQPS float32) { if newQPS <= 0 { newLimiter = flowcontrol.NewFakeNeverRateLimiter() } else { - newLimiter = flowcontrol.NewTokenBucketRateLimiter(newQPS, evictionRateLimiterBurst) + newLimiter = flowcontrol.NewTokenBucketRateLimiter(newQPS, EvictionRateLimiterBurst) } // If we're currently waiting on limiter, we drain the new one - this is a good approach when Burst value is 1 // TODO: figure out if we need to support higher Burst values and decide on the drain logic, should we keep: diff --git a/pkg/controller/node/rate_limited_queue_test.go b/pkg/controller/node/scheduler/rate_limited_queue_test.go similarity index 99% rename from pkg/controller/node/rate_limited_queue_test.go rename to pkg/controller/node/scheduler/rate_limited_queue_test.go index 6037c32e5b1..644b6569039 100644 --- a/pkg/controller/node/rate_limited_queue_test.go +++ b/pkg/controller/node/scheduler/rate_limited_queue_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package node +package scheduler import ( "reflect" diff --git a/pkg/controller/node/taint_controller.go b/pkg/controller/node/scheduler/taint_controller.go similarity index 98% rename from pkg/controller/node/taint_controller.go rename to pkg/controller/node/scheduler/taint_controller.go index 1603e433fff..9892defc5fe 100644 --- a/pkg/controller/node/taint_controller.go +++ b/pkg/controller/node/scheduler/taint_controller.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package node +package scheduler import ( "fmt" @@ -122,7 +122,7 @@ func getPodsAssignedToNode(c clientset.Interface, nodeName string) ([]v1.Pod, er time.Sleep(100 * time.Millisecond) } if err != nil { - return []v1.Pod{}, fmt.Errorf("Failed to get Pods assigned to node %v. Skipping update.", nodeName) + return []v1.Pod{}, fmt.Errorf("failed to get Pods assigned to node %v", nodeName) } return pods.Items, nil } @@ -325,9 +325,8 @@ func (tc *NoExecuteTaintManager) processPodOnNode( startTime = scheduledEviction.CreatedAt if startTime.Add(minTolerationTime).Before(triggerTime) { return - } else { - tc.cancelWorkWithEvent(podNamespacedName) } + tc.cancelWorkWithEvent(podNamespacedName) } tc.taintEvictionQueue.AddWork(NewWorkArgs(podNamespacedName.Name, podNamespacedName.Namespace), startTime, triggerTime) } diff --git a/pkg/controller/node/taint_controller_test.go b/pkg/controller/node/scheduler/taint_controller_test.go similarity index 99% rename from pkg/controller/node/taint_controller_test.go rename to pkg/controller/node/scheduler/taint_controller_test.go index f6da5ddd5d1..1e6a0e2d5b4 100644 --- a/pkg/controller/node/taint_controller_test.go +++ b/pkg/controller/node/scheduler/taint_controller_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package node +package scheduler import ( "fmt" @@ -24,7 +24,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/client-go/kubernetes/fake" - "k8s.io/kubernetes/pkg/controller/node/testutil" + "k8s.io/kubernetes/pkg/controller/testutil" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" clienttesting "k8s.io/client-go/testing" diff --git a/pkg/controller/node/timed_workers.go b/pkg/controller/node/scheduler/timed_workers.go similarity index 99% rename from pkg/controller/node/timed_workers.go rename to pkg/controller/node/scheduler/timed_workers.go index d61a63f84ec..2eef59b041b 100644 --- a/pkg/controller/node/timed_workers.go +++ b/pkg/controller/node/scheduler/timed_workers.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package node +package scheduler import ( "sync" diff --git a/pkg/controller/node/timed_workers_test.go b/pkg/controller/node/scheduler/timed_workers_test.go similarity index 99% rename from pkg/controller/node/timed_workers_test.go rename to pkg/controller/node/scheduler/timed_workers_test.go index 08761371dba..6003b07a697 100644 --- a/pkg/controller/node/timed_workers_test.go +++ b/pkg/controller/node/scheduler/timed_workers_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package node +package scheduler import ( "sync" diff --git a/pkg/controller/node/util/BUILD b/pkg/controller/node/util/BUILD new file mode 100644 index 00000000000..b1f6d8633d6 --- /dev/null +++ b/pkg/controller/node/util/BUILD @@ -0,0 +1,45 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["controller_utils.go"], + deps = [ + "//pkg/api:go_default_library", + "//pkg/cloudprovider:go_default_library", + "//pkg/controller:go_default_library", + "//pkg/kubelet/util/format:go_default_library", + "//pkg/util/node:go_default_library", + "//pkg/util/version:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/runtime: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/listers/extensions/v1beta1:go_default_library", + "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//vendor/k8s.io/client-go/tools/record:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/controller/node/controller_utils.go b/pkg/controller/node/util/controller_utils.go similarity index 72% rename from pkg/controller/node/controller_utils.go rename to pkg/controller/node/util/controller_utils.go index 035dfdc6f9a..8365a0686a9 100644 --- a/pkg/controller/node/controller_utils.go +++ b/pkg/controller/node/util/controller_utils.go @@ -14,13 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. */ -package node +package util import ( + "errors" "fmt" "strings" - "k8s.io/apimachinery/pkg/api/errors" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/types" @@ -44,9 +45,20 @@ import ( "github.com/golang/glog" ) -// deletePods will delete all pods from master running on given node, and return true -// if any pods were deleted, or were found pending deletion. -func deletePods(kubeClient clientset.Interface, recorder record.EventRecorder, nodeName, nodeUID string, daemonStore extensionslisters.DaemonSetLister) (bool, error) { +var ( + // ErrCloudInstance occurs when the cloud provider does not support + // the Instances API. + ErrCloudInstance = errors.New("cloud provider doesn't support instances") + // podStatusReconciliationVersion is the the minimum kubelet version + // for which the nodecontroller can safely flip pod.Status to + // NotReady. + podStatusReconciliationVersion = utilversion.MustParseSemantic("v1.2.0") +) + +// DeletePods will delete all pods from master running on given node, +// and return true if any pods were deleted, or were found pending +// deletion. +func DeletePods(kubeClient clientset.Interface, recorder record.EventRecorder, nodeName, nodeUID string, daemonStore extensionslisters.DaemonSetLister) (bool, error) { remaining := false selector := fields.OneTermEqualSelector(api.PodHostField, nodeName).String() options := metav1.ListOptions{FieldSelector: selector} @@ -58,7 +70,7 @@ func deletePods(kubeClient clientset.Interface, recorder record.EventRecorder, n } if len(pods.Items) > 0 { - recordNodeEvent(recorder, nodeName, nodeUID, v1.EventTypeNormal, "DeletingAllPods", fmt.Sprintf("Deleting all Pods from Node %v.", nodeName)) + RecordNodeEvent(recorder, nodeName, nodeUID, v1.EventTypeNormal, "DeletingAllPods", fmt.Sprintf("Deleting all Pods from Node %v.", nodeName)) } for _, pod := range pods.Items { @@ -68,8 +80,8 @@ func deletePods(kubeClient clientset.Interface, recorder record.EventRecorder, n } // Set reason and message in the pod object. - if _, err = setPodTerminationReason(kubeClient, &pod, nodeName); err != nil { - if errors.IsConflict(err) { + if _, err = SetPodTerminationReason(kubeClient, &pod, nodeName); err != nil { + if apierrors.IsConflict(err) { updateErrList = append(updateErrList, fmt.Errorf("update status failed for pod %q: %v", format.Pod(&pod), err)) continue @@ -100,9 +112,10 @@ func deletePods(kubeClient clientset.Interface, recorder record.EventRecorder, n return remaining, nil } -// setPodTerminationReason attempts to set a reason and message in the pod status, updates it in the apiserver, -// and returns an error if it encounters one. -func setPodTerminationReason(kubeClient clientset.Interface, pod *v1.Pod, nodeName string) (*v1.Pod, error) { +// SetPodTerminationReason attempts to set a reason and message in the +// pod status, updates it in the apiserver, and returns an error if it +// encounters one. +func SetPodTerminationReason(kubeClient clientset.Interface, pod *v1.Pod, nodeName string) (*v1.Pod, error) { if pod.Status.Reason == nodepkg.NodeUnreachablePodReason { return pod, nil } @@ -118,7 +131,8 @@ func setPodTerminationReason(kubeClient clientset.Interface, pod *v1.Pod, nodeNa return updatedPod, nil } -func forcefullyDeletePod(c clientset.Interface, pod *v1.Pod) error { +// ForcefullyDeletePod deletes the pod immediately. +func ForcefullyDeletePod(c clientset.Interface, pod *v1.Pod) error { var zero int64 glog.Infof("NodeController is force deleting Pod: %v:%v", pod.Namespace, pod.Name) err := c.Core().Pods(pod.Namespace).Delete(pod.Name, &metav1.DeleteOptions{GracePeriodSeconds: &zero}) @@ -128,75 +142,23 @@ func forcefullyDeletePod(c clientset.Interface, pod *v1.Pod) error { return err } -// forcefullyDeleteNode immediately the node. The pods on the node are cleaned -// up by the podGC. -func forcefullyDeleteNode(kubeClient clientset.Interface, nodeName string) error { +// ForcefullyDeleteNode deletes the node immediately. The pods on the +// node are cleaned up by the podGC. +func ForcefullyDeleteNode(kubeClient clientset.Interface, nodeName string) error { if err := kubeClient.Core().Nodes().Delete(nodeName, nil); err != nil { return fmt.Errorf("unable to delete node %q: %v", nodeName, err) } return nil } -// maybeDeleteTerminatingPod non-gracefully deletes pods that are terminating -// that should not be gracefully terminated. -func (nc *NodeController) maybeDeleteTerminatingPod(obj interface{}) { - pod, ok := obj.(*v1.Pod) - if !ok { - tombstone, ok := obj.(cache.DeletedFinalStateUnknown) - if !ok { - glog.Errorf("Couldn't get object from tombstone %#v", obj) - return - } - pod, ok = tombstone.Obj.(*v1.Pod) - if !ok { - glog.Errorf("Tombstone contained object that is not a Pod %#v", obj) - return - } - } - - // consider only terminating pods - if pod.DeletionTimestamp == nil { - return - } - - node, err := nc.nodeLister.Get(pod.Spec.NodeName) - // if there is no such node, do nothing and let the podGC clean it up. - if errors.IsNotFound(err) { - return - } - if err != nil { - // this can only happen if the Store.KeyFunc has a problem creating - // a key for the pod. If it happens once, it will happen again so - // don't bother requeuing the pod. - utilruntime.HandleError(err) - return - } - - // delete terminating pods that have been scheduled on - // nodes that do not support graceful termination - // TODO(mikedanese): this can be removed when we no longer - // guarantee backwards compatibility of master API to kubelets with - // versions less than 1.1.0 - v, err := utilversion.ParseSemantic(node.Status.NodeInfo.KubeletVersion) - if err != nil { - glog.V(0).Infof("Couldn't parse version %q of node: %v", node.Status.NodeInfo.KubeletVersion, err) - utilruntime.HandleError(nc.forcefullyDeletePod(pod)) - return - } - if v.LessThan(gracefulDeletionVersion) { - utilruntime.HandleError(nc.forcefullyDeletePod(pod)) - return - } -} - -// update ready status of all pods running on given node from master -// return true if success -func markAllPodsNotReady(kubeClient clientset.Interface, node *v1.Node) error { +// MarkAllPodsNotReady updates ready status of all pods running on +// given node from master return true if success +func MarkAllPodsNotReady(kubeClient clientset.Interface, node *v1.Node) error { // Don't set pods to NotReady if the kubelet is running a version that // doesn't understand how to correct readiness. // TODO: Remove this check when we no longer guarantee backward compatibility // with node versions < 1.2.0. - if nodeRunningOutdatedKubelet(node) { + if NodeRunningOutdatedKubelet(node) { return nil } nodeName := node.Name @@ -233,11 +195,11 @@ func markAllPodsNotReady(kubeClient clientset.Interface, node *v1.Node) error { return fmt.Errorf("%v", strings.Join(errMsg, "; ")) } -// nodeRunningOutdatedKubelet returns true if the kubeletVersion reported +// NodeRunningOutdatedKubelet returns true if the kubeletVersion reported // in the nodeInfo of the given node is "outdated", meaning < 1.2.0. // Older versions were inflexible and modifying pod.Status directly through // the apiserver would result in unexpected outcomes. -func nodeRunningOutdatedKubelet(node *v1.Node) bool { +func NodeRunningOutdatedKubelet(node *v1.Node) bool { v, err := utilversion.ParseSemantic(node.Status.NodeInfo.KubeletVersion) if err != nil { glog.Errorf("couldn't parse version %q of node %v", node.Status.NodeInfo.KubeletVersion, err) @@ -250,7 +212,9 @@ func nodeRunningOutdatedKubelet(node *v1.Node) bool { return false } -func nodeExistsInCloudProvider(cloud cloudprovider.Interface, nodeName types.NodeName) (bool, error) { +// NodeExistsInCloudProvider returns true if the node exists in the +// cloud provider. +func NodeExistsInCloudProvider(cloud cloudprovider.Interface, nodeName types.NodeName) (bool, error) { instances, ok := cloud.Instances() if !ok { return false, fmt.Errorf("%v", ErrCloudInstance) @@ -264,7 +228,8 @@ func nodeExistsInCloudProvider(cloud cloudprovider.Interface, nodeName types.Nod return true, nil } -func recordNodeEvent(recorder record.EventRecorder, nodeName, nodeUID, eventtype, reason, event string) { +// RecordNodeEvent records a event related to a node. +func RecordNodeEvent(recorder record.EventRecorder, nodeName, nodeUID, eventtype, reason, event string) { ref := &v1.ObjectReference{ Kind: "Node", Name: nodeName, @@ -275,21 +240,23 @@ func recordNodeEvent(recorder record.EventRecorder, nodeName, nodeUID, eventtype recorder.Eventf(ref, eventtype, reason, "Node %s event: %s", nodeName, event) } -func recordNodeStatusChange(recorder record.EventRecorder, node *v1.Node, new_status string) { +// RecordNodeStatusChange records a event related to a node status change. +func RecordNodeStatusChange(recorder record.EventRecorder, node *v1.Node, newStatus string) { ref := &v1.ObjectReference{ Kind: "Node", Name: node.Name, UID: node.UID, Namespace: "", } - glog.V(2).Infof("Recording status change %s event message for node %s", new_status, node.Name) + glog.V(2).Infof("Recording status change %s event message for node %s", newStatus, node.Name) // TODO: This requires a transaction, either both node status is updated // and event is recorded or neither should happen, see issue #6055. - recorder.Eventf(ref, v1.EventTypeNormal, new_status, "Node %s status is now: %s", node.Name, new_status) + recorder.Eventf(ref, v1.EventTypeNormal, newStatus, "Node %s status is now: %s", node.Name, newStatus) } -// Returns true in case of success and false otherwise -func swapNodeControllerTaint(kubeClient clientset.Interface, taintToAdd, taintToRemove *v1.Taint, node *v1.Node) bool { +// SwapNodeControllerTaint returns true in case of success and false +// otherwise. +func SwapNodeControllerTaint(kubeClient clientset.Interface, taintToAdd, taintToRemove *v1.Taint, node *v1.Node) bool { taintToAdd.TimeAdded = metav1.Now() err := controller.AddOrUpdateTaintOnNode(kubeClient, node.Name, taintToAdd) if err != nil { @@ -303,7 +270,7 @@ func swapNodeControllerTaint(kubeClient clientset.Interface, taintToAdd, taintTo } glog.V(4).Infof("Added %v Taint to Node %v", taintToAdd, node.Name) - err = controller.RemoveTaintOffNode(kubeClient, node.Name, taintToRemove, node) + err = controller.RemoveTaintOffNode(kubeClient, node.Name, node, taintToRemove) if err != nil { utilruntime.HandleError( fmt.Errorf( @@ -317,7 +284,8 @@ func swapNodeControllerTaint(kubeClient clientset.Interface, taintToAdd, taintTo return true } -func createAddNodeHandler(f func(node *v1.Node) error) func(obj interface{}) { +// CreateAddNodeHandler creates an add node handler. +func CreateAddNodeHandler(f func(node *v1.Node) error) func(obj interface{}) { return func(originalObj interface{}) { obj, err := scheme.Scheme.DeepCopy(originalObj) if err != nil { @@ -332,7 +300,8 @@ func createAddNodeHandler(f func(node *v1.Node) error) func(obj interface{}) { } } -func createUpdateNodeHandler(f func(oldNode, newNode *v1.Node) error) func(oldObj, newObj interface{}) { +// CreateUpdateNodeHandler creates a node update handler. +func CreateUpdateNodeHandler(f func(oldNode, newNode *v1.Node) error) func(oldObj, newObj interface{}) { return func(origOldObj, origNewObj interface{}) { oldObj, err := scheme.Scheme.DeepCopy(origOldObj) if err != nil { @@ -353,7 +322,8 @@ func createUpdateNodeHandler(f func(oldNode, newNode *v1.Node) error) func(oldOb } } -func createDeleteNodeHandler(f func(node *v1.Node) error) func(obj interface{}) { +// CreateDeleteNodeHandler creates a delete node handler. +func CreateDeleteNodeHandler(f func(node *v1.Node) error) func(obj interface{}) { return func(originalObj interface{}) { obj, err := scheme.Scheme.DeepCopy(originalObj) if err != nil { diff --git a/pkg/controller/podautoscaler/BUILD b/pkg/controller/podautoscaler/BUILD index dbf9e2f12f5..02e1916bf95 100644 --- a/pkg/controller/podautoscaler/BUILD +++ b/pkg/controller/podautoscaler/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "rate_limitters.go", "replica_calculator.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1/pod:go_default_library", @@ -58,7 +55,6 @@ go_test( "replica_calculator_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/autoscaling:go_default_library", diff --git a/pkg/controller/podautoscaler/metrics/BUILD b/pkg/controller/podautoscaler/metrics/BUILD index 7c5e8ca64a4..43e7b325732 100644 --- a/pkg/controller/podautoscaler/metrics/BUILD +++ b/pkg/controller/podautoscaler/metrics/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "rest_metrics_client.go", "utilization.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/autoscaling/v2alpha1:go_default_library", @@ -41,7 +38,6 @@ go_test( "rest_metrics_client_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions/install:go_default_library", diff --git a/pkg/controller/podgc/BUILD b/pkg/controller/podgc/BUILD index 315bab74cd0..c1630f99c44 100644 --- a/pkg/controller/podgc/BUILD +++ b/pkg/controller/podgc/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "gc_controller.go", ], - tags = ["automanaged"], deps = [ "//pkg/controller:go_default_library", "//pkg/util/metrics:go_default_library", @@ -36,10 +33,9 @@ go_test( name = "go_default_test", srcs = ["gc_controller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/controller:go_default_library", - "//pkg/controller/node/testutil:go_default_library", + "//pkg/controller/testutil:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", diff --git a/pkg/controller/podgc/gc_controller_test.go b/pkg/controller/podgc/gc_controller_test.go index 8ffce2aae47..73ecd7a8ccf 100644 --- a/pkg/controller/podgc/gc_controller_test.go +++ b/pkg/controller/podgc/gc_controller_test.go @@ -30,7 +30,7 @@ import ( clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/fake" "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/controller/node/testutil" + "k8s.io/kubernetes/pkg/controller/testutil" ) type FakeController struct{} diff --git a/pkg/controller/replicaset/BUILD b/pkg/controller/replicaset/BUILD index b8a92e56b62..91b4ebd13eb 100644 --- a/pkg/controller/replicaset/BUILD +++ b/pkg/controller/replicaset/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "replica_set.go", "replica_set_utils.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/pod:go_default_library", "//pkg/controller:go_default_library", @@ -46,7 +43,6 @@ go_test( name = "go_default_test", srcs = ["replica_set_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", diff --git a/pkg/controller/replicaset/options/BUILD b/pkg/controller/replicaset/options/BUILD index cd328134024..7bacf7fe3b4 100644 --- a/pkg/controller/replicaset/options/BUILD +++ b/pkg/controller/replicaset/options/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["options.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/spf13/pflag:go_default_library"], ) diff --git a/pkg/controller/replicaset/replica_set.go b/pkg/controller/replicaset/replica_set.go index 97b27b7040c..27d694b29fc 100644 --- a/pkg/controller/replicaset/replica_set.go +++ b/pkg/controller/replicaset/replica_set.go @@ -236,7 +236,7 @@ func (rsc *ReplicaSetController) addPod(obj interface{}) { } // If it has a ControllerRef, that's all that matters. - if controllerRef := controller.GetControllerOf(pod); controllerRef != nil { + if controllerRef := metav1.GetControllerOf(pod); controllerRef != nil { rs := rsc.resolveControllerRef(pod.Namespace, controllerRef) if rs == nil { return @@ -292,8 +292,8 @@ func (rsc *ReplicaSetController) updatePod(old, cur interface{}) { return } - curControllerRef := controller.GetControllerOf(curPod) - oldControllerRef := controller.GetControllerOf(oldPod) + curControllerRef := metav1.GetControllerOf(curPod) + oldControllerRef := metav1.GetControllerOf(oldPod) controllerRefChanged := !reflect.DeepEqual(curControllerRef, oldControllerRef) if controllerRefChanged && oldControllerRef != nil { // The ControllerRef was changed. Sync the old controller, if any. @@ -362,7 +362,7 @@ func (rsc *ReplicaSetController) deletePod(obj interface{}) { } } - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { // No controller should care about orphans being deleted. return diff --git a/pkg/controller/replication/BUILD b/pkg/controller/replication/BUILD index 93bb8d7879b..018a31f766e 100644 --- a/pkg/controller/replication/BUILD +++ b/pkg/controller/replication/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "replication_controller.go", "replication_controller_utils.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/pod:go_default_library", "//pkg/controller:go_default_library", @@ -43,7 +40,6 @@ go_test( name = "go_default_test", srcs = ["replication_controller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", diff --git a/pkg/controller/replication/replication_controller.go b/pkg/controller/replication/replication_controller.go index c50fc790b0b..5f066382fb1 100644 --- a/pkg/controller/replication/replication_controller.go +++ b/pkg/controller/replication/replication_controller.go @@ -231,7 +231,7 @@ func (rm *ReplicationManager) addPod(obj interface{}) { } // If it has a ControllerRef, that's all that matters. - if controllerRef := controller.GetControllerOf(pod); controllerRef != nil { + if controllerRef := metav1.GetControllerOf(pod); controllerRef != nil { rc := rm.resolveControllerRef(pod.Namespace, controllerRef) if rc == nil { return @@ -287,8 +287,8 @@ func (rm *ReplicationManager) updatePod(old, cur interface{}) { return } - curControllerRef := controller.GetControllerOf(curPod) - oldControllerRef := controller.GetControllerOf(oldPod) + curControllerRef := metav1.GetControllerOf(curPod) + oldControllerRef := metav1.GetControllerOf(oldPod) controllerRefChanged := !reflect.DeepEqual(curControllerRef, oldControllerRef) if controllerRefChanged && oldControllerRef != nil { // The ControllerRef was changed. Sync the old controller, if any. @@ -357,7 +357,7 @@ func (rm *ReplicationManager) deletePod(obj interface{}) { } } - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { // No controller should care about orphans being deleted. return diff --git a/pkg/controller/resourcequota/BUILD b/pkg/controller/resourcequota/BUILD index df7ed3c6e41..1e5f0646f1e 100644 --- a/pkg/controller/resourcequota/BUILD +++ b/pkg/controller/resourcequota/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "replenishment_controller.go", "resource_quota_controller.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1:go_default_library", @@ -49,7 +46,6 @@ go_test( "resource_quota_controller_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/controller:go_default_library", diff --git a/pkg/controller/resourcequota/replenishment_controller.go b/pkg/controller/resourcequota/replenishment_controller.go index 6e2903bee6c..ec7372a3337 100644 --- a/pkg/controller/resourcequota/replenishment_controller.go +++ b/pkg/controller/resourcequota/replenishment_controller.go @@ -61,7 +61,7 @@ func PodReplenishmentUpdateFunc(options *ReplenishmentControllerOptions) func(ol } } -// ObjectReplenenishmentDeleteFunc will replenish on every delete +// ObjectReplenishmentDeleteFunc will replenish on every delete func ObjectReplenishmentDeleteFunc(options *ReplenishmentControllerOptions) func(obj interface{}) { return func(obj interface{}) { metaObject, err := meta.Accessor(obj) diff --git a/pkg/controller/route/BUILD b/pkg/controller/route/BUILD index 16bedb4cb2b..282622dfdce 100644 --- a/pkg/controller/route/BUILD +++ b/pkg/controller/route/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "route_controller.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/node:go_default_library", "//pkg/cloudprovider:go_default_library", @@ -43,7 +40,6 @@ go_test( name = "go_default_test", srcs = ["route_controller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api/v1/node:go_default_library", "//pkg/cloudprovider:go_default_library", diff --git a/pkg/controller/service/BUILD b/pkg/controller/service/BUILD index 612f37dc795..9a620ec6920 100644 --- a/pkg/controller/service/BUILD +++ b/pkg/controller/service/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "service_controller.go", ], - tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/constants:go_default_library", "//pkg/api/v1/helper:go_default_library", @@ -41,7 +38,6 @@ go_test( name = "go_default_test", srcs = ["service_controller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api/testapi:go_default_library", "//pkg/cloudprovider/providers/fake:go_default_library", diff --git a/pkg/controller/service/OWNERS b/pkg/controller/service/OWNERS index 5e99c8ba0f8..fcaf2646616 100644 --- a/pkg/controller/service/OWNERS +++ b/pkg/controller/service/OWNERS @@ -2,4 +2,4 @@ reviewers: - bowei - MrHohn - thockin -- mrubin +- matchstick diff --git a/pkg/controller/service/service_controller.go b/pkg/controller/service/service_controller.go index 0a3417474ea..52f3c64998a 100644 --- a/pkg/controller/service/service_controller.go +++ b/pkg/controller/service/service_controller.go @@ -261,16 +261,11 @@ func (s *ServiceController) createLoadBalancerIfNeeded(key string, service *v1.S var err error if !wantsLoadBalancer(service) { - needDelete := true _, exists, err := s.balancer.GetLoadBalancer(s.clusterName, service) if err != nil { return fmt.Errorf("Error getting LB for service %s: %v", key, err), retryable } - if !exists { - needDelete = false - } - - if needDelete { + if exists { glog.Infof("Deleting existing load balancer for service %s that no longer needs a load balancer.", key) s.eventRecorder.Event(service, v1.EventTypeNormal, "DeletingLoadBalancer", "Deleting load balancer") if err := s.balancer.EnsureLoadBalancerDeleted(s.clusterName, service); err != nil { diff --git a/pkg/controller/serviceaccount/BUILD b/pkg/controller/serviceaccount/BUILD index 05b800fb2e3..28017ac985e 100644 --- a/pkg/controller/serviceaccount/BUILD +++ b/pkg/controller/serviceaccount/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "tokengetter.go", "tokens_controller.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1:go_default_library", "//pkg/client/retry:go_default_library", @@ -54,7 +51,6 @@ go_test( "tokens_controller_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/controller:go_default_library", diff --git a/pkg/controller/serviceaccount/tokengetter.go b/pkg/controller/serviceaccount/tokengetter.go index d8b325c0dce..e81f1381573 100644 --- a/pkg/controller/serviceaccount/tokengetter.go +++ b/pkg/controller/serviceaccount/tokengetter.go @@ -23,7 +23,7 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/storage/storagebackend" clientset "k8s.io/client-go/kubernetes" - k8s_api_v1 "k8s.io/kubernetes/pkg/api/v1" + apiv1 "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/registry/core/secret" secretstore "k8s.io/kubernetes/pkg/registry/core/secret/storage" serviceaccountregistry "k8s.io/kubernetes/pkg/registry/core/serviceaccount" @@ -68,7 +68,7 @@ func (r *registryGetter) GetServiceAccount(namespace, name string) (*v1.ServiceA return nil, err } v1ServiceAccount := v1.ServiceAccount{} - err = k8s_api_v1.Convert_api_ServiceAccount_To_v1_ServiceAccount(internalServiceAccount, &v1ServiceAccount, nil) + err = apiv1.Convert_api_ServiceAccount_To_v1_ServiceAccount(internalServiceAccount, &v1ServiceAccount, nil) return &v1ServiceAccount, err } @@ -79,7 +79,7 @@ func (r *registryGetter) GetSecret(namespace, name string) (*v1.Secret, error) { return nil, err } v1Secret := v1.Secret{} - err = k8s_api_v1.Convert_api_Secret_To_v1_Secret(internalSecret, &v1Secret, nil) + err = apiv1.Convert_api_Secret_To_v1_Secret(internalSecret, &v1Secret, nil) return &v1Secret, err } diff --git a/pkg/controller/statefulset/BUILD b/pkg/controller/statefulset/BUILD index bfb3e41ab65..7f6a0a74d84 100644 --- a/pkg/controller/statefulset/BUILD +++ b/pkg/controller/statefulset/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "stateful_set_status_updater.go", "stateful_set_utils.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1/pod:go_default_library", @@ -58,7 +55,6 @@ go_test( "stateful_set_utils_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", diff --git a/pkg/controller/statefulset/stateful_set.go b/pkg/controller/statefulset/stateful_set.go index f9838ff9310..b34cbc6e673 100644 --- a/pkg/controller/statefulset/stateful_set.go +++ b/pkg/controller/statefulset/stateful_set.go @@ -170,7 +170,7 @@ func (ssc *StatefulSetController) addPod(obj interface{}) { } // If it has a ControllerRef, that's all that matters. - if controllerRef := controller.GetControllerOf(pod); controllerRef != nil { + if controllerRef := metav1.GetControllerOf(pod); controllerRef != nil { set := ssc.resolveControllerRef(pod.Namespace, controllerRef) if set == nil { return @@ -204,8 +204,8 @@ func (ssc *StatefulSetController) updatePod(old, cur interface{}) { labelChanged := !reflect.DeepEqual(curPod.Labels, oldPod.Labels) - curControllerRef := controller.GetControllerOf(curPod) - oldControllerRef := controller.GetControllerOf(oldPod) + curControllerRef := metav1.GetControllerOf(curPod) + oldControllerRef := metav1.GetControllerOf(oldPod) controllerRefChanged := !reflect.DeepEqual(curControllerRef, oldControllerRef) if controllerRefChanged && oldControllerRef != nil { // The ControllerRef was changed. Sync the old controller, if any. @@ -260,7 +260,7 @@ func (ssc *StatefulSetController) deletePod(obj interface{}) { } } - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { // No controller should care about orphans being deleted. return @@ -316,7 +316,7 @@ func (ssc *StatefulSetController) adoptOrphanRevisions(set *apps.StatefulSet) er } hasOrphans := false for i := range revisions { - if controller.GetControllerOf(revisions[i]) == nil { + if metav1.GetControllerOf(revisions[i]) == nil { hasOrphans = true break } diff --git a/pkg/controller/statefulset/stateful_set_utils.go b/pkg/controller/statefulset/stateful_set_utils.go index 3c4fcb9a2c8..e210cc915d5 100644 --- a/pkg/controller/statefulset/stateful_set_utils.go +++ b/pkg/controller/statefulset/stateful_set_utils.go @@ -219,20 +219,6 @@ func allowsBurst(set *apps.StatefulSet) bool { return set.Spec.PodManagementPolicy == apps.ParallelPodManagement } -// newControllerRef returns an ControllerRef pointing to a given StatefulSet. -func newControllerRef(set *apps.StatefulSet) *metav1.OwnerReference { - blockOwnerDeletion := true - isController := true - return &metav1.OwnerReference{ - APIVersion: controllerKind.GroupVersion().String(), - Kind: controllerKind.Kind, - Name: set.Name, - UID: set.UID, - BlockOwnerDeletion: &blockOwnerDeletion, - Controller: &isController, - } -} - // setPodRevision sets the revision of Pod to revision by adding the StatefulSetRevisionLabel func setPodRevision(pod *v1.Pod, revision string) { if pod.Labels == nil { @@ -252,7 +238,7 @@ func getPodRevision(pod *v1.Pod) string { // newStatefulSetPod returns a new Pod conforming to the set's Spec with an identity generated from ordinal. func newStatefulSetPod(set *apps.StatefulSet, ordinal int) *v1.Pod { - pod, _ := controller.GetPodFromTemplate(&set.Spec.Template, set, newControllerRef(set)) + pod, _ := controller.GetPodFromTemplate(&set.Spec.Template, set, metav1.NewControllerRef(set, controllerKind)) pod.Name = getPodName(set, ordinal) updateIdentity(set, pod) updateStorage(set, pod) @@ -311,11 +297,21 @@ func newRevision(set *apps.StatefulSet, revision int64) (*apps.ControllerRevisio if err != nil { return nil, err } - return history.NewControllerRevision(set, + cr, err := history.NewControllerRevision(set, controllerKind, selector, runtime.RawExtension{Raw: patch}, revision) + if err != nil { + return nil, err + } + if cr.ObjectMeta.Annotations == nil { + cr.ObjectMeta.Annotations = make(map[string]string) + } + for key, value := range set.Annotations { + cr.ObjectMeta.Annotations[key] = value + } + return cr, nil } // applyRevision returns a new StatefulSet constructed by restoring the state in revision to set. If the returned error diff --git a/pkg/controller/statefulset/stateful_set_utils_test.go b/pkg/controller/statefulset/stateful_set_utils_test.go index 58dfe05ecf6..6efe8c466f7 100644 --- a/pkg/controller/statefulset/stateful_set_utils_test.go +++ b/pkg/controller/statefulset/stateful_set_utils_test.go @@ -31,7 +31,6 @@ import ( apps "k8s.io/api/apps/v1beta1" "k8s.io/api/core/v1" podutil "k8s.io/kubernetes/pkg/api/v1/pod" - "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller/history" ) @@ -252,7 +251,7 @@ func TestOverlappingStatefulSets(t *testing.T) { func TestNewPodControllerRef(t *testing.T) { set := newStatefulSet(1) pod := newStatefulSetPod(set, 0) - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { t.Fatalf("No ControllerRef found on new pod") } @@ -280,6 +279,12 @@ func TestCreateApplyRevision(t *testing.T) { t.Fatal(err) } set.Spec.Template.Spec.Containers[0].Name = "foo" + if set.Annotations == nil { + set.Annotations = make(map[string]string) + } + key := "foo" + expectedValue := "bar" + set.Annotations[key] = expectedValue restoredSet, err := applyRevision(set, revision) if err != nil { t.Fatal(err) @@ -291,6 +296,13 @@ func TestCreateApplyRevision(t *testing.T) { if !history.EqualRevision(revision, restoredRevision) { t.Errorf("wanted %v got %v", string(revision.Data.Raw), string(restoredRevision.Data.Raw)) } + value, ok := restoredRevision.Annotations[key] + if !ok { + t.Errorf("missing annotation %s", key) + } + if value != expectedValue { + t.Errorf("for annotation %s wanted %s got %s", key, expectedValue, value) + } } func newPVC(name string) v1.PersistentVolumeClaim { diff --git a/pkg/controller/node/testutil/BUILD b/pkg/controller/testutil/BUILD similarity index 96% rename from pkg/controller/node/testutil/BUILD rename to pkg/controller/testutil/BUILD index 83c040e073e..6d5cb33a651 100644 --- a/pkg/controller/node/testutil/BUILD +++ b/pkg/controller/testutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["test_utils.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/util/node:go_default_library", diff --git a/pkg/controller/node/testutil/test_utils.go b/pkg/controller/testutil/test_utils.go similarity index 95% rename from pkg/controller/node/testutil/test_utils.go rename to pkg/controller/testutil/test_utils.go index 3309e05cf38..3801c4a93d6 100644 --- a/pkg/controller/node/testutil/test_utils.go +++ b/pkg/controller/testutil/test_utils.go @@ -68,30 +68,31 @@ type FakeNodeHandler struct { DeleteWaitChan chan struct{} } +// FakeLegacyHandler is a fake implemtation of CoreV1Interface. type FakeLegacyHandler struct { v1core.CoreV1Interface n *FakeNodeHandler } // GetUpdatedNodesCopy returns a slice of Nodes with updates applied. -func (c *FakeNodeHandler) GetUpdatedNodesCopy() []*v1.Node { - c.lock.Lock() - defer c.lock.Unlock() - updatedNodesCopy := make([]*v1.Node, len(c.UpdatedNodes), len(c.UpdatedNodes)) - for i, ptr := range c.UpdatedNodes { +func (m *FakeNodeHandler) GetUpdatedNodesCopy() []*v1.Node { + m.lock.Lock() + defer m.lock.Unlock() + updatedNodesCopy := make([]*v1.Node, len(m.UpdatedNodes), len(m.UpdatedNodes)) + for i, ptr := range m.UpdatedNodes { updatedNodesCopy[i] = ptr } return updatedNodesCopy } // Core returns fake CoreInterface. -func (c *FakeNodeHandler) Core() v1core.CoreV1Interface { - return &FakeLegacyHandler{c.Clientset.Core(), c} +func (m *FakeNodeHandler) Core() v1core.CoreV1Interface { + return &FakeLegacyHandler{m.Clientset.Core(), m} } // CoreV1 returns fake CoreV1Interface -func (c *FakeNodeHandler) CoreV1() v1core.CoreV1Interface { - return &FakeLegacyHandler{c.Clientset.CoreV1(), c} +func (m *FakeNodeHandler) CoreV1() v1core.CoreV1Interface { + return &FakeLegacyHandler{m.Clientset.CoreV1(), m} } // Nodes return fake NodeInterfaces. @@ -115,9 +116,8 @@ func (m *FakeNodeHandler) Create(node *v1.Node) (*v1.Node, error) { nodeCopy := *node m.CreatedNodes = append(m.CreatedNodes, &nodeCopy) return node, nil - } else { - return nil, errors.New("Create error.") } + return nil, errors.New("create error") } // Get returns a Node from the fake store. diff --git a/pkg/controller/ttl/BUILD b/pkg/controller/ttl/BUILD index c287e6be507..01978bddb90 100644 --- a/pkg/controller/ttl/BUILD +++ b/pkg/controller/ttl/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["ttl_controller.go"], - tags = ["automanaged"], deps = [ "//pkg/controller:go_default_library", "//vendor/github.com/golang/glog:go_default_library", @@ -48,7 +45,6 @@ go_test( name = "go_default_test", srcs = ["ttl_controller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/controller/volume/attachdetach/BUILD b/pkg/controller/volume/attachdetach/BUILD index 5bcf0047036..db1e5fcccb2 100644 --- a/pkg/controller/volume/attachdetach/BUILD +++ b/pkg/controller/volume/attachdetach/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["attach_detach_controller.go"], - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//pkg/controller:go_default_library", @@ -44,7 +41,6 @@ go_test( name = "go_default_test", srcs = ["attach_detach_controller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/controller:go_default_library", "//pkg/controller/volume/attachdetach/cache:go_default_library", diff --git a/pkg/controller/volume/attachdetach/cache/BUILD b/pkg/controller/volume/attachdetach/cache/BUILD index 3a0642ee10e..b9f282c2545 100644 --- a/pkg/controller/volume/attachdetach/cache/BUILD +++ b/pkg/controller/volume/attachdetach/cache/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "actual_state_of_world.go", "desired_state_of_world.go", ], - tags = ["automanaged"], deps = [ "//pkg/volume:go_default_library", "//pkg/volume/util/operationexecutor:go_default_library", @@ -33,7 +30,6 @@ go_test( "desired_state_of_world_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/controller/volume/attachdetach/testing:go_default_library", "//pkg/volume/testing:go_default_library", diff --git a/pkg/controller/volume/attachdetach/populator/BUILD b/pkg/controller/volume/attachdetach/populator/BUILD index c75b65aaa6e..51d178f2009 100644 --- a/pkg/controller/volume/attachdetach/populator/BUILD +++ b/pkg/controller/volume/attachdetach/populator/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["desired_state_of_world_populator.go"], - tags = ["automanaged"], deps = [ "//pkg/controller/volume/attachdetach/cache:go_default_library", "//pkg/controller/volume/attachdetach/util:go_default_library", @@ -44,7 +41,6 @@ go_test( name = "go_default_test", srcs = ["desired_state_of_world_populator_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/controller:go_default_library", "//pkg/controller/volume/attachdetach/cache:go_default_library", diff --git a/pkg/controller/volume/attachdetach/reconciler/BUILD b/pkg/controller/volume/attachdetach/reconciler/BUILD index 6601e923aed..bc683f6bf0e 100644 --- a/pkg/controller/volume/attachdetach/reconciler/BUILD +++ b/pkg/controller/volume/attachdetach/reconciler/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["reconciler.go"], - tags = ["automanaged"], deps = [ "//pkg/controller/volume/attachdetach/cache:go_default_library", "//pkg/controller/volume/attachdetach/statusupdater:go_default_library", @@ -30,7 +27,6 @@ go_test( name = "go_default_test", srcs = ["reconciler_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/controller:go_default_library", "//pkg/controller/volume/attachdetach/cache:go_default_library", diff --git a/pkg/controller/volume/attachdetach/statusupdater/BUILD b/pkg/controller/volume/attachdetach/statusupdater/BUILD index 2a7119b5da0..6df3c44ef2d 100644 --- a/pkg/controller/volume/attachdetach/statusupdater/BUILD +++ b/pkg/controller/volume/attachdetach/statusupdater/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "fake_node_status_updater.go", "node_status_updater.go", ], - tags = ["automanaged"], deps = [ "//pkg/controller/volume/attachdetach/cache:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/pkg/controller/volume/attachdetach/testing/BUILD b/pkg/controller/volume/attachdetach/testing/BUILD index c453e7d5335..8e892e550d4 100644 --- a/pkg/controller/volume/attachdetach/testing/BUILD +++ b/pkg/controller/volume/attachdetach/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["testvolumespec.go"], - tags = ["automanaged"], deps = [ "//pkg/volume:go_default_library", "//pkg/volume/util/volumehelper:go_default_library", diff --git a/pkg/controller/volume/attachdetach/util/BUILD b/pkg/controller/volume/attachdetach/util/BUILD index ac6db4a6b31..d2bc40261a7 100644 --- a/pkg/controller/volume/attachdetach/util/BUILD +++ b/pkg/controller/volume/attachdetach/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = [ "//pkg/controller/volume/attachdetach/cache:go_default_library", "//pkg/volume:go_default_library", diff --git a/pkg/controller/volume/events/BUILD b/pkg/controller/volume/events/BUILD index bcca6b23aea..eb4d17dddf3 100644 --- a/pkg/controller/volume/events/BUILD +++ b/pkg/controller/volume/events/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["event.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/controller/volume/persistentvolume/BUILD b/pkg/controller/volume/persistentvolume/BUILD index 316ae735dac..aa6b165efa8 100644 --- a/pkg/controller/volume/persistentvolume/BUILD +++ b/pkg/controller/volume/persistentvolume/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "pv_controller_base.go", "volume_host.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/helper:go_default_library", "//pkg/cloudprovider:go_default_library", @@ -63,7 +60,6 @@ go_test( "recycle_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api/testapi:go_default_library", "//pkg/controller:go_default_library", diff --git a/pkg/controller/volume/persistentvolume/options/BUILD b/pkg/controller/volume/persistentvolume/options/BUILD index cd328134024..7bacf7fe3b4 100644 --- a/pkg/controller/volume/persistentvolume/options/BUILD +++ b/pkg/controller/volume/persistentvolume/options/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["options.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/spf13/pflag:go_default_library"], ) diff --git a/pkg/conversion/BUILD b/pkg/conversion/BUILD index 9f371d60332..876947c2e44 100644 --- a/pkg/conversion/BUILD +++ b/pkg/conversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/conversion/queryparams/BUILD b/pkg/conversion/queryparams/BUILD index deefdcef3c1..df044c0ebf9 100644 --- a/pkg/conversion/queryparams/BUILD +++ b/pkg/conversion/queryparams/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/credentialprovider/BUILD b/pkg/credentialprovider/BUILD index 00778151553..83f77387b9f 100644 --- a/pkg/credentialprovider/BUILD +++ b/pkg/credentialprovider/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "plugins.go", "provider.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/docker/docker/api/types:go_default_library", "//vendor/github.com/golang/glog:go_default_library", @@ -34,7 +31,6 @@ go_test( "provider_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/github.com/docker/docker/api/types:go_default_library"], ) diff --git a/pkg/credentialprovider/aws/BUILD b/pkg/credentialprovider/aws/BUILD index 550fd90001e..cc3e0d955d7 100644 --- a/pkg/credentialprovider/aws/BUILD +++ b/pkg/credentialprovider/aws/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["aws_credentials.go"], - tags = ["automanaged"], deps = [ "//pkg/credentialprovider:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", @@ -26,7 +23,6 @@ go_test( name = "go_default_test", srcs = ["aws_credentials_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/credentialprovider:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", diff --git a/pkg/credentialprovider/azure/BUILD b/pkg/credentialprovider/azure/BUILD index 9efcbe78d77..0ba1582e75d 100644 --- a/pkg/credentialprovider/azure/BUILD +++ b/pkg/credentialprovider/azure/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "azure_acr_helper.go", "azure_credentials.go", ], - tags = ["automanaged"], deps = [ "//pkg/cloudprovider/providers/azure:go_default_library", "//pkg/credentialprovider:go_default_library", @@ -32,7 +29,6 @@ go_test( name = "go_default_test", srcs = ["azure_credentials_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/Azure/azure-sdk-for-go/arm/containerregistry:go_default_library", "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", diff --git a/pkg/credentialprovider/gcp/BUILD b/pkg/credentialprovider/gcp/BUILD index 8f3a8aaa60b..45f4c3b5c97 100644 --- a/pkg/credentialprovider/gcp/BUILD +++ b/pkg/credentialprovider/gcp/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "jwt.go", "metadata.go", ], - tags = ["automanaged"], deps = [ "//pkg/credentialprovider:go_default_library", "//vendor/github.com/golang/glog:go_default_library", @@ -34,7 +31,6 @@ go_test( "metadata_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/credentialprovider:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", diff --git a/pkg/credentialprovider/rancher/BUILD b/pkg/credentialprovider/rancher/BUILD index 641dfe7679c..02689ef5c44 100644 --- a/pkg/credentialprovider/rancher/BUILD +++ b/pkg/credentialprovider/rancher/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["rancher_registry_credentials_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/credentialprovider:go_default_library", "//vendor/github.com/rancher/go-rancher/client:go_default_library", @@ -25,7 +22,6 @@ go_library( "doc.go", "rancher_registry_credentials.go", ], - tags = ["automanaged"], deps = [ "//pkg/credentialprovider:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/pkg/features/BUILD b/pkg/features/BUILD index 1bc19d3ab4c..30bf7b14ecb 100644 --- a/pkg/features/BUILD +++ b/pkg/features/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["kube_features.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/features:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", diff --git a/pkg/fieldpath/BUILD b/pkg/fieldpath/BUILD index 1b77094d462..05710a259df 100644 --- a/pkg/fieldpath/BUILD +++ b/pkg/fieldpath/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "fieldpath.go", ], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library"], ) @@ -22,7 +19,6 @@ go_test( name = "go_default_test", srcs = ["fieldpath_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/fields/BUILD b/pkg/fields/BUILD index deefdcef3c1..df044c0ebf9 100644 --- a/pkg/fields/BUILD +++ b/pkg/fields/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/generated/BUILD b/pkg/generated/BUILD index bac9f90885f..cb2a850ebe5 100644 --- a/pkg/generated/BUILD +++ b/pkg/generated/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "bindata.go", "doc.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/generated/openapi/BUILD b/pkg/generated/openapi/BUILD index 6d867fedab7..075cc4487ee 100644 --- a/pkg/generated/openapi/BUILD +++ b/pkg/generated/openapi/BUILD @@ -1,9 +1,10 @@ +# doc.go is managed by kazel, so gazelle should ignore it. +# gazelle:exclude doc.go + package(default_visibility = ["//visibility:public"]) load("//pkg/generated/openapi:def.bzl", "openapi_library") -licenses(["notice"]) - openapi_library( name = "go_default_library", srcs = ["doc.go"], @@ -34,6 +35,7 @@ openapi_library( "k8s.io/api/imagepolicy/v1alpha1", "k8s.io/api/networking/v1", "k8s.io/api/policy/v1beta1", + "k8s.io/api/rbac/v1", "k8s.io/api/rbac/v1alpha1", "k8s.io/api/rbac/v1beta1", "k8s.io/api/scheduling/v1alpha1", diff --git a/pkg/hyperkube/BUILD b/pkg/hyperkube/BUILD index deefdcef3c1..df044c0ebf9 100644 --- a/pkg/hyperkube/BUILD +++ b/pkg/hyperkube/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/kubeapiserver/BUILD b/pkg/kubeapiserver/BUILD index da7df70f9bc..fc2e3afe13e 100644 --- a/pkg/kubeapiserver/BUILD +++ b/pkg/kubeapiserver/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "default_storage_factory_builder.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", @@ -49,7 +46,6 @@ go_test( name = "go_default_test", srcs = ["default_storage_factory_builder_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", diff --git a/pkg/kubeapiserver/admission/BUILD b/pkg/kubeapiserver/admission/BUILD index ea15aac6ac1..c1a833dcd13 100644 --- a/pkg/kubeapiserver/admission/BUILD +++ b/pkg/kubeapiserver/admission/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["init_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", "//vendor/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", @@ -22,7 +19,6 @@ go_test( go_library( name = "go_default_library", srcs = ["initializer.go"], - tags = ["automanaged"], deps = [ "//pkg/client/clientset_generated/internalclientset:go_default_library", "//pkg/client/informers/informers_generated/internalversion:go_default_library", diff --git a/pkg/kubeapiserver/admission/configuration/BUILD b/pkg/kubeapiserver/admission/configuration/BUILD index 0449f19e274..edd36ae534b 100644 --- a/pkg/kubeapiserver/admission/configuration/BUILD +++ b/pkg/kubeapiserver/admission/configuration/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "initializer_manager_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", @@ -34,7 +31,6 @@ go_library( "external_admission_hook_manager.go", "initializer_manager.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", diff --git a/pkg/kubeapiserver/authenticator/BUILD b/pkg/kubeapiserver/authenticator/BUILD index 5375c49a7a1..744763e4753 100644 --- a/pkg/kubeapiserver/authenticator/BUILD +++ b/pkg/kubeapiserver/authenticator/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["config.go"], - tags = ["automanaged"], deps = [ "//pkg/serviceaccount:go_default_library", "//vendor/github.com/go-openapi/spec:go_default_library", @@ -23,7 +20,9 @@ go_library( "//vendor/k8s.io/apiserver/pkg/authentication/request/union:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/request/websocket:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/request/x509:go_default_library", + "//vendor/k8s.io/apiserver/pkg/authentication/token/cache:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/token/tokenfile:go_default_library", + "//vendor/k8s.io/apiserver/pkg/authentication/token/union:go_default_library", "//vendor/k8s.io/apiserver/plugin/pkg/authenticator/password/keystone:go_default_library", "//vendor/k8s.io/apiserver/plugin/pkg/authenticator/password/passwordfile:go_default_library", "//vendor/k8s.io/apiserver/plugin/pkg/authenticator/request/basicauth:go_default_library", diff --git a/pkg/kubeapiserver/authenticator/config.go b/pkg/kubeapiserver/authenticator/config.go index 418b616855c..72261cfdac4 100644 --- a/pkg/kubeapiserver/authenticator/config.go +++ b/pkg/kubeapiserver/authenticator/config.go @@ -30,7 +30,9 @@ import ( "k8s.io/apiserver/pkg/authentication/request/union" "k8s.io/apiserver/pkg/authentication/request/websocket" "k8s.io/apiserver/pkg/authentication/request/x509" + tokencache "k8s.io/apiserver/pkg/authentication/token/cache" "k8s.io/apiserver/pkg/authentication/token/tokenfile" + tokenunion "k8s.io/apiserver/pkg/authentication/token/union" "k8s.io/apiserver/plugin/pkg/authenticator/password/keystone" "k8s.io/apiserver/plugin/pkg/authenticator/password/passwordfile" "k8s.io/apiserver/plugin/pkg/authenticator/request/basicauth" @@ -62,6 +64,9 @@ type AuthenticatorConfig struct { WebhookTokenAuthnConfigFile string WebhookTokenAuthnCacheTTL time.Duration + TokenSuccessCacheTTL time.Duration + TokenFailureCacheTTL time.Duration + RequestHeaderConfig *authenticatorfactory.RequestHeaderConfig // TODO, this is the only non-serializable part of the entire config. Factor it out into a clientconfig @@ -73,9 +78,9 @@ type AuthenticatorConfig struct { // Kubernetes authentication mechanisms. func (config AuthenticatorConfig) New() (authenticator.Request, *spec.SecurityDefinitions, error) { var authenticators []authenticator.Request + var tokenAuthenticators []authenticator.Token securityDefinitions := spec.SecurityDefinitions{} hasBasicAuth := false - hasTokenAuth := false // front-proxy, BasicAuth methods, local first, then remote // Add the front proxy authenticator if requested @@ -125,22 +130,19 @@ func (config AuthenticatorConfig) New() (authenticator.Request, *spec.SecurityDe if err != nil { return nil, nil, err } - authenticators = append(authenticators, bearertoken.New(tokenAuth), websocket.NewProtocolAuthenticator(tokenAuth)) - hasTokenAuth = true + tokenAuthenticators = append(tokenAuthenticators, tokenAuth) } if len(config.ServiceAccountKeyFiles) > 0 { serviceAccountAuth, err := newServiceAccountAuthenticator(config.ServiceAccountKeyFiles, config.ServiceAccountLookup, config.ServiceAccountTokenGetter) if err != nil { return nil, nil, err } - authenticators = append(authenticators, bearertoken.New(serviceAccountAuth), websocket.NewProtocolAuthenticator(serviceAccountAuth)) - hasTokenAuth = true + tokenAuthenticators = append(tokenAuthenticators, serviceAccountAuth) } if config.BootstrapToken { if config.BootstrapTokenAuthenticator != nil { // TODO: This can sometimes be nil because of - authenticators = append(authenticators, bearertoken.New(config.BootstrapTokenAuthenticator), websocket.NewProtocolAuthenticator(config.BootstrapTokenAuthenticator)) - hasTokenAuth = true + tokenAuthenticators = append(tokenAuthenticators, config.BootstrapTokenAuthenticator) } } // NOTE(ericchiang): Keep the OpenID Connect after Service Accounts. @@ -154,16 +156,14 @@ func (config AuthenticatorConfig) New() (authenticator.Request, *spec.SecurityDe if err != nil { return nil, nil, err } - authenticators = append(authenticators, bearertoken.New(oidcAuth), websocket.NewProtocolAuthenticator(oidcAuth)) - hasTokenAuth = true + tokenAuthenticators = append(tokenAuthenticators, oidcAuth) } if len(config.WebhookTokenAuthnConfigFile) > 0 { webhookTokenAuth, err := newWebhookTokenAuthenticator(config.WebhookTokenAuthnConfigFile, config.WebhookTokenAuthnCacheTTL) if err != nil { return nil, nil, err } - authenticators = append(authenticators, bearertoken.New(webhookTokenAuth), websocket.NewProtocolAuthenticator(webhookTokenAuth)) - hasTokenAuth = true + tokenAuthenticators = append(tokenAuthenticators, webhookTokenAuth) } if hasBasicAuth { @@ -175,7 +175,14 @@ func (config AuthenticatorConfig) New() (authenticator.Request, *spec.SecurityDe } } - if hasTokenAuth { + if len(tokenAuthenticators) > 0 { + // Union the token authenticators + tokenAuth := tokenunion.New(tokenAuthenticators...) + // Optionally cache authentication results + if config.TokenSuccessCacheTTL > 0 || config.TokenFailureCacheTTL > 0 { + tokenAuth = tokencache.New(tokenAuth, config.TokenSuccessCacheTTL, config.TokenFailureCacheTTL) + } + authenticators = append(authenticators, bearertoken.New(tokenAuth), websocket.NewProtocolAuthenticator(tokenAuth)) securityDefinitions["BearerToken"] = &spec.SecurityScheme{ SecuritySchemeProps: spec.SecuritySchemeProps{ Type: "apiKey", diff --git a/pkg/kubeapiserver/authorizer/BUILD b/pkg/kubeapiserver/authorizer/BUILD index 95d4851d014..5fab7712679 100644 --- a/pkg/kubeapiserver/authorizer/BUILD +++ b/pkg/kubeapiserver/authorizer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,14 +13,12 @@ go_test( "//pkg/auth/authorizer/abac:example_policy", ], library = ":go_default_library", - tags = ["automanaged"], deps = ["//pkg/kubeapiserver/authorizer/modes:go_default_library"], ) go_library( name = "go_default_library", srcs = ["config.go"], - tags = ["automanaged"], deps = [ "//pkg/apis/rbac:go_default_library", "//pkg/auth/authorizer/abac:go_default_library", diff --git a/pkg/kubeapiserver/authorizer/modes/BUILD b/pkg/kubeapiserver/authorizer/modes/BUILD index df54566faef..3d6e3406c13 100644 --- a/pkg/kubeapiserver/authorizer/modes/BUILD +++ b/pkg/kubeapiserver/authorizer/modes/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["modes_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["modes.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/kubeapiserver/options/BUILD b/pkg/kubeapiserver/options/BUILD index cdcafa8646b..83d1a3793bf 100644 --- a/pkg/kubeapiserver/options/BUILD +++ b/pkg/kubeapiserver/options/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "serving.go", "storage_versions.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/informers/informers_generated/internalversion:go_default_library", @@ -56,6 +53,5 @@ go_test( name = "go_default_test", srcs = ["storage_versions_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library"], ) diff --git a/pkg/kubeapiserver/options/authentication.go b/pkg/kubeapiserver/options/authentication.go index 89a5219d6af..cc21d4cacb2 100644 --- a/pkg/kubeapiserver/options/authentication.go +++ b/pkg/kubeapiserver/options/authentication.go @@ -41,6 +41,9 @@ type BuiltInAuthenticationOptions struct { ServiceAccounts *ServiceAccountAuthenticationOptions TokenFile *TokenFileAuthenticationOptions WebHook *WebHookAuthenticationOptions + + TokenSuccessCacheTTL time.Duration + TokenFailureCacheTTL time.Duration } type AnonymousAuthenticationOptions struct { @@ -83,7 +86,10 @@ type WebHookAuthenticationOptions struct { } func NewBuiltInAuthenticationOptions() *BuiltInAuthenticationOptions { - return &BuiltInAuthenticationOptions{} + return &BuiltInAuthenticationOptions{ + TokenSuccessCacheTTL: 10 * time.Second, + TokenFailureCacheTTL: 0 * time.Second, + } } func (s *BuiltInAuthenticationOptions) WithAll() *BuiltInAuthenticationOptions { @@ -250,7 +256,10 @@ func (s *BuiltInAuthenticationOptions) AddFlags(fs *pflag.FlagSet) { } func (s *BuiltInAuthenticationOptions) ToAuthenticationConfig() authenticator.AuthenticatorConfig { - ret := authenticator.AuthenticatorConfig{} + ret := authenticator.AuthenticatorConfig{ + TokenSuccessCacheTTL: s.TokenSuccessCacheTTL, + TokenFailureCacheTTL: s.TokenFailureCacheTTL, + } if s.Anonymous != nil { ret.Anonymous = s.Anonymous.Allow @@ -297,6 +306,15 @@ func (s *BuiltInAuthenticationOptions) ToAuthenticationConfig() authenticator.Au if s.WebHook != nil { ret.WebhookTokenAuthnConfigFile = s.WebHook.ConfigFile ret.WebhookTokenAuthnCacheTTL = s.WebHook.CacheTTL + + if len(s.WebHook.ConfigFile) > 0 && s.WebHook.CacheTTL > 0 { + if s.TokenSuccessCacheTTL > 0 && s.WebHook.CacheTTL < s.TokenSuccessCacheTTL { + glog.Warningf("the webhook cache ttl of %s is shorter than the overall cache ttl of %s for successful token authentication attempts.", s.WebHook.CacheTTL, s.TokenSuccessCacheTTL) + } + if s.TokenFailureCacheTTL > 0 && s.WebHook.CacheTTL < s.TokenFailureCacheTTL { + glog.Warningf("the webhook cache ttl of %s is shorter than the overall cache ttl of %s for failed token authentication attempts.", s.WebHook.CacheTTL, s.TokenFailureCacheTTL) + } + } } return ret diff --git a/pkg/kubeapiserver/server/BUILD b/pkg/kubeapiserver/server/BUILD index 0c6f4c43221..cbbc801b475 100644 --- a/pkg/kubeapiserver/server/BUILD +++ b/pkg/kubeapiserver/server/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["insecure_handler.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", diff --git a/pkg/kubectl/BUILD b/pkg/kubectl/BUILD index 7ba148beb69..a408dad1dea 100644 --- a/pkg/kubectl/BUILD +++ b/pkg/kubectl/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,12 +12,10 @@ go_test( "cluster_test.go", "configmap_test.go", "delete_test.go", - "deployment_test.go", "env_file_test.go", "generate_test.go", "kubectl_test.go", "namespace_test.go", - "proxy_server_test.go", "quota_test.go", "resource_filter_test.go", "rolebinding_test.go", @@ -36,7 +32,6 @@ go_test( "sorting_printer_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//pkg/api:go_default_library", @@ -97,7 +92,6 @@ go_library( "kubectl.go", "namespace.go", "pdb.go", - "proxy_server.go", "quota.go", "resource_filter.go", "rolebinding.go", @@ -115,7 +109,6 @@ go_library( "sorting_printer.go", "versioned_client.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//pkg/api:go_default_library", @@ -135,7 +128,6 @@ go_library( "//pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion:go_default_library", "//pkg/client/retry:go_default_library", "//pkg/client/unversioned:go_default_library", - "//pkg/controller:go_default_library", "//pkg/controller/daemon:go_default_library", "//pkg/controller/deployment/util:go_default_library", "//pkg/credentialprovider:go_default_library", @@ -195,6 +187,7 @@ filegroup( "//pkg/kubectl/cmd:all-srcs", "//pkg/kubectl/metricsutil:all-srcs", "//pkg/kubectl/plugins:all-srcs", + "//pkg/kubectl/proxy:all-srcs", "//pkg/kubectl/resource:all-srcs", "//pkg/kubectl/testing:all-srcs", "//pkg/kubectl/util:all-srcs", diff --git a/pkg/kubectl/cmd/BUILD b/pkg/kubectl/cmd/BUILD index 2f3d2196528..0ec8b593cfb 100644 --- a/pkg/kubectl/cmd/BUILD +++ b/pkg/kubectl/cmd/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -65,7 +63,6 @@ go_library( "top_pod.go", "version.go", ], - tags = ["automanaged"], visibility = [ "//build/visible_to:pkg_kubectl_cmd_CONSUMERS", ], @@ -79,7 +76,6 @@ go_library( "//pkg/client/clientset_generated/internalclientset/typed/core/internalversion:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion:go_default_library", "//pkg/client/unversioned:go_default_library", - "//pkg/controller:go_default_library", "//pkg/kubectl:go_default_library", "//pkg/kubectl/cmd/auth:go_default_library", "//pkg/kubectl/cmd/config:go_default_library", @@ -91,6 +87,7 @@ go_library( "//pkg/kubectl/cmd/util/openapi:go_default_library", "//pkg/kubectl/metricsutil:go_default_library", "//pkg/kubectl/plugins:go_default_library", + "//pkg/kubectl/proxy:go_default_library", "//pkg/kubectl/resource:go_default_library", "//pkg/kubectl/util:go_default_library", "//pkg/kubectl/util/term:go_default_library", @@ -194,9 +191,6 @@ go_test( "//test/fixtures", ], library = ":go_default_library", - tags = [ - "automanaged", - ], deps = [ "//pkg/api:go_default_library", "//pkg/api/ref:go_default_library", diff --git a/pkg/kubectl/cmd/annotate_test.go b/pkg/kubectl/cmd/annotate_test.go index 7f8a2e24538..e1b6ca7d6dd 100644 --- a/pkg/kubectl/cmd/annotate_test.go +++ b/pkg/kubectl/cmd/annotate_test.go @@ -156,6 +156,18 @@ func TestParseAnnotations(t *testing.T) { scenario: "incorrect annotation input (missing =value)", expectErr: true, }, + { + annotations: []string{"-"}, + expectedErr: "invalid annotation format: -", + scenario: "incorrect annotation input (missing key)", + expectErr: true, + }, + { + annotations: []string{"=bar"}, + expectedErr: "invalid annotation format: =bar", + scenario: "incorrect annotation input (missing key)", + expectErr: true, + }, } for _, test := range tests { annotations, remove, err := parseAnnotations(test.annotations) @@ -380,6 +392,18 @@ func TestAnnotateErrors(t *testing.T) { return strings.Contains(err.Error(), "at least one annotation update is required") }, }, + "wrong annotations": { + args: []string{"pods", "-"}, + errFn: func(err error) bool { + return strings.Contains(err.Error(), "at least one annotation update is required") + }, + }, + "wrong annotations 2": { + args: []string{"pods", "=bar"}, + errFn: func(err error) bool { + return strings.Contains(err.Error(), "at least one annotation update is required") + }, + }, "no resources remove annotations": { args: []string{"pods-"}, errFn: func(err error) bool { return strings.Contains(err.Error(), "one or more resources must be specified") }, diff --git a/pkg/kubectl/cmd/auth/BUILD b/pkg/kubectl/cmd/auth/BUILD index ee161a7aef8..a5b957d4b22 100644 --- a/pkg/kubectl/cmd/auth/BUILD +++ b/pkg/kubectl/cmd/auth/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_library( "auth.go", "cani.go", ], - tags = ["automanaged"], visibility = [ "//build/visible_to:pkg_kubectl_cmd_auth_CONSUMERS", ], @@ -46,7 +43,6 @@ go_test( name = "go_default_test", srcs = ["cani_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/kubectl/cmd/testing:go_default_library", diff --git a/pkg/kubectl/cmd/config/BUILD b/pkg/kubectl/cmd/config/BUILD index 71213a2fb9f..d5c9c127c5b 100644 --- a/pkg/kubectl/cmd/config/BUILD +++ b/pkg/kubectl/cmd/config/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -25,7 +23,6 @@ go_library( "use_context.go", "view.go", ], - tags = ["automanaged"], visibility = [ "//build/visible_to:pkg_kubectl_cmd_config_CONSUMERS", ], @@ -66,7 +63,6 @@ go_test( "view_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubectl/cmd/util:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", diff --git a/pkg/kubectl/cmd/drain.go b/pkg/kubectl/cmd/drain.go index 8f6d511bc03..ac3ba7cb7b0 100644 --- a/pkg/kubectl/cmd/drain.go +++ b/pkg/kubectl/cmd/drain.go @@ -42,7 +42,6 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/policy" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" @@ -286,7 +285,7 @@ func (o *DrainOptions) getController(namespace string, controllerRef *metav1.Own } func (o *DrainOptions) getPodController(pod api.Pod) (*metav1.OwnerReference, error) { - controllerRef := controller.GetControllerOf(&pod) + controllerRef := metav1.GetControllerOf(&pod) if controllerRef == nil { return nil, nil } @@ -631,6 +630,9 @@ func (o *DrainOptions) RunCordonOrUncordon(desired bool) error { return err } oldData, err := json.Marshal(obj) + if err != nil { + return err + } node, ok := obj.(*corev1.Node) if !ok { return fmt.Errorf("unexpected Type%T, expected Node", obj) @@ -642,6 +644,9 @@ func (o *DrainOptions) RunCordonOrUncordon(desired bool) error { helper := resource.NewHelper(o.restClient, o.nodeInfo.Mapping) node.Spec.Unschedulable = desired newData, err := json.Marshal(obj) + if err != nil { + return err + } patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, obj) if err != nil { return err diff --git a/pkg/kubectl/cmd/edit_test.go b/pkg/kubectl/cmd/edit_test.go index e821793a3d3..ef3be5e40d1 100644 --- a/pkg/kubectl/cmd/edit_test.go +++ b/pkg/kubectl/cmd/edit_test.go @@ -280,6 +280,9 @@ func TestEdit(t *testing.T) { t.Errorf("%s: expected to see '%s' in stderr\n\nstdout:\n%s\n\nstderr:\n%s", name, s, stdout, stderr) } } + if i < len(testcase.Steps) { + t.Errorf("%s: saw %d steps, testcase included %d additional steps that were not exercised", name, i, len(testcase.Steps)-i) + } } } diff --git a/pkg/kubectl/cmd/get.go b/pkg/kubectl/cmd/get.go index 0d1cf0ebc93..077fb958aa9 100644 --- a/pkg/kubectl/cmd/get.go +++ b/pkg/kubectl/cmd/get.go @@ -138,6 +138,7 @@ func NewCmdGet(f cmdutil.Factory, out io.Writer, errOut io.Writer) *cobra.Comman usage := "identifying the resource to get from a server." cmdutil.AddFilenameOptionFlags(cmd, &options.FilenameOptions, usage) cmdutil.AddInclude3rdPartyFlags(cmd) + cmdutil.AddOpenAPIFlags(cmd) cmd.Flags().StringVar(&options.Raw, "raw", options.Raw, "Raw URI to request from the server. Uses the transport specified by the kubeconfig file.") return cmd } @@ -456,7 +457,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [ // if cmd does not specify output format and useOpenAPIPrintColumnFlagLabel flag is true, // then get the default output options for this mapping from OpenAPI schema. if !cmdSpecifiesOutputFmt(cmd) && useOpenAPIPrintColumns { - outputOpts, _ = outputOptsForMappingFromOpenAPI(f, mapping) + outputOpts, _ = outputOptsForMappingFromOpenAPI(f, cmdutil.GetOpenAPICacheDir(cmd), mapping) } printer, err = f.PrinterForMapping(cmd, false, outputOpts, mapping, allNamespaces) @@ -555,11 +556,11 @@ func cmdSpecifiesOutputFmt(cmd *cobra.Command) bool { // outputOptsForMappingFromOpenAPI looks for the output format metatadata in the // openapi schema and returns the output options for the mapping if found. -func outputOptsForMappingFromOpenAPI(f cmdutil.Factory, mapping *meta.RESTMapping) (*printers.OutputOptions, bool) { +func outputOptsForMappingFromOpenAPI(f cmdutil.Factory, openAPIcacheDir string, mapping *meta.RESTMapping) (*printers.OutputOptions, bool) { // user has not specified any output format, check if OpenAPI has // default specification to print this resource type - api, err := f.OpenAPISchema() + api, err := f.OpenAPISchema(openAPIcacheDir) if err != nil { // Error getting schema return nil, false diff --git a/pkg/kubectl/cmd/get_test.go b/pkg/kubectl/cmd/get_test.go index 1ae8208a56a..be8bc30f5eb 100644 --- a/pkg/kubectl/cmd/get_test.go +++ b/pkg/kubectl/cmd/get_test.go @@ -140,7 +140,7 @@ func TestGetUnknownSchemaObject(t *testing.T) { expected := []runtime.Object{cmdtesting.NewInternalType("", "", "foo")} actual := tf.Printer.(*testPrinter).Objects if len(actual) != len(expected) { - t.Fatal(actual) + t.Fatalf("expected: %#v, but actual: %#v", expected, actual) } for i, obj := range actual { expectedJSON := runtime.EncodeOrDie(codec, expected[i]) @@ -156,7 +156,7 @@ func TestGetUnknownSchemaObject(t *testing.T) { } if !reflect.DeepEqual(expectedMap, actualMap) { - t.Errorf("unexpected object: \n%#v\n%#v", expectedMap, actualMap) + t.Errorf("expectedMap: %#v, but actualMap: %#v", expectedMap, actualMap) } } } @@ -212,7 +212,7 @@ func TestGetObjectsWithOpenAPIOutputFormatPresent(t *testing.T) { verifyObjects(t, expected, tf.Printer.(*testPrinter).Objects) if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") + t.Error("unexpected empty output") } } @@ -265,7 +265,7 @@ func TestGetObjects(t *testing.T) { verifyObjects(t, expected, tf.Printer.(*testPrinter).Objects) if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") + t.Error("unexpected empty output") } } @@ -417,7 +417,7 @@ func TestGetSortedObjects(t *testing.T) { verifyObjects(t, expected, tf.Printer.(*testPrinter).Objects) if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") + t.Error("unexpected empty output") } } @@ -471,7 +471,7 @@ func TestGetObjectsIdentifiedByFile(t *testing.T) { verifyObjects(t, expected, tf.Printer.(*testPrinter).Objects) if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") + t.Error("unexpected empty output") } } @@ -500,7 +500,7 @@ func TestGetListObjects(t *testing.T) { verifyObjects(t, expected, tf.Printer.(*testPrinter).Objects) if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") + t.Error("unexpected empty output") } } @@ -542,7 +542,7 @@ func TestGetAllListObjects(t *testing.T) { verifyObjects(t, expected, tf.Printer.(*testPrinter).Objects) if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") + t.Error("unexpected empty output") } } @@ -571,7 +571,7 @@ func TestGetListComponentStatus(t *testing.T) { verifyObjects(t, expected, tf.Printer.(*testPrinter).Objects) if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") + t.Error("unexpected empty output") } } @@ -610,7 +610,7 @@ func TestGetMultipleTypeObjects(t *testing.T) { verifyObjects(t, expected, tf.Printer.(*testPrinter).Objects) if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") + t.Error("unexpected empty output") } } @@ -719,7 +719,7 @@ func TestGetMultipleTypeObjectsWithSelector(t *testing.T) { verifyObjects(t, expected, tf.Printer.(*testPrinter).Objects) if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") + t.Error("unexpected empty output") } } @@ -764,7 +764,7 @@ func TestGetMultipleTypeObjectsWithDirectReference(t *testing.T) { verifyObjects(t, expected, tf.Printer.(*testPrinter).Objects) if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") + t.Error("unexpected empty output") } } @@ -789,7 +789,7 @@ func TestGetByFormatForcesFlag(t *testing.T) { showAllFlag, _ := cmd.Flags().GetBool("show-all") if showAllFlag { - t.Errorf("expected showAll to not be true when getting resource") + t.Error("expected showAll to not be true when getting resource") } } @@ -909,7 +909,7 @@ func TestWatchSelector(t *testing.T) { verifyObjects(t, expected, tf.Printer.(*testPrinter).Objects) if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") + t.Error("unexpected empty output") } } @@ -951,7 +951,7 @@ func TestWatchResource(t *testing.T) { verifyObjects(t, expected, tf.Printer.(*testPrinter).Objects) if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") + t.Error("unexpected empty output") } } @@ -994,7 +994,7 @@ func TestWatchResourceIdentifiedByFile(t *testing.T) { verifyObjects(t, expected, tf.Printer.(*testPrinter).Objects) if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") + t.Error("unexpected empty output") } } @@ -1036,7 +1036,7 @@ func TestWatchOnlyResource(t *testing.T) { verifyObjects(t, expected, tf.Printer.(*testPrinter).Objects) if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") + t.Error("unexpected empty output") } } @@ -1082,7 +1082,7 @@ func TestWatchOnlyList(t *testing.T) { verifyObjects(t, expected, tf.Printer.(*testPrinter).Objects) if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") + t.Error("unexpected empty output") } } diff --git a/pkg/kubectl/cmd/label_test.go b/pkg/kubectl/cmd/label_test.go index e92dda131bd..5140ca2bcf2 100644 --- a/pkg/kubectl/cmd/label_test.go +++ b/pkg/kubectl/cmd/label_test.go @@ -289,6 +289,14 @@ func TestLabelErrors(t *testing.T) { args: []string{"pods"}, errFn: func(err error) bool { return strings.Contains(err.Error(), "at least one label update is required") }, }, + "wrong labels": { + args: []string{"pods", "-"}, + errFn: func(err error) bool { return strings.Contains(err.Error(), "at least one label update is required") }, + }, + "wrong labels 2": { + args: []string{"pods", "=bar"}, + errFn: func(err error) bool { return strings.Contains(err.Error(), "at least one label update is required") }, + }, "no resources": { args: []string{"pods-"}, errFn: func(err error) bool { return strings.Contains(err.Error(), "one or more resources must be specified") }, diff --git a/pkg/kubectl/cmd/proxy.go b/pkg/kubectl/cmd/proxy.go index 667841d6618..979d8f8aa23 100644 --- a/pkg/kubectl/cmd/proxy.go +++ b/pkg/kubectl/cmd/proxy.go @@ -26,9 +26,9 @@ import ( "github.com/golang/glog" "github.com/spf13/cobra" - "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/proxy" "k8s.io/kubernetes/pkg/util/i18n" ) @@ -83,10 +83,10 @@ func NewCmdProxy(f cmdutil.Factory, out io.Writer) *cobra.Command { cmd.Flags().StringP("www", "w", "", "Also serve static files from the given directory under the specified prefix.") cmd.Flags().StringP("www-prefix", "P", "/static/", "Prefix to serve static files under, if static file directory is specified.") cmd.Flags().StringP("api-prefix", "", "/", "Prefix to serve the proxied API under.") - cmd.Flags().String("accept-paths", kubectl.DefaultPathAcceptRE, "Regular expression for paths that the proxy should accept.") - cmd.Flags().String("reject-paths", kubectl.DefaultPathRejectRE, "Regular expression for paths that the proxy should reject. Paths specified here will be rejected even accepted by --accept-paths.") - cmd.Flags().String("accept-hosts", kubectl.DefaultHostAcceptRE, "Regular expression for hosts that the proxy should accept.") - cmd.Flags().String("reject-methods", kubectl.DefaultMethodRejectRE, "Regular expression for HTTP methods that the proxy should reject (example --reject-methods='POST,PUT,PATCH'). ") + cmd.Flags().String("accept-paths", proxy.DefaultPathAcceptRE, "Regular expression for paths that the proxy should accept.") + cmd.Flags().String("reject-paths", proxy.DefaultPathRejectRE, "Regular expression for paths that the proxy should reject. Paths specified here will be rejected even accepted by --accept-paths.") + cmd.Flags().String("accept-hosts", proxy.DefaultHostAcceptRE, "Regular expression for hosts that the proxy should accept.") + cmd.Flags().String("reject-methods", proxy.DefaultMethodRejectRE, "Regular expression for HTTP methods that the proxy should reject (example --reject-methods='POST,PUT,PATCH'). ") cmd.Flags().IntP("port", "p", defaultPort, "The port on which to run the proxy. Set to 0 to pick a random port.") cmd.Flags().StringP("address", "", "127.0.0.1", "The IP address on which to serve on.") cmd.Flags().Bool("disable-filter", false, "If true, disable request filtering in the proxy. This is dangerous, and can leave you vulnerable to XSRF attacks, when used with an accessible port.") @@ -126,11 +126,11 @@ func RunProxy(f cmdutil.Factory, out io.Writer, cmd *cobra.Command) error { if !strings.HasSuffix(apiProxyPrefix, "/") { apiProxyPrefix += "/" } - filter := &kubectl.FilterServer{ - AcceptPaths: kubectl.MakeRegexpArrayOrDie(cmdutil.GetFlagString(cmd, "accept-paths")), - RejectPaths: kubectl.MakeRegexpArrayOrDie(cmdutil.GetFlagString(cmd, "reject-paths")), - AcceptHosts: kubectl.MakeRegexpArrayOrDie(cmdutil.GetFlagString(cmd, "accept-hosts")), - RejectMethods: kubectl.MakeRegexpArrayOrDie(cmdutil.GetFlagString(cmd, "reject-methods")), + filter := &proxy.FilterServer{ + AcceptPaths: proxy.MakeRegexpArrayOrDie(cmdutil.GetFlagString(cmd, "accept-paths")), + RejectPaths: proxy.MakeRegexpArrayOrDie(cmdutil.GetFlagString(cmd, "reject-paths")), + AcceptHosts: proxy.MakeRegexpArrayOrDie(cmdutil.GetFlagString(cmd, "accept-hosts")), + RejectMethods: proxy.MakeRegexpArrayOrDie(cmdutil.GetFlagString(cmd, "reject-methods")), } if cmdutil.GetFlagBool(cmd, "disable-filter") { if path == "" { @@ -139,7 +139,7 @@ func RunProxy(f cmdutil.Factory, out io.Writer, cmd *cobra.Command) error { filter = nil } - server, err := kubectl.NewProxyServer(staticDir, apiProxyPrefix, staticPrefix, filter, clientConfig) + server, err := proxy.NewServer(staticDir, apiProxyPrefix, staticPrefix, filter, clientConfig) // Separate listening from serving so we can report the bound port // when it is chosen by os (eg: port == 0) @@ -152,7 +152,7 @@ func RunProxy(f cmdutil.Factory, out io.Writer, cmd *cobra.Command) error { if err != nil { glog.Fatal(err) } - fmt.Fprintf(out, "Starting to serve on %s", l.Addr().String()) + fmt.Fprintf(out, "Starting to serve on %s\n", l.Addr().String()) glog.Fatal(server.ServeOnListener(l)) return nil } diff --git a/pkg/kubectl/cmd/rollout/BUILD b/pkg/kubectl/cmd/rollout/BUILD index bea99df4f26..d01d3a60359 100644 --- a/pkg/kubectl/cmd/rollout/BUILD +++ b/pkg/kubectl/cmd/rollout/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "rollout_status.go", "rollout_undo.go", ], - tags = ["automanaged"], visibility = [ "//build/visible_to:pkg_kubectl_cmd_rollout_CONSUMERS", ], diff --git a/pkg/kubectl/cmd/set/BUILD b/pkg/kubectl/cmd/set/BUILD index 5712cff968d..78dc5d2c52c 100644 --- a/pkg/kubectl/cmd/set/BUILD +++ b/pkg/kubectl/cmd/set/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "set_selector.go", "set_subject.go", ], - tags = ["automanaged"], visibility = ["//build/visible_to:pkg_kubectl_cmd_set_CONSUMERS"], deps = [ "//pkg/api:go_default_library", @@ -52,7 +49,6 @@ go_test( "//examples:config", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/batch:go_default_library", diff --git a/pkg/kubectl/cmd/templates/BUILD b/pkg/kubectl/cmd/templates/BUILD index 7255c533561..082a402d495 100644 --- a/pkg/kubectl/cmd/templates/BUILD +++ b/pkg/kubectl/cmd/templates/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "templater.go", "templates.go", ], - tags = ["automanaged"], visibility = [ "//build/visible_to:pkg_kubectl_cmd_templates_CONSUMERS", ], diff --git a/pkg/kubectl/cmd/templates/command_groups.go b/pkg/kubectl/cmd/templates/command_groups.go index 42baa85a607..447a39621f7 100644 --- a/pkg/kubectl/cmd/templates/command_groups.go +++ b/pkg/kubectl/cmd/templates/command_groups.go @@ -29,9 +29,7 @@ type CommandGroups []CommandGroup func (g CommandGroups) Add(c *cobra.Command) { for _, group := range g { - for _, command := range group.Commands { - c.AddCommand(command) - } + c.AddCommand(group.Commands...) } } diff --git a/pkg/kubectl/cmd/testdata/edit/BUILD b/pkg/kubectl/cmd/testdata/edit/BUILD index e97742e3f02..7c669944352 100644 --- a/pkg/kubectl/cmd/testdata/edit/BUILD +++ b/pkg/kubectl/cmd/testdata/edit/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -9,13 +7,13 @@ load( go_binary( name = "edit", library = ":go_default_library", - tags = ["automanaged"], + visibility = ["//visibility:public"], ) go_library( name = "go_default_library", srcs = ["record.go"], - tags = ["automanaged"], + visibility = ["//visibility:private"], deps = ["//vendor/gopkg.in/yaml.v2:go_default_library"], ) diff --git a/pkg/kubectl/cmd/testing/BUILD b/pkg/kubectl/cmd/testing/BUILD index eccca1cc42f..62f5708a2d0 100644 --- a/pkg/kubectl/cmd/testing/BUILD +++ b/pkg/kubectl/cmd/testing/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ go_library( "fake.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], visibility = [ "//build/visible_to:pkg_kubectl_cmd_testing_CONSUMERS", ], diff --git a/pkg/kubectl/cmd/testing/fake.go b/pkg/kubectl/cmd/testing/fake.go index b69bc1123ef..23c27a45653 100644 --- a/pkg/kubectl/cmd/testing/fake.go +++ b/pkg/kubectl/cmd/testing/fake.go @@ -418,7 +418,7 @@ func (f *FakeFactory) SwaggerSchema(schema.GroupVersionKind) (*swagger.ApiDeclar return nil, nil } -func (f *FakeFactory) OpenAPISchema() (openapi.Resources, error) { +func (f *FakeFactory) OpenAPISchema(cacheDir string) (openapi.Resources, error) { return nil, nil } @@ -756,7 +756,7 @@ func (f *fakeAPIFactory) SwaggerSchema(schema.GroupVersionKind) (*swagger.ApiDec return nil, nil } -func (f *fakeAPIFactory) OpenAPISchema() (openapi.Resources, error) { +func (f *fakeAPIFactory) OpenAPISchema(cacheDir string) (openapi.Resources, error) { if f.tf.OpenAPISchemaFunc != nil { return f.tf.OpenAPISchemaFunc() } diff --git a/pkg/kubectl/cmd/util/BUILD b/pkg/kubectl/cmd/util/BUILD index 85bbf23bac6..99473b51dc0 100644 --- a/pkg/kubectl/cmd/util/BUILD +++ b/pkg/kubectl/cmd/util/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "printing.go", "shortcut_restmapper.go", ], - tags = ["automanaged"], visibility = [ "//build/visible_to:pkg_kubectl_cmd_util_CONSUMERS", ], @@ -89,7 +86,6 @@ go_test( "//api/swagger-spec", ], library = ":go_default_library", - tags = ["automanaged"], visibility = [ "//build/visible_to:COMMON_testing", ], diff --git a/pkg/kubectl/cmd/util/editor/BUILD b/pkg/kubectl/cmd/util/editor/BUILD index 328f1f3e55a..31abf38cc4c 100644 --- a/pkg/kubectl/cmd/util/editor/BUILD +++ b/pkg/kubectl/cmd/util/editor/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_library( "editoptions.go", "editor.go", ], - tags = ["automanaged"], visibility = [ "//build/visible_to:pkg_kubectl_cmd_util_editor_CONSUMERS", ], @@ -43,7 +40,6 @@ go_test( name = "go_default_test", srcs = ["editor_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index d2ccc5c9179..13419716ce5 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -47,7 +47,7 @@ import ( "k8s.io/client-go/tools/clientcmd" fedclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset" "k8s.io/kubernetes/pkg/api" - k8s_api_v1 "k8s.io/kubernetes/pkg/api/v1" + apiv1 "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" @@ -224,7 +224,7 @@ type ObjectMappingFactory interface { // SwaggerSchema returns the schema declaration for the provided group version kind. SwaggerSchema(schema.GroupVersionKind) (*swagger.ApiDeclaration, error) // OpenAPISchema returns the schema openapi schema definiton - OpenAPISchema() (openapi.Resources, error) + OpenAPISchema(cacheDir string) (openapi.Resources, error) } // BuilderFactory holds the second level of factory methods. These functions depend upon ObjectMappingFactory and ClientAccessFactory methods. @@ -296,13 +296,13 @@ func GetFirstPod(client coreclient.PodsGetter, namespace string, selector labels for i := range podList.Items { pod := podList.Items[i] externalPod := &v1.Pod{} - k8s_api_v1.Convert_api_Pod_To_v1_Pod(&pod, externalPod, nil) + apiv1.Convert_api_Pod_To_v1_Pod(&pod, externalPod, nil) pods = append(pods, externalPod) } if len(pods) > 0 { sort.Sort(sortBy(pods)) internalPod := &api.Pod{} - k8s_api_v1.Convert_v1_Pod_To_api_Pod(pods[0], internalPod, nil) + apiv1.Convert_v1_Pod_To_api_Pod(pods[0], internalPod, nil) return internalPod, len(podList.Items), nil } diff --git a/pkg/kubectl/cmd/util/factory_builder.go b/pkg/kubectl/cmd/util/factory_builder.go index 52967300ca2..e3a270fee30 100644 --- a/pkg/kubectl/cmd/util/factory_builder.go +++ b/pkg/kubectl/cmd/util/factory_builder.go @@ -32,7 +32,6 @@ import ( "k8s.io/kubernetes/pkg/kubectl/plugins" "k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/printers" - printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" ) type ring2Factory struct { @@ -103,16 +102,6 @@ func (f *ring2Factory) PrinterForMapping(cmd *cobra.Command, isLocal bool, outpu printer = printers.NewVersionedPrinter(printer, mapping.ObjectConvertor, version, mapping.GroupVersionKind.GroupVersion()) - } else { - // We add handlers to the printer in case it is printers.HumanReadablePrinter. - // printers.AddHandlers expects concrete type of printers.HumanReadablePrinter - // as its parameter because of this we have to do a type check on printer and - // extract out concrete HumanReadablePrinter from it. We are then able to attach - // handlers on it. - if humanReadablePrinter, ok := printer.(*printers.HumanReadablePrinter); ok { - printersinternal.AddHandlers(humanReadablePrinter) - printer = humanReadablePrinter - } } return printer, nil diff --git a/pkg/kubectl/cmd/util/factory_client_access.go b/pkg/kubectl/cmd/util/factory_client_access.go index 7e04fb8e80a..9aaa4680c81 100644 --- a/pkg/kubectl/cmd/util/factory_client_access.go +++ b/pkg/kubectl/cmd/util/factory_client_access.go @@ -474,7 +474,6 @@ const ( DeploymentBasicAppsV1Beta1GeneratorName = "deployment-basic/apps.v1beta1" JobV1GeneratorName = "job/v1" CronJobV2Alpha1GeneratorName = "cronjob/v2alpha1" - ScheduledJobV2Alpha1GeneratorName = "scheduledjob/v2alpha1" NamespaceV1GeneratorName = "namespace/v1" ResourceQuotaV1GeneratorName = "resourcequotas/v1" SecretV1GeneratorName = "secret/v1" @@ -510,10 +509,12 @@ func DefaultGenerators(cmdName string) map[string]kubectl.Generator { ServiceLoadBalancerGeneratorV1Name: kubectl.ServiceLoadBalancerGeneratorV1{}, } case "deployment": - generator = map[string]kubectl.Generator{ - DeploymentBasicV1Beta1GeneratorName: kubectl.DeploymentBasicGeneratorV1{}, - DeploymentBasicAppsV1Beta1GeneratorName: kubectl.DeploymentBasicAppsGeneratorV1{}, - } + // Create Deployment has only StructuredGenerators and no + // param-based Generators. + // The StructuredGenerators are as follows (as of 2017-07-17): + // DeploymentBasicV1Beta1GeneratorName -> kubectl.DeploymentBasicGeneratorV1 + // DeploymentBasicAppsV1Beta1GeneratorName -> kubectl.DeploymentBasicAppsGeneratorV1 + generator = map[string]kubectl.Generator{} case "run": generator = map[string]kubectl.Generator{ RunV1GeneratorName: kubectl.BasicReplicationController{}, @@ -521,7 +522,6 @@ func DefaultGenerators(cmdName string) map[string]kubectl.Generator { DeploymentV1Beta1GeneratorName: kubectl.DeploymentV1Beta1{}, DeploymentAppsV1Beta1GeneratorName: kubectl.DeploymentAppsV1Beta1{}, JobV1GeneratorName: kubectl.JobV1{}, - ScheduledJobV2Alpha1GeneratorName: kubectl.CronJobV2Alpha1{}, CronJobV2Alpha1GeneratorName: kubectl.CronJobV2Alpha1{}, } case "autoscale": diff --git a/pkg/kubectl/cmd/util/factory_object_mapping.go b/pkg/kubectl/cmd/util/factory_object_mapping.go index 6adb64fb54f..83cb1b30dbf 100644 --- a/pkg/kubectl/cmd/util/factory_object_mapping.go +++ b/pkg/kubectl/cmd/util/factory_object_mapping.go @@ -439,7 +439,13 @@ func (f *ring1Factory) SwaggerSchema(gvk schema.GroupVersionKind) (*swagger.ApiD } // OpenAPISchema returns metadata and structural information about Kubernetes object definitions. -func (f *ring1Factory) OpenAPISchema() (openapi.Resources, error) { +// Will try to cache the data to a local file. Cache is written and read from a +// file created with ioutil.TempFile and obeys the expiration semantics of that file. +// The cache location is a function of the client and server versions so that the open API +// schema will be cached separately for different client / server combinations. +// Note, the cache will not be invalidated if the server changes its open API schema without +// changing the server version. +func (f *ring1Factory) OpenAPISchema(cacheDir string) (openapi.Resources, error) { discovery, err := f.clientAccessFactory.DiscoveryClient() if err != nil { return nil, err @@ -447,8 +453,23 @@ func (f *ring1Factory) OpenAPISchema() (openapi.Resources, error) { // Lazily initialize the OpenAPIGetter once f.openAPIGetter.once.Do(func() { + // Get the server version for caching the openapi spec + versionString := "" + version, err := discovery.ServerVersion() + if err != nil { + // Cache the result under the server version + versionString = version.String() + } + + // Get the cache directory for caching the openapi spec + cacheDir, err = substituteUserHome(cacheDir) + if err != nil { + // Don't cache the result if we couldn't substitute the home directory + cacheDir = "" + } + // Create the caching OpenAPIGetter - f.openAPIGetter.getter = openapi.NewOpenAPIGetter(discovery) + f.openAPIGetter.getter = openapi.NewOpenAPIGetter(cacheDir, versionString, discovery) }) // Delegate to the OpenAPIGetter diff --git a/pkg/kubectl/cmd/util/factory_test.go b/pkg/kubectl/cmd/util/factory_test.go index 1bfa6565665..bfeaf5ee32d 100644 --- a/pkg/kubectl/cmd/util/factory_test.go +++ b/pkg/kubectl/cmd/util/factory_test.go @@ -746,12 +746,12 @@ func TestDiscoveryReplaceAliases(t *testing.T) { { name: "all-replacement", arg: "all", - expected: "pods,replicationcontrollers,services,statefulsets.apps,horizontalpodautoscalers.autoscaling,jobs.batch,cronjobs.batch,deployments.extensions,replicasets.extensions", + expected: "pods,replicationcontrollers,services,statefulsets.apps,horizontalpodautoscalers.autoscaling,jobs.batch,cronjobs.batch,daemonsets.extensions,deployments.extensions,replicasets.extensions", }, { name: "alias-in-comma-separated-arg", arg: "all,secrets", - expected: "pods,replicationcontrollers,services,statefulsets.apps,horizontalpodautoscalers.autoscaling,jobs.batch,cronjobs.batch,deployments.extensions,replicasets.extensions,secrets", + expected: "pods,replicationcontrollers,services,statefulsets.apps,horizontalpodautoscalers.autoscaling,jobs.batch,cronjobs.batch,daemonsets.extensions,deployments.extensions,replicasets.extensions,secrets", }, } diff --git a/pkg/kubectl/cmd/util/helpers.go b/pkg/kubectl/cmd/util/helpers.go index 885cd8754d7..12cdcbf642c 100644 --- a/pkg/kubectl/cmd/util/helpers.go +++ b/pkg/kubectl/cmd/util/helpers.go @@ -404,6 +404,19 @@ func AddValidateOptionFlags(cmd *cobra.Command, options *ValidateOptions) { cmd.MarkFlagFilename("schema-cache-dir") } +func AddOpenAPIFlags(cmd *cobra.Command) { + cmd.Flags().String("schema-cache-dir", + fmt.Sprintf("~/%s/%s", clientcmd.RecommendedHomeDir, clientcmd.RecommendedSchemaName), + fmt.Sprintf("If non-empty, load/store cached API schemas in this directory, default is '$HOME/%s/%s'", + clientcmd.RecommendedHomeDir, clientcmd.RecommendedSchemaName), + ) + cmd.MarkFlagFilename("schema-cache-dir") +} + +func GetOpenAPICacheDir(cmd *cobra.Command) string { + return GetFlagString(cmd, "schema-cache-dir") +} + func AddFilenameOptionFlags(cmd *cobra.Command, options *resource.FilenameOptions, usage string) { kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, "Filename, directory, or URL to files "+usage) cmd.Flags().BoolVarP(&options.Recursive, "recursive", "R", options.Recursive, "Process the directory used in -f, --filename recursively. Useful when you want to manage related manifests organized within the same directory.") @@ -606,7 +619,7 @@ func AddInclude3rdPartyVarFlags(cmd *cobra.Command, include3rdParty *bool) { func GetResourcesAndPairs(args []string, pairType string) (resources []string, pairArgs []string, err error) { foundPair := false for _, s := range args { - nonResource := strings.Contains(s, "=") || strings.HasSuffix(s, "-") + nonResource := (strings.Contains(s, "=") && s[0] != '=') || (strings.HasSuffix(s, "-") && s != "-") switch { case !foundPair && nonResource: foundPair = true @@ -632,7 +645,7 @@ func ParsePairs(pairArgs []string, pairType string, supportRemove bool) (newPair var invalidBuf bytes.Buffer var invalidBufNonEmpty bool for _, pairArg := range pairArgs { - if strings.Contains(pairArg, "=") { + if strings.Contains(pairArg, "=") && pairArg[0] != '=' { parts := strings.SplitN(pairArg, "=", 2) if len(parts) != 2 { if invalidBufNonEmpty { @@ -643,7 +656,7 @@ func ParsePairs(pairArgs []string, pairType string, supportRemove bool) (newPair } else { newPairs[parts[0]] = parts[1] } - } else if supportRemove && strings.HasSuffix(pairArg, "-") { + } else if supportRemove && strings.HasSuffix(pairArg, "-") && pairArg != "-" { removePairs = append(removePairs, pairArg[:len(pairArg)-1]) } else { if invalidBufNonEmpty { diff --git a/pkg/kubectl/cmd/util/jsonmerge/BUILD b/pkg/kubectl/cmd/util/jsonmerge/BUILD index f606fa21015..c0d175fed69 100644 --- a/pkg/kubectl/cmd/util/jsonmerge/BUILD +++ b/pkg/kubectl/cmd/util/jsonmerge/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -8,7 +6,7 @@ load( go_library( name = "go_default_library", srcs = ["jsonmerge.go"], - tags = ["automanaged"], + visibility = ["//visibility:public"], deps = [ "//vendor/github.com/evanphx/json-patch:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/pkg/kubectl/cmd/util/openapi/BUILD b/pkg/kubectl/cmd/util/openapi/BUILD index 01920e15696..b7377d9fd43 100644 --- a/pkg/kubectl/cmd/util/openapi/BUILD +++ b/pkg/kubectl/cmd/util/openapi/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,11 +13,14 @@ go_library( "document.go", "extensions.go", "openapi.go", + "openapi_cache.go", "openapi_getter.go", ], - tags = ["automanaged"], deps = [ + "//pkg/version:go_default_library", "//vendor/github.com/go-openapi/spec:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/github.com/golang/protobuf/proto:go_default_library", "//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library", "//vendor/gopkg.in/yaml.v2:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", @@ -31,14 +32,14 @@ go_test( name = "go_default_xtest", size = "small", srcs = [ + "openapi_cache_test.go", "openapi_getter_test.go", "openapi_suite_test.go", "openapi_test.go", ], data = ["//api/openapi-spec:swagger-spec"], - tags = ["automanaged"], deps = [ - "//pkg/kubectl/cmd/util/openapi:go_default_library", + ":go_default_library", "//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library", "//vendor/github.com/googleapis/gnostic/compiler:go_default_library", "//vendor/github.com/onsi/ginkgo:go_default_library", diff --git a/pkg/kubectl/cmd/util/openapi/openapi_cache.go b/pkg/kubectl/cmd/util/openapi/openapi_cache.go new file mode 100644 index 00000000000..faf83456b49 --- /dev/null +++ b/pkg/kubectl/cmd/util/openapi/openapi_cache.go @@ -0,0 +1,163 @@ +/* +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 openapi + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + + "github.com/golang/glog" + "github.com/golang/protobuf/proto" + openapi_v2 "github.com/googleapis/gnostic/OpenAPIv2" + + "k8s.io/client-go/discovery" + "k8s.io/kubernetes/pkg/version" +) + +const openapiFileName = "openapi_cache" + +type CachingOpenAPIClient struct { + version string + client discovery.OpenAPISchemaInterface + cacheDirName string +} + +// NewCachingOpenAPIClient returns a new discovery.OpenAPISchemaInterface +// that will read the openapi spec from a local cache if it exists, and +// if not will then fetch an openapi spec using a client. +// client: used to fetch a new openapi spec if a local cache is not found +// version: the server version and used as part of the cache file location +// cacheDir: the directory under which the cache file will be written +func NewCachingOpenAPIClient(client discovery.OpenAPISchemaInterface, version, cacheDir string) *CachingOpenAPIClient { + return &CachingOpenAPIClient{ + client: client, + version: version, + cacheDirName: cacheDir, + } +} + +// OpenAPIData returns an openapi spec. +// It will first attempt to read the spec from a local cache +// If it cannot read a local cache, it will read the file +// using the client and then write the cache. +func (c *CachingOpenAPIClient) OpenAPIData() (Resources, error) { + // Try to use the cached version + if c.useCache() { + doc, err := c.readOpenAPICache() + if err == nil { + return NewOpenAPIData(doc) + } + } + + // No cached version found, download from server + s, err := c.client.OpenAPISchema() + if err != nil { + glog.V(2).Infof("Failed to download openapi data %v", err) + return nil, err + } + + oa, err := NewOpenAPIData(s) + if err != nil { + glog.V(2).Infof("Failed to parse openapi data %v", err) + return nil, err + } + + // Try to cache the openapi spec + if c.useCache() { + err = c.writeToCache(s) + if err != nil { + // Just log an message, no need to fail the command since we got the data we need + glog.V(2).Infof("Unable to cache openapi spec %v", err) + } + } + + // Return the parsed data + return oa, nil +} + +// useCache returns true if the client should try to use the cache file +func (c *CachingOpenAPIClient) useCache() bool { + return len(c.version) > 0 && len(c.cacheDirName) > 0 +} + +// readOpenAPICache tries to read the openapi spec from the local file cache +func (c *CachingOpenAPIClient) readOpenAPICache() (*openapi_v2.Document, error) { + // Get the filename to read + filename := c.openAPICacheFilename() + + // Read the cached file + data, err := ioutil.ReadFile(filename) + if err != nil { + return nil, err + } + + doc := &openapi_v2.Document{} + return doc, proto.Unmarshal(data, doc) +} + +// writeToCache tries to write the openapi spec to the local file cache. +// writes the data to a new tempfile, and then links the cache file and the tempfile +func (c *CachingOpenAPIClient) writeToCache(doc *openapi_v2.Document) error { + // Get the constant filename used to read the cache. + cacheFile := c.openAPICacheFilename() + + // Binary encode the spec. This is 10x as fast as using json encoding. (60ms vs 600ms) + b, err := proto.Marshal(doc) + if err != nil { + return fmt.Errorf("Could not binary encode openapi spec: %v", err) + } + + // Create a new temp file for the cached openapi spec. + cacheDir := filepath.Dir(cacheFile) + if err := os.MkdirAll(cacheDir, 0755); err != nil { + return fmt.Errorf("Could not create directory: %v %v", cacheDir, err) + } + tmpFile, err := ioutil.TempFile(cacheDir, "openapi") + if err != nil { + return fmt.Errorf("Could not create temp cache file: %v %v", cacheFile, err) + } + + // Write the binary encoded openapi spec to the temp file + if _, err := io.Copy(tmpFile, bytes.NewBuffer(b)); err != nil { + return fmt.Errorf("Could not write temp cache file: %v", err) + } + + // Link the temp cache file to the constant cache filepath + return linkFiles(tmpFile.Name(), cacheFile) +} + +// openAPICacheFilename returns the filename to read the cache from +func (c *CachingOpenAPIClient) openAPICacheFilename() string { + // Cache using the client and server versions + return filepath.Join(c.cacheDirName, c.version, version.Get().GitVersion, openapiFileName) +} + +// linkFiles links the old file to the new file +func linkFiles(old, new string) error { + if err := os.Link(old, new); err != nil { + // If we can't write due to file existing, or permission problems, keep going. + if os.IsExist(err) || os.IsPermission(err) { + return nil + } + return err + } + return nil +} diff --git a/pkg/kubectl/cmd/util/openapi/openapi_cache_test.go b/pkg/kubectl/cmd/util/openapi/openapi_cache_test.go new file mode 100644 index 00000000000..de93c028484 --- /dev/null +++ b/pkg/kubectl/cmd/util/openapi/openapi_cache_test.go @@ -0,0 +1,268 @@ +/* +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 openapi_test + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "sync" + + "gopkg.in/yaml.v2" + + "github.com/googleapis/gnostic/OpenAPIv2" + "github.com/googleapis/gnostic/compiler" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + + "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi" +) + +var _ = Describe("When reading openAPIData", func() { + var tmpDir string + var err error + var client *fakeOpenAPIClient + var instance *openapi.CachingOpenAPIClient + var expectedData openapi.Resources + + BeforeEach(func() { + tmpDir, err = ioutil.TempDir("", "openapi_cache_test") + Expect(err).To(BeNil()) + client = &fakeOpenAPIClient{} + instance = openapi.NewCachingOpenAPIClient(client, "v1.6", tmpDir) + + d, err := data.OpenAPISchema() + Expect(err).To(BeNil()) + + expectedData, err = openapi.NewOpenAPIData(d) + Expect(err).To(BeNil()) + }) + + AfterEach(func() { + os.RemoveAll(tmpDir) + }) + + It("should write to the cache", func() { + By("getting the live openapi spec from the server") + result, err := instance.OpenAPIData() + Expect(err).To(BeNil()) + Expect(result).To(Equal(expectedData)) + Expect(client.calls).To(Equal(1)) + + By("writing the live openapi spec to a local cache file") + names, err := getFilenames(tmpDir) + Expect(err).To(BeNil()) + Expect(names).To(ConsistOf("v1.6")) + + names, err = getFilenames(filepath.Join(tmpDir, "v1.6")) + Expect(err).To(BeNil()) + Expect(names).To(HaveLen(1)) + clientVersion := names[0] + + names, err = getFilenames(filepath.Join(tmpDir, "v1.6", clientVersion)) + Expect(err).To(BeNil()) + Expect(names).To(ContainElement("openapi_cache")) + }) + + It("should read from the cache", func() { + // First call should use the client + result, err := instance.OpenAPIData() + Expect(err).To(BeNil()) + Expect(result).To(Equal(expectedData)) + Expect(client.calls).To(Equal(1)) + + // Second call shouldn't use the client + result, err = instance.OpenAPIData() + Expect(err).To(BeNil()) + Expect(result).To(Equal(expectedData)) + Expect(client.calls).To(Equal(1)) + + names, err := getFilenames(tmpDir) + Expect(err).To(BeNil()) + Expect(names).To(ConsistOf("v1.6")) + }) + + It("propagate errors that are encountered", func() { + // Expect an error + client.err = fmt.Errorf("expected error") + result, err := instance.OpenAPIData() + Expect(err.Error()).To(Equal(client.err.Error())) + Expect(result).To(BeNil()) + Expect(client.calls).To(Equal(1)) + + // No cache file is written + files, err := ioutil.ReadDir(tmpDir) + Expect(err).To(BeNil()) + Expect(files).To(HaveLen(0)) + + // Client error is not cached + result, err = instance.OpenAPIData() + Expect(err.Error()).To(Equal(client.err.Error())) + Expect(result).To(BeNil()) + Expect(client.calls).To(Equal(2)) + }) +}) + +var _ = Describe("Reading openAPIData", func() { + var tmpDir string + var serverVersion string + var cacheDir string + + BeforeEach(func() { + var err error + tmpDir, err = ioutil.TempDir("", "openapi_cache_test") + Expect(err).To(BeNil()) + }) + + AfterEach(func() { + os.RemoveAll(tmpDir) + }) + + // Set the serverVersion to empty + Context("when the server version is empty", func() { + BeforeEach(func() { + serverVersion = "" + cacheDir = tmpDir + }) + It("should not cache the result", func() { + client := &fakeOpenAPIClient{} + + instance := openapi.NewCachingOpenAPIClient(client, serverVersion, cacheDir) + + d, err := data.OpenAPISchema() + Expect(err).To(BeNil()) + + expectedData, err := openapi.NewOpenAPIData(d) + Expect(err).To(BeNil()) + + By("getting the live openapi schema") + result, err := instance.OpenAPIData() + Expect(err).To(BeNil()) + Expect(result).To(Equal(expectedData)) + Expect(client.calls).To(Equal(1)) + + files, err := ioutil.ReadDir(tmpDir) + Expect(err).To(BeNil()) + Expect(files).To(HaveLen(0)) + }) + }) + + Context("when the cache directory is empty", func() { + BeforeEach(func() { + serverVersion = "v1.6" + cacheDir = "" + }) + It("should not cache the result", func() { + client := &fakeOpenAPIClient{} + + instance := openapi.NewCachingOpenAPIClient(client, serverVersion, cacheDir) + + d, err := data.OpenAPISchema() + Expect(err).To(BeNil()) + + expectedData, err := openapi.NewOpenAPIData(d) + Expect(err).To(BeNil()) + + By("getting the live openapi schema") + result, err := instance.OpenAPIData() + Expect(err).To(BeNil()) + Expect(result).To(Equal(expectedData)) + Expect(client.calls).To(Equal(1)) + + files, err := ioutil.ReadDir(tmpDir) + Expect(err).To(BeNil()) + Expect(files).To(HaveLen(0)) + }) + }) +}) + +// Test Utils +func getFilenames(path string) ([]string, error) { + files, err := ioutil.ReadDir(path) + if err != nil { + return nil, err + } + result := []string{} + for _, n := range files { + result = append(result, n.Name()) + } + return result, nil +} + +type fakeOpenAPIClient struct { + calls int + err error +} + +func (f *fakeOpenAPIClient) OpenAPISchema() (*openapi_v2.Document, error) { + f.calls = f.calls + 1 + + if f.err != nil { + return nil, f.err + } + + return data.OpenAPISchema() +} + +// Test utils +var data apiData + +type apiData struct { + sync.Once + data *openapi_v2.Document + err error +} + +func (d *apiData) OpenAPISchema() (*openapi_v2.Document, error) { + d.Do(func() { + // Get the path to the swagger.json file + wd, err := os.Getwd() + if err != nil { + d.err = err + return + } + + abs, err := filepath.Abs(wd) + if err != nil { + d.err = err + return + } + + root := filepath.Dir(filepath.Dir(filepath.Dir(filepath.Dir(filepath.Dir(abs))))) + specpath := filepath.Join(root, "api", "openapi-spec", "swagger.json") + _, err = os.Stat(specpath) + if err != nil { + d.err = err + return + } + spec, err := ioutil.ReadFile(specpath) + if err != nil { + d.err = err + return + } + var info yaml.MapSlice + err = yaml.Unmarshal(spec, &info) + if err != nil { + d.err = err + return + } + d.data, d.err = openapi_v2.NewDocument(info, compiler.NewContext("$root", nil)) + }) + + return d.data, d.err +} diff --git a/pkg/kubectl/cmd/util/openapi/openapi_getter.go b/pkg/kubectl/cmd/util/openapi/openapi_getter.go index d5c9476a02b..0b655dc0471 100644 --- a/pkg/kubectl/cmd/util/openapi/openapi_getter.go +++ b/pkg/kubectl/cmd/util/openapi/openapi_getter.go @@ -29,6 +29,8 @@ type synchronizedOpenAPIGetter struct { openAPISchema Resources err error + serverVersion string + cacheDir string openAPIClient discovery.OpenAPISchemaInterface } @@ -40,10 +42,12 @@ type Getter interface { Get() (Resources, error) } -// NewOpenAPIGetter returns an object to return OpenAPIDatas which reads -// from a server, and then stores in memory for subsequent invocations -func NewOpenAPIGetter(openAPIClient discovery.OpenAPISchemaInterface) Getter { +// NewOpenAPIGetter returns an object to return OpenAPIDatas which either read from a +// local file cache or read from a server, and then stored in memory for subsequent invocations +func NewOpenAPIGetter(cacheDir, serverVersion string, openAPIClient discovery.OpenAPISchemaInterface) Getter { return &synchronizedOpenAPIGetter{ + serverVersion: serverVersion, + cacheDir: cacheDir, openAPIClient: openAPIClient, } } @@ -51,13 +55,15 @@ func NewOpenAPIGetter(openAPIClient discovery.OpenAPISchemaInterface) Getter { // Resources implements Getter func (g *synchronizedOpenAPIGetter) Get() (Resources, error) { g.Do(func() { - s, err := g.openAPIClient.OpenAPISchema() + client := NewCachingOpenAPIClient(g.openAPIClient, g.serverVersion, g.cacheDir) + result, err := client.OpenAPIData() if err != nil { g.err = err return } - g.openAPISchema, g.err = NewOpenAPIData(s) + // Save the result + g.openAPISchema = result }) // Return the save result diff --git a/pkg/kubectl/cmd/util/openapi/openapi_getter_test.go b/pkg/kubectl/cmd/util/openapi/openapi_getter_test.go index d8c7467840f..bbaca9dee35 100644 --- a/pkg/kubectl/cmd/util/openapi/openapi_getter_test.go +++ b/pkg/kubectl/cmd/util/openapi/openapi_getter_test.go @@ -18,83 +18,13 @@ package openapi_test import ( "fmt" - "io/ioutil" - "os" - "path/filepath" - "sync" - "gopkg.in/yaml.v2" - - "github.com/googleapis/gnostic/OpenAPIv2" - "github.com/googleapis/gnostic/compiler" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi" ) -// Test utils -var data apiData - -type apiData struct { - sync.Once - data *openapi_v2.Document - err error -} - -func (d *apiData) OpenAPISchema() (*openapi_v2.Document, error) { - d.Do(func() { - // Get the path to the swagger.json file - wd, err := os.Getwd() - if err != nil { - d.err = err - return - } - - abs, err := filepath.Abs(wd) - if err != nil { - d.err = err - return - } - - root := filepath.Dir(filepath.Dir(filepath.Dir(filepath.Dir(filepath.Dir(abs))))) - specpath := filepath.Join(root, "api", "openapi-spec", "swagger.json") - _, err = os.Stat(specpath) - if err != nil { - d.err = err - return - } - spec, err := ioutil.ReadFile(specpath) - if err != nil { - d.err = err - return - } - var info yaml.MapSlice - err = yaml.Unmarshal(spec, &info) - if err != nil { - d.err = err - return - } - d.data, d.err = openapi_v2.NewDocument(info, compiler.NewContext("$root", nil)) - }) - return d.data, d.err -} - -type fakeOpenAPIClient struct { - calls int - err error -} - -func (f *fakeOpenAPIClient) OpenAPISchema() (*openapi_v2.Document, error) { - f.calls = f.calls + 1 - - if f.err != nil { - return nil, f.err - } - - return data.OpenAPISchema() -} - var _ = Describe("Getting the Resources", func() { var client *fakeOpenAPIClient var expectedData openapi.Resources @@ -108,7 +38,7 @@ var _ = Describe("Getting the Resources", func() { expectedData, err = openapi.NewOpenAPIData(d) Expect(err).To(BeNil()) - instance = openapi.NewOpenAPIGetter(client) + instance = openapi.NewOpenAPIGetter("", "", client) }) Context("when the server returns a successful result", func() { diff --git a/pkg/kubectl/cmd/util/printing.go b/pkg/kubectl/cmd/util/printing.go index 4aee9ebc0e9..41d101d6542 100644 --- a/pkg/kubectl/cmd/util/printing.go +++ b/pkg/kubectl/cmd/util/printing.go @@ -26,6 +26,7 @@ import ( "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" "github.com/spf13/cobra" ) @@ -126,6 +127,13 @@ func PrinterForCommand(cmd *cobra.Command, outputOpts *printers.OutputOptions, m return nil, err } + // we try to convert to HumanReadablePrinter, if return ok, it must be no generic + // we execute AddHandlers() here before maybeWrapSortingPrinter so that we don't + // need to convert to delegatePrinter again then invoke AddHandlers() + if humanReadablePrinter, ok := printer.(*printers.HumanReadablePrinter); ok { + printersinternal.AddHandlers(humanReadablePrinter) + } + return maybeWrapSortingPrinter(cmd, printer), nil } diff --git a/pkg/kubectl/cmd/util/sanity/BUILD b/pkg/kubectl/cmd/util/sanity/BUILD index 0d72a12cdac..d52936f879d 100644 --- a/pkg/kubectl/cmd/util/sanity/BUILD +++ b/pkg/kubectl/cmd/util/sanity/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -8,7 +6,6 @@ load( go_library( name = "go_default_library", srcs = ["cmd_sanity.go"], - tags = ["automanaged"], visibility = [ "//build/visible_to:pkg_kubectl_cmd_util_sanity_CONSUMERS", ], diff --git a/pkg/kubectl/configmap_test.go b/pkg/kubectl/configmap_test.go index 5690c2e0f0a..b5c98b58f4c 100644 --- a/pkg/kubectl/configmap_test.go +++ b/pkg/kubectl/configmap_test.go @@ -157,7 +157,7 @@ func TestConfigMapGenerate(t *testing.T) { expectErr: true, }, { - setup: setupEnvFile("key.1=value1"), + setup: setupEnvFile("key#1=value1"), params: map[string]interface{}{ "name": "invalid_key", "from-env-file": "file.env", diff --git a/pkg/kubectl/deployment.go b/pkg/kubectl/deployment.go index da764b7593a..76a4f1f4436 100644 --- a/pkg/kubectl/deployment.go +++ b/pkg/kubectl/deployment.go @@ -36,16 +36,6 @@ type BaseDeploymentGenerator struct { Images []string } -// ParamNames: return the parameters expected by the BaseDeploymentGenerator. -// This method is here to aid in validation. When given a Generator, you can -// learn what it expects by calling this method. -func (BaseDeploymentGenerator) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"name", true}, - {"image", true}, - } -} - // validate: check if the caller has forgotten to set one of our fields. func (b BaseDeploymentGenerator) validate() error { if len(b.Name) == 0 { @@ -57,29 +47,6 @@ func (b BaseDeploymentGenerator) validate() error { return nil } -// baseDeploymentGeneratorFromParams: return a new BaseDeploymentGenerator with -// the fields set from params. The returned BaseDeploymentGenerator should have -// all required fields set and will pass validate() with no errors. -func baseDeploymentGeneratorFromParams(params map[string]interface{}) (*BaseDeploymentGenerator, error) { - paramNames := (BaseDeploymentGenerator{}).ParamNames() - err := ValidateParams(paramNames, params) - if err != nil { - return nil, err - } - name, isString := params["name"].(string) - if !isString { - return nil, fmt.Errorf("expected string, saw %v for 'name'", name) - } - imageStrings, isArray := params["image"].([]string) - if !isArray { - return nil, fmt.Errorf("expected []string, found :%v", imageStrings) - } - return &BaseDeploymentGenerator{ - Name: name, - Images: imageStrings, - }, nil -} - // structuredGenerate: determine the fields of a deployment. The struct that // embeds BaseDeploymentGenerator should assemble these pieces into a // runtime.Object. @@ -127,14 +94,6 @@ type DeploymentBasicGeneratorV1 struct { // Ensure it supports the generator pattern that uses parameters specified during construction var _ StructuredGenerator = &DeploymentBasicGeneratorV1{} -func (s DeploymentBasicGeneratorV1) Generate(params map[string]interface{}) (runtime.Object, error) { - base, err := baseDeploymentGeneratorFromParams(params) - if err != nil { - return nil, err - } - return (&DeploymentBasicGeneratorV1{*base}).StructuredGenerate() -} - // StructuredGenerate outputs a deployment object using the configured fields func (s *DeploymentBasicGeneratorV1) StructuredGenerate() (runtime.Object, error) { podSpec, labels, selector, err := s.structuredGenerate() @@ -165,14 +124,6 @@ type DeploymentBasicAppsGeneratorV1 struct { // Ensure it supports the generator pattern that uses parameters specified during construction var _ StructuredGenerator = &DeploymentBasicAppsGeneratorV1{} -func (s DeploymentBasicAppsGeneratorV1) Generate(params map[string]interface{}) (runtime.Object, error) { - base, err := baseDeploymentGeneratorFromParams(params) - if err != nil { - return nil, err - } - return (&DeploymentBasicAppsGeneratorV1{*base}).StructuredGenerate() -} - // StructuredGenerate outputs a deployment object using the configured fields func (s *DeploymentBasicAppsGeneratorV1) StructuredGenerate() (runtime.Object, error) { podSpec, labels, selector, err := s.structuredGenerate() diff --git a/pkg/kubectl/deployment_test.go b/pkg/kubectl/deployment_test.go deleted file mode 100644 index b32aebb2f1d..00000000000 --- a/pkg/kubectl/deployment_test.go +++ /dev/null @@ -1,247 +0,0 @@ -/* -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 kubectl - -import ( - "reflect" - "testing" - - appsv1beta1 "k8s.io/api/apps/v1beta1" - "k8s.io/api/core/v1" - extensionsv1beta1 "k8s.io/api/extensions/v1beta1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -func TestDeploymentGenerate(t *testing.T) { - one := int32(1) - tests := []struct { - params map[string]interface{} - expected *extensionsv1beta1.Deployment - expectErr bool - }{ - { - params: map[string]interface{}{ - "name": "foo", - "image": []string{"abc/app:v4"}, - }, - expected: &extensionsv1beta1.Deployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"app": "foo"}, - }, - Spec: extensionsv1beta1.DeploymentSpec{ - Replicas: &one, - Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"app": "foo"}}, - Template: v1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{"app": "foo"}, - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{{Name: "app", Image: "abc/app:v4"}}, - }, - }, - }, - }, - expectErr: false, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": []string{"abc/app:v4", "zyx/ape"}, - }, - expected: &extensionsv1beta1.Deployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"app": "foo"}, - }, - Spec: extensionsv1beta1.DeploymentSpec{ - Replicas: &one, - Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"app": "foo"}}, - Template: v1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{"app": "foo"}, - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{{Name: "app", Image: "abc/app:v4"}, - {Name: "ape", Image: "zyx/ape"}}, - }, - }, - }, - }, - expectErr: false, - }, - { - params: map[string]interface{}{}, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": 1, - }, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": nil, - }, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": []string{}, - }, - expectErr: true, - }, - { - params: map[string]interface{}{ - "NAME": "some_value", - }, - expectErr: true, - }, - } - generator := DeploymentBasicGeneratorV1{} - for index, test := range tests { - t.Logf("running scenario %d", index) - obj, err := generator.Generate(test.params) - switch { - case test.expectErr && err != nil: - continue // loop, since there's no output to check - case test.expectErr && err == nil: - t.Errorf("expected error and didn't get one") - continue // loop, no expected output object - case !test.expectErr && err != nil: - t.Errorf("unexpected error %v", err) - continue // loop, no output object - case !test.expectErr && err == nil: - // do nothing and drop through - } - if !reflect.DeepEqual(obj.(*extensionsv1beta1.Deployment), test.expected) { - t.Errorf("expected:\n%#v\nsaw:\n%#v", test.expected, obj.(*extensionsv1beta1.Deployment)) - } - } -} - -func TestAppsDeploymentGenerate(t *testing.T) { - one := int32(1) - tests := []struct { - params map[string]interface{} - expected *appsv1beta1.Deployment - expectErr bool - }{ - { - params: map[string]interface{}{ - "name": "foo", - "image": []string{"abc/app:v4"}, - }, - expected: &appsv1beta1.Deployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"app": "foo"}, - }, - Spec: appsv1beta1.DeploymentSpec{ - Replicas: &one, - Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"app": "foo"}}, - Template: v1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{"app": "foo"}, - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{{Name: "app", Image: "abc/app:v4"}}, - }, - }, - }, - }, - expectErr: false, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": []string{"abc/app:v4", "zyx/ape"}, - }, - expected: &appsv1beta1.Deployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"app": "foo"}, - }, - Spec: appsv1beta1.DeploymentSpec{ - Replicas: &one, - Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"app": "foo"}}, - Template: v1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{"app": "foo"}, - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{{Name: "app", Image: "abc/app:v4"}, - {Name: "ape", Image: "zyx/ape"}}, - }, - }, - }, - }, - expectErr: false, - }, - { - params: map[string]interface{}{}, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": 1, - }, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": nil, - }, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": []string{}, - }, - expectErr: true, - }, - { - params: map[string]interface{}{ - "NAME": "some_value", - }, - expectErr: true, - }, - } - generator := DeploymentBasicAppsGeneratorV1{} - for index, test := range tests { - t.Logf("running scenario %d", index) - obj, err := generator.Generate(test.params) - switch { - case test.expectErr && err != nil: - continue // loop, since there's no output to check - case test.expectErr && err == nil: - t.Errorf("expected error and didn't get one") - continue // loop, no expected output object - case !test.expectErr && err != nil: - t.Errorf("unexpected error %v", err) - continue // loop, no output object - case !test.expectErr && err == nil: - // do nothing and drop through - } - if !reflect.DeepEqual(obj.(*appsv1beta1.Deployment), test.expected) { - t.Errorf("expected:\n%#v\nsaw:\n%#v", test.expected, obj.(*appsv1beta1.Deployment)) - } - } -} diff --git a/pkg/kubectl/env_file.go b/pkg/kubectl/env_file.go index ce24c710441..19598d5354a 100644 --- a/pkg/kubectl/env_file.go +++ b/pkg/kubectl/env_file.go @@ -55,7 +55,7 @@ func proccessEnvFileLine(line []byte, filePath string, data := strings.SplitN(string(line), "=", 2) key = data[0] - if errs := validation.IsCIdentifier(key); len(errs) != 0 { + if errs := validation.IsEnvVarName(key); len(errs) != 0 { return ``, ``, fmt.Errorf("%q is not a valid key name: %s", key, strings.Join(errs, ";")) } diff --git a/pkg/kubectl/history.go b/pkg/kubectl/history.go index d8051c8b0c4..5277abfbc89 100644 --- a/pkg/kubectl/history.go +++ b/pkg/kubectl/history.go @@ -34,11 +34,10 @@ import ( clientappsv1beta1 "k8s.io/client-go/kubernetes/typed/apps/v1beta1" clientextensionsv1beta1 "k8s.io/client-go/kubernetes/typed/extensions/v1beta1" "k8s.io/kubernetes/pkg/api" - k8s_api_v1 "k8s.io/kubernetes/pkg/api/v1" + apiv1 "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/extensions" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/controller" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" sliceutil "k8s.io/kubernetes/pkg/kubectl/util/slice" printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" @@ -139,7 +138,7 @@ func (h *DeploymentHistoryViewer) ViewHistory(namespace, name string, revision i func printTemplate(template *v1.PodTemplateSpec) (string, error) { buf := bytes.NewBuffer([]byte{}) internalTemplate := &api.PodTemplateSpec{} - if err := k8s_api_v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(template, internalTemplate, nil); err != nil { + if err := apiv1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(template, internalTemplate, nil); err != nil { return "", fmt.Errorf("failed to convert podtemplate, %v", err) } w := printersinternal.NewPrefixWriter(buf) @@ -274,11 +273,10 @@ func controlledHistories(extensions clientextensionsv1beta1.ExtensionsV1beta1Int } for i := range historyList.Items { history := historyList.Items[i] - // Skip history that doesn't belong to the DaemonSet - if controllerRef := controller.GetControllerOf(&history); controllerRef == nil || controllerRef.UID != ds.UID { - continue + // Only add history that belongs to the DaemonSet + if metav1.IsControlledBy(&history, ds) { + result = append(result, &history) } - result = append(result, &history) } return ds, result, nil } diff --git a/pkg/kubectl/metricsutil/BUILD b/pkg/kubectl/metricsutil/BUILD index 652e8ebc248..ea100a92889 100644 --- a/pkg/kubectl/metricsutil/BUILD +++ b/pkg/kubectl/metricsutil/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ go_library( "metrics_client.go", "metrics_printer.go", ], - tags = ["automanaged"], visibility = [ "//build/visible_to:pkg_kubectl_metricsutil_CONSUMERS", ], diff --git a/pkg/kubectl/plugins/BUILD b/pkg/kubectl/plugins/BUILD index 96ac7e138af..31ee686c623 100644 --- a/pkg/kubectl/plugins/BUILD +++ b/pkg/kubectl/plugins/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "plugins.go", "runner.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/github.com/golang/glog:go_default_library", @@ -47,6 +44,5 @@ go_test( "runner_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/github.com/spf13/pflag:go_default_library"], ) diff --git a/pkg/kubectl/proxy/BUILD b/pkg/kubectl/proxy/BUILD new file mode 100644 index 00000000000..25d2977c8b2 --- /dev/null +++ b/pkg/kubectl/proxy/BUILD @@ -0,0 +1,43 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = ["proxy_server_test.go"], + library = ":go_default_library", + deps = [ + "//vendor/k8s.io/apimachinery/pkg/util/proxy:go_default_library", + "//vendor/k8s.io/client-go/rest:go_default_library", + ], +) + +go_library( + name = "go_default_library", + srcs = ["proxy_server.go"], + deps = [ + "//pkg/kubectl/util:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/proxy:go_default_library", + "//vendor/k8s.io/client-go/rest:go_default_library", + "//vendor/k8s.io/client-go/transport:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/kubectl/proxy_server.go b/pkg/kubectl/proxy/proxy_server.go similarity index 69% rename from pkg/kubectl/proxy_server.go rename to pkg/kubectl/proxy/proxy_server.go index f1712287ee9..3e323c8dc41 100644 --- a/pkg/kubectl/proxy_server.go +++ b/pkg/kubectl/proxy/proxy_server.go @@ -14,13 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package proxy import ( "fmt" "net" "net/http" - "net/http/httputil" "net/url" "os" "regexp" @@ -28,19 +27,26 @@ import ( "time" "github.com/golang/glog" - restclient "k8s.io/client-go/rest" + utilnet "k8s.io/apimachinery/pkg/util/net" + "k8s.io/apimachinery/pkg/util/proxy" + "k8s.io/client-go/rest" + "k8s.io/client-go/transport" "k8s.io/kubernetes/pkg/kubectl/util" ) const ( - DefaultHostAcceptRE = "^localhost$,^127\\.0\\.0\\.1$,^\\[::1\\]$" - DefaultPathAcceptRE = "^.*" - DefaultPathRejectRE = "^/api/.*/pods/.*/exec,^/api/.*/pods/.*/attach" + // DefaultHostAcceptRE is the default value for which hosts to accept. + DefaultHostAcceptRE = "^localhost$,^127\\.0\\.0\\.1$,^\\[::1\\]$" + // DefaultPathAcceptRE is the default path to accept. + DefaultPathAcceptRE = "^.*" + // DefaultPathRejectRE is the default set of paths to reject. + DefaultPathRejectRE = "^/api/.*/pods/.*/exec,^/api/.*/pods/.*/attach" + // DefaultMethodRejectRE is the set of HTTP methods to reject by default. DefaultMethodRejectRE = "^$" ) var ( - // The reverse proxy will periodically flush the io writer at this frequency. + // ReverseProxyFlushInterval is the frequency to flush the reverse proxy. // Only matters for long poll connections like the one used to watch. With an // interval of 0 the reverse proxy will buffer content sent on any connection // with transfer-encoding=chunked. @@ -63,7 +69,7 @@ type FilterServer struct { delegate http.Handler } -// Splits a comma separated list of regexps into an array of Regexp objects. +// MakeRegexpArray splits a comma separated list of regexps into an array of Regexp objects. func MakeRegexpArray(str string) ([]*regexp.Regexp, error) { parts := strings.Split(str, ",") result := make([]*regexp.Regexp, len(parts)) @@ -77,6 +83,7 @@ func MakeRegexpArray(str string) ([]*regexp.Regexp, error) { return result, nil } +// MakeRegexpArrayOrDie creates an array of regular expression objects from a string or exits. func MakeRegexpArrayOrDie(str string) []*regexp.Regexp { result, err := MakeRegexpArray(str) if err != nil { @@ -137,15 +144,38 @@ func (f *FilterServer) ServeHTTP(rw http.ResponseWriter, req *http.Request) { rw.Write([]byte("

    Unauthorized

    ")) } -// ProxyServer is a http.Handler which proxies Kubernetes APIs to remote API server. -type ProxyServer struct { +// Server is a http.Handler which proxies Kubernetes APIs to remote API server. +type Server struct { handler http.Handler } -// NewProxyServer creates and installs a new ProxyServer. -// It automatically registers the created ProxyServer to http.DefaultServeMux. +type responder struct{} + +func (r *responder) Error(w http.ResponseWriter, req *http.Request, err error) { + glog.Errorf("Error while proxying request: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) +} + +// makeUpgradeTransport creates a transport that explicitly bypasses HTTP2 support +// for proxy connections that must upgrade. +func makeUpgradeTransport(config *rest.Config) (http.RoundTripper, error) { + transportConfig, err := config.TransportConfig() + if err != nil { + return nil, err + } + tlsConfig, err := transport.TLSConfigFor(transportConfig) + if err != nil { + return nil, err + } + rt := utilnet.SetOldTransportDefaults(&http.Transport{ + TLSClientConfig: tlsConfig, + }) + return transport.HTTPWrappersForConfig(transportConfig, rt) +} + +// NewServer creates and installs a new Server. // 'filter', if non-nil, protects requests to the api only. -func NewProxyServer(filebase string, apiProxyPrefix string, staticPrefix string, filter *FilterServer, cfg *restclient.Config) (*ProxyServer, error) { +func NewServer(filebase string, apiProxyPrefix string, staticPrefix string, filter *FilterServer, cfg *rest.Config) (*Server, error) { host := cfg.Host if !strings.HasSuffix(host, "/") { host = host + "/" @@ -154,10 +184,20 @@ func NewProxyServer(filebase string, apiProxyPrefix string, staticPrefix string, if err != nil { return nil, err } - proxy := newProxy(target) - if proxy.Transport, err = restclient.TransportFor(cfg); err != nil { + + responder := &responder{} + transport, err := rest.TransportFor(cfg) + if err != nil { return nil, err } + upgradeTransport, err := makeUpgradeTransport(cfg) + if err != nil { + return nil, err + } + proxy := proxy.NewUpgradeAwareHandler(target, transport, false, false, responder) + proxy.UpgradeTransport = upgradeTransport + proxy.UseRequestLocation = true + proxyServer := http.Handler(proxy) if filter != nil { proxyServer = filter.HandlerFor(proxyServer) @@ -174,16 +214,16 @@ func NewProxyServer(filebase string, apiProxyPrefix string, staticPrefix string, // serving their working directory by default. mux.Handle(staticPrefix, newFileHandler(staticPrefix, filebase)) } - return &ProxyServer{handler: mux}, nil + return &Server{handler: mux}, nil } // Listen is a simple wrapper around net.Listen. -func (s *ProxyServer) Listen(address string, port int) (net.Listener, error) { +func (s *Server) Listen(address string, port int) (net.Listener, error) { return net.Listen("tcp", fmt.Sprintf("%s:%d", address, port)) } // ListenUnix does net.Listen for a unix socket -func (s *ProxyServer) ListenUnix(path string) (net.Listener, error) { +func (s *Server) ListenUnix(path string) (net.Listener, error) { // Remove any socket, stale or not, but fall through for other files fi, err := os.Stat(path) if err == nil && (fi.Mode()&os.ModeSocket) != 0 { @@ -196,23 +236,14 @@ func (s *ProxyServer) ListenUnix(path string) (net.Listener, error) { return l, err } -// Serve starts the server using given listener, loops forever. -func (s *ProxyServer) ServeOnListener(l net.Listener) error { +// ServeOnListener starts the server using given listener, loops forever. +func (s *Server) ServeOnListener(l net.Listener) error { server := http.Server{ Handler: s.handler, } return server.Serve(l) } -func newProxy(target *url.URL) *httputil.ReverseProxy { - director := func(req *http.Request) { - req.URL.Scheme = target.Scheme - req.URL.Host = target.Host - req.URL.Path = singleJoiningSlash(target.Path, req.URL.Path) - } - return &httputil.ReverseProxy{Director: director, FlushInterval: ReverseProxyFlushInterval} -} - func newFileHandler(prefix, base string) http.Handler { return http.StripPrefix(prefix, http.FileServer(http.Dir(base))) } diff --git a/pkg/kubectl/proxy_server_test.go b/pkg/kubectl/proxy/proxy_server_test.go similarity index 96% rename from pkg/kubectl/proxy_server_test.go rename to pkg/kubectl/proxy/proxy_server_test.go index 394259070a7..4a85501e2c1 100644 --- a/pkg/kubectl/proxy_server_test.go +++ b/pkg/kubectl/proxy/proxy_server_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package proxy import ( "fmt" @@ -27,7 +27,8 @@ import ( "strings" "testing" - restclient "k8s.io/client-go/rest" + "k8s.io/apimachinery/pkg/util/proxy" + "k8s.io/client-go/rest" ) func TestAccept(t *testing.T) { @@ -340,6 +341,12 @@ func TestFileServing(t *testing.T) { } } +func newProxy(target *url.URL) http.Handler { + p := proxy.NewUpgradeAwareHandler(target, http.DefaultTransport, false, false, &responder{}) + p.UseRequestLocation = true + return p +} + func TestAPIRequests(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) @@ -353,6 +360,7 @@ func TestAPIRequests(t *testing.T) { // httptest.NewServer should always generate a valid URL. target, _ := url.Parse(ts.URL) + target.Path = "/" proxy := newProxy(target) tests := []struct{ method, body string }{ @@ -404,13 +412,13 @@ func TestPathHandling(t *testing.T) { {"/custom/", "/custom/api/v1/pods/", "/api/v1/pods/"}, } - cc := &restclient.Config{ + cc := &rest.Config{ Host: ts.URL, } for _, item := range table { func() { - p, err := NewProxyServer("", item.prefix, "/not/used/for/this/test", nil, cc) + p, err := NewServer("", item.prefix, "/not/used/for/this/test", nil, cc) if err != nil { t.Fatalf("%#v: %v", item, err) } diff --git a/pkg/kubectl/resource/BUILD b/pkg/kubectl/resource/BUILD index 637a3fb3ac7..2e7ce43f1a0 100644 --- a/pkg/kubectl/resource/BUILD +++ b/pkg/kubectl/resource/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "selector.go", "visitor.go", ], - tags = ["automanaged"], visibility = [ "//build/visible_to:pkg_kubectl_resource_CONSUMERS", ], @@ -59,9 +56,6 @@ go_test( "//test/fixtures", ], library = ":go_default_library", - tags = [ - "automanaged", - ], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", diff --git a/pkg/kubectl/resource/categories.go b/pkg/kubectl/resource/categories.go index 98f797cb3a0..9c602a996c2 100644 --- a/pkg/kubectl/resource/categories.go +++ b/pkg/kubectl/resource/categories.go @@ -118,6 +118,7 @@ var legacyUserResources = []schema.GroupResource{ {Group: "autoscaling", Resource: "horizontalpodautoscalers"}, {Group: "batch", Resource: "jobs"}, {Group: "batch", Resource: "cronjobs"}, + {Group: "extensions", Resource: "daemonsets"}, {Group: "extensions", Resource: "deployments"}, {Group: "extensions", Resource: "replicasets"}, } diff --git a/pkg/kubectl/resource/categories_test.go b/pkg/kubectl/resource/categories_test.go index a977df751e1..69314d1848c 100644 --- a/pkg/kubectl/resource/categories_test.go +++ b/pkg/kubectl/resource/categories_test.go @@ -47,6 +47,7 @@ func TestCategoryExpansion(t *testing.T) { {Resource: "horizontalpodautoscalers", Group: "autoscaling"}, {Resource: "jobs", Group: "batch"}, {Resource: "cronjobs", Group: "batch"}, + {Resource: "daemonsets", Group: "extensions"}, {Resource: "deployments", Group: "extensions"}, {Resource: "replicasets", Group: "extensions"}, }, diff --git a/pkg/kubectl/rollback.go b/pkg/kubectl/rollback.go index c3511700325..957cbf111e4 100644 --- a/pkg/kubectl/rollback.go +++ b/pkg/kubectl/rollback.go @@ -33,7 +33,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/watch" "k8s.io/kubernetes/pkg/api" - k8s_api_v1 "k8s.io/kubernetes/pkg/api/v1" + apiv1 "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/extensions" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" @@ -181,7 +181,7 @@ func simpleDryRun(deployment *extensions.Deployment, c clientset.Interface, toRe } buf := bytes.NewBuffer([]byte{}) internalTemplate := &api.PodTemplateSpec{} - if err := k8s_api_v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(template, internalTemplate, nil); err != nil { + if err := apiv1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(template, internalTemplate, nil); err != nil { return "", fmt.Errorf("failed to convert podtemplate, %v", err) } w := printersinternal.NewPrefixWriter(buf) @@ -200,7 +200,7 @@ func simpleDryRun(deployment *extensions.Deployment, c clientset.Interface, toRe buf := bytes.NewBuffer([]byte{}) buf.WriteString("\n") internalTemplate := &api.PodTemplateSpec{} - if err := k8s_api_v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(template, internalTemplate, nil); err != nil { + if err := apiv1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(template, internalTemplate, nil); err != nil { return "", fmt.Errorf("failed to convert podtemplate, %v", err) } w := printersinternal.NewPrefixWriter(buf) @@ -259,7 +259,7 @@ func (r *DaemonSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations ma content := bytes.NewBuffer([]byte{}) w := printersinternal.NewPrefixWriter(content) internalTemplate := &api.PodTemplateSpec{} - if err := k8s_api_v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(&appliedDS.Spec.Template, internalTemplate, nil); err != nil { + if err := apiv1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(&appliedDS.Spec.Template, internalTemplate, nil); err != nil { return "", fmt.Errorf("failed to convert podtemplate while printing: %v", err) } printersinternal.DescribePodTemplate(internalTemplate, w) diff --git a/pkg/kubectl/rolling_updater.go b/pkg/kubectl/rolling_updater.go index 94379cd1342..aef287720d6 100644 --- a/pkg/kubectl/rolling_updater.go +++ b/pkg/kubectl/rolling_updater.go @@ -32,7 +32,7 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/util/integer" "k8s.io/kubernetes/pkg/api" - k8s_api_v1 "k8s.io/kubernetes/pkg/api/v1" + apiv1 "k8s.io/kubernetes/pkg/api/v1" podutil "k8s.io/kubernetes/pkg/api/v1/pod" coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" "k8s.io/kubernetes/pkg/client/retry" @@ -424,7 +424,7 @@ func (r *RollingUpdater) readyPods(oldRc, newRc *api.ReplicationController, minR } for _, pod := range pods.Items { v1Pod := &v1.Pod{} - if err := k8s_api_v1.Convert_api_Pod_To_v1_Pod(&pod, v1Pod, nil); err != nil { + if err := apiv1.Convert_api_Pod_To_v1_Pod(&pod, v1Pod, nil); err != nil { return 0, 0, err } // Do not count deleted pods as ready diff --git a/pkg/kubectl/run.go b/pkg/kubectl/run.go index e1f4549d62c..dbf9ba7d0c0 100644 --- a/pkg/kubectl/run.go +++ b/pkg/kubectl/run.go @@ -868,7 +868,7 @@ func parseEnvs(envArray []string) ([]v1.EnvVar, error) { if len(name) == 0 { return nil, fmt.Errorf("invalid env: %v", env) } - if len(validation.IsCIdentifier(name)) != 0 { + if len(validation.IsEnvVarName(name)) != 0 { return nil, fmt.Errorf("invalid env: %v", env) } envVar := v1.EnvVar{Name: name, Value: value} diff --git a/pkg/kubectl/run_test.go b/pkg/kubectl/run_test.go index 16a6e9423ab..114550ff3b2 100644 --- a/pkg/kubectl/run_test.go +++ b/pkg/kubectl/run_test.go @@ -1030,6 +1030,7 @@ func TestParseEnv(t *testing.T) { { envArray: []string{ "THIS_ENV=isOK", + "this.dotted.env=isOKToo", "HAS_COMMAS=foo,bar", "HAS_EQUALS=jJnro54iUu75xNy==", }, @@ -1038,6 +1039,10 @@ func TestParseEnv(t *testing.T) { Name: "THIS_ENV", Value: "isOK", }, + { + Name: "this.dotted.env", + Value: "isOKToo", + }, { Name: "HAS_COMMAS", Value: "foo,bar", diff --git a/pkg/kubectl/scale_test.go b/pkg/kubectl/scale_test.go index 5c870a8cdc2..6e6cd62ed46 100644 --- a/pkg/kubectl/scale_test.go +++ b/pkg/kubectl/scale_test.go @@ -257,7 +257,7 @@ func TestValidateReplicationController(t *testing.T) { t.Errorf("unexpected error: %v (%s)", err, test.test) } if err == nil && test.expectError { - t.Errorf("unexpected non-error: %v (%s)", err, test.test) + t.Errorf("expected an error: %v (%s)", err, test.test) } } } @@ -520,7 +520,7 @@ func TestValidateJob(t *testing.T) { t.Errorf("unexpected error: %v (%s)", err, test.test) } if err == nil && test.expectError { - t.Errorf("unexpected non-error: %v (%s)", err, test.test) + t.Errorf("expected an error: %v (%s)", err, test.test) } } } @@ -781,7 +781,7 @@ func TestValidateDeployment(t *testing.T) { t.Errorf("unexpected error: %v (%s)", err, test.test) } if err == nil && test.expectError { - t.Errorf("unexpected non-error: %v (%s)", err, test.test) + t.Errorf("expected an error: %v (%s)", err, test.test) } } } diff --git a/pkg/kubectl/secret_test.go b/pkg/kubectl/secret_test.go index 309c7848d65..e7c1e7478be 100644 --- a/pkg/kubectl/secret_test.go +++ b/pkg/kubectl/secret_test.go @@ -157,7 +157,7 @@ func TestSecretGenerate(t *testing.T) { expectErr: true, }, { - setup: setupEnvFile("key.1=value1"), + setup: setupEnvFile("key#1=value1"), params: map[string]interface{}{ "name": "invalid_key", "from-env-file": "file.env", diff --git a/pkg/kubectl/testing/BUILD b/pkg/kubectl/testing/BUILD index f1f8d88e5ac..cef4a41c33a 100644 --- a/pkg/kubectl/testing/BUILD +++ b/pkg/kubectl/testing/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], visibility = [ "//build/visible_to:pkg_kubectl_testing_CONSUMERS", ], diff --git a/pkg/kubectl/util/BUILD b/pkg/kubectl/util/BUILD index 58209d598a3..4ee780e7f0f 100644 --- a/pkg/kubectl/util/BUILD +++ b/pkg/kubectl/util/BUILD @@ -1,5 +1,3 @@ -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,8 +8,12 @@ go_library( srcs = [ "umask.go", "util.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "umask_windows.go", + ], + "//conditions:default": [], + }), visibility = ["//build/visible_to:pkg_kubectl_util_CONSUMERS"], deps = [ "//vendor/golang.org/x/sys/unix:go_default_library", @@ -32,6 +34,7 @@ filegroup( srcs = [ ":package-srcs", "//pkg/kubectl/util/crlf:all-srcs", + "//pkg/kubectl/util/logs:all-srcs", "//pkg/kubectl/util/slice:all-srcs", "//pkg/kubectl/util/term:all-srcs", ], diff --git a/pkg/kubectl/util/crlf/BUILD b/pkg/kubectl/util/crlf/BUILD index 13993ad72b8..fc24ef43669 100644 --- a/pkg/kubectl/util/crlf/BUILD +++ b/pkg/kubectl/util/crlf/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["crlf.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/logs/BUILD b/pkg/kubectl/util/logs/BUILD similarity index 92% rename from pkg/util/logs/BUILD rename to pkg/kubectl/util/logs/BUILD index 24d392a4862..08392d469d0 100644 --- a/pkg/util/logs/BUILD +++ b/pkg/kubectl/util/logs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["logs.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/pkg/util/logs/logs.go b/pkg/kubectl/util/logs/logs.go similarity index 100% rename from pkg/util/logs/logs.go rename to pkg/kubectl/util/logs/logs.go diff --git a/pkg/kubectl/util/slice/BUILD b/pkg/kubectl/util/slice/BUILD index 35cb2024d50..4886be406f6 100644 --- a/pkg/kubectl/util/slice/BUILD +++ b/pkg/kubectl/util/slice/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,14 +9,12 @@ load( go_library( name = "go_default_library", srcs = ["slice.go"], - tags = ["automanaged"], ) go_test( name = "go_default_test", srcs = ["slice_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/pkg/kubectl/util/term/BUILD b/pkg/kubectl/util/term/BUILD index 2a22b3ead7f..1955efc780c 100644 --- a/pkg/kubectl/util/term/BUILD +++ b/pkg/kubectl/util/term/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,8 +13,12 @@ go_library( "resizeevents.go", "term.go", "term_writer.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "resizeevents_windows.go", + ], + "//conditions:default": [], + }), deps = [ "//pkg/util/interrupt:go_default_library", "//vendor/github.com/docker/docker/pkg/term:go_default_library", @@ -31,7 +33,6 @@ go_test( name = "go_default_test", srcs = ["term_writer_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/pkg/kubelet/BUILD b/pkg/kubelet/BUILD index 607eaafe7c1..3ceb61a0914 100644 --- a/pkg/kubelet/BUILD +++ b/pkg/kubelet/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -31,7 +29,6 @@ go_library( "util.go", "volume_host.go", ], - tags = ["automanaged"], deps = [ "//cmd/kubelet/app/options:go_default_library", "//pkg/api:go_default_library", @@ -64,6 +61,7 @@ go_library( "//pkg/kubelet/gpu:go_default_library", "//pkg/kubelet/gpu/nvidia:go_default_library", "//pkg/kubelet/images:go_default_library", + "//pkg/kubelet/kubeletconfig:go_default_library", "//pkg/kubelet/kuberuntime:go_default_library", "//pkg/kubelet/lifecycle:go_default_library", "//pkg/kubelet/metrics:go_default_library", @@ -161,9 +159,13 @@ go_test( "pod_workers_test.go", "reason_cache_test.go", "runonce_test.go", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "kubelet_pods_windows_test.go", + ], + "//conditions:default": [], + }), library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", @@ -256,6 +258,7 @@ filegroup( "//pkg/kubelet/eviction:all-srcs", "//pkg/kubelet/gpu:all-srcs", "//pkg/kubelet/images:all-srcs", + "//pkg/kubelet/kubeletconfig:all-srcs", "//pkg/kubelet/kuberuntime:all-srcs", "//pkg/kubelet/leaky:all-srcs", "//pkg/kubelet/lifecycle:all-srcs", diff --git a/pkg/kubelet/apis/BUILD b/pkg/kubelet/apis/BUILD index e67f4b000ef..ea268b1a9ea 100644 --- a/pkg/kubelet/apis/BUILD +++ b/pkg/kubelet/apis/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "well_known_annotations.go", "well_known_labels.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/kubelet/apis/cri/BUILD b/pkg/kubelet/apis/cri/BUILD index 3eeb7d06941..0a869ef112d 100644 --- a/pkg/kubelet/apis/cri/BUILD +++ b/pkg/kubelet/apis/cri/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["services.go"], - tags = ["automanaged"], deps = ["//pkg/kubelet/apis/cri/v1alpha1/runtime:go_default_library"], ) diff --git a/pkg/kubelet/apis/cri/services.go b/pkg/kubelet/apis/cri/services.go index 36b11e3f9b9..8a2394dd397 100644 --- a/pkg/kubelet/apis/cri/services.go +++ b/pkg/kubelet/apis/cri/services.go @@ -43,6 +43,8 @@ type ContainerManager interface { ListContainers(filter *runtimeapi.ContainerFilter) ([]*runtimeapi.Container, error) // ContainerStatus returns the status of the container. ContainerStatus(containerID string) (*runtimeapi.ContainerStatus, error) + // UpdateContainerResources updates the cgroup resources for the container. + UpdateContainerResources(containerID string, resources *runtimeapi.LinuxContainerResources) error // ExecSync executes a command in the container, and returns the stdout output. // If command exits with a non-zero exit code, an error is returned. ExecSync(containerID string, cmd []string, timeout time.Duration) (stdout []byte, stderr []byte, err error) diff --git a/pkg/kubelet/apis/cri/testing/BUILD b/pkg/kubelet/apis/cri/testing/BUILD index 78ea0c54d76..45054521b78 100644 --- a/pkg/kubelet/apis/cri/testing/BUILD +++ b/pkg/kubelet/apis/cri/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_runtime_service.go", "utils.go", ], - tags = ["automanaged"], deps = [ "//pkg/kubelet/apis/cri/v1alpha1/runtime:go_default_library", "//pkg/kubelet/util/sliceutils:go_default_library", diff --git a/pkg/kubelet/apis/cri/testing/fake_runtime_service.go b/pkg/kubelet/apis/cri/testing/fake_runtime_service.go index c26d13abcd3..9738d18a997 100644 --- a/pkg/kubelet/apis/cri/testing/fake_runtime_service.go +++ b/pkg/kubelet/apis/cri/testing/fake_runtime_service.go @@ -362,6 +362,10 @@ func (r *FakeRuntimeService) ContainerStatus(containerID string) (*runtimeapi.Co return &status, nil } +func (r *FakeRuntimeService) UpdateContainerResources(string, *runtimeapi.LinuxContainerResources) error { + return nil +} + func (r *FakeRuntimeService) ExecSync(containerID string, cmd []string, timeout time.Duration) (stdout []byte, stderr []byte, err error) { r.Lock() defer r.Unlock() diff --git a/pkg/kubelet/apis/cri/v1alpha1/runtime/BUILD b/pkg/kubelet/apis/cri/v1alpha1/runtime/BUILD index 83824989671..c39b090d139 100644 --- a/pkg/kubelet/apis/cri/v1alpha1/runtime/BUILD +++ b/pkg/kubelet/apis/cri/v1alpha1/runtime/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "api.pb.go", "constants.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", @@ -35,3 +32,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["api.proto"], + visibility = ["//visibility:public"], +) diff --git a/pkg/kubelet/apis/cri/v1alpha1/runtime/api.pb.go b/pkg/kubelet/apis/cri/v1alpha1/runtime/api.pb.go index 754d92c496d..dffb9689dfb 100644 --- a/pkg/kubelet/apis/cri/v1alpha1/runtime/api.pb.go +++ b/pkg/kubelet/apis/cri/v1alpha1/runtime/api.pb.go @@ -79,6 +79,8 @@ limitations under the License. ContainerStatusRequest ContainerStatus ContainerStatusResponse + UpdateContainerResourcesRequest + UpdateContainerResourcesResponse ExecSyncRequest ExecSyncResponse ExecRequest @@ -1191,6 +1193,10 @@ type LinuxContainerResources struct { MemoryLimitInBytes int64 `protobuf:"varint,4,opt,name=memory_limit_in_bytes,json=memoryLimitInBytes,proto3" json:"memory_limit_in_bytes,omitempty"` // OOMScoreAdj adjusts the oom-killer score. Default: 0 (not specified). OomScoreAdj int64 `protobuf:"varint,5,opt,name=oom_score_adj,json=oomScoreAdj,proto3" json:"oom_score_adj,omitempty"` + // CpusetCpus constrains the allowed set of logical CPUs. Default: "" (not specified). + CpusetCpus string `protobuf:"bytes,6,opt,name=cpuset_cpus,json=cpusetCpus,proto3" json:"cpuset_cpus,omitempty"` + // CpusetMems constrains the allowed set of memory nodes. Default: "" (not specified). + CpusetMems string `protobuf:"bytes,7,opt,name=cpuset_mems,json=cpusetMems,proto3" json:"cpuset_mems,omitempty"` } func (m *LinuxContainerResources) Reset() { *m = LinuxContainerResources{} } @@ -1232,6 +1238,20 @@ func (m *LinuxContainerResources) GetOomScoreAdj() int64 { return 0 } +func (m *LinuxContainerResources) GetCpusetCpus() string { + if m != nil { + return m.CpusetCpus + } + return "" +} + +func (m *LinuxContainerResources) GetCpusetMems() string { + if m != nil { + return m.CpusetMems + } + return "" +} + // SELinuxOption are the labels to be applied to the container. type SELinuxOption struct { User string `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` @@ -2205,6 +2225,42 @@ func (m *ContainerStatusResponse) GetStatus() *ContainerStatus { return nil } +type UpdateContainerResourcesRequest struct { + // ID of the container to update. + ContainerId string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + // Resource configuration specific to Linux containers. + Linux *LinuxContainerResources `protobuf:"bytes,2,opt,name=linux" json:"linux,omitempty"` +} + +func (m *UpdateContainerResourcesRequest) Reset() { *m = UpdateContainerResourcesRequest{} } +func (*UpdateContainerResourcesRequest) ProtoMessage() {} +func (*UpdateContainerResourcesRequest) Descriptor() ([]byte, []int) { + return fileDescriptorApi, []int{54} +} + +func (m *UpdateContainerResourcesRequest) GetContainerId() string { + if m != nil { + return m.ContainerId + } + return "" +} + +func (m *UpdateContainerResourcesRequest) GetLinux() *LinuxContainerResources { + if m != nil { + return m.Linux + } + return nil +} + +type UpdateContainerResourcesResponse struct { +} + +func (m *UpdateContainerResourcesResponse) Reset() { *m = UpdateContainerResourcesResponse{} } +func (*UpdateContainerResourcesResponse) ProtoMessage() {} +func (*UpdateContainerResourcesResponse) Descriptor() ([]byte, []int) { + return fileDescriptorApi, []int{55} +} + type ExecSyncRequest struct { // ID of the container. ContainerId string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` @@ -2216,7 +2272,7 @@ type ExecSyncRequest struct { func (m *ExecSyncRequest) Reset() { *m = ExecSyncRequest{} } func (*ExecSyncRequest) ProtoMessage() {} -func (*ExecSyncRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{54} } +func (*ExecSyncRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{56} } func (m *ExecSyncRequest) GetContainerId() string { if m != nil { @@ -2250,7 +2306,7 @@ type ExecSyncResponse struct { func (m *ExecSyncResponse) Reset() { *m = ExecSyncResponse{} } func (*ExecSyncResponse) ProtoMessage() {} -func (*ExecSyncResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{55} } +func (*ExecSyncResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{57} } func (m *ExecSyncResponse) GetStdout() []byte { if m != nil { @@ -2286,7 +2342,7 @@ type ExecRequest struct { func (m *ExecRequest) Reset() { *m = ExecRequest{} } func (*ExecRequest) ProtoMessage() {} -func (*ExecRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{56} } +func (*ExecRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{58} } func (m *ExecRequest) GetContainerId() string { if m != nil { @@ -2323,7 +2379,7 @@ type ExecResponse struct { func (m *ExecResponse) Reset() { *m = ExecResponse{} } func (*ExecResponse) ProtoMessage() {} -func (*ExecResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{57} } +func (*ExecResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{59} } func (m *ExecResponse) GetUrl() string { if m != nil { @@ -2344,7 +2400,7 @@ type AttachRequest struct { func (m *AttachRequest) Reset() { *m = AttachRequest{} } func (*AttachRequest) ProtoMessage() {} -func (*AttachRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{58} } +func (*AttachRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{60} } func (m *AttachRequest) GetContainerId() string { if m != nil { @@ -2374,7 +2430,7 @@ type AttachResponse struct { func (m *AttachResponse) Reset() { *m = AttachResponse{} } func (*AttachResponse) ProtoMessage() {} -func (*AttachResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{59} } +func (*AttachResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{61} } func (m *AttachResponse) GetUrl() string { if m != nil { @@ -2392,7 +2448,7 @@ type PortForwardRequest struct { func (m *PortForwardRequest) Reset() { *m = PortForwardRequest{} } func (*PortForwardRequest) ProtoMessage() {} -func (*PortForwardRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{60} } +func (*PortForwardRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{62} } func (m *PortForwardRequest) GetPodSandboxId() string { if m != nil { @@ -2415,7 +2471,7 @@ type PortForwardResponse struct { func (m *PortForwardResponse) Reset() { *m = PortForwardResponse{} } func (*PortForwardResponse) ProtoMessage() {} -func (*PortForwardResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{61} } +func (*PortForwardResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{63} } func (m *PortForwardResponse) GetUrl() string { if m != nil { @@ -2431,7 +2487,7 @@ type ImageFilter struct { func (m *ImageFilter) Reset() { *m = ImageFilter{} } func (*ImageFilter) ProtoMessage() {} -func (*ImageFilter) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{62} } +func (*ImageFilter) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{64} } func (m *ImageFilter) GetImage() *ImageSpec { if m != nil { @@ -2447,7 +2503,7 @@ type ListImagesRequest struct { func (m *ListImagesRequest) Reset() { *m = ListImagesRequest{} } func (*ListImagesRequest) ProtoMessage() {} -func (*ListImagesRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{63} } +func (*ListImagesRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{65} } func (m *ListImagesRequest) GetFilter() *ImageFilter { if m != nil { @@ -2477,7 +2533,7 @@ type Image struct { func (m *Image) Reset() { *m = Image{} } func (*Image) ProtoMessage() {} -func (*Image) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{64} } +func (*Image) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{66} } func (m *Image) GetId() string { if m != nil { @@ -2528,7 +2584,7 @@ type ListImagesResponse struct { func (m *ListImagesResponse) Reset() { *m = ListImagesResponse{} } func (*ListImagesResponse) ProtoMessage() {} -func (*ListImagesResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{65} } +func (*ListImagesResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{67} } func (m *ListImagesResponse) GetImages() []*Image { if m != nil { @@ -2544,7 +2600,7 @@ type ImageStatusRequest struct { func (m *ImageStatusRequest) Reset() { *m = ImageStatusRequest{} } func (*ImageStatusRequest) ProtoMessage() {} -func (*ImageStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{66} } +func (*ImageStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{68} } func (m *ImageStatusRequest) GetImage() *ImageSpec { if m != nil { @@ -2560,7 +2616,7 @@ type ImageStatusResponse struct { func (m *ImageStatusResponse) Reset() { *m = ImageStatusResponse{} } func (*ImageStatusResponse) ProtoMessage() {} -func (*ImageStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{67} } +func (*ImageStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{69} } func (m *ImageStatusResponse) GetImage() *Image { if m != nil { @@ -2584,7 +2640,7 @@ type AuthConfig struct { func (m *AuthConfig) Reset() { *m = AuthConfig{} } func (*AuthConfig) ProtoMessage() {} -func (*AuthConfig) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{68} } +func (*AuthConfig) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{70} } func (m *AuthConfig) GetUsername() string { if m != nil { @@ -2639,7 +2695,7 @@ type PullImageRequest struct { func (m *PullImageRequest) Reset() { *m = PullImageRequest{} } func (*PullImageRequest) ProtoMessage() {} -func (*PullImageRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{69} } +func (*PullImageRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{71} } func (m *PullImageRequest) GetImage() *ImageSpec { if m != nil { @@ -2670,7 +2726,7 @@ type PullImageResponse struct { func (m *PullImageResponse) Reset() { *m = PullImageResponse{} } func (*PullImageResponse) ProtoMessage() {} -func (*PullImageResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{70} } +func (*PullImageResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{72} } func (m *PullImageResponse) GetImageRef() string { if m != nil { @@ -2686,7 +2742,7 @@ type RemoveImageRequest struct { func (m *RemoveImageRequest) Reset() { *m = RemoveImageRequest{} } func (*RemoveImageRequest) ProtoMessage() {} -func (*RemoveImageRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{71} } +func (*RemoveImageRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{73} } func (m *RemoveImageRequest) GetImage() *ImageSpec { if m != nil { @@ -2700,7 +2756,7 @@ type RemoveImageResponse struct { func (m *RemoveImageResponse) Reset() { *m = RemoveImageResponse{} } func (*RemoveImageResponse) ProtoMessage() {} -func (*RemoveImageResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{72} } +func (*RemoveImageResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{74} } type NetworkConfig struct { // CIDR to use for pod IP addresses. @@ -2709,7 +2765,7 @@ type NetworkConfig struct { func (m *NetworkConfig) Reset() { *m = NetworkConfig{} } func (*NetworkConfig) ProtoMessage() {} -func (*NetworkConfig) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{73} } +func (*NetworkConfig) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{75} } func (m *NetworkConfig) GetPodCidr() string { if m != nil { @@ -2724,7 +2780,7 @@ type RuntimeConfig struct { func (m *RuntimeConfig) Reset() { *m = RuntimeConfig{} } func (*RuntimeConfig) ProtoMessage() {} -func (*RuntimeConfig) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{74} } +func (*RuntimeConfig) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{76} } func (m *RuntimeConfig) GetNetworkConfig() *NetworkConfig { if m != nil { @@ -2739,7 +2795,7 @@ type UpdateRuntimeConfigRequest struct { func (m *UpdateRuntimeConfigRequest) Reset() { *m = UpdateRuntimeConfigRequest{} } func (*UpdateRuntimeConfigRequest) ProtoMessage() {} -func (*UpdateRuntimeConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{75} } +func (*UpdateRuntimeConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{77} } func (m *UpdateRuntimeConfigRequest) GetRuntimeConfig() *RuntimeConfig { if m != nil { @@ -2753,7 +2809,7 @@ type UpdateRuntimeConfigResponse struct { func (m *UpdateRuntimeConfigResponse) Reset() { *m = UpdateRuntimeConfigResponse{} } func (*UpdateRuntimeConfigResponse) ProtoMessage() {} -func (*UpdateRuntimeConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{76} } +func (*UpdateRuntimeConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{78} } // RuntimeCondition contains condition information for the runtime. // There are 2 kinds of runtime conditions: @@ -2781,7 +2837,7 @@ type RuntimeCondition struct { func (m *RuntimeCondition) Reset() { *m = RuntimeCondition{} } func (*RuntimeCondition) ProtoMessage() {} -func (*RuntimeCondition) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{77} } +func (*RuntimeCondition) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{79} } func (m *RuntimeCondition) GetType() string { if m != nil { @@ -2819,7 +2875,7 @@ type RuntimeStatus struct { func (m *RuntimeStatus) Reset() { *m = RuntimeStatus{} } func (*RuntimeStatus) ProtoMessage() {} -func (*RuntimeStatus) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{78} } +func (*RuntimeStatus) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{80} } func (m *RuntimeStatus) GetConditions() []*RuntimeCondition { if m != nil { @@ -2833,7 +2889,7 @@ type StatusRequest struct { func (m *StatusRequest) Reset() { *m = StatusRequest{} } func (*StatusRequest) ProtoMessage() {} -func (*StatusRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{79} } +func (*StatusRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{81} } type StatusResponse struct { // Status of the Runtime. @@ -2842,7 +2898,7 @@ type StatusResponse struct { func (m *StatusResponse) Reset() { *m = StatusResponse{} } func (*StatusResponse) ProtoMessage() {} -func (*StatusResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{80} } +func (*StatusResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{82} } func (m *StatusResponse) GetStatus() *RuntimeStatus { if m != nil { @@ -2856,7 +2912,7 @@ type ImageFsInfoRequest struct { func (m *ImageFsInfoRequest) Reset() { *m = ImageFsInfoRequest{} } func (*ImageFsInfoRequest) ProtoMessage() {} -func (*ImageFsInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{81} } +func (*ImageFsInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{83} } // UInt64Value is the wrapper of uint64. type UInt64Value struct { @@ -2866,7 +2922,7 @@ type UInt64Value struct { func (m *UInt64Value) Reset() { *m = UInt64Value{} } func (*UInt64Value) ProtoMessage() {} -func (*UInt64Value) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{82} } +func (*UInt64Value) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{84} } func (m *UInt64Value) GetValue() uint64 { if m != nil { @@ -2883,7 +2939,7 @@ type StorageIdentifier struct { func (m *StorageIdentifier) Reset() { *m = StorageIdentifier{} } func (*StorageIdentifier) ProtoMessage() {} -func (*StorageIdentifier) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{83} } +func (*StorageIdentifier) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{85} } func (m *StorageIdentifier) GetUuid() string { if m != nil { @@ -2910,7 +2966,7 @@ type FilesystemUsage struct { func (m *FilesystemUsage) Reset() { *m = FilesystemUsage{} } func (*FilesystemUsage) ProtoMessage() {} -func (*FilesystemUsage) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{84} } +func (*FilesystemUsage) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{86} } func (m *FilesystemUsage) GetTimestamp() int64 { if m != nil { @@ -2947,7 +3003,7 @@ type ImageFsInfoResponse struct { func (m *ImageFsInfoResponse) Reset() { *m = ImageFsInfoResponse{} } func (*ImageFsInfoResponse) ProtoMessage() {} -func (*ImageFsInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{85} } +func (*ImageFsInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{87} } func (m *ImageFsInfoResponse) GetImageFilesystems() []*FilesystemUsage { if m != nil { @@ -2963,7 +3019,7 @@ type ContainerStatsRequest struct { func (m *ContainerStatsRequest) Reset() { *m = ContainerStatsRequest{} } func (*ContainerStatsRequest) ProtoMessage() {} -func (*ContainerStatsRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{86} } +func (*ContainerStatsRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{88} } func (m *ContainerStatsRequest) GetContainerId() string { if m != nil { @@ -2979,7 +3035,7 @@ type ContainerStatsResponse struct { func (m *ContainerStatsResponse) Reset() { *m = ContainerStatsResponse{} } func (*ContainerStatsResponse) ProtoMessage() {} -func (*ContainerStatsResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{87} } +func (*ContainerStatsResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{89} } func (m *ContainerStatsResponse) GetStats() *ContainerStats { if m != nil { @@ -2995,7 +3051,7 @@ type ListContainerStatsRequest struct { func (m *ListContainerStatsRequest) Reset() { *m = ListContainerStatsRequest{} } func (*ListContainerStatsRequest) ProtoMessage() {} -func (*ListContainerStatsRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{88} } +func (*ListContainerStatsRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{90} } func (m *ListContainerStatsRequest) GetFilter() *ContainerStatsFilter { if m != nil { @@ -3019,7 +3075,7 @@ type ContainerStatsFilter struct { func (m *ContainerStatsFilter) Reset() { *m = ContainerStatsFilter{} } func (*ContainerStatsFilter) ProtoMessage() {} -func (*ContainerStatsFilter) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{89} } +func (*ContainerStatsFilter) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{91} } func (m *ContainerStatsFilter) GetId() string { if m != nil { @@ -3049,7 +3105,7 @@ type ListContainerStatsResponse struct { func (m *ListContainerStatsResponse) Reset() { *m = ListContainerStatsResponse{} } func (*ListContainerStatsResponse) ProtoMessage() {} -func (*ListContainerStatsResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{90} } +func (*ListContainerStatsResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{92} } func (m *ListContainerStatsResponse) GetStats() []*ContainerStats { if m != nil { @@ -3075,7 +3131,7 @@ type ContainerAttributes struct { func (m *ContainerAttributes) Reset() { *m = ContainerAttributes{} } func (*ContainerAttributes) ProtoMessage() {} -func (*ContainerAttributes) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{91} } +func (*ContainerAttributes) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{93} } func (m *ContainerAttributes) GetId() string { if m != nil { @@ -3119,7 +3175,7 @@ type ContainerStats struct { func (m *ContainerStats) Reset() { *m = ContainerStats{} } func (*ContainerStats) ProtoMessage() {} -func (*ContainerStats) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{92} } +func (*ContainerStats) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{94} } func (m *ContainerStats) GetAttributes() *ContainerAttributes { if m != nil { @@ -3159,7 +3215,7 @@ type CpuUsage struct { func (m *CpuUsage) Reset() { *m = CpuUsage{} } func (*CpuUsage) ProtoMessage() {} -func (*CpuUsage) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{93} } +func (*CpuUsage) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{95} } func (m *CpuUsage) GetTimestamp() int64 { if m != nil { @@ -3185,7 +3241,7 @@ type MemoryUsage struct { func (m *MemoryUsage) Reset() { *m = MemoryUsage{} } func (*MemoryUsage) ProtoMessage() {} -func (*MemoryUsage) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{94} } +func (*MemoryUsage) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{96} } func (m *MemoryUsage) GetTimestamp() int64 { if m != nil { @@ -3256,6 +3312,8 @@ func init() { proto.RegisterType((*ContainerStatusRequest)(nil), "runtime.ContainerStatusRequest") proto.RegisterType((*ContainerStatus)(nil), "runtime.ContainerStatus") proto.RegisterType((*ContainerStatusResponse)(nil), "runtime.ContainerStatusResponse") + proto.RegisterType((*UpdateContainerResourcesRequest)(nil), "runtime.UpdateContainerResourcesRequest") + proto.RegisterType((*UpdateContainerResourcesResponse)(nil), "runtime.UpdateContainerResourcesResponse") proto.RegisterType((*ExecSyncRequest)(nil), "runtime.ExecSyncRequest") proto.RegisterType((*ExecSyncResponse)(nil), "runtime.ExecSyncResponse") proto.RegisterType((*ExecRequest)(nil), "runtime.ExecRequest") @@ -3357,6 +3415,8 @@ type RuntimeServiceClient interface { // ContainerStatus returns status of the container. If the container is not // present, returns an error. ContainerStatus(ctx context.Context, in *ContainerStatusRequest, opts ...grpc.CallOption) (*ContainerStatusResponse, error) + // UpdateContainerResources updates ContainerConfig of the container. + UpdateContainerResources(ctx context.Context, in *UpdateContainerResourcesRequest, opts ...grpc.CallOption) (*UpdateContainerResourcesResponse, error) // ExecSync runs a command in a container synchronously. ExecSync(ctx context.Context, in *ExecSyncRequest, opts ...grpc.CallOption) (*ExecSyncResponse, error) // Exec prepares a streaming endpoint to execute a command in the container. @@ -3492,6 +3552,15 @@ func (c *runtimeServiceClient) ContainerStatus(ctx context.Context, in *Containe return out, nil } +func (c *runtimeServiceClient) UpdateContainerResources(ctx context.Context, in *UpdateContainerResourcesRequest, opts ...grpc.CallOption) (*UpdateContainerResourcesResponse, error) { + out := new(UpdateContainerResourcesResponse) + err := grpc.Invoke(ctx, "/runtime.RuntimeService/UpdateContainerResources", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *runtimeServiceClient) ExecSync(ctx context.Context, in *ExecSyncRequest, opts ...grpc.CallOption) (*ExecSyncResponse, error) { out := new(ExecSyncResponse) err := grpc.Invoke(ctx, "/runtime.RuntimeService/ExecSync", in, out, c.cc, opts...) @@ -3611,6 +3680,8 @@ type RuntimeServiceServer interface { // ContainerStatus returns status of the container. If the container is not // present, returns an error. ContainerStatus(context.Context, *ContainerStatusRequest) (*ContainerStatusResponse, error) + // UpdateContainerResources updates ContainerConfig of the container. + UpdateContainerResources(context.Context, *UpdateContainerResourcesRequest) (*UpdateContainerResourcesResponse, error) // ExecSync runs a command in a container synchronously. ExecSync(context.Context, *ExecSyncRequest) (*ExecSyncResponse, error) // Exec prepares a streaming endpoint to execute a command in the container. @@ -3850,6 +3921,24 @@ func _RuntimeService_ContainerStatus_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } +func _RuntimeService_UpdateContainerResources_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateContainerResourcesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RuntimeServiceServer).UpdateContainerResources(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/runtime.RuntimeService/UpdateContainerResources", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RuntimeServiceServer).UpdateContainerResources(ctx, req.(*UpdateContainerResourcesRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _RuntimeService_ExecSync_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ExecSyncRequest) if err := dec(in); err != nil { @@ -4046,6 +4135,10 @@ var _RuntimeService_serviceDesc = grpc.ServiceDesc{ MethodName: "ContainerStatus", Handler: _RuntimeService_ContainerStatus_Handler, }, + { + MethodName: "UpdateContainerResources", + Handler: _RuntimeService_UpdateContainerResources_Handler, + }, { MethodName: "ExecSync", Handler: _RuntimeService_ExecSync_Handler, @@ -5546,6 +5639,18 @@ func (m *LinuxContainerResources) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintApi(dAtA, i, uint64(m.OomScoreAdj)) } + if len(m.CpusetCpus) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintApi(dAtA, i, uint64(len(m.CpusetCpus))) + i += copy(dAtA[i:], m.CpusetCpus) + } + if len(m.CpusetMems) > 0 { + dAtA[i] = 0x3a + i++ + i = encodeVarintApi(dAtA, i, uint64(len(m.CpusetMems))) + i += copy(dAtA[i:], m.CpusetMems) + } return i, nil } @@ -6684,6 +6789,58 @@ func (m *ContainerStatusResponse) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *UpdateContainerResourcesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *UpdateContainerResourcesRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.ContainerId) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintApi(dAtA, i, uint64(len(m.ContainerId))) + i += copy(dAtA[i:], m.ContainerId) + } + if m.Linux != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintApi(dAtA, i, uint64(m.Linux.Size())) + n40, err := m.Linux.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n40 + } + return i, nil +} + +func (m *UpdateContainerResourcesResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *UpdateContainerResourcesResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + func (m *ExecSyncRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6936,22 +7093,22 @@ func (m *PortForwardRequest) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], m.PodSandboxId) } if len(m.Port) > 0 { - dAtA41 := make([]byte, len(m.Port)*10) - var j40 int + dAtA42 := make([]byte, len(m.Port)*10) + var j41 int for _, num1 := range m.Port { num := uint64(num1) for num >= 1<<7 { - dAtA41[j40] = uint8(uint64(num)&0x7f | 0x80) + dAtA42[j41] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j40++ + j41++ } - dAtA41[j40] = uint8(num) - j40++ + dAtA42[j41] = uint8(num) + j41++ } dAtA[i] = 0x12 i++ - i = encodeVarintApi(dAtA, i, uint64(j40)) - i += copy(dAtA[i:], dAtA41[:j40]) + i = encodeVarintApi(dAtA, i, uint64(j41)) + i += copy(dAtA[i:], dAtA42[:j41]) } return i, nil } @@ -6999,11 +7156,11 @@ func (m *ImageFilter) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintApi(dAtA, i, uint64(m.Image.Size())) - n42, err := m.Image.MarshalTo(dAtA[i:]) + n43, err := m.Image.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n42 + i += n43 } return i, nil } @@ -7027,11 +7184,11 @@ func (m *ListImagesRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintApi(dAtA, i, uint64(m.Filter.Size())) - n43, err := m.Filter.MarshalTo(dAtA[i:]) + n44, err := m.Filter.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n43 + i += n44 } return i, nil } @@ -7096,11 +7253,11 @@ func (m *Image) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintApi(dAtA, i, uint64(m.Uid.Size())) - n44, err := m.Uid.MarshalTo(dAtA[i:]) + n45, err := m.Uid.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n44 + i += n45 } if len(m.Username) > 0 { dAtA[i] = 0x32 @@ -7160,11 +7317,11 @@ func (m *ImageStatusRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintApi(dAtA, i, uint64(m.Image.Size())) - n45, err := m.Image.MarshalTo(dAtA[i:]) + n46, err := m.Image.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n45 + i += n46 } return i, nil } @@ -7188,11 +7345,11 @@ func (m *ImageStatusResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintApi(dAtA, i, uint64(m.Image.Size())) - n46, err := m.Image.MarshalTo(dAtA[i:]) + n47, err := m.Image.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n46 + i += n47 } return i, nil } @@ -7270,32 +7427,32 @@ func (m *PullImageRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintApi(dAtA, i, uint64(m.Image.Size())) - n47, err := m.Image.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n47 - } - if m.Auth != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintApi(dAtA, i, uint64(m.Auth.Size())) - n48, err := m.Auth.MarshalTo(dAtA[i:]) + n48, err := m.Image.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n48 } - if m.SandboxConfig != nil { - dAtA[i] = 0x1a + if m.Auth != nil { + dAtA[i] = 0x12 i++ - i = encodeVarintApi(dAtA, i, uint64(m.SandboxConfig.Size())) - n49, err := m.SandboxConfig.MarshalTo(dAtA[i:]) + i = encodeVarintApi(dAtA, i, uint64(m.Auth.Size())) + n49, err := m.Auth.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n49 } + if m.SandboxConfig != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintApi(dAtA, i, uint64(m.SandboxConfig.Size())) + n50, err := m.SandboxConfig.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n50 + } return i, nil } @@ -7342,11 +7499,11 @@ func (m *RemoveImageRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintApi(dAtA, i, uint64(m.Image.Size())) - n50, err := m.Image.MarshalTo(dAtA[i:]) + n51, err := m.Image.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n50 + i += n51 } return i, nil } @@ -7412,11 +7569,11 @@ func (m *RuntimeConfig) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintApi(dAtA, i, uint64(m.NetworkConfig.Size())) - n51, err := m.NetworkConfig.MarshalTo(dAtA[i:]) + n52, err := m.NetworkConfig.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n51 + i += n52 } return i, nil } @@ -7440,11 +7597,11 @@ func (m *UpdateRuntimeConfigRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintApi(dAtA, i, uint64(m.RuntimeConfig.Size())) - n52, err := m.RuntimeConfig.MarshalTo(dAtA[i:]) + n53, err := m.RuntimeConfig.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n52 + i += n53 } return i, nil } @@ -7580,11 +7737,11 @@ func (m *StatusResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintApi(dAtA, i, uint64(m.Status.Size())) - n53, err := m.Status.MarshalTo(dAtA[i:]) + n54, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n53 + i += n54 } return i, nil } @@ -7678,32 +7835,32 @@ func (m *FilesystemUsage) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintApi(dAtA, i, uint64(m.StorageId.Size())) - n54, err := m.StorageId.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n54 - } - if m.UsedBytes != nil { - dAtA[i] = 0x1a - i++ - i = encodeVarintApi(dAtA, i, uint64(m.UsedBytes.Size())) - n55, err := m.UsedBytes.MarshalTo(dAtA[i:]) + n55, err := m.StorageId.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n55 } - if m.InodesUsed != nil { - dAtA[i] = 0x22 + if m.UsedBytes != nil { + dAtA[i] = 0x1a i++ - i = encodeVarintApi(dAtA, i, uint64(m.InodesUsed.Size())) - n56, err := m.InodesUsed.MarshalTo(dAtA[i:]) + i = encodeVarintApi(dAtA, i, uint64(m.UsedBytes.Size())) + n56, err := m.UsedBytes.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n56 } + if m.InodesUsed != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintApi(dAtA, i, uint64(m.InodesUsed.Size())) + n57, err := m.InodesUsed.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n57 + } return i, nil } @@ -7780,11 +7937,11 @@ func (m *ContainerStatsResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintApi(dAtA, i, uint64(m.Stats.Size())) - n57, err := m.Stats.MarshalTo(dAtA[i:]) + n58, err := m.Stats.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n57 + i += n58 } return i, nil } @@ -7808,11 +7965,11 @@ func (m *ListContainerStatsRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintApi(dAtA, i, uint64(m.Filter.Size())) - n58, err := m.Filter.MarshalTo(dAtA[i:]) + n59, err := m.Filter.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n58 + i += n59 } return i, nil } @@ -7919,11 +8076,11 @@ func (m *ContainerAttributes) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintApi(dAtA, i, uint64(m.Metadata.Size())) - n59, err := m.Metadata.MarshalTo(dAtA[i:]) + n60, err := m.Metadata.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n59 + i += n60 } if len(m.Labels) > 0 { for k := range m.Labels { @@ -7981,42 +8138,42 @@ func (m *ContainerStats) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintApi(dAtA, i, uint64(m.Attributes.Size())) - n60, err := m.Attributes.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n60 - } - if m.Cpu != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintApi(dAtA, i, uint64(m.Cpu.Size())) - n61, err := m.Cpu.MarshalTo(dAtA[i:]) + n61, err := m.Attributes.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n61 } - if m.Memory != nil { - dAtA[i] = 0x1a + if m.Cpu != nil { + dAtA[i] = 0x12 i++ - i = encodeVarintApi(dAtA, i, uint64(m.Memory.Size())) - n62, err := m.Memory.MarshalTo(dAtA[i:]) + i = encodeVarintApi(dAtA, i, uint64(m.Cpu.Size())) + n62, err := m.Cpu.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n62 } - if m.WritableLayer != nil { - dAtA[i] = 0x22 + if m.Memory != nil { + dAtA[i] = 0x1a i++ - i = encodeVarintApi(dAtA, i, uint64(m.WritableLayer.Size())) - n63, err := m.WritableLayer.MarshalTo(dAtA[i:]) + i = encodeVarintApi(dAtA, i, uint64(m.Memory.Size())) + n63, err := m.Memory.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n63 } + if m.WritableLayer != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintApi(dAtA, i, uint64(m.WritableLayer.Size())) + n64, err := m.WritableLayer.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n64 + } return i, nil } @@ -8044,11 +8201,11 @@ func (m *CpuUsage) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintApi(dAtA, i, uint64(m.UsageCoreNanoSeconds.Size())) - n64, err := m.UsageCoreNanoSeconds.MarshalTo(dAtA[i:]) + n65, err := m.UsageCoreNanoSeconds.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n64 + i += n65 } return i, nil } @@ -8077,11 +8234,11 @@ func (m *MemoryUsage) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintApi(dAtA, i, uint64(m.WorkingSetBytes.Size())) - n65, err := m.WorkingSetBytes.MarshalTo(dAtA[i:]) + n66, err := m.WorkingSetBytes.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n65 + i += n66 } return i, nil } @@ -8635,6 +8792,14 @@ func (m *LinuxContainerResources) Size() (n int) { if m.OomScoreAdj != 0 { n += 1 + sovApi(uint64(m.OomScoreAdj)) } + l = len(m.CpusetCpus) + if l > 0 { + n += 1 + l + sovApi(uint64(l)) + } + l = len(m.CpusetMems) + if l > 0 { + n += 1 + l + sovApi(uint64(l)) + } return n } @@ -9129,6 +9294,26 @@ func (m *ContainerStatusResponse) Size() (n int) { return n } +func (m *UpdateContainerResourcesRequest) Size() (n int) { + var l int + _ = l + l = len(m.ContainerId) + if l > 0 { + n += 1 + l + sovApi(uint64(l)) + } + if m.Linux != nil { + l = m.Linux.Size() + n += 1 + l + sovApi(uint64(l)) + } + return n +} + +func (m *UpdateContainerResourcesResponse) Size() (n int) { + var l int + _ = l + return n +} + func (m *ExecSyncRequest) Size() (n int) { var l int _ = l @@ -10141,6 +10326,8 @@ func (this *LinuxContainerResources) String() string { `CpuShares:` + fmt.Sprintf("%v", this.CpuShares) + `,`, `MemoryLimitInBytes:` + fmt.Sprintf("%v", this.MemoryLimitInBytes) + `,`, `OomScoreAdj:` + fmt.Sprintf("%v", this.OomScoreAdj) + `,`, + `CpusetCpus:` + fmt.Sprintf("%v", this.CpusetCpus) + `,`, + `CpusetMems:` + fmt.Sprintf("%v", this.CpusetMems) + `,`, `}`, }, "") return s @@ -10502,6 +10689,26 @@ func (this *ContainerStatusResponse) String() string { }, "") return s } +func (this *UpdateContainerResourcesRequest) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&UpdateContainerResourcesRequest{`, + `ContainerId:` + fmt.Sprintf("%v", this.ContainerId) + `,`, + `Linux:` + strings.Replace(fmt.Sprintf("%v", this.Linux), "LinuxContainerResources", "LinuxContainerResources", 1) + `,`, + `}`, + }, "") + return s +} +func (this *UpdateContainerResourcesResponse) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&UpdateContainerResourcesResponse{`, + `}`, + }, "") + return s +} func (this *ExecSyncRequest) String() string { if this == nil { return "nil" @@ -15392,6 +15599,64 @@ func (m *LinuxContainerResources) Unmarshal(dAtA []byte) error { break } } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CpusetCpus", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CpusetCpus = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CpusetMems", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CpusetMems = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) @@ -19453,6 +19718,168 @@ func (m *ContainerStatusResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *UpdateContainerResourcesRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UpdateContainerResourcesRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UpdateContainerResourcesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ContainerId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Linux", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Linux == nil { + m.Linux = &LinuxContainerResources{} + } + if err := m.Linux.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApi(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *UpdateContainerResourcesResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UpdateContainerResourcesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UpdateContainerResourcesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipApi(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ExecSyncRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -24073,262 +24500,267 @@ var ( func init() { proto.RegisterFile("api.proto", fileDescriptorApi) } var fileDescriptorApi = []byte{ - // 4103 bytes of a gzipped FileDescriptorProto + // 4185 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x3b, 0x4d, 0x6f, 0x1c, 0x47, - 0x76, 0x9c, 0x19, 0x7e, 0xcc, 0xbc, 0xe1, 0x0c, 0x87, 0x25, 0x8a, 0x1c, 0x8d, 0x24, 0x9a, 0x6e, - 0x59, 0xb6, 0xa4, 0x5d, 0xc9, 0x32, 0xbd, 0xb6, 0x63, 0xf9, 0x4b, 0x34, 0x49, 0x19, 0xb4, 0xa4, - 0x11, 0xb7, 0x47, 0xf4, 0xee, 0x66, 0x03, 0x74, 0x9a, 0xd3, 0xc5, 0x61, 0x5b, 0x33, 0x5d, 0xbd, - 0xdd, 0xd5, 0x92, 0x98, 0x53, 0x72, 0x09, 0x72, 0x74, 0x8e, 0xb9, 0xe5, 0x10, 0x60, 0x91, 0x4b, - 0x0e, 0x39, 0x04, 0xf9, 0x05, 0xc1, 0x02, 0x41, 0x80, 0x9c, 0x82, 0xe4, 0xb6, 0xab, 0x1c, 0x72, - 0x08, 0x90, 0xdf, 0x10, 0xd4, 0x57, 0x77, 0xf5, 0xd7, 0x88, 0x94, 0x8d, 0x5d, 0xdd, 0xba, 0x5e, - 0xbd, 0xf7, 0xea, 0x55, 0xbd, 0x57, 0xaf, 0xde, 0x7b, 0x55, 0x0d, 0x0d, 0xdb, 0x77, 0x6f, 0xf9, - 0x01, 0xa1, 0x04, 0x2d, 0x04, 0x91, 0x47, 0xdd, 0x09, 0xee, 0xdd, 0x1c, 0xb9, 0xf4, 0x38, 0x3a, - 0xbc, 0x35, 0x24, 0x93, 0x77, 0x47, 0x64, 0x44, 0xde, 0xe5, 0xfd, 0x87, 0xd1, 0x11, 0x6f, 0xf1, - 0x06, 0xff, 0x12, 0x74, 0xc6, 0x0d, 0x68, 0x7f, 0x83, 0x83, 0xd0, 0x25, 0x9e, 0x89, 0x7f, 0x15, - 0xe1, 0x90, 0xa2, 0x2e, 0x2c, 0x3c, 0x15, 0x90, 0x6e, 0x65, 0xa3, 0x72, 0xad, 0x61, 0xaa, 0xa6, - 0xf1, 0xeb, 0x0a, 0x2c, 0xc5, 0xc8, 0xa1, 0x4f, 0xbc, 0x10, 0x97, 0x63, 0xa3, 0x37, 0x61, 0x51, - 0xca, 0x64, 0x79, 0xf6, 0x04, 0x77, 0xab, 0xbc, 0xbb, 0x29, 0x61, 0x7d, 0x7b, 0x82, 0xd1, 0x3b, - 0xb0, 0xa4, 0x50, 0x14, 0x93, 0x1a, 0xc7, 0x6a, 0x4b, 0xb0, 0x1c, 0x0d, 0xdd, 0x82, 0x73, 0x0a, - 0xd1, 0xf6, 0xdd, 0x18, 0x79, 0x96, 0x23, 0x2f, 0xcb, 0xae, 0x2d, 0xdf, 0x95, 0xf8, 0xc6, 0x2f, - 0xa1, 0xb1, 0xd3, 0x1f, 0x6c, 0x13, 0xef, 0xc8, 0x1d, 0x31, 0x11, 0x43, 0x1c, 0x30, 0x9a, 0x6e, - 0x65, 0xa3, 0xc6, 0x44, 0x94, 0x4d, 0xd4, 0x83, 0x7a, 0x88, 0xed, 0x60, 0x78, 0x8c, 0xc3, 0x6e, - 0x95, 0x77, 0xc5, 0x6d, 0x46, 0x45, 0x7c, 0xea, 0x12, 0x2f, 0xec, 0xd6, 0x04, 0x95, 0x6c, 0x1a, - 0x7f, 0x53, 0x81, 0xe6, 0x3e, 0x09, 0xe8, 0x43, 0xdb, 0xf7, 0x5d, 0x6f, 0x84, 0x6e, 0x42, 0x9d, - 0xaf, 0xe5, 0x90, 0x8c, 0xf9, 0x1a, 0xb4, 0x37, 0x97, 0x6f, 0x49, 0x91, 0x6e, 0xed, 0xcb, 0x0e, - 0x33, 0x46, 0x41, 0x57, 0xa1, 0x3d, 0x24, 0x1e, 0xb5, 0x5d, 0x0f, 0x07, 0x96, 0x4f, 0x02, 0xca, - 0x57, 0x66, 0xce, 0x6c, 0xc5, 0x50, 0xc6, 0x1c, 0x5d, 0x84, 0xc6, 0x31, 0x09, 0xa9, 0xc0, 0xa8, - 0x71, 0x8c, 0x3a, 0x03, 0xf0, 0xce, 0x35, 0x58, 0xe0, 0x9d, 0xae, 0x2f, 0xd7, 0x60, 0x9e, 0x35, - 0xf7, 0x7c, 0xe3, 0xbb, 0x0a, 0xcc, 0x3d, 0x24, 0x91, 0x47, 0x33, 0xc3, 0xd8, 0xf4, 0x58, 0xea, - 0x47, 0x1b, 0xc6, 0xa6, 0xc7, 0xc9, 0x30, 0x0c, 0x43, 0xa8, 0x48, 0x0c, 0xc3, 0x3a, 0x7b, 0x50, - 0x0f, 0xb0, 0xed, 0x10, 0x6f, 0x7c, 0xc2, 0x45, 0xa8, 0x9b, 0x71, 0x9b, 0xe9, 0x2e, 0xc4, 0x63, - 0xd7, 0x8b, 0x9e, 0x5b, 0x01, 0x1e, 0xdb, 0x87, 0x78, 0xcc, 0x45, 0xa9, 0x9b, 0x6d, 0x09, 0x36, - 0x05, 0xd4, 0xf8, 0x16, 0x96, 0x98, 0xb2, 0x43, 0xdf, 0x1e, 0xe2, 0x47, 0x7c, 0x09, 0x99, 0x69, - 0xf0, 0x41, 0x3d, 0x4c, 0x9f, 0x91, 0xe0, 0x09, 0x97, 0xac, 0x6e, 0x36, 0x19, 0xac, 0x2f, 0x40, - 0xe8, 0x02, 0xd4, 0x85, 0x5c, 0xae, 0xc3, 0xc5, 0xaa, 0x9b, 0x7c, 0xc6, 0xfb, 0xae, 0x13, 0x77, - 0xb9, 0xfe, 0x50, 0x4a, 0xb5, 0x20, 0x66, 0x3f, 0x34, 0x0c, 0x80, 0x3d, 0x8f, 0x7e, 0xf8, 0x93, - 0x6f, 0xec, 0x71, 0x84, 0xd1, 0x0a, 0xcc, 0x3d, 0x65, 0x1f, 0x9c, 0x7f, 0xcd, 0x14, 0x0d, 0xe3, - 0x2f, 0x6b, 0x70, 0xf1, 0x01, 0x13, 0x70, 0x60, 0x7b, 0xce, 0x21, 0x79, 0x3e, 0xc0, 0xc3, 0x28, - 0x70, 0xe9, 0xc9, 0x36, 0xf1, 0x28, 0x7e, 0x4e, 0xd1, 0x2e, 0x2c, 0x7b, 0x4a, 0x5e, 0x4b, 0x99, - 0x00, 0xe3, 0xd0, 0xdc, 0xec, 0xc6, 0x7a, 0xcd, 0xcc, 0xc8, 0xec, 0x78, 0x69, 0x40, 0x88, 0xbe, - 0x48, 0xd6, 0x47, 0x31, 0xa9, 0x72, 0x26, 0xab, 0x31, 0x93, 0xc1, 0x2e, 0x97, 0x43, 0xb2, 0x50, - 0xeb, 0xa6, 0x18, 0xbc, 0x0f, 0x6c, 0xaf, 0x58, 0x76, 0x68, 0x45, 0x21, 0x0e, 0xf8, 0x4c, 0x9b, - 0x9b, 0xe7, 0x62, 0xe2, 0x64, 0x9e, 0x66, 0x23, 0x88, 0xbc, 0xad, 0xf0, 0x20, 0xc4, 0x01, 0xdf, - 0x51, 0x52, 0x43, 0x56, 0x40, 0x08, 0x3d, 0x0a, 0x95, 0x56, 0x14, 0xd8, 0xe4, 0x50, 0xf4, 0x2e, - 0x9c, 0x0b, 0x23, 0xdf, 0x1f, 0xe3, 0x09, 0xf6, 0xa8, 0x3d, 0xb6, 0x46, 0x01, 0x89, 0xfc, 0xb0, - 0x3b, 0xb7, 0x51, 0xbb, 0x56, 0x33, 0x91, 0xde, 0xf5, 0x15, 0xef, 0x41, 0xeb, 0x00, 0x7e, 0xe0, - 0x3e, 0x75, 0xc7, 0x78, 0x84, 0x9d, 0xee, 0x3c, 0x67, 0xaa, 0x41, 0xd0, 0x6d, 0x58, 0x09, 0xf1, - 0x70, 0x48, 0x26, 0xbe, 0xe5, 0x07, 0xe4, 0xc8, 0x1d, 0x63, 0x61, 0x53, 0x0b, 0xdc, 0xa6, 0x90, - 0xec, 0xdb, 0x17, 0x5d, 0xcc, 0xba, 0x8c, 0xef, 0xaa, 0x70, 0x9e, 0x2f, 0xc0, 0x3e, 0x71, 0xa4, - 0x2e, 0xe4, 0x8e, 0xbd, 0x02, 0xad, 0x21, 0x17, 0xc8, 0xf2, 0xed, 0x00, 0x7b, 0x54, 0x9a, 0xee, - 0xa2, 0x00, 0xee, 0x73, 0x18, 0x7a, 0x04, 0x9d, 0x50, 0xaa, 0xce, 0x1a, 0x0a, 0xdd, 0xc9, 0x15, - 0x7e, 0x2b, 0x5e, 0xa4, 0x29, 0x7a, 0x36, 0x97, 0xc2, 0x9c, 0xe2, 0x17, 0xc2, 0x93, 0x70, 0x48, - 0xc7, 0x62, 0xc7, 0x37, 0x37, 0x7f, 0x94, 0xe6, 0x93, 0x15, 0xf3, 0xd6, 0x40, 0x60, 0xef, 0x7a, - 0x34, 0x38, 0x31, 0x15, 0x6d, 0xef, 0x0e, 0x2c, 0xea, 0x1d, 0xa8, 0x03, 0xb5, 0x27, 0xf8, 0x44, - 0x4e, 0x81, 0x7d, 0x26, 0x76, 0x29, 0xf6, 0x9b, 0x68, 0xdc, 0xa9, 0xfe, 0x51, 0xc5, 0x08, 0x00, - 0x25, 0xa3, 0x3c, 0xc4, 0xd4, 0x76, 0x6c, 0x6a, 0x23, 0x04, 0xb3, 0xdc, 0x83, 0x0a, 0x16, 0xfc, - 0x9b, 0x71, 0x8d, 0xe4, 0xd6, 0x68, 0x98, 0xec, 0x13, 0x5d, 0x82, 0x46, 0x6c, 0x84, 0xd2, 0x8d, - 0x26, 0x00, 0xe6, 0xce, 0x6c, 0x4a, 0xf1, 0xc4, 0xa7, 0xdc, 0x20, 0x5a, 0xa6, 0x6a, 0x1a, 0xff, - 0x3c, 0x0b, 0x9d, 0x9c, 0x06, 0x3e, 0x82, 0xfa, 0x44, 0x0e, 0x2f, 0x6d, 0xff, 0x62, 0xe2, 0xd3, - 0x72, 0x12, 0x9a, 0x31, 0x32, 0x73, 0x19, 0x6c, 0x33, 0x6a, 0x1e, 0x3f, 0x6e, 0x33, 0xb5, 0x8e, - 0xc9, 0xc8, 0x72, 0xdc, 0x00, 0x0f, 0x29, 0x09, 0x4e, 0xa4, 0x94, 0x8b, 0x63, 0x32, 0xda, 0x51, - 0x30, 0xf4, 0x1e, 0x80, 0xe3, 0x85, 0x4c, 0xa3, 0x47, 0xee, 0x88, 0xcb, 0xda, 0xdc, 0x44, 0xf1, - 0xd8, 0xb1, 0x57, 0x37, 0x1b, 0x8e, 0x17, 0x4a, 0x61, 0x3f, 0x86, 0x16, 0xf3, 0x92, 0xd6, 0x44, - 0x38, 0x64, 0x61, 0xc5, 0xcd, 0xcd, 0x15, 0x4d, 0xe2, 0xd8, 0x5b, 0x9b, 0x8b, 0x7e, 0xd2, 0x08, - 0xd1, 0x67, 0x30, 0xcf, 0xbd, 0x54, 0xd8, 0x9d, 0xe7, 0x34, 0x57, 0x0b, 0x66, 0x29, 0xb5, 0xfd, - 0x80, 0xe3, 0x09, 0x65, 0x4b, 0x22, 0xf4, 0x00, 0x9a, 0xb6, 0xe7, 0x11, 0x6a, 0x8b, 0x0d, 0xbe, - 0xc0, 0x79, 0xdc, 0x28, 0xe7, 0xb1, 0x95, 0x20, 0x0b, 0x46, 0x3a, 0x39, 0xfa, 0x09, 0xcc, 0x71, - 0x0f, 0xd0, 0xad, 0xf3, 0x59, 0xaf, 0x4f, 0x37, 0x3f, 0x53, 0x20, 0xf7, 0x3e, 0x86, 0xa6, 0x26, - 0xda, 0x59, 0xcc, 0xad, 0xf7, 0x39, 0x74, 0xb2, 0x12, 0x9d, 0xc9, 0x5c, 0xf7, 0x60, 0xc5, 0x8c, - 0xbc, 0x44, 0x30, 0x15, 0x42, 0xbc, 0x07, 0xf3, 0x52, 0x7f, 0xc2, 0x76, 0x2e, 0x94, 0xae, 0x88, - 0x29, 0x11, 0x8d, 0xcf, 0xe0, 0x7c, 0x86, 0x95, 0x0c, 0x30, 0xde, 0x82, 0xb6, 0x4f, 0x1c, 0x2b, - 0x14, 0x60, 0xcb, 0x75, 0x94, 0x33, 0xf0, 0x63, 0xdc, 0x3d, 0x87, 0x91, 0x0f, 0x28, 0xf1, 0xf3, - 0xa2, 0x9c, 0x8e, 0xbc, 0x0b, 0xab, 0x59, 0x72, 0x31, 0xbc, 0xf1, 0x05, 0xac, 0x99, 0x78, 0x42, - 0x9e, 0xe2, 0x57, 0x65, 0xdd, 0x83, 0x6e, 0x9e, 0x41, 0xc2, 0x3c, 0x81, 0x0e, 0xa8, 0x4d, 0xa3, - 0xf0, 0x6c, 0xcc, 0xaf, 0xeb, 0x0c, 0xe4, 0xd1, 0x29, 0xf8, 0xa0, 0x36, 0x54, 0x5d, 0x5f, 0x12, - 0x55, 0x5d, 0xdf, 0xf8, 0x02, 0x1a, 0xf1, 0xa1, 0x85, 0x36, 0x93, 0xe0, 0xa6, 0xfa, 0x92, 0x93, - 0x2d, 0x0e, 0x7b, 0xee, 0xe7, 0xbc, 0xb5, 0x1c, 0x69, 0x13, 0x20, 0xf6, 0x33, 0xea, 0xa4, 0x44, - 0x79, 0x7e, 0xa6, 0x86, 0x65, 0xfc, 0x5d, 0xca, 0xe9, 0x68, 0x22, 0x3b, 0xb1, 0xc8, 0x4e, 0xca, - 0x09, 0x55, 0xcf, 0xe2, 0x84, 0x6e, 0xc1, 0x5c, 0x48, 0x6d, 0x2a, 0xdc, 0x60, 0x5b, 0x9b, 0x5c, - 0x7a, 0x48, 0x6c, 0x0a, 0x34, 0x74, 0x19, 0x60, 0x18, 0x60, 0x9b, 0x62, 0xc7, 0xb2, 0x85, 0x7f, - 0xac, 0x99, 0x0d, 0x09, 0xd9, 0xa2, 0xe8, 0x0e, 0x2c, 0xa8, 0x48, 0x65, 0x8e, 0x8b, 0xb1, 0x51, - 0xc0, 0x30, 0xb5, 0xfa, 0xa6, 0x22, 0x48, 0xf6, 0xf4, 0xfc, 0xf4, 0x3d, 0x2d, 0xe9, 0x04, 0xb2, - 0xe6, 0x96, 0x16, 0x4a, 0xdd, 0x92, 0xa0, 0x38, 0x8d, 0x5b, 0xaa, 0x97, 0xba, 0x25, 0xc9, 0x63, - 0xaa, 0x5b, 0xfa, 0x43, 0x3a, 0x98, 0x87, 0xd0, 0xcd, 0x6f, 0x10, 0xe9, 0x18, 0xde, 0x83, 0xf9, - 0x90, 0x43, 0xa6, 0x38, 0x19, 0x49, 0x22, 0x11, 0x8d, 0x7b, 0xb0, 0x92, 0xb1, 0x00, 0x11, 0x28, - 0xc6, 0xf6, 0x52, 0x39, 0x95, 0xbd, 0x18, 0xff, 0x57, 0xd1, 0xad, 0xf7, 0x9e, 0x3b, 0xa6, 0x38, - 0xc8, 0x59, 0xef, 0xfb, 0x8a, 0xa9, 0x30, 0xdd, 0xcb, 0x65, 0x4c, 0x45, 0x0c, 0x27, 0x2d, 0x71, - 0x00, 0x6d, 0xae, 0x43, 0x2b, 0xc4, 0x63, 0x7e, 0x20, 0xca, 0x50, 0xe4, 0xc7, 0x05, 0xd4, 0x62, - 0x5c, 0x61, 0x00, 0x03, 0x89, 0x2e, 0xd4, 0xd7, 0x1a, 0xeb, 0xb0, 0xde, 0x5d, 0x40, 0x79, 0xa4, - 0x33, 0xe9, 0xe1, 0x6b, 0xb6, 0xf7, 0x59, 0xee, 0x51, 0xe0, 0xe9, 0x8f, 0xb8, 0x18, 0x53, 0x94, - 0x20, 0xe4, 0x34, 0x25, 0xa2, 0xf1, 0xb7, 0x35, 0x80, 0xa4, 0xf3, 0xb5, 0xdd, 0xf4, 0x1f, 0xc5, - 0x5b, 0x50, 0x44, 0x13, 0x6f, 0x14, 0xf0, 0x2b, 0xdc, 0x7c, 0xf7, 0xd2, 0x9b, 0x4f, 0xc4, 0x15, - 0x6f, 0x15, 0x51, 0xbf, 0xb6, 0xdb, 0x6e, 0x1b, 0x56, 0xb3, 0xea, 0x96, 0x9b, 0xee, 0x3a, 0xcc, - 0xb9, 0x14, 0x4f, 0x44, 0x26, 0xad, 0xa7, 0x23, 0x1a, 0xae, 0xc0, 0x30, 0xde, 0x84, 0xc6, 0xde, - 0xc4, 0x1e, 0xe1, 0x81, 0x8f, 0x87, 0x6c, 0x2c, 0x97, 0x35, 0xe4, 0xf8, 0xa2, 0x61, 0x6c, 0x42, - 0xfd, 0x3e, 0x3e, 0x11, 0x7b, 0xf0, 0x94, 0xf2, 0x19, 0xff, 0x5a, 0x81, 0x35, 0xee, 0x3b, 0xb7, - 0x55, 0x1e, 0x6b, 0xe2, 0x90, 0x44, 0xc1, 0x10, 0x87, 0x5c, 0xa5, 0x7e, 0x64, 0xf9, 0x38, 0x70, - 0x89, 0x23, 0xb3, 0xbe, 0xc6, 0xd0, 0x8f, 0xf6, 0x39, 0x80, 0xe5, 0xba, 0xac, 0xfb, 0x57, 0x11, - 0x91, 0xb6, 0x55, 0x33, 0xeb, 0x43, 0x3f, 0xfa, 0x29, 0x6b, 0x2b, 0xda, 0xf0, 0xd8, 0x0e, 0x70, - 0xc8, 0x6d, 0x48, 0xd0, 0x0e, 0x38, 0x00, 0xbd, 0x07, 0xe7, 0x27, 0x78, 0x42, 0x82, 0x13, 0x6b, - 0xec, 0x4e, 0x5c, 0x6a, 0xb9, 0x9e, 0x75, 0x78, 0x42, 0x71, 0x28, 0x0d, 0x07, 0x89, 0xce, 0x07, - 0xac, 0x6f, 0xcf, 0xfb, 0x92, 0xf5, 0x20, 0x03, 0x5a, 0x84, 0x4c, 0xac, 0x70, 0x48, 0x02, 0x6c, - 0xd9, 0xce, 0xb7, 0xfc, 0xf0, 0xa8, 0x99, 0x4d, 0x42, 0x26, 0x03, 0x06, 0xdb, 0x72, 0xbe, 0x35, - 0x6c, 0x68, 0xa5, 0xb2, 0x40, 0x16, 0xeb, 0xf3, 0x74, 0x4f, 0xc6, 0xfa, 0xec, 0x9b, 0xc1, 0x02, - 0x32, 0x56, 0xeb, 0xc0, 0xbf, 0x19, 0x8c, 0x9e, 0xf8, 0x2a, 0xd0, 0xe7, 0xdf, 0x6c, 0xc1, 0xc6, - 0xf8, 0xa9, 0x4c, 0xc4, 0x1b, 0xa6, 0x68, 0x18, 0x0e, 0xc0, 0xb6, 0xed, 0xdb, 0x87, 0xee, 0xd8, - 0xa5, 0x27, 0xe8, 0x3a, 0x74, 0x6c, 0xc7, 0xb1, 0x86, 0x0a, 0xe2, 0x62, 0x55, 0x15, 0x59, 0xb2, - 0x1d, 0x67, 0x5b, 0x03, 0xa3, 0x1f, 0xc1, 0xb2, 0x13, 0x10, 0x3f, 0x8d, 0x2b, 0xca, 0x24, 0x1d, - 0xd6, 0xa1, 0x23, 0x1b, 0xff, 0x34, 0x0b, 0x97, 0xd3, 0x6a, 0xc9, 0xe6, 0xd5, 0x1f, 0xc1, 0x62, - 0x66, 0xd4, 0x74, 0x42, 0x9b, 0x08, 0x69, 0xa6, 0x10, 0x33, 0x99, 0x67, 0x35, 0x97, 0x79, 0x16, - 0x26, 0xec, 0xb5, 0x1f, 0x22, 0x61, 0x9f, 0xfd, 0x3e, 0x09, 0xfb, 0xdc, 0xa9, 0x12, 0xf6, 0xb7, - 0x79, 0x09, 0x4c, 0x11, 0xf1, 0xb4, 0x69, 0x5e, 0xd4, 0x69, 0x62, 0x1c, 0x4f, 0x95, 0xca, 0x32, - 0x89, 0xfd, 0xc2, 0x59, 0x12, 0xfb, 0x7a, 0x69, 0x62, 0xcf, 0x2c, 0xc2, 0xf7, 0xed, 0x60, 0x42, - 0x02, 0x95, 0xb9, 0x77, 0x1b, 0x5c, 0x84, 0x25, 0x05, 0x97, 0x59, 0x7b, 0x69, 0x8e, 0x0f, 0x65, - 0x39, 0x3e, 0xda, 0x80, 0x45, 0x8f, 0x58, 0x1e, 0x7e, 0x66, 0x31, 0x85, 0x85, 0xdd, 0xa6, 0xd0, - 0x9e, 0x47, 0xfa, 0xf8, 0xd9, 0x3e, 0x83, 0x18, 0x7f, 0x5f, 0x81, 0x95, 0xb4, 0xe1, 0xc8, 0xac, - 0xee, 0x73, 0x68, 0x04, 0x6a, 0x67, 0x4b, 0x63, 0xd9, 0x48, 0x47, 0x4f, 0x79, 0x0f, 0x60, 0x26, - 0x24, 0xe8, 0xa7, 0xa5, 0xf5, 0x81, 0xb7, 0x4b, 0xd8, 0xbc, 0xac, 0x42, 0x60, 0x6c, 0xc1, 0x72, - 0x8c, 0x3c, 0x35, 0x3b, 0xd7, 0xb2, 0xed, 0x6a, 0x3a, 0xdb, 0xf6, 0x60, 0x7e, 0x07, 0x3f, 0x75, - 0x87, 0xf8, 0x07, 0x29, 0xd0, 0x6d, 0x40, 0xd3, 0xc7, 0xc1, 0xc4, 0x0d, 0xc3, 0xd8, 0xe8, 0x1b, - 0xa6, 0x0e, 0x32, 0xfe, 0x6b, 0x0e, 0x96, 0xb2, 0x2b, 0xfb, 0x61, 0x2e, 0xb9, 0xef, 0x25, 0xbb, - 0x30, 0x3b, 0x3f, 0xed, 0x84, 0xbd, 0xa6, 0x9c, 0x78, 0x35, 0x13, 0xe3, 0xc7, 0x7e, 0x5e, 0x3a, - 0x76, 0x36, 0xff, 0x21, 0x99, 0x4c, 0x6c, 0xcf, 0x51, 0xc5, 0x53, 0xd9, 0x64, 0xab, 0x65, 0x07, - 0x23, 0xb6, 0xb5, 0x18, 0x98, 0x7f, 0xa3, 0x37, 0xa0, 0xc9, 0x62, 0x65, 0xd7, 0xe3, 0xb5, 0x01, - 0xbe, 0x71, 0x1a, 0x26, 0x48, 0xd0, 0x8e, 0x1b, 0xa0, 0xab, 0x30, 0x8b, 0xbd, 0xa7, 0xea, 0x2c, - 0x4d, 0xaa, 0xab, 0xea, 0xf0, 0x30, 0x79, 0x37, 0x7a, 0x1b, 0xe6, 0x27, 0x24, 0xf2, 0xa8, 0x8a, - 0x9a, 0xdb, 0x31, 0x22, 0x2f, 0x89, 0x9a, 0xb2, 0x17, 0x5d, 0x87, 0x05, 0x87, 0xeb, 0x40, 0x85, - 0xc6, 0x4b, 0x49, 0x7d, 0x81, 0xc3, 0x4d, 0xd5, 0x8f, 0x3e, 0x8d, 0xa3, 0x80, 0x46, 0xe6, 0x1c, - 0xcf, 0x2c, 0x6a, 0x61, 0x28, 0x70, 0x3f, 0x1d, 0x0a, 0x00, 0x67, 0x71, 0xbd, 0x94, 0xc5, 0xf4, - 0xea, 0xc0, 0x05, 0xa8, 0x8f, 0xc9, 0x48, 0xd8, 0x41, 0x53, 0x94, 0xda, 0xc7, 0x64, 0xc4, 0xcd, - 0x60, 0x85, 0x85, 0x3e, 0x8e, 0xeb, 0x75, 0x17, 0xf9, 0xf6, 0x12, 0x0d, 0x76, 0xa2, 0xf1, 0x0f, - 0x8b, 0x78, 0x43, 0xdc, 0x6d, 0xf1, 0xae, 0x06, 0x87, 0x3c, 0xf2, 0x86, 0xfc, 0xc0, 0xa5, 0xf4, - 0xa4, 0xdb, 0xe6, 0x70, 0xf6, 0xc9, 0x22, 0x56, 0x91, 0xab, 0x2c, 0x65, 0x22, 0xd6, 0xa2, 0xfd, - 0xf9, 0x1a, 0x94, 0x1f, 0xfe, 0xb1, 0x02, 0xab, 0xdb, 0x3c, 0x60, 0xd3, 0x3c, 0xc1, 0x19, 0xd2, - 0x67, 0x74, 0x3b, 0xae, 0x53, 0x64, 0xb3, 0xe0, 0xec, 0x64, 0x25, 0x1e, 0xba, 0x0b, 0x6d, 0xc5, - 0x53, 0x52, 0xd6, 0x5e, 0x56, 0xe1, 0x68, 0x85, 0x7a, 0xd3, 0xf8, 0x14, 0xd6, 0x72, 0x32, 0xcb, - 0xe0, 0xea, 0x4d, 0x58, 0x4c, 0x3c, 0x42, 0x2c, 0x72, 0x33, 0x86, 0xed, 0x39, 0xc6, 0x1d, 0x38, - 0x3f, 0xa0, 0x76, 0x40, 0x73, 0x13, 0x3e, 0x05, 0x2d, 0x2f, 0x72, 0xa4, 0x69, 0x65, 0x1d, 0x62, - 0x00, 0x2b, 0x03, 0x4a, 0xfc, 0x57, 0x60, 0xca, 0x76, 0x3a, 0x9b, 0x36, 0x89, 0xa8, 0x8c, 0xa8, - 0x54, 0xd3, 0x58, 0x13, 0x25, 0x99, 0xfc, 0x68, 0x9f, 0xc0, 0xaa, 0xa8, 0x88, 0xbc, 0xca, 0x24, - 0x2e, 0xa8, 0x7a, 0x4c, 0x9e, 0xef, 0x0e, 0x9c, 0x4b, 0x5c, 0x79, 0x92, 0xdc, 0xdd, 0x4c, 0x27, - 0x77, 0x6b, 0x79, 0x1d, 0xa7, 0x72, 0xbb, 0xbf, 0xae, 0x6a, 0x0e, 0xb3, 0x24, 0xb5, 0xdb, 0x4c, - 0xa7, 0x76, 0x97, 0x4a, 0x58, 0xa6, 0x32, 0xbb, 0xbc, 0x45, 0xd6, 0x0a, 0x2c, 0xd2, 0xcc, 0xe5, - 0x7f, 0xb3, 0x99, 0x52, 0x74, 0x46, 0xb6, 0xdf, 0x4b, 0xfa, 0xb7, 0x27, 0xd2, 0xbf, 0x78, 0xe8, - 0xb8, 0x4a, 0x75, 0x3b, 0x93, 0xfe, 0x75, 0xcb, 0xc4, 0x8c, 0xb3, 0xbf, 0xbf, 0x9a, 0x85, 0x46, - 0xdc, 0x97, 0x5b, 0xd8, 0xfc, 0x22, 0x55, 0x0b, 0x16, 0x49, 0x3f, 0xbf, 0x6a, 0xaf, 0x72, 0x7e, - 0xcd, 0xbe, 0xec, 0xfc, 0xba, 0x08, 0x0d, 0xfe, 0x61, 0x05, 0xf8, 0x48, 0x9e, 0x47, 0x75, 0x0e, - 0x30, 0xf1, 0x51, 0x62, 0x50, 0xf3, 0xa7, 0x31, 0xa8, 0x4c, 0x9e, 0xb9, 0x90, 0xcd, 0x33, 0x3f, - 0x8c, 0x4f, 0x18, 0x71, 0x16, 0xad, 0xe7, 0xd9, 0x15, 0x9e, 0x2d, 0xbb, 0xe9, 0xb3, 0x45, 0x1c, - 0x4f, 0x57, 0x0a, 0x88, 0x5f, 0xdb, 0x2c, 0xf3, 0x81, 0xc8, 0x32, 0x75, 0xab, 0x92, 0x8e, 0x70, - 0x13, 0x20, 0xde, 0xf3, 0x2a, 0xd5, 0x44, 0xf9, 0xa9, 0x99, 0x1a, 0x16, 0xf3, 0x2a, 0xa9, 0xf5, - 0x4f, 0x4a, 0xa9, 0xa7, 0xf0, 0x2a, 0xff, 0xa2, 0x47, 0x49, 0x25, 0xd5, 0xc8, 0x0f, 0x73, 0x85, - 0x89, 0xd3, 0x59, 0xdd, 0xcd, 0x74, 0x5d, 0xe2, 0x6c, 0xe6, 0x92, 0x2b, 0x4b, 0xf0, 0x43, 0xdd, - 0x0e, 0x64, 0xb7, 0xc8, 0x28, 0x1b, 0x12, 0xb2, 0x45, 0x59, 0x28, 0x75, 0xe4, 0x7a, 0x6e, 0x78, - 0x2c, 0xfa, 0xe7, 0x79, 0x3f, 0x28, 0xd0, 0x16, 0xbf, 0x56, 0xc6, 0xcf, 0x5d, 0x6a, 0x0d, 0x89, - 0x83, 0xb9, 0x31, 0xce, 0x99, 0x75, 0x06, 0xd8, 0x26, 0x0e, 0x4e, 0x36, 0x48, 0xfd, 0x4c, 0x1b, - 0xa4, 0x91, 0xd9, 0x20, 0xab, 0x30, 0x1f, 0x60, 0x3b, 0x24, 0x9e, 0x4c, 0x0c, 0x64, 0x8b, 0x9d, - 0x15, 0x13, 0x1c, 0x86, 0x6c, 0x00, 0x19, 0xc0, 0xc8, 0xa6, 0x16, 0x66, 0x2d, 0x96, 0x85, 0x59, - 0x53, 0xca, 0x9d, 0x99, 0x30, 0xab, 0x55, 0x16, 0x66, 0x9d, 0xa6, 0xda, 0xa9, 0x05, 0x91, 0xed, - 0xa9, 0x41, 0xa4, 0x1e, 0x8e, 0x2d, 0xa5, 0xc2, 0xb1, 0x3f, 0xe4, 0x9e, 0xba, 0x0f, 0x6b, 0xb9, - 0x5d, 0x20, 0x37, 0xd5, 0xed, 0x4c, 0xbd, 0xb4, 0x5b, 0xb6, 0x40, 0x71, 0xb9, 0xf4, 0x4f, 0x61, - 0x69, 0xf7, 0x39, 0x1e, 0x0e, 0x4e, 0xbc, 0xe1, 0x19, 0x22, 0x82, 0x0e, 0xd4, 0x86, 0x13, 0x47, - 0x16, 0x0a, 0xd8, 0xa7, 0x1e, 0x23, 0xd4, 0xd2, 0x31, 0x82, 0x05, 0x9d, 0x64, 0x04, 0x29, 0xe7, - 0x2a, 0x93, 0xd3, 0x61, 0xc8, 0x8c, 0xf9, 0xa2, 0x29, 0x5b, 0x12, 0x8e, 0x83, 0x80, 0xcf, 0x5a, - 0xc0, 0x71, 0x10, 0xa4, 0x2d, 0xba, 0x96, 0xb6, 0x68, 0xe3, 0x5b, 0x68, 0xb2, 0x01, 0xbe, 0x97, - 0xf8, 0x32, 0x50, 0xae, 0x25, 0x81, 0x72, 0x1c, 0x6f, 0xcf, 0x6a, 0xf1, 0xb6, 0xb1, 0x01, 0x8b, - 0x62, 0x2c, 0x39, 0x91, 0x0e, 0xd4, 0xa2, 0x60, 0xac, 0xf4, 0x16, 0x05, 0x63, 0xe3, 0x8f, 0xa1, - 0xb5, 0x45, 0xa9, 0x3d, 0x3c, 0x3e, 0x83, 0x3c, 0xf1, 0x58, 0x55, 0x3d, 0xb6, 0xcf, 0xc9, 0x64, - 0x18, 0xd0, 0x56, 0xbc, 0x4b, 0xc7, 0xef, 0x03, 0xda, 0x27, 0x01, 0xbd, 0x47, 0x82, 0x67, 0x76, - 0xe0, 0x9c, 0x2d, 0x56, 0x46, 0x30, 0x2b, 0x1f, 0xab, 0xd4, 0xae, 0xcd, 0x99, 0xfc, 0xdb, 0x78, - 0x07, 0xce, 0xa5, 0xf8, 0x95, 0x0e, 0xfc, 0x11, 0x34, 0xb9, 0x0b, 0x91, 0xf1, 0xd4, 0x35, 0xbd, - 0x1a, 0x38, 0xcd, 0xcf, 0xb0, 0x8c, 0x9b, 0x9d, 0x11, 0x1c, 0x1e, 0x3b, 0xf4, 0x1f, 0x67, 0xa2, - 0x8e, 0x95, 0x34, 0x7d, 0x26, 0xe2, 0xf8, 0x87, 0x0a, 0xcc, 0x71, 0x78, 0xce, 0xa3, 0x5f, 0x84, - 0x46, 0x80, 0x7d, 0x62, 0x51, 0x7b, 0x14, 0xbf, 0xff, 0x61, 0x80, 0xc7, 0xf6, 0x28, 0xe4, 0xcf, - 0x97, 0x58, 0xa7, 0xe3, 0x8e, 0x70, 0x48, 0xd5, 0x23, 0xa0, 0x26, 0x83, 0xed, 0x08, 0x10, 0x5b, - 0x92, 0xd0, 0xfd, 0x33, 0x11, 0x4e, 0xcc, 0x9a, 0xfc, 0x1b, 0x5d, 0x15, 0xf7, 0xf2, 0x53, 0x8a, - 0x3f, 0xfc, 0xb2, 0xbe, 0x07, 0xf5, 0x4c, 0xbd, 0x27, 0x6e, 0x1b, 0x9f, 0x02, 0xd2, 0xe7, 0x2c, - 0x17, 0xf5, 0x6d, 0x98, 0xe7, 0x4b, 0xa2, 0xce, 0xc3, 0x76, 0x7a, 0xd2, 0xa6, 0xec, 0x35, 0x3e, - 0x07, 0x24, 0x56, 0x31, 0x75, 0x06, 0x9e, 0x7e, 0xc5, 0x3f, 0x81, 0x73, 0x29, 0xfa, 0xf8, 0x1a, - 0x36, 0xc5, 0x20, 0x3b, 0xba, 0x24, 0xfe, 0xb7, 0x0a, 0xc0, 0x56, 0x44, 0x8f, 0x65, 0xa1, 0x41, - 0x9f, 0x65, 0x25, 0x3d, 0x4b, 0xd6, 0xe7, 0xdb, 0x61, 0xf8, 0x8c, 0x04, 0x2a, 0xc8, 0x8b, 0xdb, - 0xbc, 0x48, 0x10, 0xd1, 0x63, 0x55, 0xdc, 0x64, 0xdf, 0xe8, 0x2a, 0xb4, 0xc5, 0xb3, 0x2d, 0xcb, - 0x76, 0x9c, 0x00, 0x87, 0xa1, 0xac, 0x72, 0xb6, 0x04, 0x74, 0x4b, 0x00, 0x19, 0x9a, 0xeb, 0x60, - 0x8f, 0xba, 0xf4, 0xc4, 0xa2, 0xe4, 0x09, 0xf6, 0x64, 0xf8, 0xd6, 0x52, 0xd0, 0xc7, 0x0c, 0xc8, - 0xd0, 0x02, 0x3c, 0x72, 0x43, 0x1a, 0x28, 0x34, 0x55, 0x75, 0x93, 0x50, 0x8e, 0x66, 0xfc, 0xba, - 0x02, 0x9d, 0xfd, 0x68, 0x3c, 0x16, 0x93, 0x3c, 0xeb, 0x5a, 0xa2, 0x77, 0xe4, 0x3c, 0xaa, 0x19, - 0x6b, 0x48, 0x96, 0x48, 0x4e, 0xee, 0xfb, 0xa7, 0x95, 0xb7, 0x61, 0x59, 0x13, 0x54, 0x2a, 0x2d, - 0x75, 0x4a, 0x57, 0xd2, 0xa7, 0x34, 0x33, 0x14, 0x91, 0x49, 0xbd, 0xda, 0xe4, 0x8c, 0xf3, 0x70, - 0x2e, 0x45, 0x2f, 0xb3, 0xb0, 0x1b, 0xd0, 0x92, 0x57, 0xa1, 0xd2, 0x08, 0x2e, 0x40, 0x9d, 0xb9, - 0x97, 0xa1, 0xeb, 0xa8, 0xaa, 0xf6, 0x82, 0x4f, 0x9c, 0x6d, 0xd7, 0x09, 0x8c, 0x3e, 0xb4, 0x4c, - 0xc1, 0x5e, 0xe2, 0x7e, 0x06, 0x6d, 0x79, 0x71, 0x6a, 0xa5, 0x1e, 0x10, 0x24, 0x25, 0xd8, 0x14, - 0x6f, 0xb3, 0xe5, 0xe9, 0x4d, 0xe3, 0x97, 0xd0, 0x3b, 0xf0, 0x1d, 0x16, 0x4c, 0xe9, 0x5c, 0xd5, - 0xd4, 0x3e, 0x03, 0xf5, 0xac, 0xb0, 0x8c, 0x79, 0x9a, 0xac, 0x15, 0xe8, 0x4d, 0xe3, 0x32, 0x5c, - 0x2c, 0x64, 0x2e, 0xe7, 0xed, 0x43, 0x27, 0xe9, 0x70, 0x5c, 0x55, 0xcc, 0xe7, 0x45, 0xfa, 0x8a, - 0x56, 0xa4, 0x5f, 0x8d, 0x8f, 0x61, 0xe1, 0xd0, 0x65, 0x4b, 0x0b, 0x9a, 0x6a, 0x65, 0x41, 0xd3, - 0x6c, 0x2a, 0x68, 0x32, 0xbe, 0x8e, 0x57, 0x4f, 0x46, 0xac, 0x1f, 0xf3, 0xb0, 0x59, 0x8c, 0xad, - 0xdc, 0xc4, 0x85, 0x82, 0xc9, 0x09, 0x0c, 0x53, 0x43, 0x36, 0x96, 0xa0, 0x95, 0x72, 0x18, 0xc6, - 0x5d, 0x68, 0x67, 0x3c, 0xc0, 0xad, 0x4c, 0xfc, 0x90, 0x5b, 0xb6, 0x4c, 0xf4, 0xb0, 0x22, 0x1d, - 0xd1, 0xbd, 0x70, 0xcf, 0x3b, 0x22, 0x8a, 0xef, 0x15, 0x68, 0x1e, 0x94, 0x3d, 0xd1, 0x9b, 0x55, - 0x77, 0x3c, 0xef, 0xc0, 0xf2, 0x80, 0x92, 0xc0, 0x1e, 0xe1, 0x3d, 0xbe, 0x6b, 0x8f, 0x5c, 0x71, - 0x0b, 0x12, 0x45, 0xb1, 0xff, 0xe6, 0xdf, 0xc6, 0x7f, 0x54, 0x60, 0xe9, 0x9e, 0x3b, 0xc6, 0xe1, - 0x49, 0x48, 0xf1, 0xe4, 0x80, 0xc7, 0x92, 0x97, 0xa0, 0xc1, 0xa4, 0x09, 0xa9, 0x3d, 0xf1, 0xd5, - 0x1d, 0x50, 0x0c, 0x60, 0x6b, 0x14, 0x0a, 0xd6, 0x2a, 0xbb, 0xd4, 0xe3, 0xf8, 0xdc, 0xa8, 0x2c, - 0xb6, 0x96, 0x20, 0xf4, 0x3e, 0x40, 0x14, 0x62, 0x47, 0xde, 0xfb, 0xd4, 0x32, 0x47, 0xcf, 0x81, - 0x5e, 0xdf, 0x67, 0x78, 0xe2, 0x12, 0xe8, 0x03, 0x68, 0xba, 0x1e, 0x71, 0x30, 0xaf, 0xef, 0x3b, - 0x32, 0xf3, 0x2c, 0xa6, 0x02, 0x81, 0x78, 0x10, 0x62, 0xc7, 0xf8, 0x13, 0xe9, 0x85, 0xd5, 0xe2, - 0x49, 0x1d, 0xec, 0xc2, 0xb2, 0xd8, 0xd0, 0x47, 0xf1, 0xa4, 0x95, 0xa2, 0x93, 0x70, 0x2e, 0xb3, - 0x20, 0x66, 0xc7, 0x95, 0xa7, 0xa2, 0xa2, 0x30, 0xee, 0xc0, 0xf9, 0x54, 0xcc, 0x77, 0x96, 0x54, - 0xe9, 0xab, 0x4c, 0x9e, 0x95, 0x18, 0x88, 0x4c, 0x74, 0x94, 0x7d, 0x94, 0x24, 0x3a, 0xa1, 0x48, - 0x74, 0x42, 0xc3, 0x84, 0x0b, 0xa9, 0xf4, 0x2f, 0x25, 0xc8, 0x07, 0x99, 0x23, 0xfe, 0x72, 0x09, - 0xb3, 0xcc, 0x59, 0xff, 0x3f, 0x15, 0x58, 0x29, 0x42, 0x78, 0xc5, 0x42, 0xc3, 0xcf, 0x4a, 0x6e, - 0xe3, 0x6f, 0x4f, 0x95, 0xe6, 0xf7, 0x52, 0x92, 0xb9, 0x0f, 0xbd, 0xa2, 0xd5, 0xcb, 0xab, 0xa2, - 0x76, 0x0a, 0x55, 0xfc, 0x6f, 0x55, 0x2b, 0x9d, 0x6d, 0x51, 0x1a, 0xb8, 0x87, 0x11, 0x33, 0xde, - 0x1f, 0x2a, 0x05, 0xbe, 0x1b, 0xa7, 0x77, 0x62, 0xfd, 0xae, 0xe5, 0xa9, 0x92, 0x51, 0x0b, 0x53, - 0xbc, 0x47, 0xe9, 0x14, 0x4f, 0x14, 0xc5, 0x6e, 0x4e, 0x65, 0xf3, 0xda, 0xd6, 0x3d, 0x5e, 0x54, - 0xa0, 0x9d, 0xd6, 0x03, 0xfa, 0x14, 0xc0, 0x8e, 0x25, 0x97, 0x26, 0x7f, 0x69, 0xda, 0xec, 0x4c, - 0x0d, 0x1f, 0x5d, 0x81, 0xda, 0xd0, 0x8f, 0xa4, 0x46, 0x92, 0xdb, 0x91, 0x6d, 0x3f, 0x12, 0x0e, - 0x80, 0xf5, 0xb2, 0xa0, 0x59, 0xdc, 0x51, 0xe7, 0x3c, 0xd7, 0x43, 0x0e, 0x16, 0xa8, 0x12, 0x07, - 0x7d, 0x01, 0xed, 0x67, 0x81, 0x4b, 0xed, 0xc3, 0x31, 0xb6, 0xc6, 0xf6, 0x09, 0x0e, 0xa4, 0xe7, - 0x2a, 0xf7, 0x32, 0x2d, 0x85, 0xff, 0x80, 0xa1, 0x1b, 0x11, 0xd4, 0xd5, 0xf8, 0x2f, 0xf1, 0xc8, - 0xf7, 0x61, 0x2d, 0x62, 0x68, 0x16, 0xbf, 0x27, 0xf7, 0x6c, 0x8f, 0x58, 0x21, 0x66, 0x47, 0x93, - 0x7a, 0x9b, 0x56, 0xec, 0x2d, 0x57, 0x38, 0xd1, 0x36, 0x09, 0x70, 0xdf, 0xf6, 0xc8, 0x40, 0x50, - 0x18, 0x13, 0x68, 0x6a, 0xd3, 0x79, 0xc9, 0xc8, 0x77, 0x61, 0x59, 0xdd, 0x3b, 0x85, 0x98, 0x4a, - 0xbf, 0x3e, 0x6d, 0xcc, 0x25, 0x89, 0x3e, 0xc0, 0x94, 0x7b, 0xf7, 0x1b, 0x97, 0xa0, 0xae, 0x5e, - 0xf8, 0xa3, 0x05, 0xa8, 0x3d, 0xde, 0xde, 0xef, 0xcc, 0xb0, 0x8f, 0x83, 0x9d, 0xfd, 0x4e, 0xe5, - 0xc6, 0x1d, 0x58, 0xca, 0xbc, 0x3d, 0x41, 0xcb, 0xd0, 0x1a, 0x6c, 0xf5, 0x77, 0xbe, 0x7c, 0xf4, - 0x73, 0xcb, 0xdc, 0xdd, 0xda, 0xf9, 0x45, 0x67, 0x06, 0xad, 0x40, 0x47, 0x81, 0xfa, 0x8f, 0x1e, - 0x0b, 0x68, 0xe5, 0xc6, 0x93, 0x8c, 0x8d, 0x60, 0x74, 0x1e, 0x96, 0xb7, 0x1f, 0xf5, 0x1f, 0x6f, - 0xed, 0xf5, 0x77, 0x4d, 0x6b, 0xdb, 0xdc, 0xdd, 0x7a, 0xbc, 0xbb, 0xd3, 0x99, 0x49, 0x83, 0xcd, - 0x83, 0x7e, 0x7f, 0xaf, 0xff, 0x55, 0xa7, 0xc2, 0xb8, 0x26, 0xe0, 0xdd, 0x9f, 0xef, 0x31, 0xe4, - 0x6a, 0x1a, 0xf9, 0xa0, 0x7f, 0xbf, 0xff, 0xe8, 0x67, 0xfd, 0x4e, 0x6d, 0xf3, 0xb7, 0x8b, 0xd0, - 0x56, 0x87, 0x38, 0x0e, 0xf8, 0xed, 0xe4, 0xe7, 0xb0, 0xa0, 0x7e, 0xbe, 0x48, 0xbc, 0x47, 0xfa, - 0x4f, 0x91, 0x5e, 0x37, 0xdf, 0x21, 0x83, 0xa1, 0x19, 0xb4, 0xcf, 0x83, 0x13, 0xed, 0x9d, 0xcf, - 0x65, 0x3d, 0x5c, 0xc8, 0x3d, 0x24, 0xea, 0xad, 0x97, 0x75, 0xc7, 0x1c, 0x07, 0x2c, 0x22, 0xd1, - 0xdf, 0x68, 0xa2, 0x75, 0xfd, 0xdc, 0xce, 0xbf, 0xfd, 0xec, 0xbd, 0x51, 0xda, 0x1f, 0x33, 0xfd, - 0x05, 0x74, 0xb2, 0xaf, 0x33, 0x51, 0x72, 0xcb, 0x5c, 0xf2, 0xf2, 0xb3, 0xf7, 0xe6, 0x14, 0x0c, - 0x9d, 0x75, 0xee, 0x85, 0xe3, 0x46, 0xf9, 0x1b, 0xb5, 0x1c, 0xeb, 0xb2, 0x87, 0x6f, 0x62, 0x29, - 0xd2, 0xef, 0x73, 0x90, 0xfe, 0xae, 0xb0, 0xe0, 0x9d, 0x96, 0xb6, 0x14, 0xc5, 0x0f, 0x7b, 0x8c, - 0x19, 0xf4, 0x0d, 0x2c, 0x65, 0x2e, 0xa6, 0x50, 0x42, 0x55, 0x7c, 0xcd, 0xd6, 0xdb, 0x28, 0x47, - 0x48, 0xeb, 0x4d, 0xbf, 0x76, 0x4a, 0xe9, 0xad, 0xe0, 0x2e, 0x2b, 0xa5, 0xb7, 0xc2, 0xfb, 0x2a, - 0x6e, 0x5e, 0xa9, 0xcb, 0x25, 0xcd, 0xbc, 0x8a, 0x6e, 0xb2, 0x7a, 0xeb, 0x65, 0xdd, 0xfa, 0xf4, - 0x33, 0x17, 0x4b, 0xda, 0xf4, 0x8b, 0xef, 0xab, 0x7a, 0x1b, 0xe5, 0x08, 0x59, 0x5d, 0x25, 0x55, - 0xee, 0x8c, 0xae, 0x72, 0x97, 0x2a, 0x19, 0x5d, 0xe5, 0xcb, 0xe3, 0x52, 0x57, 0x99, 0x72, 0xf5, - 0x1b, 0xa5, 0xe5, 0xbc, 0xbc, 0xae, 0x8a, 0x2b, 0x84, 0xc6, 0x0c, 0xda, 0x82, 0xba, 0xaa, 0xc7, - 0xa1, 0x64, 0x77, 0x67, 0x8a, 0x80, 0xbd, 0x0b, 0x05, 0x3d, 0x31, 0x8b, 0x0f, 0x60, 0x96, 0x41, - 0xd1, 0x4a, 0x0a, 0x49, 0x91, 0x9e, 0xcf, 0x40, 0x63, 0xb2, 0x4f, 0x60, 0x5e, 0x94, 0xaf, 0x50, - 0x92, 0x57, 0xa4, 0x6a, 0x65, 0xbd, 0xb5, 0x1c, 0x3c, 0x26, 0xfe, 0x5a, 0xfc, 0x90, 0x25, 0xeb, - 0x50, 0xe8, 0x62, 0xea, 0xe1, 0x7f, 0xba, 0xda, 0xd5, 0xbb, 0x54, 0xdc, 0xa9, 0xeb, 0x2b, 0x73, - 0x38, 0xaf, 0x97, 0x45, 0x4f, 0x39, 0x7d, 0x15, 0x47, 0x63, 0xc6, 0x0c, 0xb2, 0x44, 0x49, 0x27, - 0xc3, 0xd8, 0x28, 0x56, 0x74, 0x8a, 0xf9, 0x95, 0xa9, 0x38, 0xf1, 0x00, 0x87, 0x70, 0xae, 0x20, - 0x39, 0x45, 0x09, 0x75, 0x79, 0x5e, 0xdc, 0x7b, 0x6b, 0x3a, 0x92, 0xae, 0x22, 0x69, 0x6b, 0xab, - 0xfa, 0x06, 0xd5, 0x4c, 0x6c, 0x2d, 0x07, 0x57, 0xc4, 0x9b, 0x7f, 0x51, 0x83, 0x45, 0x51, 0x42, - 0x90, 0x07, 0xcc, 0x57, 0x00, 0x49, 0x95, 0x0b, 0xf5, 0x52, 0xd3, 0x4c, 0x95, 0xfb, 0x7a, 0x17, - 0x0b, 0xfb, 0x74, 0xe5, 0x6b, 0x05, 0x2b, 0x4d, 0xf9, 0xf9, 0x32, 0x98, 0xa6, 0xfc, 0x82, 0x1a, - 0x97, 0x31, 0x83, 0x76, 0xa0, 0x11, 0x57, 0x51, 0x90, 0x56, 0x7c, 0xc9, 0x94, 0x80, 0x7a, 0xbd, - 0xa2, 0x2e, 0x5d, 0x22, 0xad, 0x32, 0xa2, 0x49, 0x94, 0xaf, 0xb7, 0x68, 0x12, 0x15, 0x15, 0x53, - 0x92, 0xd9, 0x89, 0x44, 0x30, 0x3b, 0xbb, 0x54, 0x6e, 0x9d, 0x9d, 0x5d, 0x3a, 0x77, 0x34, 0x66, - 0xbe, 0xbc, 0xf4, 0x9b, 0xdf, 0xad, 0x57, 0xfe, 0xf3, 0x77, 0xeb, 0x33, 0x7f, 0xfe, 0x62, 0xbd, - 0xf2, 0x9b, 0x17, 0xeb, 0x95, 0x7f, 0x7f, 0xb1, 0x5e, 0xf9, 0xed, 0x8b, 0xf5, 0xca, 0x77, 0xff, - 0xbd, 0x3e, 0x73, 0x38, 0xcf, 0xff, 0x50, 0x7c, 0xff, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0xbd, - 0x17, 0xb2, 0x8b, 0x55, 0x3a, 0x00, 0x00, + 0x76, 0x9c, 0x19, 0x7e, 0xcc, 0xbc, 0xe1, 0x0c, 0x87, 0x25, 0x4a, 0x1c, 0x8d, 0x24, 0x8a, 0x6e, + 0x59, 0xb6, 0xa4, 0x5d, 0xc9, 0x32, 0xbd, 0x96, 0x63, 0xf9, 0x4b, 0x63, 0x92, 0x32, 0x68, 0x49, + 0x14, 0xb7, 0x47, 0xf4, 0xee, 0x66, 0x03, 0x74, 0x9a, 0xd3, 0xc5, 0x61, 0xdb, 0x33, 0x5d, 0xed, + 0xee, 0x6a, 0x49, 0x0c, 0x72, 0x48, 0x2e, 0x41, 0x2e, 0x01, 0x9c, 0x63, 0x6e, 0x39, 0x04, 0x58, + 0xe4, 0x92, 0x43, 0x0e, 0x41, 0x7e, 0x41, 0xb0, 0x97, 0x00, 0x01, 0x02, 0x04, 0xc9, 0x2d, 0xab, + 0x1c, 0x72, 0x08, 0x90, 0xdf, 0xb0, 0xa8, 0xaf, 0xee, 0xea, 0xaf, 0x11, 0x29, 0x1b, 0xbb, 0x3a, + 0x4d, 0xd7, 0xab, 0x57, 0xaf, 0x5e, 0xd5, 0x7b, 0xf5, 0xbe, 0xaa, 0x06, 0x1a, 0xb6, 0xef, 0xde, + 0xf2, 0x03, 0x42, 0x09, 0x5a, 0x08, 0x22, 0x8f, 0xba, 0x13, 0xdc, 0xbb, 0x39, 0x72, 0xe9, 0x51, + 0x74, 0x70, 0x6b, 0x48, 0x26, 0xef, 0x8c, 0xc8, 0x88, 0xbc, 0xc3, 0xfb, 0x0f, 0xa2, 0x43, 0xde, + 0xe2, 0x0d, 0xfe, 0x25, 0xc6, 0x19, 0x37, 0xa0, 0xfd, 0x15, 0x0e, 0x42, 0x97, 0x78, 0x26, 0xfe, + 0x36, 0xc2, 0x21, 0x45, 0x5d, 0x58, 0x78, 0x2a, 0x20, 0xdd, 0xca, 0x7a, 0xe5, 0x5a, 0xc3, 0x54, + 0x4d, 0xe3, 0x57, 0x15, 0x58, 0x8a, 0x91, 0x43, 0x9f, 0x78, 0x21, 0x2e, 0xc7, 0x46, 0x6f, 0xc0, + 0xa2, 0xe4, 0xc9, 0xf2, 0xec, 0x09, 0xee, 0x56, 0x79, 0x77, 0x53, 0xc2, 0x76, 0xed, 0x09, 0x46, + 0x6f, 0xc3, 0x92, 0x42, 0x51, 0x44, 0x6a, 0x1c, 0xab, 0x2d, 0xc1, 0x72, 0x36, 0x74, 0x0b, 0xce, + 0x28, 0x44, 0xdb, 0x77, 0x63, 0xe4, 0x59, 0x8e, 0xbc, 0x2c, 0xbb, 0xfa, 0xbe, 0x2b, 0xf1, 0x8d, + 0x5f, 0x42, 0x63, 0x6b, 0x77, 0xb0, 0x49, 0xbc, 0x43, 0x77, 0xc4, 0x58, 0x0c, 0x71, 0xc0, 0xc6, + 0x74, 0x2b, 0xeb, 0x35, 0xc6, 0xa2, 0x6c, 0xa2, 0x1e, 0xd4, 0x43, 0x6c, 0x07, 0xc3, 0x23, 0x1c, + 0x76, 0xab, 0xbc, 0x2b, 0x6e, 0xb3, 0x51, 0xc4, 0xa7, 0x2e, 0xf1, 0xc2, 0x6e, 0x4d, 0x8c, 0x92, + 0x4d, 0xe3, 0x6f, 0x2a, 0xd0, 0xdc, 0x23, 0x01, 0x7d, 0x64, 0xfb, 0xbe, 0xeb, 0x8d, 0xd0, 0x4d, + 0xa8, 0xf3, 0xbd, 0x1c, 0x92, 0x31, 0xdf, 0x83, 0xf6, 0xc6, 0xf2, 0x2d, 0xc9, 0xd2, 0xad, 0x3d, + 0xd9, 0x61, 0xc6, 0x28, 0xe8, 0x2a, 0xb4, 0x87, 0xc4, 0xa3, 0xb6, 0xeb, 0xe1, 0xc0, 0xf2, 0x49, + 0x40, 0xf9, 0xce, 0xcc, 0x99, 0xad, 0x18, 0xca, 0x88, 0xa3, 0x0b, 0xd0, 0x38, 0x22, 0x21, 0x15, + 0x18, 0x35, 0x8e, 0x51, 0x67, 0x00, 0xde, 0xb9, 0x0a, 0x0b, 0xbc, 0xd3, 0xf5, 0xe5, 0x1e, 0xcc, + 0xb3, 0xe6, 0x8e, 0x6f, 0x7c, 0x57, 0x81, 0xb9, 0x47, 0x24, 0xf2, 0x68, 0x66, 0x1a, 0x9b, 0x1e, + 0x49, 0xf9, 0x68, 0xd3, 0xd8, 0xf4, 0x28, 0x99, 0x86, 0x61, 0x08, 0x11, 0x89, 0x69, 0x58, 0x67, + 0x0f, 0xea, 0x01, 0xb6, 0x1d, 0xe2, 0x8d, 0x8f, 0x39, 0x0b, 0x75, 0x33, 0x6e, 0x33, 0xd9, 0x85, + 0x78, 0xec, 0x7a, 0xd1, 0x73, 0x2b, 0xc0, 0x63, 0xfb, 0x00, 0x8f, 0x39, 0x2b, 0x75, 0xb3, 0x2d, + 0xc1, 0xa6, 0x80, 0x1a, 0x5f, 0xc3, 0x12, 0x13, 0x76, 0xe8, 0xdb, 0x43, 0xfc, 0x98, 0x6f, 0x21, + 0x53, 0x0d, 0x3e, 0xa9, 0x87, 0xe9, 0x33, 0x12, 0x7c, 0xc3, 0x39, 0xab, 0x9b, 0x4d, 0x06, 0xdb, + 0x15, 0x20, 0x74, 0x1e, 0xea, 0x82, 0x2f, 0xd7, 0xe1, 0x6c, 0xd5, 0x4d, 0xbe, 0xe2, 0x3d, 0xd7, + 0x89, 0xbb, 0x5c, 0x7f, 0x28, 0xb9, 0x5a, 0x10, 0xab, 0x1f, 0x1a, 0x06, 0xc0, 0x8e, 0x47, 0xef, + 0xfc, 0xe4, 0x2b, 0x7b, 0x1c, 0x61, 0xb4, 0x02, 0x73, 0x4f, 0xd9, 0x07, 0xa7, 0x5f, 0x33, 0x45, + 0xc3, 0xf8, 0x8b, 0x1a, 0x5c, 0x78, 0xc8, 0x18, 0x1c, 0xd8, 0x9e, 0x73, 0x40, 0x9e, 0x0f, 0xf0, + 0x30, 0x0a, 0x5c, 0x7a, 0xbc, 0x49, 0x3c, 0x8a, 0x9f, 0x53, 0xb4, 0x0d, 0xcb, 0x9e, 0xe2, 0xd7, + 0x52, 0x2a, 0xc0, 0x28, 0x34, 0x37, 0xba, 0xb1, 0x5c, 0x33, 0x2b, 0x32, 0x3b, 0x5e, 0x1a, 0x10, + 0xa2, 0xcf, 0x92, 0xfd, 0x51, 0x44, 0xaa, 0x9c, 0xc8, 0xb9, 0x98, 0xc8, 0x60, 0x9b, 0xf3, 0x21, + 0x49, 0xa8, 0x7d, 0x53, 0x04, 0xde, 0x03, 0x76, 0x56, 0x2c, 0x3b, 0xb4, 0xa2, 0x10, 0x07, 0x7c, + 0xa5, 0xcd, 0x8d, 0x33, 0xf1, 0xe0, 0x64, 0x9d, 0x66, 0x23, 0x88, 0xbc, 0x7e, 0xb8, 0x1f, 0xe2, + 0x80, 0x9f, 0x28, 0x29, 0x21, 0x2b, 0x20, 0x84, 0x1e, 0x86, 0x4a, 0x2a, 0x0a, 0x6c, 0x72, 0x28, + 0x7a, 0x07, 0xce, 0x84, 0x91, 0xef, 0x8f, 0xf1, 0x04, 0x7b, 0xd4, 0x1e, 0x5b, 0xa3, 0x80, 0x44, + 0x7e, 0xd8, 0x9d, 0x5b, 0xaf, 0x5d, 0xab, 0x99, 0x48, 0xef, 0xfa, 0x82, 0xf7, 0xa0, 0x35, 0x00, + 0x3f, 0x70, 0x9f, 0xba, 0x63, 0x3c, 0xc2, 0x4e, 0x77, 0x9e, 0x13, 0xd5, 0x20, 0xe8, 0x36, 0xac, + 0x84, 0x78, 0x38, 0x24, 0x13, 0xdf, 0xf2, 0x03, 0x72, 0xe8, 0x8e, 0xb1, 0xd0, 0xa9, 0x05, 0xae, + 0x53, 0x48, 0xf6, 0xed, 0x89, 0x2e, 0xa6, 0x5d, 0xc6, 0x77, 0x55, 0x38, 0xcb, 0x37, 0x60, 0x8f, + 0x38, 0x52, 0x16, 0xf2, 0xc4, 0x5e, 0x81, 0xd6, 0x90, 0x33, 0x64, 0xf9, 0x76, 0x80, 0x3d, 0x2a, + 0x55, 0x77, 0x51, 0x00, 0xf7, 0x38, 0x0c, 0x3d, 0x86, 0x4e, 0x28, 0x45, 0x67, 0x0d, 0x85, 0xec, + 0xe4, 0x0e, 0xbf, 0x19, 0x6f, 0xd2, 0x14, 0x39, 0x9b, 0x4b, 0x61, 0x4e, 0xf0, 0x0b, 0xe1, 0x71, + 0x38, 0xa4, 0x63, 0x71, 0xe2, 0x9b, 0x1b, 0x3f, 0x4a, 0xd3, 0xc9, 0xb2, 0x79, 0x6b, 0x20, 0xb0, + 0xb7, 0x3d, 0x1a, 0x1c, 0x9b, 0x6a, 0x6c, 0xef, 0x2e, 0x2c, 0xea, 0x1d, 0xa8, 0x03, 0xb5, 0x6f, + 0xf0, 0xb1, 0x5c, 0x02, 0xfb, 0x4c, 0xf4, 0x52, 0x9c, 0x37, 0xd1, 0xb8, 0x5b, 0xfd, 0x83, 0x8a, + 0x11, 0x00, 0x4a, 0x66, 0x79, 0x84, 0xa9, 0xed, 0xd8, 0xd4, 0x46, 0x08, 0x66, 0xb9, 0x05, 0x15, + 0x24, 0xf8, 0x37, 0xa3, 0x1a, 0xc9, 0xa3, 0xd1, 0x30, 0xd9, 0x27, 0xba, 0x08, 0x8d, 0x58, 0x09, + 0xa5, 0x19, 0x4d, 0x00, 0xcc, 0x9c, 0xd9, 0x94, 0xe2, 0x89, 0x4f, 0xb9, 0x42, 0xb4, 0x4c, 0xd5, + 0x34, 0xfe, 0x79, 0x16, 0x3a, 0x39, 0x09, 0x7c, 0x00, 0xf5, 0x89, 0x9c, 0x5e, 0xea, 0xfe, 0x85, + 0xc4, 0xa6, 0xe5, 0x38, 0x34, 0x63, 0x64, 0x66, 0x32, 0xd8, 0x61, 0xd4, 0x2c, 0x7e, 0xdc, 0x66, + 0x62, 0x1d, 0x93, 0x91, 0xe5, 0xb8, 0x01, 0x1e, 0x52, 0x12, 0x1c, 0x4b, 0x2e, 0x17, 0xc7, 0x64, + 0xb4, 0xa5, 0x60, 0xe8, 0x5d, 0x00, 0xc7, 0x0b, 0x99, 0x44, 0x0f, 0xdd, 0x11, 0xe7, 0xb5, 0xb9, + 0x81, 0xe2, 0xb9, 0x63, 0xab, 0x6e, 0x36, 0x1c, 0x2f, 0x94, 0xcc, 0x7e, 0x08, 0x2d, 0x66, 0x25, + 0xad, 0x89, 0x30, 0xc8, 0x42, 0x8b, 0x9b, 0x1b, 0x2b, 0x1a, 0xc7, 0xb1, 0xb5, 0x36, 0x17, 0xfd, + 0xa4, 0x11, 0xa2, 0x4f, 0x60, 0x9e, 0x5b, 0xa9, 0xb0, 0x3b, 0xcf, 0xc7, 0x5c, 0x2d, 0x58, 0xa5, + 0x94, 0xf6, 0x43, 0x8e, 0x27, 0x84, 0x2d, 0x07, 0xa1, 0x87, 0xd0, 0xb4, 0x3d, 0x8f, 0x50, 0x5b, + 0x1c, 0xf0, 0x05, 0x4e, 0xe3, 0x46, 0x39, 0x8d, 0x7e, 0x82, 0x2c, 0x08, 0xe9, 0xc3, 0xd1, 0x4f, + 0x60, 0x8e, 0x5b, 0x80, 0x6e, 0x9d, 0xaf, 0x7a, 0x6d, 0xba, 0xfa, 0x99, 0x02, 0xb9, 0xf7, 0x21, + 0x34, 0x35, 0xd6, 0x4e, 0xa3, 0x6e, 0xbd, 0x4f, 0xa1, 0x93, 0xe5, 0xe8, 0x54, 0xea, 0xba, 0x03, + 0x2b, 0x66, 0xe4, 0x25, 0x8c, 0xa9, 0x10, 0xe2, 0x5d, 0x98, 0x97, 0xf2, 0x13, 0xba, 0x73, 0xbe, + 0x74, 0x47, 0x4c, 0x89, 0x68, 0x7c, 0x02, 0x67, 0x33, 0xa4, 0x64, 0x80, 0xf1, 0x26, 0xb4, 0x7d, + 0xe2, 0x58, 0xa1, 0x00, 0x5b, 0xae, 0xa3, 0x8c, 0x81, 0x1f, 0xe3, 0xee, 0x38, 0x6c, 0xf8, 0x80, + 0x12, 0x3f, 0xcf, 0xca, 0xc9, 0x86, 0x77, 0xe1, 0x5c, 0x76, 0xb8, 0x98, 0xde, 0xf8, 0x0c, 0x56, + 0x4d, 0x3c, 0x21, 0x4f, 0xf1, 0xab, 0x92, 0xee, 0x41, 0x37, 0x4f, 0x20, 0x21, 0x9e, 0x40, 0x07, + 0xd4, 0xa6, 0x51, 0x78, 0x3a, 0xe2, 0xd7, 0x75, 0x02, 0xd2, 0x75, 0x0a, 0x3a, 0xa8, 0x0d, 0x55, + 0xd7, 0x97, 0x83, 0xaa, 0xae, 0x6f, 0x7c, 0x06, 0x8d, 0xd8, 0x69, 0xa1, 0x8d, 0x24, 0xb8, 0xa9, + 0xbe, 0xc4, 0xb3, 0xc5, 0x61, 0xcf, 0x83, 0x9c, 0xb5, 0x96, 0x33, 0x6d, 0x00, 0xc4, 0x76, 0x46, + 0x79, 0x4a, 0x94, 0xa7, 0x67, 0x6a, 0x58, 0xc6, 0xdf, 0xa5, 0x8c, 0x8e, 0xc6, 0xb2, 0x13, 0xb3, + 0xec, 0xa4, 0x8c, 0x50, 0xf5, 0x34, 0x46, 0xe8, 0x16, 0xcc, 0x85, 0xd4, 0xa6, 0xc2, 0x0c, 0xb6, + 0xb5, 0xc5, 0xa5, 0xa7, 0xc4, 0xa6, 0x40, 0x43, 0x97, 0x00, 0x86, 0x01, 0xb6, 0x29, 0x76, 0x2c, + 0x5b, 0xd8, 0xc7, 0x9a, 0xd9, 0x90, 0x90, 0x3e, 0x45, 0x77, 0x61, 0x41, 0x45, 0x2a, 0x73, 0x9c, + 0x8d, 0xf5, 0x02, 0x82, 0xa9, 0xdd, 0x37, 0xd5, 0x80, 0xe4, 0x4c, 0xcf, 0x4f, 0x3f, 0xd3, 0x72, + 0x9c, 0x40, 0xd6, 0xcc, 0xd2, 0x42, 0xa9, 0x59, 0x12, 0x23, 0x4e, 0x62, 0x96, 0xea, 0xa5, 0x66, + 0x49, 0xd2, 0x98, 0x6a, 0x96, 0x7e, 0x9f, 0x06, 0xe6, 0x11, 0x74, 0xf3, 0x07, 0x44, 0x1a, 0x86, + 0x77, 0x61, 0x3e, 0xe4, 0x90, 0x29, 0x46, 0x46, 0x0e, 0x91, 0x88, 0xc6, 0x7d, 0x58, 0xc9, 0x68, + 0x80, 0x08, 0x14, 0x63, 0x7d, 0xa9, 0x9c, 0x48, 0x5f, 0x8c, 0xff, 0xaf, 0xe8, 0xda, 0x7b, 0xdf, + 0x1d, 0x53, 0x1c, 0xe4, 0xb4, 0xf7, 0x3d, 0x45, 0x54, 0xa8, 0xee, 0xa5, 0x32, 0xa2, 0x22, 0x86, + 0x93, 0x9a, 0x38, 0x80, 0x36, 0x97, 0xa1, 0x15, 0xe2, 0x31, 0x77, 0x88, 0x32, 0x14, 0xf9, 0x71, + 0xc1, 0x68, 0x31, 0xaf, 0x50, 0x80, 0x81, 0x44, 0x17, 0xe2, 0x6b, 0x8d, 0x75, 0x58, 0xef, 0x1e, + 0xa0, 0x3c, 0xd2, 0xa9, 0xe4, 0xf0, 0x25, 0x3b, 0xfb, 0x2c, 0xf7, 0x28, 0xb0, 0xf4, 0x87, 0x9c, + 0x8d, 0x29, 0x42, 0x10, 0x7c, 0x9a, 0x12, 0xd1, 0xf8, 0xdb, 0x1a, 0x40, 0xd2, 0xf9, 0xda, 0x1e, + 0xfa, 0x0f, 0xe2, 0x23, 0x28, 0xa2, 0x89, 0xcb, 0x05, 0xf4, 0x0a, 0x0f, 0xdf, 0xfd, 0xf4, 0xe1, + 0x13, 0x71, 0xc5, 0x9b, 0x45, 0xa3, 0x5f, 0xdb, 0x63, 0xb7, 0x09, 0xe7, 0xb2, 0xe2, 0x96, 0x87, + 0xee, 0x3a, 0xcc, 0xb9, 0x14, 0x4f, 0x44, 0x26, 0xad, 0xa7, 0x23, 0x1a, 0xae, 0xc0, 0x30, 0xde, + 0x80, 0xc6, 0xce, 0xc4, 0x1e, 0xe1, 0x81, 0x8f, 0x87, 0x6c, 0x2e, 0x97, 0x35, 0xe4, 0xfc, 0xa2, + 0x61, 0x6c, 0x40, 0xfd, 0x01, 0x3e, 0x16, 0x67, 0xf0, 0x84, 0xfc, 0x19, 0x7f, 0x55, 0x85, 0x55, + 0x6e, 0x3b, 0x37, 0x55, 0x1e, 0x6b, 0xe2, 0x90, 0x44, 0xc1, 0x10, 0x87, 0x5c, 0xa4, 0x7e, 0x64, + 0xf9, 0x38, 0x70, 0x89, 0x23, 0xb3, 0xbe, 0xc6, 0xd0, 0x8f, 0xf6, 0x38, 0x80, 0xe5, 0xba, 0xac, + 0xfb, 0xdb, 0x88, 0x48, 0xdd, 0xaa, 0x99, 0xf5, 0xa1, 0x1f, 0xfd, 0x94, 0xb5, 0xd5, 0xd8, 0xf0, + 0xc8, 0x0e, 0x70, 0xc8, 0x75, 0x48, 0x8c, 0x1d, 0x70, 0x00, 0x7a, 0x17, 0xce, 0x4e, 0xf0, 0x84, + 0x04, 0xc7, 0xd6, 0xd8, 0x9d, 0xb8, 0xd4, 0x72, 0x3d, 0xeb, 0xe0, 0x98, 0xe2, 0x50, 0x2a, 0x0e, + 0x12, 0x9d, 0x0f, 0x59, 0xdf, 0x8e, 0xf7, 0x39, 0xeb, 0x41, 0x06, 0xb4, 0x08, 0x99, 0x58, 0xe1, + 0x90, 0x04, 0xd8, 0xb2, 0x9d, 0xaf, 0xb9, 0xf3, 0xa8, 0x99, 0x4d, 0x42, 0x26, 0x03, 0x06, 0xeb, + 0x3b, 0x5f, 0xa3, 0xcb, 0xd0, 0x1c, 0xfa, 0x51, 0x88, 0xa9, 0xc5, 0x7e, 0xb8, 0x93, 0x68, 0x98, + 0x20, 0x40, 0x9b, 0x7e, 0x14, 0x6a, 0x08, 0x13, 0xb6, 0xed, 0x0b, 0x3a, 0xc2, 0x23, 0xb6, 0xcd, + 0x36, 0xb4, 0x52, 0x79, 0x24, 0xcb, 0x16, 0x78, 0xc2, 0x28, 0xb3, 0x05, 0xf6, 0xcd, 0x60, 0x01, + 0x19, 0xab, 0x9d, 0xe4, 0xdf, 0x0c, 0x46, 0x8f, 0x7d, 0x95, 0x2a, 0xf0, 0x6f, 0xb6, 0xe5, 0x63, + 0xfc, 0x54, 0xa6, 0xf2, 0x0d, 0x53, 0x34, 0x0c, 0x07, 0x60, 0xd3, 0xf6, 0xed, 0x03, 0x77, 0xec, + 0xd2, 0x63, 0x74, 0x1d, 0x3a, 0xb6, 0xe3, 0x58, 0x43, 0x05, 0x71, 0xb1, 0xaa, 0xab, 0x2c, 0xd9, + 0x8e, 0xb3, 0xa9, 0x81, 0xd1, 0x8f, 0x60, 0xd9, 0x09, 0x88, 0x9f, 0xc6, 0x15, 0x85, 0x96, 0x0e, + 0xeb, 0xd0, 0x91, 0x8d, 0x7f, 0x9a, 0x85, 0x4b, 0x69, 0xc1, 0x66, 0x33, 0xf3, 0x0f, 0x60, 0x31, + 0x33, 0x6b, 0x3a, 0x25, 0x4e, 0x98, 0x34, 0x53, 0x88, 0x99, 0xdc, 0xb5, 0x9a, 0xcb, 0x5d, 0x0b, + 0x53, 0xfe, 0xda, 0x0f, 0x91, 0xf2, 0xcf, 0x7e, 0x9f, 0x94, 0x7f, 0xee, 0x44, 0x29, 0xff, 0x5b, + 0xbc, 0x88, 0xa6, 0x06, 0xf1, 0xc4, 0x4b, 0xa8, 0x51, 0x2b, 0xc6, 0xf1, 0x54, 0xb1, 0x2d, 0x53, + 0x1a, 0x58, 0x38, 0x4d, 0x69, 0xa0, 0x5e, 0x5a, 0x1a, 0x60, 0x1a, 0xe1, 0xfb, 0x76, 0x30, 0x21, + 0x81, 0xca, 0xfd, 0xbb, 0x0d, 0xce, 0xc2, 0x92, 0x82, 0xcb, 0xbc, 0xbf, 0xb4, 0x4a, 0x00, 0x65, + 0x55, 0x02, 0xb4, 0x0e, 0x8b, 0x1e, 0xb1, 0x3c, 0xfc, 0xcc, 0x62, 0x02, 0x0b, 0xbb, 0x4d, 0x21, + 0x3d, 0x8f, 0xec, 0xe2, 0x67, 0x7b, 0x0c, 0x62, 0xfc, 0x7d, 0x05, 0x56, 0xd2, 0x8a, 0x23, 0xf3, + 0xc2, 0x4f, 0xa1, 0x11, 0x28, 0xdb, 0x20, 0x95, 0x65, 0x3d, 0x1d, 0x7f, 0xe5, 0x6d, 0x88, 0x99, + 0x0c, 0x41, 0x3f, 0x2d, 0xad, 0x30, 0xbc, 0x55, 0x42, 0xe6, 0x65, 0x35, 0x06, 0xa3, 0x0f, 0xcb, + 0x31, 0xf2, 0xd4, 0xfc, 0x5e, 0xcb, 0xd7, 0xab, 0xe9, 0x7c, 0xdd, 0x83, 0xf9, 0x2d, 0xfc, 0xd4, + 0x1d, 0xe2, 0x1f, 0xa4, 0xc4, 0xb7, 0x0e, 0x4d, 0x1f, 0x07, 0x13, 0x37, 0x0c, 0x63, 0xa5, 0x6f, + 0x98, 0x3a, 0xc8, 0xf8, 0xaf, 0x39, 0x58, 0xca, 0xee, 0xec, 0x9d, 0x5c, 0x79, 0xa0, 0x97, 0x9c, + 0xc2, 0xec, 0xfa, 0x34, 0x1f, 0x7d, 0x4d, 0xb9, 0x81, 0x6a, 0x26, 0x4b, 0x88, 0x3d, 0x85, 0x74, + 0x0d, 0x6c, 0xfd, 0x43, 0x32, 0x99, 0xd8, 0x9e, 0xa3, 0xca, 0xaf, 0xb2, 0xc9, 0x76, 0xcb, 0x0e, + 0x46, 0xec, 0x68, 0x31, 0x30, 0xff, 0x66, 0x56, 0x92, 0x45, 0xdb, 0xae, 0xc7, 0xab, 0x0b, 0xfc, + 0xe0, 0x34, 0x4c, 0x90, 0xa0, 0x2d, 0x37, 0x40, 0x57, 0x61, 0x16, 0x7b, 0x4f, 0x95, 0x37, 0x4e, + 0xea, 0xb3, 0xca, 0xfd, 0x98, 0xbc, 0x1b, 0xbd, 0x05, 0xf3, 0x13, 0x12, 0x79, 0x54, 0xc5, 0xdd, + 0xed, 0x18, 0x91, 0x17, 0x55, 0x4d, 0xd9, 0x8b, 0xae, 0xc3, 0x82, 0xc3, 0x65, 0xa0, 0x82, 0xeb, + 0xa5, 0xa4, 0x42, 0xc1, 0xe1, 0xa6, 0xea, 0x47, 0x1f, 0xc7, 0x71, 0x44, 0x23, 0x13, 0x09, 0x64, + 0x36, 0xb5, 0x30, 0x98, 0x78, 0x90, 0x0e, 0x26, 0x80, 0x93, 0xb8, 0x5e, 0x4a, 0x62, 0x7a, 0x7d, + 0xe1, 0x3c, 0xd4, 0xc7, 0x64, 0x24, 0xf4, 0xa0, 0x29, 0x8a, 0xf5, 0x63, 0x32, 0xe2, 0x6a, 0xb0, + 0xc2, 0x82, 0x27, 0xc7, 0xf5, 0xba, 0x8b, 0xfc, 0x78, 0x89, 0x06, 0xf3, 0x89, 0xfc, 0xc3, 0x22, + 0xde, 0x10, 0x77, 0x5b, 0xbc, 0xab, 0xc1, 0x21, 0x8f, 0xbd, 0x21, 0x77, 0xd9, 0x94, 0x1e, 0x77, + 0xdb, 0x1c, 0xce, 0x3e, 0x59, 0xcc, 0x2b, 0xb2, 0x9d, 0xa5, 0x4c, 0xcc, 0x5b, 0x74, 0x3e, 0x5f, + 0x83, 0x02, 0xc6, 0x3f, 0x56, 0xe0, 0xdc, 0x26, 0x0f, 0xf9, 0x34, 0x4b, 0x70, 0x8a, 0x04, 0x1c, + 0xdd, 0x8e, 0x2b, 0x1d, 0xd9, 0x3c, 0x3a, 0xbb, 0x58, 0x89, 0x87, 0xee, 0x41, 0x5b, 0xd1, 0x94, + 0x23, 0x6b, 0x2f, 0xab, 0x91, 0xb4, 0x42, 0xbd, 0x69, 0x7c, 0x0c, 0xab, 0x39, 0x9e, 0x65, 0x78, + 0xf6, 0x06, 0x2c, 0x26, 0x16, 0x21, 0x66, 0xb9, 0x19, 0xc3, 0x76, 0x1c, 0xe3, 0x2e, 0x9c, 0x1d, + 0x50, 0x3b, 0xa0, 0xb9, 0x05, 0x9f, 0x60, 0x2c, 0x2f, 0x93, 0xa4, 0xc7, 0xca, 0x4a, 0xc6, 0x00, + 0x56, 0x06, 0x94, 0xf8, 0xaf, 0x40, 0x94, 0x9d, 0x74, 0xb6, 0x6c, 0x12, 0x51, 0x19, 0x93, 0xa9, + 0xa6, 0xb1, 0x2a, 0x8a, 0x3a, 0xf9, 0xd9, 0x3e, 0x82, 0x73, 0xa2, 0xa6, 0xf2, 0x2a, 0x8b, 0x38, + 0xaf, 0x2a, 0x3a, 0x79, 0xba, 0x5b, 0x70, 0x26, 0x31, 0xe5, 0x49, 0x7a, 0x78, 0x33, 0x9d, 0x1e, + 0xae, 0xe6, 0x65, 0x9c, 0xca, 0x0e, 0xff, 0xba, 0xaa, 0x19, 0xcc, 0x92, 0xe4, 0x70, 0x23, 0x9d, + 0x1c, 0x5e, 0x2c, 0x21, 0x99, 0xca, 0x0d, 0xf3, 0x1a, 0x59, 0x2b, 0xd0, 0x48, 0x33, 0x97, 0x41, + 0xce, 0x66, 0x8a, 0xd9, 0x19, 0xde, 0x7e, 0x27, 0x09, 0xe4, 0x8e, 0x48, 0x20, 0xe3, 0xa9, 0xe3, + 0x3a, 0xd7, 0xed, 0x4c, 0x02, 0xd9, 0x2d, 0x63, 0x33, 0xce, 0x1f, 0xff, 0x72, 0x16, 0x1a, 0x71, + 0x5f, 0x6e, 0x63, 0xf3, 0x9b, 0x54, 0x2d, 0xd8, 0x24, 0xdd, 0x7f, 0xd5, 0x5e, 0xc5, 0x7f, 0xcd, + 0xbe, 0xcc, 0x7f, 0x5d, 0x80, 0x06, 0xff, 0xb0, 0x02, 0x7c, 0x28, 0xfd, 0x51, 0x9d, 0x03, 0x4c, + 0x7c, 0x98, 0x28, 0xd4, 0xfc, 0x49, 0x14, 0x2a, 0x93, 0xa9, 0x2e, 0x64, 0x33, 0xd5, 0x3b, 0xb1, + 0x87, 0x11, 0xbe, 0x68, 0x2d, 0x4f, 0xae, 0xd0, 0xb7, 0x6c, 0xa7, 0x7d, 0x8b, 0x70, 0x4f, 0x57, + 0x0a, 0x06, 0xbf, 0xb6, 0x79, 0xea, 0x43, 0x91, 0xa7, 0xea, 0x5a, 0x25, 0x0d, 0xe1, 0x06, 0x40, + 0x7c, 0xe6, 0x55, 0xb2, 0x8a, 0xf2, 0x4b, 0x33, 0x35, 0x2c, 0x66, 0x55, 0x52, 0xfb, 0x9f, 0x14, + 0x63, 0x4f, 0x60, 0x55, 0xfe, 0x45, 0x8f, 0x92, 0x4a, 0xea, 0x99, 0x77, 0x72, 0xa5, 0x8d, 0x93, + 0x69, 0xdd, 0xcd, 0x74, 0x65, 0xe3, 0x74, 0xea, 0x92, 0x2b, 0x6c, 0x70, 0xa7, 0x6e, 0x07, 0xb2, + 0x5b, 0xe4, 0xa4, 0x0d, 0x09, 0xe9, 0x53, 0x16, 0x4a, 0x1d, 0xba, 0x9e, 0x1b, 0x1e, 0x89, 0xfe, + 0x79, 0xde, 0x0f, 0x0a, 0xd4, 0xe7, 0x17, 0xd3, 0xf8, 0xb9, 0x4b, 0xad, 0x21, 0x71, 0x30, 0x57, + 0xc6, 0x39, 0xb3, 0xce, 0x00, 0x9b, 0xc4, 0xc1, 0xc9, 0x01, 0xa9, 0x9f, 0xea, 0x80, 0x34, 0x32, + 0x07, 0xe4, 0x1c, 0xcc, 0x07, 0xd8, 0x0e, 0x89, 0x27, 0x13, 0x03, 0xd9, 0x62, 0xbe, 0x62, 0x82, + 0xc3, 0x90, 0x4d, 0x20, 0x03, 0x18, 0xd9, 0xd4, 0xc2, 0xac, 0xc5, 0xb2, 0x30, 0x6b, 0x4a, 0xc1, + 0x34, 0x13, 0x66, 0xb5, 0xca, 0xc2, 0xac, 0x93, 0xd4, 0x4b, 0xb5, 0x20, 0xb2, 0x3d, 0x35, 0x88, + 0xd4, 0xc3, 0xb1, 0xa5, 0x54, 0x38, 0xf6, 0xfb, 0x3c, 0x53, 0x0f, 0x60, 0x35, 0x77, 0x0a, 0xe4, + 0xa1, 0xba, 0x9d, 0xa9, 0xb8, 0x76, 0xcb, 0x36, 0x28, 0x2e, 0xb8, 0xfe, 0x29, 0x5c, 0xde, 0xf7, + 0x9d, 0x4c, 0xa8, 0x22, 0x13, 0xad, 0x93, 0x47, 0x08, 0x77, 0x54, 0x54, 0x59, 0x3d, 0x61, 0x0e, + 0x27, 0xd0, 0x0d, 0x03, 0xd6, 0xcb, 0x67, 0x97, 0x2e, 0xff, 0x8f, 0x61, 0x69, 0xfb, 0x39, 0x1e, + 0x0e, 0x8e, 0xbd, 0xe1, 0x29, 0x38, 0xea, 0x40, 0x6d, 0x38, 0x71, 0x64, 0x29, 0x83, 0x7d, 0xea, + 0x51, 0x4c, 0x2d, 0x1d, 0xc5, 0x58, 0xd0, 0x49, 0x66, 0x90, 0x3b, 0x79, 0x8e, 0xed, 0xa4, 0xc3, + 0x90, 0x19, 0xf1, 0x45, 0x53, 0xb6, 0x24, 0x1c, 0x07, 0x01, 0x5f, 0xaa, 0x80, 0xe3, 0x20, 0x48, + 0x9f, 0xb9, 0x5a, 0xfa, 0xcc, 0x19, 0x5f, 0x43, 0x93, 0x4d, 0xf0, 0xbd, 0xd8, 0x97, 0xa1, 0x7c, + 0x2d, 0x09, 0xe5, 0xe3, 0x8c, 0x60, 0x56, 0xcb, 0x08, 0x8c, 0x75, 0x58, 0x14, 0x73, 0xc9, 0x85, + 0x74, 0xa0, 0x16, 0x05, 0x63, 0xa5, 0x59, 0x51, 0x30, 0x36, 0xfe, 0x10, 0x5a, 0x7d, 0x4a, 0xed, + 0xe1, 0xd1, 0x29, 0xf8, 0x89, 0xe7, 0xaa, 0xea, 0xd9, 0x47, 0x8e, 0x27, 0xc3, 0x80, 0xb6, 0xa2, + 0x5d, 0x3a, 0xff, 0x2e, 0xa0, 0x3d, 0x12, 0xd0, 0xfb, 0x24, 0x78, 0x66, 0x07, 0xce, 0xe9, 0xa2, + 0x79, 0x04, 0xb3, 0xf2, 0x41, 0x4e, 0xed, 0xda, 0x9c, 0xc9, 0xbf, 0x8d, 0xb7, 0xe1, 0x4c, 0x8a, + 0x5e, 0xe9, 0xc4, 0x1f, 0x40, 0x93, 0x1b, 0x39, 0x19, 0xf1, 0x5d, 0xd3, 0x2b, 0x9e, 0xd3, 0x2c, + 0xa1, 0xd1, 0x87, 0x65, 0xe6, 0xc5, 0x38, 0x3c, 0x3e, 0x16, 0x3f, 0xce, 0xc4, 0x45, 0x2b, 0xe9, + 0xf1, 0x99, 0x98, 0xe8, 0x1f, 0x2a, 0x30, 0xc7, 0xe1, 0x39, 0x9f, 0x73, 0x01, 0x1a, 0x01, 0xf6, + 0x89, 0x45, 0xed, 0x51, 0xfc, 0xc6, 0x89, 0x01, 0x9e, 0xd8, 0xa3, 0x90, 0x3f, 0xd1, 0x62, 0x9d, + 0x8e, 0x3b, 0xc2, 0x21, 0x55, 0x0f, 0x9d, 0x9a, 0x0c, 0xb6, 0x25, 0x40, 0x6c, 0x4b, 0x42, 0xf7, + 0x4f, 0x44, 0xc0, 0x33, 0x6b, 0xf2, 0x6f, 0x74, 0x55, 0xbc, 0x3d, 0x98, 0x52, 0x9e, 0xe2, 0x0f, + 0x12, 0x7a, 0x50, 0xcf, 0x54, 0xa4, 0xe2, 0xb6, 0xf1, 0x31, 0x20, 0x7d, 0xcd, 0x72, 0x53, 0xdf, + 0x82, 0x79, 0xbe, 0x25, 0xca, 0x63, 0xb7, 0xd3, 0x8b, 0x36, 0x65, 0xaf, 0xf1, 0x29, 0x20, 0xb1, + 0x8b, 0x29, 0x2f, 0x7d, 0xf2, 0x1d, 0xff, 0x08, 0xce, 0xa4, 0xc6, 0xc7, 0x57, 0xcd, 0x29, 0x02, + 0xd9, 0xd9, 0xe5, 0xe0, 0x7f, 0xad, 0x00, 0xf4, 0x23, 0x7a, 0x24, 0x4b, 0x21, 0xfa, 0x2a, 0x2b, + 0xe9, 0x55, 0xb2, 0x3e, 0xdf, 0x0e, 0xc3, 0x67, 0x24, 0x50, 0x61, 0x68, 0xdc, 0xe6, 0x65, 0x8c, + 0x88, 0x1e, 0xa9, 0xf2, 0x2b, 0xfb, 0x46, 0x57, 0xa1, 0x2d, 0x9e, 0xa6, 0x59, 0xb6, 0xe3, 0x04, + 0x38, 0x0c, 0x65, 0x1d, 0xb6, 0x25, 0xa0, 0x7d, 0x01, 0x64, 0x68, 0xae, 0x83, 0x3d, 0xea, 0xd2, + 0x63, 0x8b, 0x92, 0x6f, 0xb0, 0x27, 0x03, 0xcc, 0x96, 0x82, 0x3e, 0x61, 0x40, 0x86, 0x16, 0xe0, + 0x91, 0x1b, 0xd2, 0x40, 0xa1, 0xa9, 0xba, 0xa0, 0x84, 0x72, 0x34, 0xe3, 0x57, 0x15, 0xe8, 0xec, + 0x45, 0xe3, 0xb1, 0x58, 0xe4, 0x69, 0xf7, 0x12, 0xbd, 0x2d, 0xd7, 0x51, 0xcd, 0x68, 0x43, 0xb2, + 0x45, 0x72, 0x71, 0xdf, 0x3f, 0xf1, 0xbd, 0x0d, 0xcb, 0x1a, 0xa3, 0x52, 0x68, 0xa9, 0x38, 0xa2, + 0x92, 0x8e, 0x23, 0x98, 0xa2, 0x88, 0x5c, 0xef, 0xd5, 0x16, 0x67, 0x9c, 0x85, 0x33, 0xa9, 0xf1, + 0xd2, 0x69, 0xdc, 0x80, 0x96, 0xbc, 0xee, 0x95, 0x4a, 0x70, 0x1e, 0xea, 0xcc, 0xbc, 0x0c, 0x5d, + 0x47, 0xd5, 0xdd, 0x17, 0x7c, 0xe2, 0x6c, 0xba, 0x4e, 0x60, 0xec, 0x42, 0xcb, 0x14, 0xe4, 0x25, + 0xee, 0x27, 0xd0, 0x96, 0x97, 0xc3, 0x56, 0xea, 0x91, 0x44, 0x52, 0x24, 0x4e, 0xd1, 0x36, 0x5b, + 0x9e, 0xde, 0x34, 0x7e, 0x09, 0x3d, 0xe1, 0xd4, 0x52, 0x54, 0xd5, 0xd2, 0x3e, 0x01, 0xf5, 0x74, + 0xb2, 0x8c, 0x78, 0x7a, 0x58, 0x2b, 0xd0, 0x9b, 0xc6, 0x25, 0xb8, 0x50, 0x48, 0x5c, 0xae, 0xdb, + 0x87, 0x4e, 0xd2, 0xe1, 0xb8, 0xea, 0xba, 0x81, 0x5f, 0x23, 0x54, 0xb4, 0x6b, 0x84, 0x73, 0x71, + 0xa0, 0x20, 0x0c, 0xba, 0x6c, 0x69, 0x61, 0x5d, 0xad, 0x2c, 0xac, 0x9b, 0x4d, 0x85, 0x75, 0xc6, + 0x97, 0xf1, 0xee, 0xc9, 0x98, 0xfa, 0x43, 0x1e, 0xd8, 0x8b, 0xb9, 0x95, 0x99, 0x38, 0x5f, 0xb0, + 0x38, 0x81, 0x61, 0x6a, 0xc8, 0xc6, 0x12, 0xb4, 0x52, 0x06, 0xc3, 0xb8, 0x07, 0xed, 0x8c, 0x05, + 0xb8, 0x95, 0x89, 0x70, 0x72, 0xdb, 0x96, 0x89, 0x6f, 0x56, 0xa4, 0x21, 0xba, 0x1f, 0xee, 0x78, + 0x87, 0x44, 0xd1, 0xbd, 0x02, 0xcd, 0xfd, 0xb2, 0x67, 0x88, 0xb3, 0xea, 0x1e, 0xeb, 0x6d, 0x58, + 0x1e, 0x50, 0x12, 0xd8, 0x23, 0xbc, 0xc3, 0x4f, 0xed, 0xa1, 0x2b, 0xee, 0x69, 0xa2, 0x28, 0xb6, + 0xdf, 0xfc, 0xdb, 0xf8, 0x8f, 0x0a, 0x2c, 0xdd, 0x77, 0xc7, 0x38, 0x3c, 0x0e, 0x29, 0x9e, 0xec, + 0xf3, 0x68, 0xf7, 0x22, 0x34, 0x18, 0x37, 0x21, 0xb5, 0x27, 0xbe, 0xba, 0xe7, 0x8a, 0x01, 0x6c, + 0x8f, 0x42, 0x41, 0x5a, 0xe5, 0xbf, 0x7a, 0xa6, 0x91, 0x9b, 0x95, 0x45, 0xff, 0x12, 0x84, 0xde, + 0x03, 0x88, 0x42, 0xec, 0xc8, 0xbb, 0xad, 0x5a, 0xc6, 0xf5, 0xec, 0xeb, 0x37, 0x10, 0x0c, 0x4f, + 0x5c, 0x74, 0xbd, 0x0f, 0x4d, 0xd7, 0x23, 0x0e, 0xe6, 0x37, 0x10, 0x8e, 0xcc, 0x8d, 0x8b, 0x47, + 0x81, 0x40, 0xdc, 0x0f, 0xb1, 0x63, 0xfc, 0x91, 0xb4, 0xc2, 0x6a, 0xf3, 0xa4, 0x0c, 0xb6, 0x61, + 0x59, 0x1c, 0xe8, 0xc3, 0x78, 0xd1, 0x4a, 0xd0, 0x49, 0xc0, 0x99, 0xd9, 0x10, 0xb3, 0xe3, 0x4a, + 0xaf, 0xa8, 0x46, 0x18, 0x77, 0xe1, 0x6c, 0x2a, 0x2a, 0x3d, 0x4d, 0x32, 0xf7, 0x45, 0x26, 0x13, + 0x4c, 0x14, 0x44, 0xa6, 0x62, 0x4a, 0x3f, 0x4a, 0x52, 0xb1, 0x50, 0xa4, 0x62, 0xa1, 0x61, 0xc2, + 0xf9, 0x54, 0x82, 0x9a, 0x62, 0xe4, 0xfd, 0x8c, 0x8b, 0xbf, 0x54, 0x42, 0x2c, 0xe3, 0xeb, 0xff, + 0xb7, 0x02, 0x2b, 0x45, 0x08, 0xaf, 0x58, 0x0a, 0xf9, 0x59, 0xc9, 0x8b, 0x83, 0xdb, 0x53, 0xb9, + 0xf9, 0x9d, 0x14, 0x8d, 0x1e, 0x40, 0xaf, 0x68, 0xf7, 0xf2, 0xa2, 0xa8, 0x9d, 0x40, 0x14, 0xff, + 0x57, 0xd5, 0x8a, 0x7b, 0x7d, 0x4a, 0x03, 0xf7, 0x20, 0x62, 0xca, 0xfb, 0x43, 0x25, 0xe9, 0xf7, + 0xe2, 0x04, 0x54, 0xec, 0xdf, 0xb5, 0xfc, 0xa8, 0x64, 0xd6, 0xc2, 0x24, 0xf4, 0x71, 0x3a, 0x09, + 0x15, 0x65, 0xbb, 0x9b, 0x53, 0xc9, 0xbc, 0xb6, 0x95, 0x99, 0x17, 0x15, 0x68, 0xa7, 0xe5, 0x80, + 0x3e, 0x06, 0xb0, 0x63, 0xce, 0xa5, 0xca, 0x5f, 0x9c, 0xb6, 0x3a, 0x53, 0xc3, 0x47, 0x57, 0xa0, + 0x36, 0xf4, 0x23, 0x29, 0x91, 0xe4, 0xfe, 0x66, 0xd3, 0x8f, 0x84, 0x01, 0x60, 0xbd, 0x2c, 0x68, + 0x16, 0xf7, 0xf0, 0x39, 0xcb, 0xf5, 0x88, 0x83, 0x05, 0xaa, 0xc4, 0x41, 0x9f, 0x41, 0xfb, 0x59, + 0xe0, 0x52, 0xfb, 0x60, 0x8c, 0xad, 0xb1, 0x7d, 0x8c, 0x03, 0x69, 0xb9, 0xca, 0xad, 0x4c, 0x4b, + 0xe1, 0x3f, 0x64, 0xe8, 0x46, 0x04, 0x75, 0x35, 0xff, 0x4b, 0x2c, 0xf2, 0x03, 0x58, 0x8d, 0x18, + 0x9a, 0xc5, 0xdf, 0x02, 0x78, 0xb6, 0x47, 0xac, 0x10, 0x33, 0xd7, 0xa4, 0xde, 0xdf, 0x15, 0x5b, + 0xcb, 0x15, 0x3e, 0x68, 0x93, 0x04, 0x78, 0xd7, 0xf6, 0xc8, 0x40, 0x8c, 0x30, 0x26, 0xd0, 0xd4, + 0x96, 0xf3, 0x92, 0x99, 0xef, 0xc1, 0xb2, 0xba, 0x19, 0x0b, 0x31, 0x95, 0x76, 0x7d, 0xda, 0x9c, + 0x4b, 0x12, 0x7d, 0x80, 0x29, 0xb7, 0xee, 0x37, 0x2e, 0x42, 0x5d, 0xfd, 0x8b, 0x01, 0x2d, 0x40, + 0xed, 0xc9, 0xe6, 0x5e, 0x67, 0x86, 0x7d, 0xec, 0x6f, 0xed, 0x75, 0x2a, 0x37, 0xee, 0xc2, 0x52, + 0xe6, 0x7d, 0x0d, 0x5a, 0x86, 0xd6, 0xa0, 0xbf, 0xbb, 0xf5, 0xf9, 0xe3, 0x9f, 0x5b, 0xe6, 0x76, + 0x7f, 0xeb, 0x17, 0x9d, 0x19, 0xb4, 0x02, 0x1d, 0x05, 0xda, 0x7d, 0xfc, 0x44, 0x40, 0x2b, 0x37, + 0xbe, 0xc9, 0xe8, 0x08, 0x46, 0x67, 0x61, 0x79, 0xf3, 0xf1, 0xee, 0x93, 0xfe, 0xce, 0xee, 0xb6, + 0x69, 0x6d, 0x9a, 0xdb, 0xfd, 0x27, 0xdb, 0x5b, 0x9d, 0x99, 0x34, 0xd8, 0xdc, 0xdf, 0xdd, 0xdd, + 0xd9, 0xfd, 0xa2, 0x53, 0x61, 0x54, 0x13, 0xf0, 0xf6, 0xcf, 0x77, 0x18, 0x72, 0x35, 0x8d, 0xbc, + 0xbf, 0xfb, 0x60, 0xf7, 0xf1, 0xcf, 0x76, 0x3b, 0xb5, 0x8d, 0x7f, 0x6f, 0x41, 0x5b, 0x39, 0x71, + 0x1c, 0xf0, 0xfb, 0xd3, 0x4f, 0x61, 0x41, 0xfd, 0xc1, 0x24, 0xb1, 0x1e, 0xe9, 0x7f, 0xc3, 0xf4, + 0xba, 0xf9, 0x0e, 0x19, 0x0c, 0xcd, 0xa0, 0x3d, 0x1e, 0x9c, 0x68, 0x6f, 0x99, 0x2e, 0xe9, 0xe1, + 0x42, 0xee, 0xb1, 0x54, 0x6f, 0xad, 0xac, 0x3b, 0xa6, 0x38, 0x60, 0x11, 0x89, 0xfe, 0x0e, 0x15, + 0xad, 0xe9, 0x7e, 0x3b, 0xff, 0xbe, 0xb5, 0x77, 0xb9, 0xb4, 0x3f, 0x26, 0xfa, 0x0b, 0xe8, 0x64, + 0x5f, 0xa0, 0xa2, 0xa4, 0x86, 0x52, 0xf2, 0xba, 0xb5, 0xf7, 0xc6, 0x14, 0x0c, 0x9d, 0x74, 0xee, + 0x15, 0xe7, 0x7a, 0xf9, 0x3b, 0xbc, 0x1c, 0xe9, 0xb2, 0xc7, 0x7d, 0x62, 0x2b, 0xd2, 0x6f, 0x90, + 0x90, 0xfe, 0x76, 0xb2, 0xe0, 0x2d, 0x9a, 0xb6, 0x15, 0xc5, 0x8f, 0x97, 0x8c, 0x19, 0xf4, 0x15, + 0x2c, 0x65, 0xae, 0xce, 0x50, 0x32, 0xaa, 0xf8, 0x22, 0xb0, 0xb7, 0x5e, 0x8e, 0x90, 0x96, 0x9b, + 0x7e, 0x31, 0x96, 0x92, 0x5b, 0xc1, 0x6d, 0x5b, 0x4a, 0x6e, 0x85, 0x37, 0x6a, 0x5c, 0xbd, 0x52, + 0xd7, 0x5f, 0x9a, 0x7a, 0x15, 0xdd, 0xb5, 0xf5, 0xd6, 0xca, 0xba, 0xf5, 0xe5, 0x67, 0xae, 0xbe, + 0xb4, 0xe5, 0x17, 0xdf, 0xa8, 0xf5, 0xd6, 0xcb, 0x11, 0xb2, 0xb2, 0x4a, 0xea, 0xf0, 0x19, 0x59, + 0xe5, 0xae, 0x7d, 0x32, 0xb2, 0xca, 0x17, 0xf0, 0xa5, 0xac, 0x32, 0x05, 0xf5, 0xcb, 0xa5, 0x05, + 0xc7, 0xbc, 0xac, 0x8a, 0x6b, 0x98, 0xc6, 0x0c, 0xfa, 0x16, 0xba, 0x65, 0x55, 0x41, 0x94, 0x38, + 0xed, 0x97, 0x94, 0x2d, 0x7b, 0xd7, 0x4f, 0x80, 0x19, 0x4f, 0xd9, 0x87, 0xba, 0x2a, 0x01, 0xa2, + 0xc4, 0xa0, 0x64, 0xea, 0x8e, 0xbd, 0xf3, 0x05, 0x3d, 0x31, 0x89, 0xf7, 0x61, 0x96, 0x41, 0xd1, + 0x4a, 0x0a, 0x49, 0x0d, 0x3d, 0x9b, 0x81, 0xc6, 0xc3, 0x3e, 0x82, 0x79, 0x51, 0x31, 0x43, 0x49, + 0x2a, 0x93, 0x2a, 0xcf, 0xf5, 0x56, 0x73, 0xf0, 0x78, 0xf0, 0x97, 0xe2, 0x7f, 0x6e, 0xb2, 0xf4, + 0x85, 0x2e, 0xa4, 0xfe, 0x4f, 0x91, 0x2e, 0xb0, 0xf5, 0x2e, 0x16, 0x77, 0xea, 0x2a, 0x92, 0x89, + 0x07, 0xd6, 0xca, 0x02, 0xb6, 0x9c, 0x8a, 0x14, 0x07, 0x80, 0xc6, 0x0c, 0xb2, 0x44, 0x15, 0x29, + 0x43, 0xd8, 0x28, 0xd6, 0xad, 0x14, 0xf1, 0x2b, 0x53, 0x71, 0xe2, 0x09, 0x0e, 0xe0, 0x4c, 0x41, + 0x3e, 0x8c, 0xae, 0x64, 0x84, 0x5f, 0x94, 0x8a, 0xf7, 0xde, 0x9c, 0x8e, 0xa4, 0x8b, 0x48, 0xaa, + 0xf7, 0x39, 0xdd, 0x26, 0x68, 0x5a, 0xbd, 0x9a, 0x83, 0xab, 0xc1, 0x1b, 0x7f, 0x5e, 0x83, 0x45, + 0x51, 0xb5, 0x90, 0x3e, 0xed, 0x0b, 0x80, 0xa4, 0xb0, 0x86, 0x7a, 0xa9, 0x65, 0xa6, 0x2a, 0x8c, + 0xbd, 0x0b, 0x85, 0x7d, 0xba, 0xf0, 0xb5, 0x1a, 0x99, 0x26, 0xfc, 0x7c, 0xe5, 0x4d, 0x13, 0x7e, + 0x41, 0x59, 0xcd, 0x98, 0x41, 0x5b, 0xd0, 0x88, 0x0b, 0x37, 0x48, 0xab, 0xf7, 0x64, 0xaa, 0x4e, + 0xbd, 0x5e, 0x51, 0x97, 0xce, 0x91, 0x56, 0x8c, 0xd1, 0x38, 0xca, 0x97, 0x78, 0x34, 0x8e, 0x8a, + 0xea, 0x37, 0xc9, 0xea, 0x44, 0xee, 0x99, 0x5d, 0x5d, 0x2a, 0x9d, 0xcf, 0xae, 0x2e, 0x9d, 0xae, + 0x1a, 0x33, 0x9f, 0x5f, 0xfc, 0xf5, 0x6f, 0xd6, 0x2a, 0xff, 0xf9, 0x9b, 0xb5, 0x99, 0x3f, 0x7b, + 0xb1, 0x56, 0xf9, 0xf5, 0x8b, 0xb5, 0xca, 0xbf, 0xbd, 0x58, 0xab, 0xfc, 0xf7, 0x8b, 0xb5, 0xca, + 0x77, 0xff, 0xb3, 0x36, 0x73, 0x30, 0xcf, 0xff, 0xf8, 0xf9, 0xde, 0x6f, 0x03, 0x00, 0x00, 0xff, + 0xff, 0x19, 0x8a, 0xba, 0xfd, 0xac, 0x3b, 0x00, 0x00, } diff --git a/pkg/kubelet/apis/cri/v1alpha1/runtime/api.proto b/pkg/kubelet/apis/cri/v1alpha1/runtime/api.proto index 490771ee9dd..b4d077900e9 100644 --- a/pkg/kubelet/apis/cri/v1alpha1/runtime/api.proto +++ b/pkg/kubelet/apis/cri/v1alpha1/runtime/api.proto @@ -61,6 +61,8 @@ service RuntimeService { // ContainerStatus returns status of the container. If the container is not // present, returns an error. rpc ContainerStatus(ContainerStatusRequest) returns (ContainerStatusResponse) {} + // UpdateContainerResources updates ContainerConfig of the container. + rpc UpdateContainerResources(UpdateContainerResourcesRequest) returns (UpdateContainerResourcesResponse) {} // ExecSync runs a command in a container synchronously. rpc ExecSync(ExecSyncRequest) returns (ExecSyncResponse) {} @@ -445,6 +447,10 @@ message LinuxContainerResources { int64 memory_limit_in_bytes = 4; // OOMScoreAdj adjusts the oom-killer score. Default: 0 (not specified). int64 oom_score_adj = 5; + // CpusetCpus constrains the allowed set of logical CPUs. Default: "" (not specified). + string cpuset_cpus = 6; + // CpusetMems constrains the allowed set of memory nodes. Default: "" (not specified). + string cpuset_mems = 7; } // SELinuxOption are the labels to be applied to the container. @@ -772,6 +778,15 @@ message ContainerStatusResponse { ContainerStatus status = 1; } +message UpdateContainerResourcesRequest { + // ID of the container to update. + string container_id = 1; + // Resource configuration specific to Linux containers. + LinuxContainerResources linux = 2; +} + +message UpdateContainerResourcesResponse {} + message ExecSyncRequest { // ID of the container. string container_id = 1; diff --git a/pkg/kubelet/apis/stats/v1alpha1/BUILD b/pkg/kubelet/apis/stats/v1alpha1/BUILD index f5d8e191fe7..26c1951081c 100644 --- a/pkg/kubelet/apis/stats/v1alpha1/BUILD +++ b/pkg/kubelet/apis/stats/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["types.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], ) diff --git a/pkg/kubelet/cadvisor/BUILD b/pkg/kubelet/cadvisor/BUILD index 33996af2b99..15cea0e8d72 100644 --- a/pkg/kubelet/cadvisor/BUILD +++ b/pkg/kubelet/cadvisor/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,41 +9,59 @@ load( go_library( name = "go_default_library", srcs = [ - "cadvisor_linux.go", + "cadvisor_unsupported.go", "doc.go", "types.go", "util.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "cadvisor_linux.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "cadvisor_windows.go", + ], + "//conditions:default": [], + }), deps = [ - "//pkg/kubelet/types:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/google/cadvisor/cache/memory:go_default_library", - "//vendor/github.com/google/cadvisor/container:go_default_library", "//vendor/github.com/google/cadvisor/events:go_default_library", - "//vendor/github.com/google/cadvisor/fs:go_default_library", - "//vendor/github.com/google/cadvisor/http:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - "//vendor/github.com/google/cadvisor/manager:go_default_library", - "//vendor/github.com/google/cadvisor/metrics:go_default_library", - "//vendor/github.com/google/cadvisor/utils/sysfs:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//pkg/kubelet/types:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/github.com/google/cadvisor/cache/memory:go_default_library", + "//vendor/github.com/google/cadvisor/container:go_default_library", + "//vendor/github.com/google/cadvisor/fs:go_default_library", + "//vendor/github.com/google/cadvisor/http:go_default_library", + "//vendor/github.com/google/cadvisor/manager:go_default_library", + "//vendor/github.com/google/cadvisor/metrics:go_default_library", + "//vendor/github.com/google/cadvisor/utils/sysfs:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + ], + "//conditions:default": [], + }), ) go_test( name = "go_default_test", - srcs = ["cadvisor_linux_test.go"], + srcs = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "cadvisor_linux_test.go", + ], + "//conditions:default": [], + }), library = ":go_default_library", - tags = ["automanaged"], - deps = [ - "//pkg/kubelet/types:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/metrics:go_default_library", - ], + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//pkg/kubelet/types:go_default_library", + "//vendor/github.com/google/cadvisor/info/v1:go_default_library", + "//vendor/github.com/google/cadvisor/metrics:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/kubelet/cadvisor/cadvisor_linux.go b/pkg/kubelet/cadvisor/cadvisor_linux.go index dd95c5234c4..77135b2871b 100644 --- a/pkg/kubelet/cadvisor/cadvisor_linux.go +++ b/pkg/kubelet/cadvisor/cadvisor_linux.go @@ -101,7 +101,7 @@ func New(address string, port uint, runtime string, rootPath string) (Interface, sysFs := sysfs.NewRealSysFs() // Create and start the cAdvisor container manager. - m, err := manager.New(memory.New(statsCacheDuration, nil), sysFs, maxHousekeepingInterval, allowDynamicHousekeeping, cadvisormetrics.MetricSet{cadvisormetrics.NetworkTcpUsageMetrics: struct{}{}}, http.DefaultClient) + m, err := manager.New(memory.New(statsCacheDuration, nil), sysFs, maxHousekeepingInterval, allowDynamicHousekeeping, cadvisormetrics.MetricSet{cadvisormetrics.NetworkTcpUsageMetrics: struct{}{}, cadvisormetrics.NetworkUdpUsageMetrics: struct{}{}}, http.DefaultClient) if err != nil { return nil, err } diff --git a/pkg/kubelet/cadvisor/testing/BUILD b/pkg/kubelet/cadvisor/testing/BUILD index 820d5c9772d..bd41574fec1 100644 --- a/pkg/kubelet/cadvisor/testing/BUILD +++ b/pkg/kubelet/cadvisor/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "cadvisor_fake.go", "cadvisor_mock.go", ], - tags = ["automanaged"], deps = [ "//pkg/kubelet/cadvisor:go_default_library", "//vendor/github.com/google/cadvisor/events:go_default_library", diff --git a/pkg/kubelet/certificate/BUILD b/pkg/kubelet/certificate/BUILD index 6c0010e48ce..6def1dd40c1 100644 --- a/pkg/kubelet/certificate/BUILD +++ b/pkg/kubelet/certificate/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "kubelet.go", "transport.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/componentconfig:go_default_library", "//pkg/util/file:go_default_library", @@ -43,7 +40,6 @@ go_test( "transport_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/kubelet/certificate/bootstrap/BUILD b/pkg/kubelet/certificate/bootstrap/BUILD index cff67f14cee..669d9307577 100644 --- a/pkg/kubelet/certificate/bootstrap/BUILD +++ b/pkg/kubelet/certificate/bootstrap/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["bootstrap_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", @@ -22,7 +19,6 @@ go_test( go_library( name = "go_default_library", srcs = ["bootstrap.go"], - tags = ["automanaged"], deps = [ "//pkg/kubelet/util/csr:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/pkg/kubelet/certificate/kubelet.go b/pkg/kubelet/certificate/kubelet.go index aed82739c15..5c85c66f225 100644 --- a/pkg/kubelet/certificate/kubelet.go +++ b/pkg/kubelet/certificate/kubelet.go @@ -31,15 +31,15 @@ import ( // NewKubeletServerCertificateManager creates a certificate manager for the kubelet when retrieving a server certificate // or returns an error. -func NewKubeletServerCertificateManager(kubeClient clientset.Interface, kubeCfg *componentconfig.KubeletConfiguration, nodeName types.NodeName, ips []net.IP, hostnames []string) (Manager, error) { +func NewKubeletServerCertificateManager(kubeClient clientset.Interface, kubeCfg *componentconfig.KubeletConfiguration, nodeName types.NodeName, ips []net.IP, hostnames []string, certDirectory string) (Manager, error) { var certSigningRequestClient clientcertificates.CertificateSigningRequestInterface if kubeClient != nil && kubeClient.Certificates() != nil { certSigningRequestClient = kubeClient.Certificates().CertificateSigningRequests() } certificateStore, err := NewFileStore( "kubelet-server", - kubeCfg.CertDirectory, - kubeCfg.CertDirectory, + certDirectory, + certDirectory, kubeCfg.TLSCertFile, kubeCfg.TLSPrivateKeyFile) if err != nil { diff --git a/pkg/kubelet/client/BUILD b/pkg/kubelet/client/BUILD index 366d1536755..8a2ff7041dc 100644 --- a/pkg/kubelet/client/BUILD +++ b/pkg/kubelet/client/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["kubelet_client.go"], - tags = ["automanaged"], deps = [ "//pkg/util/node:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -28,9 +25,6 @@ go_test( srcs = ["kubelet_client_test.go"], data = ["//pkg/client/testdata"], library = ":go_default_library", - tags = [ - "automanaged", - ], deps = [ "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", diff --git a/pkg/kubelet/cm/BUILD b/pkg/kubelet/cm/BUILD index 98455c5adf6..5bce88a5a28 100644 --- a/pkg/kubelet/cm/BUILD +++ b/pkg/kubelet/cm/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,70 +9,92 @@ load( go_library( name = "go_default_library", srcs = [ - "cgroup_manager_linux.go", + "cgroup_manager_unsupported.go", "container_manager.go", - "container_manager_linux.go", "container_manager_stub.go", - "helpers_linux.go", - "node_container_manager.go", - "pod_container_manager_linux.go", + "container_manager_unsupported.go", + "helpers_unsupported.go", "pod_container_manager_stub.go", - "qos_container_manager_linux.go", + "pod_container_manager_unsupported.go", "types.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "cgroup_manager_linux.go", + "container_manager_linux.go", + "helpers_linux.go", + "node_container_manager.go", + "pod_container_manager_linux.go", + "qos_container_manager_linux.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "container_manager_windows.go", + ], + "//conditions:default": [], + }), deps = [ - "//pkg/api/v1/helper/qos:go_default_library", - "//pkg/api/v1/resource:go_default_library", "//pkg/apis/componentconfig:go_default_library", "//pkg/kubelet/cadvisor:go_default_library", - "//pkg/kubelet/cm/util:go_default_library", - "//pkg/kubelet/events:go_default_library", "//pkg/kubelet/eviction/api:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//pkg/kubelet/qos:go_default_library", - "//pkg/util/file:go_default_library", "//pkg/util/mount:go_default_library", - "//pkg/util/oom:go_default_library", - "//pkg/util/procfs:go_default_library", - "//pkg/util/sysctl:go_default_library", - "//pkg/util/version:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/client-go/tools/record:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//pkg/api/v1/helper/qos:go_default_library", + "//pkg/api/v1/resource:go_default_library", + "//pkg/kubelet/cm/util:go_default_library", + "//pkg/kubelet/events:go_default_library", + "//pkg/kubelet/metrics:go_default_library", + "//pkg/kubelet/qos:go_default_library", + "//pkg/util/file:go_default_library", + "//pkg/util/oom:go_default_library", + "//pkg/util/procfs:go_default_library", + "//pkg/util/sysctl:go_default_library", + "//pkg/util/version:go_default_library", + "//vendor/github.com/google/cadvisor/info/v2:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + ], + "//conditions:default": [], + }), ) go_test( name = "go_default_test", srcs = [ - "cgroup_manager_linux_test.go", - "cgroup_manager_test.go", - "container_manager_linux_test.go", - "helpers_linux_test.go", - "node_container_manager_test.go", - ], + "container_manager_unsupported_test.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "cgroup_manager_linux_test.go", + "cgroup_manager_test.go", + "container_manager_linux_test.go", + "helpers_linux_test.go", + "node_container_manager_test.go", + ], + "//conditions:default": [], + }), library = ":go_default_library", - tags = ["automanaged"], deps = [ - "//pkg/apis/componentconfig:go_default_library", - "//pkg/kubelet/eviction/api:go_default_library", "//pkg/util/mount:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//pkg/apis/componentconfig:go_default_library", + "//pkg/kubelet/eviction/api:go_default_library", + "//vendor/github.com/stretchr/testify/assert:go_default_library", + "//vendor/github.com/stretchr/testify/require:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/kubelet/cm/util/BUILD b/pkg/kubelet/cm/util/BUILD index 36688c5753c..66030b3f25c 100644 --- a/pkg/kubelet/cm/util/BUILD +++ b/pkg/kubelet/cm/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,12 +7,21 @@ load( go_library( name = "go_default_library", - srcs = ["cgroups_linux.go"], - tags = ["automanaged"], - deps = [ - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/utils:go_default_library", - ], + srcs = [ + "cgroups_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "cgroups_linux.go", + ], + "//conditions:default": [], + }), + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/utils:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/kubelet/config/BUILD b/pkg/kubelet/config/BUILD index 7ea9a36b8e3..fc6b62394b5 100644 --- a/pkg/kubelet/config/BUILD +++ b/pkg/kubelet/config/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,11 +14,15 @@ go_library( "config.go", "doc.go", "file.go", - "file_linux.go", + "file_unsupported.go", "http.go", "sources.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "file_linux.go", + ], + "//conditions:default": [], + }), deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", @@ -35,7 +37,6 @@ go_library( "//pkg/util/config:go_default_library", "//pkg/util/hash:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/golang.org/x/exp/inotify:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", @@ -48,7 +49,12 @@ go_library( "//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", "//vendor/k8s.io/client-go/tools/record:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/golang.org/x/exp/inotify:go_default_library", + ], + "//conditions:default": [], + }), ) go_test( @@ -57,11 +63,14 @@ go_test( "apiserver_test.go", "common_test.go", "config_test.go", - "file_linux_test.go", "http_test.go", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "file_linux_test.go", + ], + "//conditions:default": [], + }), library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", @@ -74,13 +83,17 @@ go_test( "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/client-go/kubernetes/scheme: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/util/testing:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/kubelet/configmap/BUILD b/pkg/kubelet/configmap/BUILD index bd68be6b23b..c078a2b2f26 100644 --- a/pkg/kubelet/configmap/BUILD +++ b/pkg/kubelet/configmap/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "configmap_manager.go", "fake_manager.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/pod:go_default_library", "//pkg/kubelet/util:go_default_library", @@ -45,7 +42,6 @@ go_test( name = "go_default_test", srcs = ["configmap_manager_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/kubelet/container/BUILD b/pkg/kubelet/container/BUILD index 473d2ca1feb..6f68454ab62 100644 --- a/pkg/kubelet/container/BUILD +++ b/pkg/kubelet/container/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,15 +14,19 @@ go_library( "container_reference_manager.go", "helpers.go", "os.go", - "pty_linux.go", + "pty_unsupported.go", "ref.go", "resize.go", "runtime.go", "runtime_cache.go", "runtime_cache_fake.go", "sync_result.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "pty_linux.go", + ], + "//conditions:default": [], + }), deps = [ "//pkg/api:go_default_library", "//pkg/kubelet/apis/cri/v1alpha1/runtime:go_default_library", @@ -34,7 +36,6 @@ go_library( "//pkg/volume:go_default_library", "//third_party/forked/golang/expansion:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/kr/pty:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", @@ -45,7 +46,12 @@ go_library( "//vendor/k8s.io/client-go/tools/reference:go_default_library", "//vendor/k8s.io/client-go/tools/remotecommand:go_default_library", "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/kr/pty:go_default_library", + ], + "//conditions:default": [], + }), ) go_test( @@ -57,7 +63,6 @@ go_test( "sync_result_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", @@ -71,9 +76,8 @@ go_test( go_test( name = "go_default_xtest", srcs = ["runtime_cache_test.go"], - tags = ["automanaged"], deps = [ - "//pkg/kubelet/container:go_default_library", + ":go_default_library", "//pkg/kubelet/container/testing:go_default_library", ], ) diff --git a/pkg/kubelet/container/testing/BUILD b/pkg/kubelet/container/testing/BUILD index 47766e9243f..3efa80948c6 100644 --- a/pkg/kubelet/container/testing/BUILD +++ b/pkg/kubelet/container/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "os.go", "runtime_mock.go", ], - tags = ["automanaged"], deps = [ "//pkg/kubelet/container:go_default_library", "//pkg/volume:go_default_library", diff --git a/pkg/kubelet/custommetrics/BUILD b/pkg/kubelet/custommetrics/BUILD index 3098e296a39..8f2814384e2 100644 --- a/pkg/kubelet/custommetrics/BUILD +++ b/pkg/kubelet/custommetrics/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["custom_metrics.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/api/core/v1:go_default_library"], ) @@ -19,7 +16,6 @@ go_test( name = "go_default_test", srcs = ["custom_metrics_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/kubelet/dockershim/BUILD b/pkg/kubelet/dockershim/BUILD index d95675cd271..c4554ded65e 100644 --- a/pkg/kubelet/dockershim/BUILD +++ b/pkg/kubelet/dockershim/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -24,12 +22,19 @@ go_library( "docker_streaming.go", "exec.go", "helpers.go", - "helpers_linux.go", + "helpers_unsupported.go", "naming.go", "security_context.go", "selinux_util.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "helpers_linux.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "helpers_windows.go", + ], + "//conditions:default": [], + }), deps = [ "//pkg/apis/componentconfig:go_default_library", "//pkg/credentialprovider:go_default_library", @@ -82,18 +87,21 @@ go_test( "docker_legacy_test.go", "docker_sandbox_test.go", "docker_service_test.go", - "helpers_linux_test.go", "helpers_test.go", "naming_test.go", "security_context_test.go", "selinux_util_test.go", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "helpers_linux_test.go", + ], + "//conditions:default": [], + }), data = [ "fixtures/seccomp/sub/subtest", "fixtures/seccomp/test", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubelet/apis/cri/v1alpha1/runtime:go_default_library", "//pkg/kubelet/container:go_default_library", @@ -114,9 +122,13 @@ go_test( "//vendor/github.com/golang/mock/gomock:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/k8s.io/api/core/v1:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/kubelet/dockershim/cm/BUILD b/pkg/kubelet/dockershim/cm/BUILD index 426cc237d68..a83c367b85e 100644 --- a/pkg/kubelet/dockershim/cm/BUILD +++ b/pkg/kubelet/dockershim/cm/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,19 +9,30 @@ go_library( name = "go_default_library", srcs = [ "container_manager.go", - "container_manager_linux.go", - ], - tags = ["automanaged"], + "container_manager_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "container_manager_linux.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "container_manager_windows.go", + ], + "//conditions:default": [], + }), deps = [ - "//pkg/kubelet/cm:go_default_library", "//pkg/kubelet/dockershim/libdocker:go_default_library", - "//pkg/kubelet/qos:go_default_library", - "//pkg/util/version:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//pkg/kubelet/cm:go_default_library", + "//pkg/kubelet/qos:go_default_library", + "//pkg/util/version:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/kubelet/dockershim/docker_container.go b/pkg/kubelet/dockershim/docker_container.go index 064dd6edf85..d33d8c01179 100644 --- a/pkg/kubelet/dockershim/docker_container.go +++ b/pkg/kubelet/dockershim/docker_container.go @@ -402,3 +402,22 @@ func (ds *dockerService) ContainerStatus(containerID string) (*runtimeapi.Contai LogPath: r.Config.Labels[containerLogPathLabelKey], }, nil } + +func (ds *dockerService) UpdateContainerResources(containerID string, resources *runtimeapi.LinuxContainerResources) error { + updateConfig := dockercontainer.UpdateConfig{ + Resources: dockercontainer.Resources{ + CPUPeriod: resources.CpuPeriod, + CPUQuota: resources.CpuQuota, + CPUShares: resources.CpuShares, + Memory: resources.MemoryLimitInBytes, + CpusetCpus: resources.CpusetCpus, + CpusetMems: resources.CpusetMems, + }, + } + + err := ds.client.UpdateContainerResources(containerID, updateConfig) + if err != nil { + return fmt.Errorf("failed to update container %q: %v", containerID, err) + } + return nil +} diff --git a/pkg/kubelet/dockershim/errors/BUILD b/pkg/kubelet/dockershim/errors/BUILD index 0d35ca937bd..1a00c4f8509 100644 --- a/pkg/kubelet/dockershim/errors/BUILD +++ b/pkg/kubelet/dockershim/errors/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["errors.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/kubelet/dockershim/libdocker/BUILD b/pkg/kubelet/dockershim/libdocker/BUILD index fa284b9ed0b..c6f09bd9bb7 100644 --- a/pkg/kubelet/dockershim/libdocker/BUILD +++ b/pkg/kubelet/dockershim/libdocker/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "legacy_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/hash:go_default_library", "//vendor/github.com/docker/docker/api/types:go_default_library", @@ -36,7 +33,6 @@ go_library( "kube_docker_client.go", "legacy.go", ], - tags = ["automanaged"], deps = [ "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/metrics:go_default_library", diff --git a/pkg/kubelet/dockershim/libdocker/client.go b/pkg/kubelet/dockershim/libdocker/client.go index 0307a82dc53..f6c16154738 100644 --- a/pkg/kubelet/dockershim/libdocker/client.go +++ b/pkg/kubelet/dockershim/libdocker/client.go @@ -48,6 +48,7 @@ type Interface interface { CreateContainer(dockertypes.ContainerCreateConfig) (*dockercontainer.ContainerCreateCreatedBody, error) StartContainer(id string) error StopContainer(id string, timeout time.Duration) error + UpdateContainerResources(id string, updateConfig dockercontainer.UpdateConfig) error RemoveContainer(id string, opts dockertypes.ContainerRemoveOptions) error InspectImageByRef(imageRef string) (*dockertypes.ImageInspect, error) InspectImageByID(imageID string) (*dockertypes.ImageInspect, error) diff --git a/pkg/kubelet/dockershim/libdocker/fake_client.go b/pkg/kubelet/dockershim/libdocker/fake_client.go index 341dcd484c4..48f8d6c451a 100644 --- a/pkg/kubelet/dockershim/libdocker/fake_client.go +++ b/pkg/kubelet/dockershim/libdocker/fake_client.go @@ -625,6 +625,10 @@ func (f *FakeDockerClient) RemoveContainer(id string, opts dockertypes.Container return fmt.Errorf("container not stopped") } +func (f *FakeDockerClient) UpdateContainerResources(id string, updateConfig dockercontainer.UpdateConfig) error { + return nil +} + // Logs is a test-spy implementation of Interface.Logs. // It adds an entry "logs" to the internal method call record. func (f *FakeDockerClient) Logs(id string, opts dockertypes.ContainerLogsOptions, sopts StreamOptions) error { diff --git a/pkg/kubelet/dockershim/libdocker/instrumented_client.go b/pkg/kubelet/dockershim/libdocker/instrumented_client.go index 13d4a3e6493..ff3d7f69c27 100644 --- a/pkg/kubelet/dockershim/libdocker/instrumented_client.go +++ b/pkg/kubelet/dockershim/libdocker/instrumented_client.go @@ -108,6 +108,15 @@ func (in instrumentedInterface) RemoveContainer(id string, opts dockertypes.Cont return err } +func (in instrumentedInterface) UpdateContainerResources(id string, updateConfig dockercontainer.UpdateConfig) error { + const operation = "update_container" + defer recordOperation(operation, time.Now()) + + err := in.client.UpdateContainerResources(id, updateConfig) + recordError(operation, err) + return err +} + func (in instrumentedInterface) InspectImageByRef(image string) (*dockertypes.ImageInspect, error) { const operation = "inspect_image" defer recordOperation(operation, time.Now()) diff --git a/pkg/kubelet/dockershim/libdocker/kube_docker_client.go b/pkg/kubelet/dockershim/libdocker/kube_docker_client.go index b74a5d04355..7a2f4e6d66b 100644 --- a/pkg/kubelet/dockershim/libdocker/kube_docker_client.go +++ b/pkg/kubelet/dockershim/libdocker/kube_docker_client.go @@ -171,6 +171,16 @@ func (d *kubeDockerClient) RemoveContainer(id string, opts dockertypes.Container return err } +func (d *kubeDockerClient) UpdateContainerResources(id string, updateConfig dockercontainer.UpdateConfig) error { + ctx, cancel := d.getTimeoutContext() + defer cancel() + _, err := d.client.ContainerUpdate(ctx, id, updateConfig) + if ctxErr := contextError(ctx); ctxErr != nil { + return ctxErr + } + return err +} + func (d *kubeDockerClient) inspectImageRaw(ref string) (*dockertypes.ImageInspect, error) { ctx, cancel := d.getTimeoutContext() defer cancel() diff --git a/pkg/kubelet/dockershim/remote/BUILD b/pkg/kubelet/dockershim/remote/BUILD index 7aa94a20050..9460128d657 100644 --- a/pkg/kubelet/dockershim/remote/BUILD +++ b/pkg/kubelet/dockershim/remote/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "docker_server.go", "docker_service.go", ], - tags = ["automanaged"], deps = [ "//pkg/kubelet/apis/cri:go_default_library", "//pkg/kubelet/apis/cri/v1alpha1/runtime:go_default_library", diff --git a/pkg/kubelet/dockershim/remote/docker_service.go b/pkg/kubelet/dockershim/remote/docker_service.go index 13a5e8bfd25..f51004aa058 100644 --- a/pkg/kubelet/dockershim/remote/docker_service.go +++ b/pkg/kubelet/dockershim/remote/docker_service.go @@ -147,6 +147,14 @@ func (d *dockerService) ContainerStatus(ctx context.Context, r *runtimeapi.Conta return &runtimeapi.ContainerStatusResponse{Status: status}, nil } +func (d *dockerService) UpdateContainerResources(ctx context.Context, r *runtimeapi.UpdateContainerResourcesRequest) (*runtimeapi.UpdateContainerResourcesResponse, error) { + err := d.runtimeService.UpdateContainerResources(r.ContainerId, r.Linux) + if err != nil { + return nil, err + } + return &runtimeapi.UpdateContainerResourcesResponse{}, nil +} + func (d *dockerService) ExecSync(ctx context.Context, r *runtimeapi.ExecSyncRequest) (*runtimeapi.ExecSyncResponse, error) { stdout, stderr, err := d.runtimeService.ExecSync(r.ContainerId, r.Cmd, time.Duration(r.Timeout)*time.Second) var exitCode int32 diff --git a/pkg/kubelet/dockershim/testing/BUILD b/pkg/kubelet/dockershim/testing/BUILD index cc21e75d1b3..9400d0efa7f 100644 --- a/pkg/kubelet/dockershim/testing/BUILD +++ b/pkg/kubelet/dockershim/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = ["//pkg/kubelet/dockershim/errors:go_default_library"], ) diff --git a/pkg/kubelet/envvars/BUILD b/pkg/kubelet/envvars/BUILD index 6b710f1a784..335fb9ef673 100644 --- a/pkg/kubelet/envvars/BUILD +++ b/pkg/kubelet/envvars/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "envvars.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/helper:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -24,9 +21,8 @@ go_library( go_test( name = "go_default_xtest", srcs = ["envvars_test.go"], - tags = ["automanaged"], deps = [ - "//pkg/kubelet/envvars:go_default_library", + ":go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ], diff --git a/pkg/kubelet/events/BUILD b/pkg/kubelet/events/BUILD index bcca6b23aea..eb4d17dddf3 100644 --- a/pkg/kubelet/events/BUILD +++ b/pkg/kubelet/events/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["event.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/kubelet/eviction/BUILD b/pkg/kubelet/eviction/BUILD index 27639e09415..0d796fdd3a7 100644 --- a/pkg/kubelet/eviction/BUILD +++ b/pkg/kubelet/eviction/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "helpers_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", @@ -40,10 +37,14 @@ go_library( "doc.go", "eviction_manager.go", "helpers.go", - "threshold_notifier_linux.go", + "threshold_notifier_unsupported.go", "types.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "threshold_notifier_linux.go", + ], + "//conditions:default": [], + }), deps = [ "//pkg/api:go_default_library", "//pkg/api/v1/helper/qos:go_default_library", @@ -59,7 +60,6 @@ go_library( "//pkg/kubelet/util/format:go_default_library", "//pkg/quota/evaluator/core:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -68,7 +68,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/tools/record:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/kubelet/eviction/api/BUILD b/pkg/kubelet/eviction/api/BUILD index 9328c46993b..e36c2fc1cfd 100644 --- a/pkg/kubelet/eviction/api/BUILD +++ b/pkg/kubelet/eviction/api/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["types.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library"], ) diff --git a/pkg/kubelet/gpu/BUILD b/pkg/kubelet/gpu/BUILD index c90963272ef..885d267ad29 100644 --- a/pkg/kubelet/gpu/BUILD +++ b/pkg/kubelet/gpu/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "gpu_manager_stub.go", "types.go", ], - tags = ["automanaged"], deps = ["//vendor/k8s.io/api/core/v1:go_default_library"], ) diff --git a/pkg/kubelet/gpu/nvidia/BUILD b/pkg/kubelet/gpu/nvidia/BUILD index c785ddebad1..71f110e8a07 100644 --- a/pkg/kubelet/gpu/nvidia/BUILD +++ b/pkg/kubelet/gpu/nvidia/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "helpers.go", "nvidia_gpu_manager.go", ], - tags = ["automanaged"], deps = [ "//pkg/kubelet/dockershim/libdocker:go_default_library", "//pkg/kubelet/gpu:go_default_library", @@ -42,7 +39,6 @@ go_test( name = "go_default_test", srcs = ["nvidia_gpu_manager_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubelet/dockershim/libdocker:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", diff --git a/pkg/kubelet/images/BUILD b/pkg/kubelet/images/BUILD index 0ca1ebf00de..e67fb3b7640 100644 --- a/pkg/kubelet/images/BUILD +++ b/pkg/kubelet/images/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "puller.go", "types.go", ], - tags = ["automanaged"], deps = [ "//pkg/kubelet/cadvisor:go_default_library", "//pkg/kubelet/container:go_default_library", @@ -42,7 +39,6 @@ go_test( "image_manager_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubelet/cadvisor/testing:go_default_library", "//pkg/kubelet/container:go_default_library", diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index b562e5e9be3..03e43ed1d77 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -74,6 +74,7 @@ import ( "k8s.io/kubernetes/pkg/kubelet/gpu" "k8s.io/kubernetes/pkg/kubelet/gpu/nvidia" "k8s.io/kubernetes/pkg/kubelet/images" + "k8s.io/kubernetes/pkg/kubelet/kubeletconfig" "k8s.io/kubernetes/pkg/kubelet/kuberuntime" "k8s.io/kubernetes/pkg/kubelet/lifecycle" "k8s.io/kubernetes/pkg/kubelet/metrics" @@ -189,7 +190,15 @@ type Bootstrap interface { } // Builder creates and initializes a Kubelet instance -type Builder func(kubeCfg *componentconfig.KubeletConfiguration, kubeDeps *Dependencies, crOptions *options.ContainerRuntimeOptions, hostnameOverride, nodeIP, providerID string) (Bootstrap, error) +type Builder func(kubeCfg *componentconfig.KubeletConfiguration, + kubeDeps *Dependencies, + 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 @@ -218,23 +227,24 @@ type Dependencies struct { Options []Option // Injected Dependencies - Auth server.AuthInterface - CAdvisorInterface cadvisor.Interface - Cloud cloudprovider.Interface - ContainerManager cm.ContainerManager - DockerClient libdocker.Interface - EventClient v1core.EventsGetter - KubeClient clientset.Interface - ExternalKubeClient clientgoclientset.Interface - Mounter mount.Interface - NetworkPlugins []network.NetworkPlugin - OOMAdjuster *oom.OOMAdjuster - OSInterface kubecontainer.OSInterface - PodConfig *config.PodConfig - Recorder record.EventRecorder - Writer kubeio.Writer - VolumePlugins []volume.VolumePlugin - TLSOptions *server.TLSOptions + Auth server.AuthInterface + CAdvisorInterface cadvisor.Interface + Cloud cloudprovider.Interface + ContainerManager cm.ContainerManager + DockerClient libdocker.Interface + EventClient v1core.EventsGetter + KubeClient clientset.Interface + ExternalKubeClient clientgoclientset.Interface + Mounter mount.Interface + NetworkPlugins []network.NetworkPlugin + OOMAdjuster *oom.OOMAdjuster + OSInterface kubecontainer.OSInterface + PodConfig *config.PodConfig + Recorder record.EventRecorder + Writer kubeio.Writer + VolumePlugins []volume.VolumePlugin + TLSOptions *server.TLSOptions + KubeletConfigController *kubeletconfig.Controller } // makePodSourceConfig creates a config.PodConfig from the given @@ -284,9 +294,17 @@ func getRuntimeAndImageServices(config *componentconfig.KubeletConfiguration) (i // NewMainKubelet instantiates a new Kubelet object along with all the required internal modules. // No initialization of Kubelet and its modules should happen here. -func NewMainKubelet(kubeCfg *componentconfig.KubeletConfiguration, kubeDeps *Dependencies, crOptions *options.ContainerRuntimeOptions, hostnameOverride, nodeIP, providerID string) (*Kubelet, error) { - if kubeCfg.RootDirectory == "" { - return nil, fmt.Errorf("invalid root directory %q", kubeCfg.RootDirectory) +func NewMainKubelet(kubeCfg *componentconfig.KubeletConfiguration, + kubeDeps *Dependencies, + crOptions *options.ContainerRuntimeOptions, + hostnameOverride, + nodeIP, + providerID, + cloudProvider, + certDirectory, + rootDirectory string) (*Kubelet, error) { + if rootDirectory == "" { + return nil, fmt.Errorf("invalid root directory %q", rootDirectory) } if kubeCfg.SyncFrequency.Duration <= 0 { return nil, fmt.Errorf("invalid sync frequency %d", kubeCfg.SyncFrequency.Duration) @@ -429,7 +447,7 @@ func NewMainKubelet(kubeCfg *componentconfig.KubeletConfiguration, kubeDeps *Dep hostname: hostname, nodeName: nodeName, kubeClient: kubeDeps.KubeClient, - rootDirectory: kubeCfg.RootDirectory, + rootDirectory: rootDirectory, resyncInterval: kubeCfg.SyncFrequency.Duration, sourcesReady: config.NewSourcesReady(kubeDeps.PodConfig.SeenAllSources), registerNode: kubeCfg.RegisterNode, @@ -443,8 +461,8 @@ func NewMainKubelet(kubeCfg *componentconfig.KubeletConfiguration, kubeDeps *Dep recorder: kubeDeps.Recorder, cadvisor: kubeDeps.CAdvisorInterface, cloud: kubeDeps.Cloud, - autoDetectCloudProvider: (componentconfigv1alpha1.AutoDetectCloudProvider == kubeCfg.CloudProvider), - externalCloudProvider: cloudprovider.IsExternal(kubeCfg.CloudProvider), + autoDetectCloudProvider: (componentconfigv1alpha1.AutoDetectCloudProvider == cloudProvider), + externalCloudProvider: cloudprovider.IsExternal(cloudProvider), providerID: providerID, nodeRef: nodeRef, nodeLabels: kubeCfg.NodeLabels, @@ -696,7 +714,7 @@ func NewMainKubelet(kubeCfg *componentconfig.KubeletConfiguration, kubeDeps *Dep ips = append(ips, cloudIPs...) names := append([]string{klet.GetHostname(), hostnameOverride}, cloudNames...) - klet.serverCertificateManager, err = certificate.NewKubeletServerCertificateManager(klet.kubeClient, kubeCfg, klet.nodeName, ips, names) + 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) } diff --git a/pkg/kubelet/kubelet_pods.go b/pkg/kubelet/kubelet_pods.go index f98a57cc5e5..b3e752f49e2 100644 --- a/pkg/kubelet/kubelet_pods.go +++ b/pkg/kubelet/kubelet_pods.go @@ -472,7 +472,7 @@ func (kl *Kubelet) makeEnvironmentVariables(pod *v1.Pod, container *v1.Container if len(envFrom.Prefix) > 0 { k = envFrom.Prefix + k } - if errMsgs := utilvalidation.IsCIdentifier(k); len(errMsgs) != 0 { + if errMsgs := utilvalidation.IsEnvVarName(k); len(errMsgs) != 0 { invalidKeys = append(invalidKeys, k) continue } @@ -507,7 +507,7 @@ func (kl *Kubelet) makeEnvironmentVariables(pod *v1.Pod, container *v1.Container if len(envFrom.Prefix) > 0 { k = envFrom.Prefix + k } - if errMsgs := utilvalidation.IsCIdentifier(k); len(errMsgs) != 0 { + if errMsgs := utilvalidation.IsEnvVarName(k); len(errMsgs) != 0 { invalidKeys = append(invalidKeys, k) continue } diff --git a/pkg/kubelet/kubelet_pods_test.go b/pkg/kubelet/kubelet_pods_test.go index 16b8bf68b89..986de4fac8c 100644 --- a/pkg/kubelet/kubelet_pods_test.go +++ b/pkg/kubelet/kubelet_pods_test.go @@ -1219,14 +1219,14 @@ func TestMakeEnvironmentVariables(t *testing.T) { Name: "test-secret", }, Data: map[string][]byte{ - "1234": []byte("abc"), - "1z": []byte("abc"), - "key": []byte("value"), + "1234": []byte("abc"), + "1z": []byte("abc"), + "key.1": []byte("value"), }, }, expectedEnvs: []kubecontainer.EnvVar{ { - Name: "key", + Name: "key.1", Value: "value", }, }, @@ -1250,12 +1250,12 @@ func TestMakeEnvironmentVariables(t *testing.T) { Name: "test-secret", }, Data: map[string][]byte{ - "1234": []byte("abc"), + "1234.name": []byte("abc"), }, }, expectedEnvs: []kubecontainer.EnvVar{ { - Name: "p_1234", + Name: "p_1234.name", Value: "abc", }, }, diff --git a/pkg/kubelet/kubelet_resources.go b/pkg/kubelet/kubelet_resources.go index c5d73b796bb..15e4d9ac238 100644 --- a/pkg/kubelet/kubelet_resources.go +++ b/pkg/kubelet/kubelet_resources.go @@ -43,7 +43,7 @@ func (kl *Kubelet) defaultPodLimitsForDownwardAPI(pod *v1.Pod, container *v1.Con return nil, nil, fmt.Errorf("failed to find node object, expected a node") } allocatable := node.Status.Allocatable - glog.Errorf("allocatable: %v", allocatable) + glog.Infof("allocatable: %v", allocatable) 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) diff --git a/pkg/kubelet/kubeletconfig/BUILD b/pkg/kubelet/kubeletconfig/BUILD new file mode 100644 index 00000000000..b85d49d1627 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/BUILD @@ -0,0 +1,66 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = [ + "configsync.go", + "controller.go", + "rollback.go", + "watch.go", + ], + deps = [ + "//pkg/apis/componentconfig:go_default_library", + "//pkg/apis/componentconfig/validation:go_default_library", + "//pkg/kubelet/kubeletconfig/badconfig:go_default_library", + "//pkg/kubelet/kubeletconfig/checkpoint:go_default_library", + "//pkg/kubelet/kubeletconfig/checkpoint/store:go_default_library", + "//pkg/kubelet/kubeletconfig/configfiles:go_default_library", + "//pkg/kubelet/kubeletconfig/startups:go_default_library", + "//pkg/kubelet/kubeletconfig/status:go_default_library", + "//pkg/kubelet/kubeletconfig/util/equal:go_default_library", + "//pkg/kubelet/kubeletconfig/util/filesystem:go_default_library", + "//pkg/kubelet/kubeletconfig/util/log:go_default_library", + "//pkg/kubelet/kubeletconfig/util/panic:go_default_library", + "//pkg/version:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/tools/cache:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//pkg/kubelet/kubeletconfig/badconfig:all-srcs", + "//pkg/kubelet/kubeletconfig/checkpoint:all-srcs", + "//pkg/kubelet/kubeletconfig/configfiles:all-srcs", + "//pkg/kubelet/kubeletconfig/startups:all-srcs", + "//pkg/kubelet/kubeletconfig/status:all-srcs", + "//pkg/kubelet/kubeletconfig/util/codec:all-srcs", + "//pkg/kubelet/kubeletconfig/util/equal:all-srcs", + "//pkg/kubelet/kubeletconfig/util/files:all-srcs", + "//pkg/kubelet/kubeletconfig/util/filesystem:all-srcs", + "//pkg/kubelet/kubeletconfig/util/log:all-srcs", + "//pkg/kubelet/kubeletconfig/util/panic:all-srcs", + "//pkg/kubelet/kubeletconfig/util/test:all-srcs", + ], + tags = ["automanaged"], +) diff --git a/pkg/kubelet/kubeletconfig/OWNERS b/pkg/kubelet/kubeletconfig/OWNERS new file mode 100644 index 00000000000..99d321aac10 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/OWNERS @@ -0,0 +1,5 @@ +approvers: +- mtaufen +- dchen1107 +reviewers: +- sig-node-reviewers diff --git a/pkg/kubelet/kubeletconfig/badconfig/BUILD b/pkg/kubelet/kubeletconfig/badconfig/BUILD new file mode 100644 index 00000000000..82fecc72678 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/badconfig/BUILD @@ -0,0 +1,47 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = [ + "badconfig_test.go", + "fstracker_test.go", + ], + library = ":go_default_library", + deps = [ + "//pkg/kubelet/kubeletconfig/util/files:go_default_library", + "//pkg/kubelet/kubeletconfig/util/filesystem:go_default_library", + "//pkg/kubelet/kubeletconfig/util/test:go_default_library", + ], +) + +go_library( + name = "go_default_library", + srcs = [ + "badconfig.go", + "fstracker.go", + ], + deps = [ + "//pkg/kubelet/kubeletconfig/util/files:go_default_library", + "//pkg/kubelet/kubeletconfig/util/filesystem:go_default_library", + "//pkg/kubelet/kubeletconfig/util/log:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/kubelet/kubeletconfig/badconfig/badconfig.go b/pkg/kubelet/kubeletconfig/badconfig/badconfig.go new file mode 100644 index 00000000000..0374192695a --- /dev/null +++ b/pkg/kubelet/kubeletconfig/badconfig/badconfig.go @@ -0,0 +1,83 @@ +/* +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 badconfig + +import ( + "encoding/json" + "fmt" + "time" +) + +// Tracker tracks "bad" configurations in a storage layer +type Tracker interface { + // Initialize sets up the storage layer + Initialize() error + // MarkBad marks `uid` as a bad config and records `reason` as the reason for marking it bad + MarkBad(uid, reason string) error + // Entry returns the Entry for `uid` if it exists in the tracker, otherise nil + Entry(uid string) (*Entry, error) +} + +// Entry describes when a configuration was marked bad and why +type Entry struct { + Time string `json:"time"` + Reason string `json:"reason"` +} + +// markBad makes an entry in `m` for the config with `uid` and reason `reason` +func markBad(m map[string]Entry, uid, reason string) { + now := time.Now() + entry := Entry{ + Time: now.Format(time.RFC3339), // use RFC3339 time format + Reason: reason, + } + m[uid] = entry +} + +// getEntry returns the Entry for `uid` in `m`, or nil if no such entry exists +func getEntry(m map[string]Entry, uid string) *Entry { + entry, ok := m[uid] + if ok { + return &entry + } + return nil +} + +// encode retuns a []byte representation of `m`, for saving `m` to a storage layer +func encode(m map[string]Entry) ([]byte, error) { + data, err := json.Marshal(m) + if err != nil { + return nil, err + } + return data, nil +} + +// decode transforms a []byte into a `map[string]Entry`, or returns an error if it can't produce said map +// if `data` is empty, returns an empty map +func decode(data []byte) (map[string]Entry, error) { + // create the map + m := map[string]Entry{} + // if the data is empty, just return the empty map + if len(data) == 0 { + return m, nil + } + // otherwise unmarshal the json + if err := json.Unmarshal(data, &m); err != nil { + return nil, fmt.Errorf("failed to unmarshal, error: %v", err) + } + return m, nil +} diff --git a/pkg/kubelet/kubeletconfig/badconfig/badconfig_test.go b/pkg/kubelet/kubeletconfig/badconfig/badconfig_test.go new file mode 100644 index 00000000000..617219eeb6c --- /dev/null +++ b/pkg/kubelet/kubeletconfig/badconfig/badconfig_test.go @@ -0,0 +1,157 @@ +/* +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 badconfig + +import ( + "fmt" + "reflect" + "testing" + "time" +) + +func TestMarkBad(t *testing.T) { + // build a map with one entry + m := map[string]Entry{} + uid := "uid" + reason := "reason" + markBad(m, uid, reason) + + // the entry should exist for uid + entry, ok := m[uid] + if !ok { + t.Fatalf("expect entry for uid %q, but none exists", uid) + } + + // the entry's reason should match the reason it was marked bad with + if entry.Reason != reason { + t.Errorf("expect Entry.Reason %q, but got %q", reason, entry.Reason) + } + + // the entry's timestamp should be in RFC3339 format + if err := assertRFC3339(entry.Time); err != nil { + t.Errorf("expect Entry.Time to use RFC3339 format, but got %q, error: %v", entry.Time, err) + } + + // it should be the only entry in the map thus far + if n := len(m); n != 1 { + t.Errorf("expect one entry in the map, but got %d", n) + } + +} + +func TestGetEntry(t *testing.T) { + nowstamp := time.Now().Format(time.RFC3339) + uid := "uid" + expect := &Entry{ + Time: nowstamp, + Reason: "reason", + } + m := map[string]Entry{uid: *expect} + + // should return nil for entries that don't exist + bogus := "bogus-uid" + if e := getEntry(m, bogus); e != nil { + t.Errorf("expect nil for entries that don't exist (uid: %q), but got %#v", bogus, e) + } + + // should return non-nil for entries that exist + if e := getEntry(m, uid); e == nil { + t.Errorf("expect non-nil for entries that exist (uid: %q), but got nil", uid) + } else if !reflect.DeepEqual(expect, e) { + // entry should match what we inserted for the given UID + t.Errorf("expect entry for uid %q to match %#v, but got %#v", uid, expect, e) + } +} + +func TestEncode(t *testing.T) { + nowstamp := time.Now().Format(time.RFC3339) + uid := "uid" + expect := fmt.Sprintf(`{"%s":{"time":"%s","reason":"reason"}}`, uid, nowstamp) + m := map[string]Entry{uid: { + Time: nowstamp, + Reason: "reason", + }} + + data, err := encode(m) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + json := string(data) + + if json != expect { + t.Errorf("expect encoding of %#v to match %q, but got %q", m, expect, json) + } +} + +func TestDecode(t *testing.T) { + nowstamp := time.Now().Format(time.RFC3339) + uid := "uid" + valid := []byte(fmt.Sprintf(`{"%s":{"time":"%s","reason":"reason"}}`, uid, nowstamp)) + expect := map[string]Entry{uid: { + Time: nowstamp, + Reason: "reason", + }} + + // decoding valid json should result in an object with the correct values + if m, err := decode(valid); err != nil { + t.Errorf("expect decoding valid json %q to produce a map, but got error: %v", valid, err) + } else if !reflect.DeepEqual(expect, m) { + // m should equal expected decoded object + t.Errorf("expect decoding valid json %q to produce %#v, but got %#v", valid, expect, m) + } + + // decoding invalid json should return an error + invalid := []byte(`invalid`) + if m, err := decode(invalid); err == nil { + t.Errorf("expect decoding invalid json %q to return an error, but decoded to %#v", invalid, m) + } +} + +func TestRoundTrip(t *testing.T) { + nowstamp := time.Now().Format(time.RFC3339) + uid := "uid" + expect := map[string]Entry{uid: { + Time: nowstamp, + Reason: "reason", + }} + + // test that encoding and decoding an object results in the same value + data, err := encode(expect) + if err != nil { + t.Fatalf("failed to encode %#v, error: %v", expect, err) + } + after, err := decode(data) + if err != nil { + t.Fatalf("failed to decode %q, error: %v", string(data), err) + } + if !reflect.DeepEqual(expect, after) { + t.Errorf("expect round-tripping %#v to result in the same value, but got %#v", expect, after) + } +} + +func assertRFC3339(s string) error { + tm, err := time.Parse(time.RFC3339, s) + if err != nil { + return fmt.Errorf("expect RFC3339 format, but failed to parse, error: %v", err) + } + // parsing succeeded, now finish round-trip and compare + rt := tm.Format(time.RFC3339) + if rt != s { + return fmt.Errorf("expect RFC3339 format, but failed to round trip unchanged, original %q, round-trip %q", s, rt) + } + return nil +} diff --git a/pkg/kubelet/kubeletconfig/badconfig/fstracker.go b/pkg/kubelet/kubeletconfig/badconfig/fstracker.go new file mode 100644 index 00000000000..a90ec26dd5c --- /dev/null +++ b/pkg/kubelet/kubeletconfig/badconfig/fstracker.go @@ -0,0 +1,105 @@ +/* +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 badconfig + +import ( + "path/filepath" + + utilfiles "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files" + utilfs "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/filesystem" + utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" +) + +const ( + badConfigsFile = "bad-configs.json" +) + +// fsTracker tracks bad config in the local filesystem +type fsTracker struct { + // fs is the filesystem to use for storage operations; can be mocked for testing + fs utilfs.Filesystem + // trackingDir is the absolute path to the storage directory for fsTracker + trackingDir string +} + +// NewFsTracker returns a new Tracker that will store information in the `trackingDir` +func NewFsTracker(fs utilfs.Filesystem, trackingDir string) Tracker { + return &fsTracker{ + fs: fs, + trackingDir: trackingDir, + } +} + +func (tracker *fsTracker) Initialize() error { + utillog.Infof("initializing bad config tracking directory %q", tracker.trackingDir) + if err := utilfiles.EnsureDir(tracker.fs, tracker.trackingDir); err != nil { + return err + } + if err := utilfiles.EnsureFile(tracker.fs, filepath.Join(tracker.trackingDir, badConfigsFile)); err != nil { + return err + } + return nil +} + +func (tracker *fsTracker) MarkBad(uid, reason string) error { + m, err := tracker.load() + if err != nil { + return err + } + // create the bad config entry in the map + markBad(m, uid, reason) + // save the file + if err := tracker.save(m); err != nil { + return err + } + return nil +} + +func (tracker *fsTracker) Entry(uid string) (*Entry, error) { + m, err := tracker.load() + if err != nil { + return nil, err + } + // return the entry, or nil if it doesn't exist + return getEntry(m, uid), nil +} + +// load loads the bad-config-tracking file from disk and decodes the map encoding it contains +func (tracker *fsTracker) load() (map[string]Entry, error) { + path := filepath.Join(tracker.trackingDir, badConfigsFile) + // load the file + data, err := tracker.fs.ReadFile(path) + if err != nil { + return nil, err + } + return decode(data) +} + +// save replaces the contents of the bad-config-tracking file with the encoding of `m` +func (tracker *fsTracker) save(m map[string]Entry) error { + // encode the map + data, err := encode(m) + if err != nil { + return err + } + // save the file + path := filepath.Join(tracker.trackingDir, badConfigsFile) + if err := utilfiles.ReplaceFile(tracker.fs, path, data); err != nil { + return err + } + return nil +} diff --git a/pkg/kubelet/kubeletconfig/badconfig/fstracker_test.go b/pkg/kubelet/kubeletconfig/badconfig/fstracker_test.go new file mode 100644 index 00000000000..25b234b18b0 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/badconfig/fstracker_test.go @@ -0,0 +1,255 @@ +/* +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 badconfig + +import ( + "fmt" + "path/filepath" + "reflect" + "testing" + "time" + + utilfiles "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files" + utilfs "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/filesystem" + utiltest "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/test" +) + +const testTrackingDir = "/test-tracking-dir" + +// TODO(mtaufen): this file reuses a lot of test code from badconfig_test.go, should consolidate + +func newInitializedFakeFsTracker() (*fsTracker, error) { + fs := utilfs.NewFakeFs() + tracker := NewFsTracker(fs, testTrackingDir) + if err := tracker.Initialize(); err != nil { + return nil, err + } + return tracker.(*fsTracker), nil +} + +func TestFsTrackerInitialize(t *testing.T) { + tracker, err := newInitializedFakeFsTracker() + if err != nil { + t.Fatalf("fsTracker.Initialize() failed with error: %v", err) + } + + // check that testTrackingDir exists + _, err = tracker.fs.Stat(testTrackingDir) + if err != nil { + t.Fatalf("expect %q to exist, but stat failed with error: %v", testTrackingDir, err) + } + + // check that testTrackingDir contains the badConfigsFile + path := filepath.Join(testTrackingDir, badConfigsFile) + _, err = tracker.fs.Stat(path) + if err != nil { + t.Fatalf("expect %q to exist, but stat failed with error: %v", path, err) + } +} + +func TestFsTrackerMarkBad(t *testing.T) { + tracker, err := newInitializedFakeFsTracker() + if err != nil { + t.Fatalf("failed to construct a tracker, error: %v", err) + } + + // create a bad config entry in the fs + uid := "uid" + reason := "reason" + tracker.MarkBad(uid, reason) + + // load the map from the fs + m, err := tracker.load() + if err != nil { + t.Fatalf("failed to load bad-config data, error: %v", err) + } + + // the entry should exist for uid + entry, ok := m[uid] + if !ok { + t.Fatalf("expect entry for uid %q, but none exists", uid) + } + + // the entry's reason should match the reason it was marked bad with + if entry.Reason != reason { + t.Errorf("expect Entry.Reason %q, but got %q", reason, entry.Reason) + } + + // the entry's timestamp should be in RFC3339 format + if err := assertRFC3339(entry.Time); err != nil { + t.Errorf("expect Entry.Time to use RFC3339 format, but got %q, error: %v", entry.Time, err) + } + + // it should be the only entry in the map thus far + if n := len(m); n != 1 { + t.Errorf("expect one entry in the map, but got %d", n) + } +} + +func TestFsTrackerEntry(t *testing.T) { + tracker, err := newInitializedFakeFsTracker() + if err != nil { + t.Fatalf("failed to construct a tracker, error: %v", err) + } + + // manually save a correct entry to fs + nowstamp := time.Now().Format(time.RFC3339) + uid := "uid" + expect := &Entry{ + Time: nowstamp, + Reason: "reason", + } + m := map[string]Entry{uid: *expect} + err = tracker.save(m) + if err != nil { + t.Fatalf("failed to save bad-config data, error: %v", err) + } + + // should return nil for entries that don't exist + bogus := "bogus-uid" + e, err := tracker.Entry(bogus) + if err != nil { + t.Errorf("expect nil for entries that don't exist (uid: %q), but got error: %v", bogus, err) + } else if e != nil { + t.Errorf("expect nil for entries that don't exist (uid: %q), but got %#v", bogus, e) + } + + // should return non-nil for entries that exist + e, err = tracker.Entry(uid) + if err != nil { + t.Errorf("expect non-nil for entries that exist (uid: %q), but got error: %v", uid, err) + } else if e == nil { + t.Errorf("expect non-nil for entries that exist (uid: %q), but got nil", uid) + } else if !reflect.DeepEqual(expect, e) { + // entry should match what we inserted for the given UID + t.Errorf("expect entry for uid %q to match %#v, but got %#v", uid, expect, e) + } +} + +// TODO(mtaufen): test loading invalid json (see startups/fstracker_test.go for example) +func TestFsTrackerLoad(t *testing.T) { + tracker, err := newInitializedFakeFsTracker() + if err != nil { + t.Fatalf("failed to construct a tracker, error: %v", err) + } + + uid := "uid" + nowstamp := time.Now().Format(time.RFC3339) + cases := []struct { + desc string + data []byte + expect map[string]Entry + err string + }{ + // empty file + {"empty file", []byte(""), map[string]Entry{}, ""}, + // empty map + {"empty map", []byte("{}"), map[string]Entry{}, ""}, + // valid json + {"valid json", []byte(fmt.Sprintf(`{"%s":{"time":"%s","reason":"reason"}}`, uid, nowstamp)), + map[string]Entry{uid: { + Time: nowstamp, + Reason: "reason", + }}, ""}, + // invalid json + {"invalid json", []byte(`*`), map[string]Entry{}, "failed to unmarshal"}, + } + + for _, c := range cases { + // save a file containing the correct serialization + utilfiles.ReplaceFile(tracker.fs, filepath.Join(testTrackingDir, badConfigsFile), c.data) + + // loading valid json should result in an object with the correct values + m, err := tracker.load() + if utiltest.SkipRest(t, c.desc, err, c.err) { + continue + } + if !reflect.DeepEqual(c.expect, m) { + // m should equal expected decoded object + t.Errorf("case %q, expect %#v but got %#v", c.desc, c.expect, m) + } + } +} + +func TestFsTrackerSave(t *testing.T) { + tracker, err := newInitializedFakeFsTracker() + if err != nil { + t.Fatalf("failed to construct a tracker, error: %v", err) + } + + uid := "uid" + nowstamp := time.Now().Format(time.RFC3339) + cases := []struct { + desc string + m map[string]Entry + expect string + err string + }{ + // empty map + {"empty map", map[string]Entry{}, "{}", ""}, + // 1-entry map + {"1-entry map", + map[string]Entry{uid: { + Time: nowstamp, + Reason: "reason", + }}, + fmt.Sprintf(`{"%s":{"time":"%s","reason":"reason"}}`, uid, nowstamp), ""}, + } + + for _, c := range cases { + if err := tracker.save(c.m); utiltest.SkipRest(t, c.desc, err, c.err) { + continue + } + + data, err := tracker.fs.ReadFile(filepath.Join(testTrackingDir, badConfigsFile)) + if err != nil { + t.Fatalf("failed to read bad-config file, error: %v", err) + } + json := string(data) + + if json != c.expect { + t.Errorf("case %q, expect %q but got %q", c.desc, c.expect, json) + } + } +} + +func TestFsTrackerRoundTrip(t *testing.T) { + tracker, err := newInitializedFakeFsTracker() + if err != nil { + t.Fatalf("failed to construct a tracker, error: %v", err) + } + + nowstamp := time.Now().Format(time.RFC3339) + uid := "uid" + expect := map[string]Entry{uid: { + Time: nowstamp, + Reason: "reason", + }} + + // test that saving and loading an object results in the same value + err = tracker.save(expect) + if err != nil { + t.Fatalf("failed to save bad-config data, error: %v", err) + } + after, err := tracker.load() + if err != nil { + t.Fatalf("failed to load bad-config data, error: %v", err) + } + if !reflect.DeepEqual(expect, after) { + t.Errorf("expect round-tripping %#v to result in the same value, but got %#v", expect, after) + } +} diff --git a/pkg/kubelet/kubeletconfig/checkpoint/BUILD b/pkg/kubelet/kubeletconfig/checkpoint/BUILD new file mode 100644 index 00000000000..e04e74148f8 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/checkpoint/BUILD @@ -0,0 +1,67 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = [ + "checkpoint_test.go", + "configmap_test.go", + "download_test.go", + ], + library = ":go_default_library", + deps = [ + "//pkg/api:go_default_library", + "//pkg/apis/componentconfig:go_default_library", + "//pkg/apis/componentconfig/v1alpha1:go_default_library", + "//pkg/kubelet/kubeletconfig/util/codec:go_default_library", + "//pkg/kubelet/kubeletconfig/util/test:go_default_library", + "//vendor/github.com/davecgh/go-spew/spew: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/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", + ], +) + +go_library( + name = "go_default_library", + srcs = [ + "checkpoint.go", + "configmap.go", + "download.go", + ], + deps = [ + "//pkg/api:go_default_library", + "//pkg/apis/componentconfig:go_default_library", + "//pkg/kubelet/kubeletconfig/util/codec:go_default_library", + "//pkg/kubelet/kubeletconfig/util/log: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/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//pkg/kubelet/kubeletconfig/checkpoint/store:all-srcs", + ], + tags = ["automanaged"], +) diff --git a/pkg/kubelet/kubeletconfig/checkpoint/checkpoint.go b/pkg/kubelet/kubeletconfig/checkpoint/checkpoint.go new file mode 100644 index 00000000000..20a8a853e70 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/checkpoint/checkpoint.go @@ -0,0 +1,71 @@ +/* +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 checkpoint + +import ( + "fmt" + + apiv1 "k8s.io/api/core/v1" + apiequality "k8s.io/apimachinery/pkg/api/equality" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/apis/componentconfig" +) + +// Checkpoint represents a local copy of a config source (payload) object +type Checkpoint interface { + // UID returns the UID of the config source object behind the Checkpoint + UID() string + // Parse parses the checkpoint into the internal KubeletConfiguration type + Parse() (*componentconfig.KubeletConfiguration, error) + // Encode returns a []byte representation of the config source object behind the Checkpoint + Encode() ([]byte, error) + + // object returns the underlying checkpointed object. If you want to compare sources for equality, use EqualCheckpoints, + // which compares the underlying checkpointed objects for semantic API equality. + object() interface{} +} + +// DecodeCheckpoint is a helper for using the apimachinery to decode serialized checkpoints +func DecodeCheckpoint(data []byte) (Checkpoint, error) { + // decode the checkpoint + obj, err := runtime.Decode(api.Codecs.UniversalDecoder(), data) + if err != nil { + return nil, fmt.Errorf("failed to decode, error: %v", err) + } + + // TODO(mtaufen): for now we assume we are trying to load a ConfigMap checkpoint, may need to extend this if we allow other checkpoint types + + // convert it to the external ConfigMap type, so we're consistently working with the external type outside of the on-disk representation + cm := &apiv1.ConfigMap{} + err = api.Scheme.Convert(obj, cm, nil) + if err != nil { + return nil, fmt.Errorf("failed to convert decoded object into a v1 ConfigMap, error: %v", err) + } + return NewConfigMapCheckpoint(cm) +} + +// EqualCheckpoints compares two Checkpoints for equality, if their underlying objects are equal, so are the Checkpoints +func EqualCheckpoints(a, b Checkpoint) bool { + if a != nil && b != nil { + return apiequality.Semantic.DeepEqual(a.object(), b.object()) + } + if a == nil && b == nil { + return true + } + return false +} diff --git a/pkg/kubelet/kubeletconfig/checkpoint/checkpoint_test.go b/pkg/kubelet/kubeletconfig/checkpoint/checkpoint_test.go new file mode 100644 index 00000000000..d9cc2595249 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/checkpoint/checkpoint_test.go @@ -0,0 +1,89 @@ +/* +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 checkpoint + +import ( + "testing" + + "github.com/davecgh/go-spew/spew" + + apiv1 "k8s.io/api/core/v1" + 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" + utilcodec "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec" + utiltest "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/test" +) + +// newUnsupportedEncoded returns an encoding of an object that does not have a Checkpoint implementation +func newUnsupportedEncoded(t *testing.T) []byte { + encoder, err := utilcodec.NewJSONEncoder(apiv1.GroupName) + if err != nil { + t.Fatalf("could not create an encoder, error: %v", err) + } + unsupported := &apiv1.Node{} + data, err := runtime.Encode(encoder, unsupported) + if err != nil { + t.Fatalf("could not encode object, error: %v", err) + } + return data +} + +func TestDecodeCheckpoint(t *testing.T) { + // generate correct Checkpoint for v1/ConfigMap test case + cm, err := NewConfigMapCheckpoint(&apiv1.ConfigMap{ObjectMeta: metav1.ObjectMeta{UID: types.UID("uid")}}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + // generate unsupported object encoding for unsupported type test case + unsupported := newUnsupportedEncoded(t) + + // test cases + cases := []struct { + desc string + data []byte + expect Checkpoint // expect a deeply-equal Checkpoint to be returned from Decode + err string // expect error to contain this substring + }{ + // v1/ConfigMap + {"v1/ConfigMap", []byte(`{"apiVersion": "v1","kind": "ConfigMap","metadata": {"uid": "uid"}}`), cm, ""}, + // malformed + {"malformed", []byte("malformed"), nil, "failed to decode"}, + // no UID + {"no UID", []byte(`{"apiVersion": "v1","kind": "ConfigMap"}`), nil, "ConfigMap must have a UID"}, + // well-formed, but unsupported type + {"well-formed, but unsupported encoded type", unsupported, nil, "failed to convert"}, + } + + for _, c := range cases { + cpt, err := DecodeCheckpoint(c.data) + if utiltest.SkipRest(t, c.desc, err, c.err) { + continue + } + // Unfortunately reflect.DeepEqual treats nil data structures as != empty data structures, so + // we have to settle for semantic equality of the underlying checkpointed API objects. + // If additional fields are added to the object that implements the Checkpoint interface, + // they should be added to a named sub-object to facilitate a DeepEquals comparison + // of the extra fields. + // decoded checkpoint should match expected checkpoint + if !apiequality.Semantic.DeepEqual(cpt.object(), c.expect.object()) { + t.Errorf("case %q, expect checkpoint %s but got %s", c.desc, spew.Sdump(c.expect), spew.Sdump(cpt)) + } + } +} diff --git a/pkg/kubelet/kubeletconfig/checkpoint/configmap.go b/pkg/kubelet/kubeletconfig/checkpoint/configmap.go new file mode 100644 index 00000000000..ff26005b211 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/checkpoint/configmap.go @@ -0,0 +1,88 @@ +/* +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 checkpoint + +import ( + "fmt" + + apiv1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/apis/componentconfig" + utilcodec "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec" +) + +const configMapConfigKey = "kubelet" + +// configMapCheckpoint implements Checkpoint, backed by a v1/ConfigMap config source object +type configMapCheckpoint struct { + configMap *apiv1.ConfigMap +} + +// NewConfigMapCheckpoint returns a Checkpoint backed by `cm`. `cm` must be non-nil +// and have a non-empty ObjectMeta.UID, or an error will be returned. +func NewConfigMapCheckpoint(cm *apiv1.ConfigMap) (Checkpoint, error) { + if cm == nil { + return nil, fmt.Errorf("ConfigMap must be non-nil to be treated as a Checkpoint") + } else if len(cm.ObjectMeta.UID) == 0 { + return nil, fmt.Errorf("ConfigMap must have a UID to be treated as a Checkpoint") + } + return &configMapCheckpoint{cm}, nil +} + +// UID returns the UID of a configMapCheckpoint +func (c *configMapCheckpoint) UID() string { + return string(c.configMap.UID) +} + +// implements Parse for v1/ConfigMap checkpoints +func (c *configMapCheckpoint) Parse() (*componentconfig.KubeletConfiguration, error) { + const emptyCfgErr = "config was empty, but some parameters are required" + + cm := c.configMap + + if len(cm.Data) == 0 { + return nil, fmt.Errorf(emptyCfgErr) + } + + // TODO(mtaufen): Once the KubeletConfiguration type is decomposed, extend this to a key for each sub-object + config, ok := cm.Data[configMapConfigKey] + if !ok { + return nil, fmt.Errorf("key %q not found in ConfigMap", configMapConfigKey) + } else if len(config) == 0 { + return nil, fmt.Errorf(emptyCfgErr) + } + + return utilcodec.DecodeKubeletConfiguration([]byte(config)) +} + +// Encode encodes a configMapCheckpoint +func (c *configMapCheckpoint) Encode() ([]byte, error) { + cm := c.configMap + encoder, err := utilcodec.NewJSONEncoder(apiv1.GroupName) + if err != nil { + return nil, err + } + data, err := runtime.Encode(encoder, cm) + if err != nil { + return nil, err + } + return data, nil +} + +func (c *configMapCheckpoint) object() interface{} { + return c.configMap +} diff --git a/pkg/kubelet/kubeletconfig/checkpoint/configmap_test.go b/pkg/kubelet/kubeletconfig/checkpoint/configmap_test.go new file mode 100644 index 00000000000..398e7cf992a --- /dev/null +++ b/pkg/kubelet/kubeletconfig/checkpoint/configmap_test.go @@ -0,0 +1,216 @@ +/* +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 checkpoint + +import ( + "fmt" + "testing" + + "github.com/davecgh/go-spew/spew" + + apiv1 "k8s.io/api/core/v1" + apiequality "k8s.io/apimachinery/pkg/api/equality" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/apis/componentconfig" + ccv1a1 "k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1" + utiltest "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/test" +) + +func TestNewConfigMapCheckpoint(t *testing.T) { + cases := []struct { + desc string + cm *apiv1.ConfigMap + err string + }{ + {"nil v1/ConfigMap", nil, "must be non-nil"}, + {"empty v1/ConfigMap", &apiv1.ConfigMap{}, "must have a UID"}, + {"populated v1/ConfigMap", + &apiv1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "name", + UID: types.UID("uid"), + }, + Data: map[string]string{ + "key1": "value1", + "key2": "value2", + }, + }, ""}, + } + + for _, c := range cases { + cpt, err := NewConfigMapCheckpoint(c.cm) + if utiltest.SkipRest(t, c.desc, err, c.err) { + continue + } + // underlying object should match the object passed in + if !apiequality.Semantic.DeepEqual(cpt.object(), c.cm) { + t.Errorf("case %q, expect Checkpoint %s but got %s", c.desc, spew.Sdump(c.cm), spew.Sdump(cpt)) + } + } +} + +func TestConfigMapCheckpointUID(t *testing.T) { + cases := []string{"", "uid", "376dfb73-56db-11e7-a01e-42010a800002"} + for _, uidIn := range cases { + cpt := &configMapCheckpoint{ + &apiv1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{UID: types.UID(uidIn)}, + }, + } + // UID method should return the correct value of the UID + uidOut := cpt.UID() + if uidIn != uidOut { + t.Errorf("expect UID() to return %q, but got %q", uidIn, uidOut) + } + } +} + +func TestConfigMapCheckpointParse(t *testing.T) { + // get the built-in default configuration + external := &ccv1a1.KubeletConfiguration{} + api.Scheme.Default(external) + defaultConfig := &componentconfig.KubeletConfiguration{} + err := api.Scheme.Convert(external, defaultConfig, nil) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + cases := []struct { + desc string + cm *apiv1.ConfigMap + expect *componentconfig.KubeletConfiguration + err string + }{ + {"empty data", &apiv1.ConfigMap{}, nil, "config was empty"}, + // missing kubelet key + {"missing kubelet key", &apiv1.ConfigMap{Data: map[string]string{ + "bogus": "stuff"}}, nil, fmt.Sprintf("key %q not found", configMapConfigKey)}, + // invalid format + {"invalid yaml", &apiv1.ConfigMap{Data: map[string]string{ + "kubelet": "*"}}, nil, "failed to decode"}, + {"invalid json", &apiv1.ConfigMap{Data: map[string]string{ + "kubelet": "{*"}}, nil, "failed to decode"}, + // invalid object + {"missing kind", &apiv1.ConfigMap{Data: map[string]string{ + "kubelet": `{"apiVersion":"componentconfig/v1alpha1"}`}}, nil, "failed to decode"}, + {"missing version", &apiv1.ConfigMap{Data: map[string]string{ + "kubelet": `{"kind":"KubeletConfiguration"}`}}, nil, "failed to decode"}, + {"unregistered kind", &apiv1.ConfigMap{Data: map[string]string{ + "kubelet": `{"kind":"BogusKind","apiVersion":"componentconfig/v1alpha1"}`}}, nil, "failed to decode"}, + {"unregistered version", &apiv1.ConfigMap{Data: map[string]string{ + "kubelet": `{"kind":"KubeletConfiguration","apiVersion":"bogusversion"}`}}, nil, "failed to decode"}, + // empty object with correct kind and version should result in the defaults for that kind and version + {"default from yaml", &apiv1.ConfigMap{Data: map[string]string{ + "kubelet": `kind: KubeletConfiguration +apiVersion: componentconfig/v1alpha1`}}, defaultConfig, ""}, + {"default from json", &apiv1.ConfigMap{Data: map[string]string{ + "kubelet": `{"kind":"KubeletConfiguration","apiVersion":"componentconfig/v1alpha1"}`}}, defaultConfig, ""}, + } + for _, c := range cases { + cpt := &configMapCheckpoint{c.cm} + kc, err := cpt.Parse() + if utiltest.SkipRest(t, c.desc, err, c.err) { + continue + } + // we expect the parsed configuration to match what we described in the ConfigMap + if !apiequality.Semantic.DeepEqual(c.expect, kc) { + t.Errorf("case %q, expect config %s but got %s", c.desc, spew.Sdump(c.expect), spew.Sdump(kc)) + } + } +} + +func TestConfigMapCheckpointEncode(t *testing.T) { + // only one case, based on output from the existing encoder, and since + // this is hard to test (key order isn't guaranteed), we should probably + // just stick to this test case and mostly rely on the round-trip test. + cases := []struct { + desc string + cpt *configMapCheckpoint + expect string + }{ + // we expect Checkpoints to be encoded as a json representation of the underlying API object + {"one-key", + &configMapCheckpoint{&apiv1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{Name: "one-key"}, + Data: map[string]string{"one": ""}}}, + `{"kind":"ConfigMap","apiVersion":"v1","metadata":{"name":"one-key","creationTimestamp":null},"data":{"one":""}} +`}, + } + + for _, c := range cases { + data, err := c.cpt.Encode() + // we don't expect any errors from encoding + if utiltest.SkipRest(t, c.desc, err, "") { + continue + } + if string(data) != c.expect { + t.Errorf("case %q, expect encoding %q but got %q", c.desc, c.expect, string(data)) + } + } +} + +func TestConfigMapCheckpointRoundTrip(t *testing.T) { + cases := []struct { + desc string + cpt *configMapCheckpoint + decodeErr string + }{ + // empty data + {"empty data", + &configMapCheckpoint{&apiv1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "empty-data-sha256-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + UID: "uid", + }, + Data: map[string]string{}}}, + ""}, + // two keys + {"two keys", + &configMapCheckpoint{&apiv1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "two-keys-sha256-2bff03d6249c8a9dc9a1436d087c124741361ccfac6615b81b67afcff5c42431", + UID: "uid", + }, + Data: map[string]string{"one": "", "two": "2"}}}, + ""}, + // missing uid + {"missing uid", + &configMapCheckpoint{&apiv1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "two-keys-sha256-2bff03d6249c8a9dc9a1436d087c124741361ccfac6615b81b67afcff5c42431", + UID: "", + }, + Data: map[string]string{"one": "", "two": "2"}}}, + "must have a UID"}, + } + for _, c := range cases { + // we don't expect any errors from encoding + data, err := c.cpt.Encode() + if utiltest.SkipRest(t, c.desc, err, "") { + continue + } + after, err := DecodeCheckpoint(data) + if utiltest.SkipRest(t, c.desc, err, c.decodeErr) { + continue + } + if !apiequality.Semantic.DeepEqual(c.cpt.object(), after.object()) { + t.Errorf("case %q, expect round-trip result %s but got %s", c.desc, spew.Sdump(c.cpt), spew.Sdump(after)) + } + } +} diff --git a/pkg/kubelet/kubeletconfig/checkpoint/download.go b/pkg/kubelet/kubeletconfig/checkpoint/download.go new file mode 100644 index 00000000000..b61b394ab4b --- /dev/null +++ b/pkg/kubelet/kubeletconfig/checkpoint/download.go @@ -0,0 +1,152 @@ +/* +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 checkpoint + +import ( + "fmt" + + apiv1 "k8s.io/api/core/v1" + apiequality "k8s.io/apimachinery/pkg/api/equality" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/kubernetes/pkg/api" + utilcodec "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec" + utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" +) + +// RemoteConfigSource represents a remote config source object that can be downloaded as a Checkpoint +type RemoteConfigSource interface { + // UID returns the UID of the remote config source object + UID() string + // Download downloads the remote config source object returns a Checkpoint backed by the object, + // or a sanitized failure reason and error if the download fails + Download(client clientset.Interface) (Checkpoint, string, error) + // Encode returns a []byte representation of the object behind the RemoteConfigSource + Encode() ([]byte, error) + + // object returns the underlying source object. If you want to compare sources for equality, use EqualRemoteConfigSources, + // which compares the underlying source objects for semantic API equality. + object() interface{} +} + +// NewRemoteConfigSource constructs a RemoteConfigSource from a v1/NodeConfigSource object, or returns +// a sanitized failure reason and an error if the `source` is blatantly invalid. +// You should only call this with a non-nil config source. +func NewRemoteConfigSource(source *apiv1.NodeConfigSource) (RemoteConfigSource, string, error) { + // exactly one subfield of the config source must be non-nil, toady ConfigMapRef is the only reference + if source.ConfigMapRef == nil { + reason := "invalid NodeConfigSource, exactly one subfield must be non-nil, but all were nil" + return nil, reason, fmt.Errorf("%s, NodeConfigSource was: %#v", reason, source) + } + + // validate the NodeConfigSource: + + // at this point we know we're using the ConfigMapRef subfield + ref := source.ConfigMapRef + + // name, namespace, and UID must all be non-empty for ConfigMapRef + if ref.Name == "" || ref.Namespace == "" || string(ref.UID) == "" { + reason := "invalid ObjectReference, all of UID, Name, and Namespace must be specified" + return nil, reason, fmt.Errorf("%s, ObjectReference was: %#v", reason, ref) + } + + return &remoteConfigMap{source}, "", nil +} + +// DecodeRemoteConfigSource is a helper for using the apimachinery to decode serialized RemoteConfigSources; +// e.g. the objects stored in the .cur and .lkg files by checkpoint/store/fsstore.go +func DecodeRemoteConfigSource(data []byte) (RemoteConfigSource, error) { + // decode the remote config source + obj, err := runtime.Decode(api.Codecs.UniversalDecoder(), data) + if err != nil { + return nil, fmt.Errorf("failed to decode, error: %v", err) + } + + // for now we assume we are trying to load an apiv1.NodeConfigSource, + // this may need to be extended if e.g. a new version of the api is born + + // convert it to the external NodeConfigSource type, so we're consistently working with the external type outside of the on-disk representation + cs := &apiv1.NodeConfigSource{} + err = api.Scheme.Convert(obj, cs, nil) + if err != nil { + return nil, fmt.Errorf("failed to convert decoded object into a v1 NodeConfigSource, error: %v", err) + } + source, _, err := NewRemoteConfigSource(cs) + return source, err +} + +// EqualRemoteConfigSources is a helper for comparing remote config sources by +// comparing the underlying API objects for semantic equality. +func EqualRemoteConfigSources(a, b RemoteConfigSource) bool { + if a != nil && b != nil { + return apiequality.Semantic.DeepEqual(a.object(), b.object()) + } + if a == nil && b == nil { + return true + } + return false +} + +// remoteConfigMap implements RemoteConfigSource for v1/ConfigMap config sources +type remoteConfigMap struct { + source *apiv1.NodeConfigSource +} + +func (r *remoteConfigMap) UID() string { + return string(r.source.ConfigMapRef.UID) +} + +func (r *remoteConfigMap) Download(client clientset.Interface) (Checkpoint, string, error) { + var reason string + + uid := string(r.source.ConfigMapRef.UID) + + utillog.Infof("attempting to download ConfigMap with UID %q", uid) + + // get the ConfigMap via namespace/name, there doesn't seem to be a way to get it by UID + cm, err := client.CoreV1().ConfigMaps(r.source.ConfigMapRef.Namespace).Get(r.source.ConfigMapRef.Name, metav1.GetOptions{}) + if err != nil { + reason = fmt.Sprintf("could not download ConfigMap with name %q from namespace %q", r.source.ConfigMapRef.Name, r.source.ConfigMapRef.Namespace) + return nil, reason, fmt.Errorf("%s, error: %v", reason, err) + } + + // ensure that UID matches the UID on the reference, the ObjectReference must be unambiguous + if r.source.ConfigMapRef.UID != cm.UID { + reason = fmt.Sprintf("invalid ObjectReference, UID %q does not match UID of downloaded ConfigMap %q", r.source.ConfigMapRef.UID, cm.UID) + return nil, reason, fmt.Errorf(reason) + } + + utillog.Infof("successfully downloaded ConfigMap with UID %q", uid) + return &configMapCheckpoint{cm}, "", nil +} + +func (r *remoteConfigMap) Encode() ([]byte, error) { + encoder, err := utilcodec.NewJSONEncoder(apiv1.GroupName) + if err != nil { + return nil, err + } + data, err := runtime.Encode(encoder, r.source) + if err != nil { + return nil, err + } + return data, nil +} + +func (r *remoteConfigMap) object() interface{} { + return r.source +} diff --git a/pkg/kubelet/kubeletconfig/checkpoint/download_test.go b/pkg/kubelet/kubeletconfig/checkpoint/download_test.go new file mode 100644 index 00000000000..496353919f4 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/checkpoint/download_test.go @@ -0,0 +1,134 @@ +/* +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 checkpoint + +import ( + "testing" + + "github.com/davecgh/go-spew/spew" + + apiv1 "k8s.io/api/core/v1" + apiequality "k8s.io/apimachinery/pkg/api/equality" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + fakeclient "k8s.io/client-go/kubernetes/fake" + utiltest "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/test" +) + +func TestNewRemoteConfigSource(t *testing.T) { + cases := []struct { + desc string + source *apiv1.NodeConfigSource + expect RemoteConfigSource + err string + }{ + // all NodeConfigSource subfields nil + {"all NodeConfigSource subfields nil", + &apiv1.NodeConfigSource{}, nil, "exactly one subfield must be non-nil"}, + {"ConfigMapRef: empty name, namespace, and UID", + &apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{}}, nil, "invalid ObjectReference"}, + // ConfigMapRef: empty name and namespace + {"ConfigMapRef: empty name and namespace", + &apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{UID: "uid"}}, nil, "invalid ObjectReference"}, + // ConfigMapRef: empty name and UID + {"ConfigMapRef: empty name and UID", + &apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Namespace: "namespace"}}, nil, "invalid ObjectReference"}, + // ConfigMapRef: empty namespace and UID + {"ConfigMapRef: empty namespace and UID", + &apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Name: "name"}}, nil, "invalid ObjectReference"}, + // ConfigMapRef: empty UID + {"ConfigMapRef: empty namespace and UID", + &apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Name: "name", Namespace: "namespace"}}, nil, "invalid ObjectReference"}, + // ConfigMapRef: empty namespace + {"ConfigMapRef: empty namespace and UID", + &apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Name: "name", UID: "uid"}}, nil, "invalid ObjectReference"}, + // ConfigMapRef: empty name + {"ConfigMapRef: empty namespace and UID", + &apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Namespace: "namespace", UID: "uid"}}, nil, "invalid ObjectReference"}, + // ConfigMapRef: valid reference + {"ConfigMapRef: valid reference", + &apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Name: "name", Namespace: "namespace", UID: "uid"}}, + &remoteConfigMap{&apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Name: "name", Namespace: "namespace", UID: "uid"}}}, ""}, + } + + for _, c := range cases { + src, _, err := NewRemoteConfigSource(c.source) + if utiltest.SkipRest(t, c.desc, err, c.err) { + continue + } + // underlying object should match the object passed in + if !apiequality.Semantic.DeepEqual(c.expect.object(), src.object()) { + t.Errorf("case %q, expect RemoteConfigSource %s but got %s", c.desc, spew.Sdump(c.expect), spew.Sdump(src)) + } + } +} + +func TestRemoteConfigMapUID(t *testing.T) { + cases := []string{"", "uid", "376dfb73-56db-11e7-a01e-42010a800002"} + for _, uidIn := range cases { + cpt := &remoteConfigMap{ + &apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Name: "name", Namespace: "namespace", UID: types.UID(uidIn)}}, + } + // UID method should return the correct value of the UID + uidOut := cpt.UID() + if uidIn != uidOut { + t.Errorf("expect UID() to return %q, but got %q", uidIn, uidOut) + } + } +} + +func TestRemoteConfigMapDownload(t *testing.T) { + cm := &apiv1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "name", + Namespace: "namespace", + UID: "uid", + }} + client := fakeclient.NewSimpleClientset(cm) + + cases := []struct { + desc string + source RemoteConfigSource + expect Checkpoint + err string + }{ + + // object doesn't exist + {"object doesn't exist", + &remoteConfigMap{&apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Name: "bogus", Namespace: "namespace", UID: "bogus"}}}, + nil, "could not download ConfigMap"}, + // UID of downloaded object doesn't match UID of referent found via namespace/name + {"UID is incorrect for namespace/name", + &remoteConfigMap{&apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Name: "name", Namespace: "namespace", UID: "bogus"}}}, + nil, "does not match UID"}, + // successful download + {"object exists and reference is correct", + &remoteConfigMap{&apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Name: "name", Namespace: "namespace", UID: "uid"}}}, + &configMapCheckpoint{cm}, ""}, + } + + for _, c := range cases { + cpt, _, err := c.source.Download(client) + if utiltest.SkipRest(t, c.desc, err, c.err) { + continue + } + // "downloaded" object should match the expected + if !apiequality.Semantic.DeepEqual(c.expect.object(), cpt.object()) { + t.Errorf("case %q, expect Checkpoint %s but got %s", c.desc, spew.Sdump(c.expect), spew.Sdump(cpt)) + } + } +} diff --git a/pkg/kubelet/kubeletconfig/checkpoint/store/BUILD b/pkg/kubelet/kubeletconfig/checkpoint/store/BUILD new file mode 100644 index 00000000000..44be6347300 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/checkpoint/store/BUILD @@ -0,0 +1,54 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = [ + "fsstore_test.go", + "store_test.go", + ], + library = ":go_default_library", + deps = [ + "//pkg/kubelet/kubeletconfig/checkpoint:go_default_library", + "//pkg/kubelet/kubeletconfig/util/files:go_default_library", + "//pkg/kubelet/kubeletconfig/util/filesystem:go_default_library", + "//pkg/kubelet/kubeletconfig/util/test:go_default_library", + "//vendor/github.com/davecgh/go-spew/spew:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + ], +) + +go_library( + name = "go_default_library", + srcs = [ + "fakestore.go", + "fsstore.go", + "store.go", + ], + deps = [ + "//pkg/kubelet/kubeletconfig/checkpoint:go_default_library", + "//pkg/kubelet/kubeletconfig/util/files:go_default_library", + "//pkg/kubelet/kubeletconfig/util/filesystem:go_default_library", + "//pkg/kubelet/kubeletconfig/util/log:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/kubelet/kubeletconfig/checkpoint/store/fakestore.go b/pkg/kubelet/kubeletconfig/checkpoint/store/fakestore.go new file mode 100644 index 00000000000..cb5d2491b26 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/checkpoint/store/fakestore.go @@ -0,0 +1,76 @@ +/* +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 store + +import ( + "fmt" + "time" + + "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint" +) + +// so far only implements Current(), LastKnownGood(), SetCurrent(), and SetLastKnownGood() +type fakeStore struct { + current checkpoint.RemoteConfigSource + lastKnownGood checkpoint.RemoteConfigSource +} + +func (s *fakeStore) Initialize() error { + return fmt.Errorf("Initialize method not supported") +} + +func (s *fakeStore) Exists(uid string) (bool, error) { + return false, fmt.Errorf("Exists method not supported") +} + +func (s *fakeStore) Save(c checkpoint.Checkpoint) error { + return fmt.Errorf("Save method not supported") +} + +func (s *fakeStore) Load(uid string) (checkpoint.Checkpoint, error) { + return nil, fmt.Errorf("Load method not supported") +} + +func (s *fakeStore) CurrentModified() (time.Time, error) { + return time.Time{}, fmt.Errorf("CurrentModified method not supported") +} + +func (s *fakeStore) Current() (checkpoint.RemoteConfigSource, error) { + return s.current, nil +} + +func (s *fakeStore) LastKnownGood() (checkpoint.RemoteConfigSource, error) { + return s.lastKnownGood, nil +} + +func (s *fakeStore) SetCurrent(source checkpoint.RemoteConfigSource) error { + s.current = source + return nil +} + +func (s *fakeStore) SetCurrentUpdated(source checkpoint.RemoteConfigSource) (bool, error) { + return setCurrentUpdated(s, source) +} + +func (s *fakeStore) SetLastKnownGood(source checkpoint.RemoteConfigSource) error { + s.lastKnownGood = source + return nil +} + +func (s *fakeStore) Reset() (bool, error) { + return false, fmt.Errorf("Reset method not supported") +} diff --git a/pkg/kubelet/kubeletconfig/checkpoint/store/fsstore.go b/pkg/kubelet/kubeletconfig/checkpoint/store/fsstore.go new file mode 100644 index 00000000000..710683fdf29 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/checkpoint/store/fsstore.go @@ -0,0 +1,163 @@ +/* +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 store + +import ( + "fmt" + "path/filepath" + "time" + + "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint" + utilfiles "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files" + utilfs "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/filesystem" + utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" +) + +const ( + curFile = ".cur" + lkgFile = ".lkg" +) + +// fsStore is for tracking checkpoints in the local filesystem, implements Store +type fsStore struct { + // fs is the filesystem to use for storage operations; can be mocked for testing + fs utilfs.Filesystem + // checkpointsDir is the absolute path to the storage directory for fsStore + checkpointsDir string +} + +// NewFsStore returns a Store that saves its data in `checkpointsDir` +func NewFsStore(fs utilfs.Filesystem, checkpointsDir string) Store { + return &fsStore{ + fs: fs, + checkpointsDir: checkpointsDir, + } +} + +func (s *fsStore) Initialize() error { + utillog.Infof("initializing config checkpoints directory %q", s.checkpointsDir) + if err := utilfiles.EnsureDir(s.fs, s.checkpointsDir); err != nil { + return err + } + if err := utilfiles.EnsureFile(s.fs, filepath.Join(s.checkpointsDir, curFile)); err != nil { + return err + } + if err := utilfiles.EnsureFile(s.fs, filepath.Join(s.checkpointsDir, lkgFile)); err != nil { + return err + } + return nil +} + +func (s *fsStore) Exists(uid string) (bool, error) { + ok, err := utilfiles.FileExists(s.fs, filepath.Join(s.checkpointsDir, uid)) + if err != nil { + return false, fmt.Errorf("failed to determine whether checkpoint %q exists, error: %v", uid, err) + } + return ok, nil +} + +func (s *fsStore) Save(c checkpoint.Checkpoint) error { + // encode the checkpoint + data, err := c.Encode() + if err != nil { + return err + } + // save the file + if err := utilfiles.ReplaceFile(s.fs, filepath.Join(s.checkpointsDir, c.UID()), data); err != nil { + return err + } + return nil +} + +func (s *fsStore) Load(uid string) (checkpoint.Checkpoint, error) { + filePath := filepath.Join(s.checkpointsDir, uid) + utillog.Infof("loading configuration from %q", filePath) + + // load the file + data, err := s.fs.ReadFile(filePath) + if err != nil { + return nil, fmt.Errorf("failed to read checkpoint file %q, error: %v", filePath, err) + } + + // decode it + c, err := checkpoint.DecodeCheckpoint(data) + if err != nil { + return nil, fmt.Errorf("failed to decode checkpoint file %q, error: %v", filePath, err) + } + return c, nil +} + +func (s *fsStore) CurrentModified() (time.Time, error) { + path := filepath.Join(s.checkpointsDir, curFile) + info, err := s.fs.Stat(path) + if err != nil { + return time.Time{}, fmt.Errorf("failed to stat %q while checking modification time, error: %v", path, err) + } + return info.ModTime(), nil +} + +func (s *fsStore) Current() (checkpoint.RemoteConfigSource, error) { + return s.sourceFromFile(curFile) +} + +func (s *fsStore) LastKnownGood() (checkpoint.RemoteConfigSource, error) { + return s.sourceFromFile(lkgFile) +} + +func (s *fsStore) SetCurrent(source checkpoint.RemoteConfigSource) error { + return s.setSourceFile(curFile, source) +} + +func (s *fsStore) SetCurrentUpdated(source checkpoint.RemoteConfigSource) (bool, error) { + return setCurrentUpdated(s, source) +} + +func (s *fsStore) SetLastKnownGood(source checkpoint.RemoteConfigSource) error { + return s.setSourceFile(lkgFile, source) +} + +func (s *fsStore) Reset() (bool, error) { + return reset(s) +} + +// sourceFromFile returns the RemoteConfigSource stored in the file at `s.checkpointsDir/relPath`, +// or nil if the file is empty +func (s *fsStore) sourceFromFile(relPath string) (checkpoint.RemoteConfigSource, error) { + path := filepath.Join(s.checkpointsDir, relPath) + data, err := s.fs.ReadFile(path) + if err != nil { + return nil, err + } else if len(data) == 0 { + return nil, nil + } + return checkpoint.DecodeRemoteConfigSource(data) +} + +// set source file replaces the file at `s.checkpointsDir/relPath` with a file containing `source` +func (s *fsStore) setSourceFile(relPath string, source checkpoint.RemoteConfigSource) error { + path := filepath.Join(s.checkpointsDir, relPath) + // if nil, reset the file + if source == nil { + return utilfiles.ReplaceFile(s.fs, path, []byte{}) + } + // encode the source and save it to the file + data, err := source.Encode() + if err != nil { + return err + } + return utilfiles.ReplaceFile(s.fs, path, data) +} diff --git a/pkg/kubelet/kubeletconfig/checkpoint/store/fsstore_test.go b/pkg/kubelet/kubeletconfig/checkpoint/store/fsstore_test.go new file mode 100644 index 00000000000..09c743dc37f --- /dev/null +++ b/pkg/kubelet/kubeletconfig/checkpoint/store/fsstore_test.go @@ -0,0 +1,628 @@ +/* +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 store + +import ( + "fmt" + "path/filepath" + "testing" + "time" + + "github.com/davecgh/go-spew/spew" + + apiv1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint" + utilfiles "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files" + utilfs "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/filesystem" + utiltest "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/test" +) + +const testCheckpointsDir = "/test-checkpoints-dir" + +func newInitializedFakeFsStore() (*fsStore, error) { + fs := utilfs.NewFakeFs() + store := NewFsStore(fs, testCheckpointsDir) + if err := store.Initialize(); err != nil { + return nil, err + } + return store.(*fsStore), nil +} + +func TestFsStoreInitialize(t *testing.T) { + store, err := newInitializedFakeFsStore() + if err != nil { + t.Fatalf("fsStore.Initialize() failed with error: %v", err) + } + + // check that testCheckpointsDir exists + _, err = store.fs.Stat(testCheckpointsDir) + if err != nil { + t.Fatalf("expect %q to exist, but stat failed with error: %v", testCheckpointsDir, err) + } + + // check that testCheckpointsDir contains the curFile + curPath := filepath.Join(testCheckpointsDir, curFile) + _, err = store.fs.Stat(curPath) + if err != nil { + t.Fatalf("expect %q to exist, but stat failed with error: %v", curPath, err) + } + + // check that testCheckpointsDir contains the lkgFile + lkgPath := filepath.Join(testCheckpointsDir, lkgFile) + _, err = store.fs.Stat(lkgPath) + if err != nil { + t.Fatalf("expect %q to exist, but stat failed with error: %v", lkgPath, err) + } +} + +func TestFsStoreExists(t *testing.T) { + store, err := newInitializedFakeFsStore() + if err != nil { + t.Fatalf("failed to construct a store, error: %v", err) + } + + // create a checkpoint file; this is enough for an exists check + cpt, err := checkpoint.NewConfigMapCheckpoint(&apiv1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{UID: "uid"}, + }) + if err != nil { + t.Fatalf("could not construct checkpoint, error: %v", err) + } + saveTestCheckpointFile(t, store.fs, cpt) + + cases := []struct { + desc string + uid string // the uid to test + expect bool + err string + }{ + {"exists", "uid", true, ""}, + {"does not exist", "bogus-uid", false, ""}, + } + + for _, c := range cases { + ok, err := store.Exists(c.uid) + if utiltest.SkipRest(t, c.desc, err, c.err) { + continue + } + if c.expect != ok { + t.Errorf("case %q, expect %t but got %t", c.desc, c.expect, ok) + } + } +} + +func TestFsStoreSave(t *testing.T) { + store, err := newInitializedFakeFsStore() + if err != nil { + t.Fatalf("failed to construct a store, error: %v", err) + } + + cpt, err := checkpoint.NewConfigMapCheckpoint(&apiv1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{UID: "uid"}, + }) + if err != nil { + t.Fatalf("could not construct checkpoint, error: %v", err) + } + + // save the checkpoint + err = store.Save(cpt) + if err != nil { + t.Fatalf("unable to save checkpoint, error: %v", err) + } + + // expect the saved checkpoint file to match the encoding of the checkpoint + data, err := cpt.Encode() + if err != nil { + t.Fatalf("unable to encode the checkpoint, error: %v", err) + } + expect := string(data) + + data = readTestCheckpointFile(t, store.fs, cpt.UID()) + cptFile := string(data) + + if expect != cptFile { + t.Errorf("expect %q but got %q", expect, cptFile) + } +} + +func TestFsStoreLoad(t *testing.T) { + store, err := newInitializedFakeFsStore() + if err != nil { + t.Fatalf("failed to construct a store, error: %v", err) + } + + const uid = "uid" + cpt, err := checkpoint.NewConfigMapCheckpoint(&apiv1.ConfigMap{ObjectMeta: metav1.ObjectMeta{UID: types.UID(uid)}}) + if err != nil { + t.Fatalf("unable to construct checkpoint, error: %v", err) + } + + cases := []struct { + desc string + loadUID string + cpt checkpoint.Checkpoint + err string + }{ + {"checkpoint exists", uid, cpt, ""}, + {"checkpoint does not exist", "bogus-uid", nil, "failed to read"}, + } + for _, c := range cases { + if c.cpt != nil { + saveTestCheckpointFile(t, store.fs, c.cpt) + } + cpt, err := store.Load(c.loadUID) + if utiltest.SkipRest(t, c.desc, err, c.err) { + continue + } + if !checkpoint.EqualCheckpoints(c.cpt, cpt) { + t.Errorf("case %q, expect %q but got %q", c.desc, spew.Sdump(c.cpt), spew.Sdump(cpt)) + } + } +} + +func TestFsStoreRoundTrip(t *testing.T) { + store, err := newInitializedFakeFsStore() + if err != nil { + t.Fatalf("failed to construct a store, error: %v", err) + } + const uid = "uid" + cpt, err := checkpoint.NewConfigMapCheckpoint(&apiv1.ConfigMap{ObjectMeta: metav1.ObjectMeta{UID: types.UID(uid)}}) + if err != nil { + t.Fatalf("unable to construct checkpoint, error: %v", err) + } + err = store.Save(cpt) + if err != nil { + t.Fatalf("unable to save checkpoint, error: %v", err) + } + cptAfter, err := store.Load(uid) + if err != nil { + t.Fatalf("unable to load checkpoint, error: %v", err) + } + if !checkpoint.EqualCheckpoints(cpt, cptAfter) { + t.Errorf("expect %q but got %q", spew.Sdump(cpt), spew.Sdump(cptAfter)) + } +} + +func TestFsStoreCurrentModified(t *testing.T) { + store, err := newInitializedFakeFsStore() + if err != nil { + t.Fatalf("failed to construct a store, error: %v", err) + } + + // create an empty current file, this is good enough for testing + saveTestSourceFile(t, store.fs, curFile, nil) + + // set the timestamps to the current time, so we can compare to result of store.SetCurrentModified + now := time.Now() + err = store.fs.Chtimes(filepath.Join(testCheckpointsDir, curFile), now, now) + if err != nil { + t.Fatalf("could not change timestamps, error: %v", err) + } + + // for now we hope that the system won't truncate the time to a less precise unit, + // if this test fails on certain systems that may be the reason. + modTime, err := store.CurrentModified() + if err != nil { + t.Fatalf("unable to determine modification time of current config source, error: %v", err) + } + if !now.Equal(modTime) { + t.Errorf("expect %q but got %q", now.Format(time.RFC3339), modTime.Format(time.RFC3339)) + } +} + +func TestFsStoreCurrent(t *testing.T) { + store, err := newInitializedFakeFsStore() + if err != nil { + t.Fatalf("failed to construct a store, error: %v", err) + } + + source, _, err := checkpoint.NewRemoteConfigSource(&apiv1.NodeConfigSource{ + ConfigMapRef: &apiv1.ObjectReference{Name: "name", Namespace: "namespace", UID: "uid"}}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + cases := []struct { + desc string + expect checkpoint.RemoteConfigSource + err string + }{ + {"default source", nil, ""}, + {"non-default source", source, ""}, + } + for _, c := range cases { + // save the last known good source + saveTestSourceFile(t, store.fs, curFile, c.expect) + + // load last-known-good and compare to expected result + source, err := store.Current() + if utiltest.SkipRest(t, c.desc, err, c.err) { + continue + } + if !checkpoint.EqualRemoteConfigSources(c.expect, source) { + t.Errorf("case %q, expect %q but got %q", spew.Sdump(c.expect), spew.Sdump(c.expect), spew.Sdump(source)) + } + } +} + +func TestFsStoreLastKnownGood(t *testing.T) { + store, err := newInitializedFakeFsStore() + if err != nil { + t.Fatalf("failed to construct a store, error: %v", err) + } + + source, _, err := checkpoint.NewRemoteConfigSource(&apiv1.NodeConfigSource{ + ConfigMapRef: &apiv1.ObjectReference{Name: "name", Namespace: "namespace", UID: "uid"}}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + cases := []struct { + desc string + expect checkpoint.RemoteConfigSource + err string + }{ + {"default source", nil, ""}, + {"non-default source", source, ""}, + } + for _, c := range cases { + // save the last known good source + saveTestSourceFile(t, store.fs, lkgFile, c.expect) + + // load last-known-good and compare to expected result + source, err := store.LastKnownGood() + if utiltest.SkipRest(t, c.desc, err, c.err) { + continue + } + if !checkpoint.EqualRemoteConfigSources(c.expect, source) { + t.Errorf("case %q, expect %q but got %q", spew.Sdump(c.expect), spew.Sdump(c.expect), spew.Sdump(source)) + } + } +} + +func TestFsStoreSetCurrent(t *testing.T) { + store, err := newInitializedFakeFsStore() + if err != nil { + t.Fatalf("failed to construct a store, error: %v", err) + } + + const uid = "uid" + expect := fmt.Sprintf(`{"kind":"NodeConfigSource","apiVersion":"v1","configMapRef":{"namespace":"namespace","name":"name","uid":"%s"}}%s`, uid, "\n") + source, _, err := checkpoint.NewRemoteConfigSource(&apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{ + Name: "name", Namespace: "namespace", UID: types.UID(uid)}}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + // save the current source + if err := store.SetCurrent(source); err != nil { + t.Fatalf("unexpected error: %v", err) + } + + // check that the source saved as we would expect + data := readTestSourceFile(t, store.fs, curFile) + if expect != string(data) { + t.Errorf("expect current source file to contain %q, but got %q", expect, string(data)) + } +} + +func TestFsStoreSetCurrentUpdated(t *testing.T) { + store, err := newInitializedFakeFsStore() + if err != nil { + t.Fatalf("failed to construct a store, error: %v", err) + } + + cases := []struct { + current string + newCurrent string + expectUpdated bool + err string + }{ + {"", "", false, ""}, + {"uid", "", true, ""}, + {"", "uid", true, ""}, + {"uid", "uid", false, ""}, + {"uid", "other-uid", true, ""}, + {"other-uid", "uid", true, ""}, + {"other-uid", "other-uid", false, ""}, + } + + for _, c := range cases { + // construct current source + var source checkpoint.RemoteConfigSource + expectSource := "" + if len(c.current) > 0 { + expectSource = fmt.Sprintf(`{"kind":"NodeConfigSource","apiVersion":"v1","configMapRef":{"namespace":"namespace","name":"name","uid":"%s"}}%s`, c.current, "\n") + source, _, err = checkpoint.NewRemoteConfigSource(&apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{ + Name: "name", Namespace: "namespace", UID: types.UID(c.current)}}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + } + + // construct new source + var newSource checkpoint.RemoteConfigSource + expectNewSource := "" + if len(c.newCurrent) > 0 { + expectNewSource = fmt.Sprintf(`{"kind":"NodeConfigSource","apiVersion":"v1","configMapRef":{"namespace":"namespace","name":"new-name","uid":"%s"}}%s`, c.newCurrent, "\n") + newSource, _, err = checkpoint.NewRemoteConfigSource(&apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{ + Name: "new-name", Namespace: "namespace", UID: types.UID(c.newCurrent)}}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + } + + // set the initial current + if err := store.SetCurrent(source); err != nil { + t.Fatalf("unexpected error: %v", err) + } + + // update to the new current + updated, err := store.SetCurrentUpdated(newSource) + if utiltest.SkipRest(t, fmt.Sprintf("%q -> %q", c.current, c.newCurrent), err, c.err) { + continue + } + + // check that SetCurrentUpdated correctly reports whether the current checkpoint changed + if c.expectUpdated != updated { + t.Errorf("case %q -> %q, expect %v but got %v", c.current, c.newCurrent, c.expectUpdated, updated) + } + + // check that curFile is saved by SetCurrentUpdated as we expect + data := readTestSourceFile(t, store.fs, curFile) + if c.current == c.newCurrent { + // same UID should leave file unchanged + if expectSource != string(data) { + t.Errorf("case %q -> %q, expect current source file to contain %q, but got %q", c.current, c.newCurrent, expectSource, string(data)) + } + } else if expectNewSource != string(data) { + // otherwise expect the file to change + t.Errorf("case %q -> %q, expect current source file to contain %q, but got %q", c.current, c.newCurrent, expectNewSource, string(data)) + } + } + +} + +func TestFsStoreSetLastKnownGood(t *testing.T) { + store, err := newInitializedFakeFsStore() + if err != nil { + t.Fatalf("failed to construct a store, error: %v", err) + } + + const uid = "uid" + expect := fmt.Sprintf(`{"kind":"NodeConfigSource","apiVersion":"v1","configMapRef":{"namespace":"namespace","name":"name","uid":"%s"}}%s`, uid, "\n") + source, _, err := checkpoint.NewRemoteConfigSource(&apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{ + Name: "name", Namespace: "namespace", UID: types.UID(uid)}}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + // save the last known good source + if err := store.SetLastKnownGood(source); err != nil { + t.Fatalf("unexpected error: %v", err) + } + + // check that the source saved as we would expect + data := readTestSourceFile(t, store.fs, lkgFile) + if expect != string(data) { + t.Errorf("expect last-known-good source file to contain %q, but got %q", expect, string(data)) + } +} + +func TestFsStoreReset(t *testing.T) { + store, err := newInitializedFakeFsStore() + if err != nil { + t.Fatalf("failed to construct a store, error: %v", err) + } + + source, _, err := checkpoint.NewRemoteConfigSource(&apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Name: "name", Namespace: "namespace", UID: "uid"}}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + otherSource, _, err := checkpoint.NewRemoteConfigSource(&apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Name: "other-name", Namespace: "namespace", UID: "other-uid"}}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + cases := []struct { + desc string + current checkpoint.RemoteConfigSource + lastKnownGood checkpoint.RemoteConfigSource + updated bool + }{ + {"nil -> nil", nil, nil, false}, + {"source -> nil", source, nil, true}, + {"nil -> source", nil, source, false}, + {"source -> source", source, source, true}, + {"source -> otherSource", source, otherSource, true}, + {"otherSource -> source", otherSource, source, true}, + } + for _, c := range cases { + // manually save the sources to their respective files + saveTestSourceFile(t, store.fs, curFile, c.current) + saveTestSourceFile(t, store.fs, lkgFile, c.lastKnownGood) + + // reset + updated, err := store.Reset() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + // make sure the files were emptied + if size := testSourceFileSize(t, store.fs, curFile); size > 0 { + t.Errorf("case %q, expect source file %q to be empty but got %d bytes", c.desc, curFile, size) + } + if size := testSourceFileSize(t, store.fs, lkgFile); size > 0 { + t.Errorf("case %q, expect source file %q to be empty but got %d bytes", c.desc, lkgFile, size) + } + + // make sure Current() and LastKnownGood() both return nil + current, err := store.Current() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + lastKnownGood, err := store.LastKnownGood() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if current != nil || lastKnownGood != nil { + t.Errorf("case %q, expect nil for current and last-known-good checkpoints, but still have %q and %q, respectively", + c.desc, current, lastKnownGood) + } + if c.updated != updated { + t.Errorf("case %q, expect reset to return %t, but got %t", c.desc, c.updated, updated) + } + } +} + +func TestFsStoreSourceFromFile(t *testing.T) { + store, err := newInitializedFakeFsStore() + if err != nil { + t.Fatalf("failed to construct a store, error: %v", err) + } + + source, _, err := checkpoint.NewRemoteConfigSource(&apiv1.NodeConfigSource{ + ConfigMapRef: &apiv1.ObjectReference{Name: "name", Namespace: "namespace", UID: "uid"}}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + cases := []struct { + desc string + expect checkpoint.RemoteConfigSource + err string + }{ + {"default source", nil, ""}, + {"non-default source", source, ""}, + } + + const name = "some-source-file" + for _, c := range cases { + saveTestSourceFile(t, store.fs, name, c.expect) + source, err := store.sourceFromFile(name) + if utiltest.SkipRest(t, c.desc, err, c.err) { + continue + } + if !checkpoint.EqualRemoteConfigSources(c.expect, source) { + t.Errorf("case %q, expect %q but got %q", spew.Sdump(c.expect), spew.Sdump(c.expect), spew.Sdump(source)) + } + } +} + +func TestFsStoreSetSourceFile(t *testing.T) { + store, err := newInitializedFakeFsStore() + if err != nil { + t.Fatalf("failed to construct a store, error: %v", err) + } + + source, _, err := checkpoint.NewRemoteConfigSource(&apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Name: "name", Namespace: "namespace", UID: "uid"}}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + cases := []struct { + source checkpoint.RemoteConfigSource + }{ + {nil}, + {source}, + } + + const name = "some-source-file" + for _, c := range cases { + // set the source file + err := store.setSourceFile(name, c.source) + if err != nil { + t.Fatalf("unable to set source file, error: %v", err) + } + // read back the file + data := readTestSourceFile(t, store.fs, name) + str := string(data) + + if c.source != nil { + // expect the contents to match the encoding of the source + data, err := c.source.Encode() + expect := string(data) + if err != nil { + t.Fatalf("couldn't encode source, error: %v", err) + } + if expect != str { + t.Errorf("case %q, expect %q but got %q", spew.Sdump(c.source), expect, str) + } + } else { + // expect empty file + expect := "" + if expect != str { + t.Errorf("case %q, expect %q but got %q", spew.Sdump(c.source), expect, str) + } + } + } +} + +func readTestCheckpointFile(t *testing.T, fs utilfs.Filesystem, uid string) []byte { + data, err := fs.ReadFile(filepath.Join(testCheckpointsDir, uid)) + if err != nil { + t.Fatalf("unable to read test checkpoint file, error: %v", err) + } + return data +} + +func saveTestCheckpointFile(t *testing.T, fs utilfs.Filesystem, cpt checkpoint.Checkpoint) { + data, err := cpt.Encode() + if err != nil { + t.Fatalf("unable to encode test checkpoint, error: %v", err) + } + fmt.Println(cpt.UID()) + err = utilfiles.ReplaceFile(fs, filepath.Join(testCheckpointsDir, cpt.UID()), data) + if err != nil { + t.Fatalf("unable to save test checkpoint file, error: %v", err) + } +} + +func readTestSourceFile(t *testing.T, fs utilfs.Filesystem, relPath string) []byte { + data, err := fs.ReadFile(filepath.Join(testCheckpointsDir, relPath)) + if err != nil { + t.Fatalf("unable to read test source file, error: %v", err) + } + return data +} + +func saveTestSourceFile(t *testing.T, fs utilfs.Filesystem, relPath string, source checkpoint.RemoteConfigSource) { + if source != nil { + data, err := source.Encode() + if err != nil { + t.Fatalf("unable to save test source file, error: %v", err) + } + err = utilfiles.ReplaceFile(fs, filepath.Join(testCheckpointsDir, relPath), data) + if err != nil { + t.Fatalf("unable to save test source file, error: %v", err) + } + } else { + err := utilfiles.ReplaceFile(fs, filepath.Join(testCheckpointsDir, relPath), []byte{}) + if err != nil { + t.Fatalf("unable to save test source file, error: %v", err) + } + } +} + +func testSourceFileSize(t *testing.T, fs utilfs.Filesystem, relPath string) int64 { + info, err := fs.Stat(filepath.Join(testCheckpointsDir, relPath)) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + return info.Size() +} diff --git a/pkg/kubelet/kubeletconfig/checkpoint/store/store.go b/pkg/kubelet/kubeletconfig/checkpoint/store/store.go new file mode 100644 index 00000000000..a6bdb736b26 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/checkpoint/store/store.go @@ -0,0 +1,84 @@ +/* +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 store + +import ( + "fmt" + "time" + + "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint" +) + +// Store saves checkpoints and information about which is the current and last-known-good checkpoint to a storage layer +type Store interface { + // Initialize sets up the storage layer + Initialize() error + // Exists returns true if a checkpoint with `uid` exists in the store, false otherwise + Exists(uid string) (bool, error) + // Save saves the checkpoint to the storage layer + Save(c checkpoint.Checkpoint) error + // Load loads the checkpoint with UID `uid` from the storage layer, or returns an error if the checkpoint does not exist + Load(uid string) (checkpoint.Checkpoint, error) + // CurrentModified returns the last time that the current UID was set + CurrentModified() (time.Time, error) + // Current returns the source that points to the current checkpoint, or nil if no current checkpoint is set + Current() (checkpoint.RemoteConfigSource, error) + // LastKnownGood returns the source that points to the last-known-good checkpoint, or nil if no last-known-good checkpoint is set + LastKnownGood() (checkpoint.RemoteConfigSource, error) + // SetCurrent saves the source that points to the current checkpoint, set to nil to unset + SetCurrent(source checkpoint.RemoteConfigSource) error + // SetCurrentUpdated is similar to SetCurrent, but also returns whether the current checkpoint changed as a result + SetCurrentUpdated(source checkpoint.RemoteConfigSource) (bool, error) + // SetLastKnownGood saves the source that points to the last-known-good checkpoint, set to nil to unset + SetLastKnownGood(source checkpoint.RemoteConfigSource) error + // Reset unsets the current and last-known-good UIDs and returns whether the current UID was unset as a result of the reset + Reset() (bool, error) +} + +// reset is a helper for implementing Reset, which can be implemented in terms of Store methods +func reset(s Store) (bool, error) { + if err := s.SetLastKnownGood(nil); err != nil { + return false, fmt.Errorf("failed to reset last-known-good UID in checkpoint store, error: %v", err) + } + updated, err := s.SetCurrentUpdated(nil) + if err != nil { + return false, fmt.Errorf("failed to reset current UID in checkpoint store, error: %v", err) + } + return updated, nil +} + +// setCurrentUpdated is a helper for implementing SetCurrentUpdated, which can be implemented in terms of Store methods +func setCurrentUpdated(s Store, source checkpoint.RemoteConfigSource) (bool, error) { + cur, err := s.Current() + if err != nil { + return false, err + } + + // if both are nil, no need to update + if cur == nil && source == nil { + return false, nil + } + // if UIDs match, no need to update + if (source != nil && cur != nil) && cur.UID() == source.UID() { + return false, nil + } + // update the source + if err := s.SetCurrent(source); err != nil { + return false, err + } + return true, nil +} diff --git a/pkg/kubelet/kubeletconfig/checkpoint/store/store_test.go b/pkg/kubelet/kubeletconfig/checkpoint/store/store_test.go new file mode 100644 index 00000000000..c269d785890 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/checkpoint/store/store_test.go @@ -0,0 +1,96 @@ +/* +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 store + +import ( + "testing" + + "github.com/davecgh/go-spew/spew" + + apiv1 "k8s.io/api/core/v1" + "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint" +) + +func TestReset(t *testing.T) { + source, _, err := checkpoint.NewRemoteConfigSource(&apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Name: "name", Namespace: "namespace", UID: "uid"}}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + otherSource, _, err := checkpoint.NewRemoteConfigSource(&apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Name: "other-name", Namespace: "namespace", UID: "other-uid"}}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + cases := []struct { + s *fakeStore + updated bool + }{ + {&fakeStore{current: nil, lastKnownGood: nil}, false}, + {&fakeStore{current: source, lastKnownGood: nil}, true}, + {&fakeStore{current: nil, lastKnownGood: source}, false}, + {&fakeStore{current: source, lastKnownGood: source}, true}, + {&fakeStore{current: source, lastKnownGood: otherSource}, true}, + {&fakeStore{current: otherSource, lastKnownGood: source}, true}, + } + for _, c := range cases { + updated, err := reset(c.s) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if c.s.current != nil || c.s.lastKnownGood != nil { + t.Errorf("case %q, expect nil for current and last-known-good checkpoints, but still have %q and %q, respectively", + spew.Sdump(c.s), c.s.current, c.s.lastKnownGood) + } + if c.updated != updated { + t.Errorf("case %q, expect reset to return %t, but got %t", spew.Sdump(c.s), c.updated, updated) + } + } +} + +func TestSetCurrentUpdated(t *testing.T) { + source, _, err := checkpoint.NewRemoteConfigSource(&apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Name: "name", Namespace: "namespace", UID: "uid"}}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + otherSource, _, err := checkpoint.NewRemoteConfigSource(&apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Name: "other-name", Namespace: "namespace", UID: "other-uid"}}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + cases := []struct { + s *fakeStore + newCurrent checkpoint.RemoteConfigSource + updated bool + }{ + {&fakeStore{current: nil}, nil, false}, + {&fakeStore{current: nil}, source, true}, + {&fakeStore{current: source}, source, false}, + {&fakeStore{current: source}, nil, true}, + {&fakeStore{current: source}, otherSource, true}, + } + for _, c := range cases { + current := c.s.current + updated, err := setCurrentUpdated(c.s, c.newCurrent) + if err != nil { + t.Fatalf("case %q -> %q, unexpected error: %v", current, c.newCurrent, err) + } + if c.newCurrent != c.s.current { + t.Errorf("case %q -> %q, expect current UID to be %q, but got %q", current, c.newCurrent, c.newCurrent, c.s.current) + } + if c.updated != updated { + t.Errorf("case %q -> %q, expect setCurrentUpdated to return %t, but got %t", current, c.newCurrent, c.updated, updated) + } + } +} diff --git a/pkg/kubelet/kubeletconfig/configfiles/BUILD b/pkg/kubelet/kubeletconfig/configfiles/BUILD new file mode 100644 index 00000000000..1c594f31ad9 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/configfiles/BUILD @@ -0,0 +1,29 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["configfiles.go"], + deps = [ + "//pkg/apis/componentconfig:go_default_library", + "//pkg/kubelet/kubeletconfig/util/codec:go_default_library", + "//pkg/kubelet/kubeletconfig/util/filesystem:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/kubelet/kubeletconfig/configfiles/configfiles.go b/pkg/kubelet/kubeletconfig/configfiles/configfiles.go new file mode 100644 index 00000000000..fad56a80f0f --- /dev/null +++ b/pkg/kubelet/kubeletconfig/configfiles/configfiles.go @@ -0,0 +1,66 @@ +/* +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 configfiles + +import ( + "fmt" + "path/filepath" + + "k8s.io/kubernetes/pkg/apis/componentconfig" + utilcodec "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec" + utilfs "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/filesystem" +) + +// Loader loads configuration from a storage layer +type Loader interface { + // Load loads and returns the KubeletConfiguration from the storage layer, or an error if a configuration could not be loaded + Load() (*componentconfig.KubeletConfiguration, error) +} + +// fsLoader loads configuration from `configDir` +type fsLoader struct { + // fs is the filesystem where the config files exist; can be mocked for testing + fs utilfs.Filesystem + // configDir is the absolute path to the directory containing the configuration files + configDir string +} + +// NewFSLoader returns a Loader that loads a KubeletConfiguration from the files in `configDir` +func NewFSLoader(fs utilfs.Filesystem, configDir string) Loader { + return &fsLoader{ + fs: fs, + configDir: configDir, + } +} + +func (loader *fsLoader) Load() (*componentconfig.KubeletConfiguration, error) { + errfmt := fmt.Sprintf("failed to load Kubelet config files from %q, error: ", loader.configDir) + "%v" + + // require the config be in a file called "kubelet" + path := filepath.Join(loader.configDir, "kubelet") + data, err := loader.fs.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("failed to read init config file %q, error: %v", path, err) + } + + // no configuration is an error, some parameters are required + if len(data) == 0 { + return nil, fmt.Errorf(errfmt, fmt.Errorf("config file was empty, but some parameters are required")) + } + + return utilcodec.DecodeKubeletConfiguration(data) +} diff --git a/pkg/kubelet/kubeletconfig/configsync.go b/pkg/kubelet/kubeletconfig/configsync.go new file mode 100644 index 00000000000..6f2f74f28cc --- /dev/null +++ b/pkg/kubelet/kubeletconfig/configsync.go @@ -0,0 +1,208 @@ +/* +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 kubeletconfig + +import ( + "fmt" + "os" + + apiv1 "k8s.io/api/core/v1" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/cache" + "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint" + utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" +) + +// pokeConfiSourceWorker tells the worker thread that syncs config sources that work needs to be done +func (cc *Controller) pokeConfigSourceWorker() { + select { + case cc.pendingConfigSource <- true: + default: + } +} + +// syncConfigSource checks if work needs to be done to use a new configuration, and does that work if necessary +func (cc *Controller) syncConfigSource(client clientset.Interface, nodeName string) { + select { + case <-cc.pendingConfigSource: + default: + // no work to be done, return + return + } + + // if the sync fails, we want to retry + var syncerr error + defer func() { + if syncerr != nil { + utillog.Errorf(syncerr.Error()) + cc.pokeConfigSourceWorker() + } + }() + + node, err := latestNode(cc.informer.GetStore(), nodeName) + if err != nil { + reason := "unable to read Node from internal object cache" + cc.configOK.SetFailedSyncCondition(reason) + syncerr = fmt.Errorf("%s, error: %v", reason, err) + return + } + + // check the Node and download any new config + if updated, reason, err := cc.doSyncConfigSource(client, node.Spec.ConfigSource); err != nil { + cc.configOK.SetFailedSyncCondition(reason) + syncerr = fmt.Errorf("%s, error: %v", reason, err) + return + } else if updated { + // TODO(mtaufen): Consider adding a "currently restarting" node condition for this case + utillog.Infof("config updated, Kubelet will restart to begin using new config") + os.Exit(0) + } + + // If we get here: + // - there is no need to restart to update the current config + // - there was no error trying to sync configuration + // - if, previously, there was an error trying to sync configuration, we need to update to the correct condition + errfmt := `sync succeeded but unable to clear "failed to sync" message from ConfigOK, error: %v` + + currentUID := "" + if currentSource, err := cc.checkpointStore.Current(); err != nil { + utillog.Errorf(errfmt, err) + return + } else if currentSource != nil { + currentUID = currentSource.UID() + } + + lkgUID := "" + if lkgSource, err := cc.checkpointStore.LastKnownGood(); err != nil { + utillog.Errorf(errfmt, err) + return + } else if lkgSource != nil { + lkgUID = lkgSource.UID() + } + + currentBadReason := "" + if entry, err := cc.badConfigTracker.Entry(currentUID); err != nil { + utillog.Errorf(errfmt, err) + } else if entry != nil { + currentBadReason = entry.Reason + } + cc.configOK.ClearFailedSyncCondition(currentUID, lkgUID, currentBadReason, cc.initConfig != nil) +} + +// doSyncConfigSource checkpoints and sets the store's current config to the new config or resets config, +// depending on the `source`, and returns whether the current config in the checkpoint store was updated as a result +func (cc *Controller) doSyncConfigSource(client clientset.Interface, source *apiv1.NodeConfigSource) (bool, string, error) { + if source == nil { + utillog.Infof("Node.Spec.ConfigSource is empty, will reset current and last-known-good to defaults") + updated, reason, err := cc.resetConfig() + if err != nil { + return false, reason, err + } + return updated, "", nil + } + + // if the NodeConfigSource is non-nil, download the config + utillog.Infof("Node.Spec.ConfigSource is non-empty, will checkpoint source and update config if necessary") + remote, reason, err := checkpoint.NewRemoteConfigSource(source) + if err != nil { + return false, reason, err + } + reason, err = cc.checkpointConfigSource(client, remote) + if err != nil { + return false, reason, err + } + updated, reason, err := cc.setCurrentConfig(remote) + if err != nil { + return false, reason, err + } + return updated, "", nil +} + +// checkpointConfigSource downloads and checkpoints the object referred to by `source` if the checkpoint does not already exist, +// if a failure occurs, returns a sanitized failure reason and an error +func (cc *Controller) checkpointConfigSource(client clientset.Interface, source checkpoint.RemoteConfigSource) (string, error) { + uid := source.UID() + + // if the checkpoint already exists, skip downloading + if ok, err := cc.checkpointStore.Exists(uid); err != nil { + reason := fmt.Sprintf("unable to determine whether object with UID %q was already checkpointed", uid) + return reason, fmt.Errorf("%s, error: %v", reason, err) + } else if ok { + utillog.Infof("checkpoint already exists for object with UID %q, skipping download", uid) + return "", nil + } + + // download + checkpoint, reason, err := source.Download(client) + if err != nil { + return reason, fmt.Errorf("%s, error: %v", reason, err) + } + + // save + err = cc.checkpointStore.Save(checkpoint) + if err != nil { + reason := fmt.Sprintf("failed to save checkpoint for object with UID %q", checkpoint.UID()) + return reason, fmt.Errorf("%s, error: %v", reason, err) + } + + return "", nil +} + +// setCurrentConfig updates UID of the current checkpoint in the checkpoint store to `uid` and returns whether the +// current UID changed as a result, or a sanitized failure reason and an error. +func (cc *Controller) setCurrentConfig(source checkpoint.RemoteConfigSource) (bool, string, error) { + updated, err := cc.checkpointStore.SetCurrentUpdated(source) + if err != nil { + str := "default" + if source != nil { + str = fmt.Sprintf("object with UID %q", source.UID()) + } + return false, fmt.Sprintf("failed to set current checkpoint to %s", str), err + } + return updated, "", nil +} + +// resetConfig resets the current and last-known-good checkpoints in the checkpoint store to their default values and +// returns whether the current checkpoint changed as a result, or a sanitized failure reason and an error. +func (cc *Controller) resetConfig() (bool, string, error) { + updated, err := cc.checkpointStore.Reset() + if err != nil { + return false, "failed to reset to using local (default or init) config", err + } + return updated, "", nil +} + +// latestNode returns the most recent Node with `nodeName` from `store` +func latestNode(store cache.Store, nodeName string) (*apiv1.Node, error) { + obj, ok, err := store.GetByKey(nodeName) + if err != nil { + err := fmt.Errorf("failed to retrieve Node %q from informer's store, error: %v", nodeName, err) + utillog.Errorf(err.Error()) + return nil, err + } else if !ok { + err := fmt.Errorf("Node %q does not exist in the informer's store, can't sync config source", nodeName) + utillog.Errorf(err.Error()) + return nil, err + } + node, ok := obj.(*apiv1.Node) + if !ok { + err := fmt.Errorf("failed to cast object from informer's store to Node, can't sync config source for Node %q", nodeName) + utillog.Errorf(err.Error()) + return nil, err + } + return node, nil +} diff --git a/pkg/kubelet/kubeletconfig/controller.go b/pkg/kubelet/kubeletconfig/controller.go new file mode 100644 index 00000000000..cc7c36a2587 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/controller.go @@ -0,0 +1,350 @@ +/* +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 kubeletconfig + +import ( + "fmt" + "path/filepath" + "time" + + apiv1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/util/wait" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/cache" + "k8s.io/kubernetes/pkg/apis/componentconfig" + "k8s.io/kubernetes/pkg/apis/componentconfig/validation" + "k8s.io/kubernetes/pkg/version" + + "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/badconfig" + "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store" + "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles" + "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/startups" + "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status" + utilfs "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/filesystem" + utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" + utilpanic "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic" +) + +const ( + badConfigTrackingDir = "bad-config-tracking" + startupTrackingDir = "startup-tracking" + checkpointsDir = "checkpoints" + initConfigDir = "init" +) + +// Controller is the controller which, among other things: +// - loads configuration from disk +// - checkpoints configuration to disk +// - downloads new configuration from the API server +// - validates configuration +// - monitors for potential crash-loops caused by new configurations +// - tracks the last-known-good configuration, and rolls-back to last-known-good when necessary +// For more information, see the proposal: https://github.com/kubernetes/kubernetes/pull/29459 +type Controller struct { + // dynamicConfig, if true, indicates that we should sync config from the API server + dynamicConfig bool + + // defaultConfig is the configuration to use if no initConfig is provided + defaultConfig *componentconfig.KubeletConfiguration + + // initConfig is the unmarshaled init config, this will be loaded by the Controller if an initConfigDir is provided + initConfig *componentconfig.KubeletConfiguration + + // initLoader is for loading the Kubelet's init configuration files from disk + initLoader configfiles.Loader + + // pendingConfigSource; write to this channel to indicate that the config source needs to be synced from the API server + pendingConfigSource chan bool + + // configOK manages the ConfigOK condition that is reported in Node.Status.Conditions + configOK status.ConfigOKCondition + + // informer is the informer that watches the Node object + informer cache.SharedInformer + + // checkpointStore persists config source checkpoints to a storage layer + checkpointStore store.Store + + // badConfigTracker persists bad-config records to a storage layer + badConfigTracker badconfig.Tracker + + // startupTracker persists Kubelet startup records, used for crash-loop detection, to a storage layer + startupTracker startups.Tracker +} + +// NewController constructs a new Controller object and returns it. Directory paths must be absolute. +// If the `initConfigDir` is an empty string, skips trying to load the init config. +// If the `dynamicConfigDir` is an empty string, skips trying to load checkpoints or download new config, +// but will still sync the ConfigOK condition if you call StartSync with a non-nil client. +func NewController(initConfigDir string, dynamicConfigDir string, defaultConfig *componentconfig.KubeletConfiguration) *Controller { + fs := utilfs.DefaultFs{} + + var initLoader configfiles.Loader + if len(initConfigDir) > 0 { + initLoader = configfiles.NewFSLoader(fs, initConfigDir) + } + dynamicConfig := false + if len(dynamicConfigDir) > 0 { + dynamicConfig = true + } + + // Get the current kubelet version; bad-config and startup-tracking information can be kubelet-version specific, + // e.g. a bug that crash loops an old Kubelet under a given config might be fixed in a new Kubelet or vice-versa, + // validation might be relaxed in a new Kubelet, etc. + // We also don't want a change in a file format to break Kubelet upgrades; this makes sure a new kubelet gets + // a fresh dir to put its config health data in. + // Note that config checkpoints use the api machinery to store ConfigMaps, and thus get file format versioning for free. + kubeletVersion := version.Get().String() + + return &Controller{ + dynamicConfig: dynamicConfig, + defaultConfig: defaultConfig, + // channels must have capacity at least 1, since we signal with non-blocking writes + pendingConfigSource: make(chan bool, 1), + configOK: status.NewConfigOKCondition(), + checkpointStore: store.NewFsStore(fs, filepath.Join(dynamicConfigDir, checkpointsDir)), + badConfigTracker: badconfig.NewFsTracker(fs, filepath.Join(dynamicConfigDir, badConfigTrackingDir, kubeletVersion)), + startupTracker: startups.NewFsTracker(fs, filepath.Join(dynamicConfigDir, startupTrackingDir, kubeletVersion)), + initLoader: initLoader, + } +} + +// Bootstrap attempts to return a valid KubeletConfiguration based on the configuration of the Controller, +// or returns an error if no valid configuration could be produced. Bootstrap should be called synchronously before StartSync. +func (cc *Controller) Bootstrap() (*componentconfig.KubeletConfiguration, error) { + utillog.Infof("starting controller") + + // ALWAYS validate the local (default and init) configs. This makes incorrectly provisioned nodes an error. + // These must be valid because they are the foundational last-known-good configs. + utillog.Infof("validating combination of defaults and flags") + if err := validation.ValidateKubeletConfiguration(cc.defaultConfig); err != nil { + return nil, fmt.Errorf("combination of defaults and flags failed validation, error: %v", err) + } + // only attempt to load and validate the init config if the user provided a path + if cc.initLoader != nil { + utillog.Infof("loading init config") + kc, err := cc.initLoader.Load() + if err != nil { + return nil, err + } + // validate the init config + utillog.Infof("validating init config") + if err := validation.ValidateKubeletConfiguration(kc); err != nil { + return nil, fmt.Errorf("failed to validate the init config, error: %v", err) + } + cc.initConfig = kc + } + // Assert: the default and init configs are both valid + + // if dynamic config is disabled, skip trying to load any checkpoints because they won't exist + if !cc.dynamicConfig { + return cc.localConfig(), nil + } + + // assert: now we know that a dynamicConfigDir was provided, and we can rely on that existing + + // make sure the filesystem is set up properly + // TODO(mtaufen): rename this to initializeDynamicConfigDir + if err := cc.initialize(); err != nil { + return nil, err + } + + // record the kubelet startup time, used for crashloop detection + if err := cc.startupTracker.RecordStartup(); err != nil { + return nil, err + } + + // determine UID of the current config source + curUID := "" + if curSource, err := cc.checkpointStore.Current(); err != nil { + return nil, err + } else if curSource != nil { + curUID = curSource.UID() + } + + // if curUID indicates the local config should be used, return the correct one of those + if len(curUID) == 0 { + return cc.localConfig(), nil + } // Assert: we will not use the local configurations, unless we roll back to lkg; curUID is non-empty + + // check whether the current config is marked bad + if entry, err := cc.badConfigTracker.Entry(curUID); err != nil { + return nil, err + } else if entry != nil { + utillog.Infof("current config %q was marked bad for reason %q at time %q", curUID, entry.Reason, entry.Time) + return cc.lkgRollback(entry.Reason) + } + + // TODO(mtaufen): consider re-verifying integrity and re-attempting download when a load/verify/parse/validate + // error happens outside trial period, we already made it past the trial so it's probably filesystem corruption + // or something else scary (unless someone is using a 0-length trial period) + + // load the current config + checkpoint, err := cc.checkpointStore.Load(curUID) + if err != nil { + // TODO(mtaufen): rollback and mark bad for now, but this could reasonably be handled by re-attempting a download, + // it probably indicates some sort of corruption + return cc.badRollback(curUID, fmt.Sprintf(status.CurFailLoadReasonFmt, curUID), fmt.Sprintf("error: %v", err)) + } + + // parse the checkpoint into a KubeletConfiguration + cur, err := checkpoint.Parse() + if err != nil { + return cc.badRollback(curUID, fmt.Sprintf(status.CurFailParseReasonFmt, curUID), fmt.Sprintf("error: %v", err)) + } + + // validate current config + if err := validation.ValidateKubeletConfiguration(cur); err != nil { + return cc.badRollback(curUID, fmt.Sprintf(status.CurFailValidateReasonFmt, curUID), fmt.Sprintf("error: %v", err)) + } + + // check for crash loops if we're still in the trial period + if trial, err := cc.inTrial(cur.ConfigTrialDuration.Duration); err != nil { + return nil, err + } else if trial { + if crashing, err := cc.crashLooping(cur.CrashLoopThreshold); err != nil { + return nil, err + } else if crashing { + return cc.badRollback(curUID, fmt.Sprintf(status.CurFailCrashLoopReasonFmt, curUID), "") + } + } else { + // when the trial period is over, the current config becomes the last-known-good + if err := cc.graduateCurrentToLastKnownGood(); err != nil { + return nil, err + } + } + + // update the status to note that we will use the current config + cc.configOK.Set(fmt.Sprintf(status.CurRemoteMessageFmt, curUID), status.CurRemoteOKReason, apiv1.ConditionTrue) + return cur, nil +} + +// StartSync launches the controller's sync loops if `client` is non-nil and `nodeName` is non-empty. +// It will always start the Node condition reporting loop, and will also start the dynamic conifg sync loops +// if dynamic config is enabled on the controller. If `nodeName` is empty but `client` is non-nil, an error is logged. +func (cc *Controller) StartSync(client clientset.Interface, nodeName string) { + if client == nil { + utillog.Infof("nil client, will not start sync loops") + return + } else if len(nodeName) == 0 { + utillog.Errorf("cannot start sync loops with empty nodeName") + return + } + + // start the ConfigOK condition sync loop + go utilpanic.HandlePanic(func() { + utillog.Infof("starting ConfigOK condition sync loop") + wait.JitterUntil(func() { + cc.configOK.Sync(client, nodeName) + }, 10*time.Second, 0.2, true, wait.NeverStop) + })() + + // only sync to new, remotely provided configurations if dynamic config was enabled + if cc.dynamicConfig { + cc.informer = newSharedNodeInformer(client, nodeName, + cc.onAddNodeEvent, cc.onUpdateNodeEvent, cc.onDeleteNodeEvent) + // start the informer loop + // Rather than use utilruntime.HandleCrash, which doesn't actually crash in the Kubelet, + // we use HandlePanic to manually call the panic handlers and then crash. + // We have a better chance of recovering normal operation if we just restart the Kubelet in the event + // of a Go runtime error. + go utilpanic.HandlePanic(func() { + utillog.Infof("starting Node informer sync loop") + cc.informer.Run(wait.NeverStop) + })() + + // start the config source sync loop + go utilpanic.HandlePanic(func() { + utillog.Infof("starting config source sync loop") + wait.JitterUntil(func() { + cc.syncConfigSource(client, nodeName) + }, 10*time.Second, 0.2, true, wait.NeverStop) + })() + } else { + utillog.Infof("dynamic config not enabled, will not sync to remote config") + } +} + +// initialize makes sure that the storage layers for various controller components are set up correctly +func (cc *Controller) initialize() error { + utillog.Infof("ensuring filesystem is set up correctly") + // initialize local checkpoint storage location + if err := cc.checkpointStore.Initialize(); err != nil { + return err + } + // initialize bad config tracker + if err := cc.badConfigTracker.Initialize(); err != nil { + return err + } + // initialize startup tracker + if err := cc.startupTracker.Initialize(); err != nil { + return err + } + return nil +} + +// localConfig returns the initConfig if it is loaded, otherwise returns the defaultConfig +func (cc *Controller) localConfig() *componentconfig.KubeletConfiguration { + if cc.initConfig != nil { + cc.configOK.Set(status.CurInitMessage, status.CurInitOKReason, apiv1.ConditionTrue) + return cc.initConfig + } + cc.configOK.Set(status.CurDefaultMessage, status.CurDefaultOKReason, apiv1.ConditionTrue) + return cc.defaultConfig +} + +// inTrial returns true if the time elapsed since the last modification of the current config exceeds `trialDur`, false otherwise +func (cc *Controller) inTrial(trialDur time.Duration) (bool, error) { + now := time.Now() + t, err := cc.checkpointStore.CurrentModified() + if err != nil { + return false, err + } + if now.Sub(t) > trialDur { + return true, nil + } + return false, nil +} + +// crashLooping returns true if the number of startups since the last modification of the current config exceeds `threshold`, false otherwise +func (cc *Controller) crashLooping(threshold int32) (bool, error) { + // determine the last time the current config changed + modTime, err := cc.checkpointStore.CurrentModified() + if err != nil { + return false, err + } + // get the number of startups since that modification time + num, err := cc.startupTracker.StartupsSince(modTime) + if err != nil { + return false, err + } + return num > threshold, nil +} + +// graduateCurrentToLastKnownGood sets the last-known-good UID on the checkpointStore +// to the same value as the current UID maintained by the checkpointStore +func (cc *Controller) graduateCurrentToLastKnownGood() error { + curUID, err := cc.checkpointStore.Current() + if err != nil { + return fmt.Errorf("could not graduate last-known-good config to current config, error: %v", err) + } + err = cc.checkpointStore.SetLastKnownGood(curUID) + if err != nil { + return fmt.Errorf("could not graduate last-known-good config to current config, error: %v", err) + } + return nil +} diff --git a/pkg/kubelet/kubeletconfig/rollback.go b/pkg/kubelet/kubeletconfig/rollback.go new file mode 100644 index 00000000000..2769fa9c493 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/rollback.go @@ -0,0 +1,79 @@ +/* +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 kubeletconfig + +import ( + "fmt" + + apiv1 "k8s.io/api/core/v1" + "k8s.io/kubernetes/pkg/apis/componentconfig" + "k8s.io/kubernetes/pkg/apis/componentconfig/validation" + "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status" + utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" +) + +// badRollback makes an entry in the bad-config-tracking file for `uid` with `reason`, and returns the result of rolling back to the last-known-good config +func (cc *Controller) badRollback(uid, reason, detail string) (*componentconfig.KubeletConfiguration, error) { + utillog.Errorf(fmt.Sprintf("%s, %s", reason, detail)) + if err := cc.badConfigTracker.MarkBad(uid, reason); err != nil { + return nil, err + } + return cc.lkgRollback(reason) +} + +// lkgRollback returns a valid last-known-good configuration, and updates the `cc.configOK` condition +// regarding the `reason` for the rollback, or returns an error if a valid last-known-good could not be produced +func (cc *Controller) lkgRollback(reason string) (*componentconfig.KubeletConfiguration, error) { + utillog.Infof("rolling back to last-known-good config") + + lkgUID := "" + if lkgSource, err := cc.checkpointStore.LastKnownGood(); err != nil { + return nil, fmt.Errorf("unable to determine last-known-good config, error: %v", err) + } else if lkgSource != nil { + lkgUID = lkgSource.UID() + } + + // if lkgUID indicates the default should be used, return initConfig or defaultConfig + if len(lkgUID) == 0 { + if cc.initConfig != nil { + cc.configOK.Set(status.LkgInitMessage, reason, apiv1.ConditionFalse) + return cc.initConfig, nil + } + cc.configOK.Set(status.LkgDefaultMessage, reason, apiv1.ConditionFalse) + return cc.defaultConfig, nil + } + + // load + checkpoint, err := cc.checkpointStore.Load(lkgUID) + if err != nil { + return nil, fmt.Errorf("%s, error: %v", fmt.Sprintf(status.LkgFailLoadReasonFmt, lkgUID), err) + } + + // parse + lkg, err := checkpoint.Parse() + if err != nil { + return nil, fmt.Errorf("%s, error: %v", fmt.Sprintf(status.LkgFailParseReasonFmt, lkgUID), err) + } + + // validate + if err := validation.ValidateKubeletConfiguration(lkg); err != nil { + return nil, fmt.Errorf("%s, error: %v", fmt.Sprintf(status.LkgFailValidateReasonFmt, lkgUID), err) + } + + cc.configOK.Set(fmt.Sprintf(status.LkgRemoteMessageFmt, lkgUID), reason, apiv1.ConditionFalse) + return lkg, nil +} diff --git a/pkg/kubelet/kubeletconfig/startups/BUILD b/pkg/kubelet/kubeletconfig/startups/BUILD new file mode 100644 index 00000000000..4dfd37e775e --- /dev/null +++ b/pkg/kubelet/kubeletconfig/startups/BUILD @@ -0,0 +1,48 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_library( + name = "go_default_library", + srcs = [ + "fstracker.go", + "startups.go", + ], + deps = [ + "//pkg/apis/componentconfig/validation:go_default_library", + "//pkg/kubelet/kubeletconfig/util/files:go_default_library", + "//pkg/kubelet/kubeletconfig/util/filesystem:go_default_library", + "//pkg/kubelet/kubeletconfig/util/log:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) + +go_test( + name = "go_default_test", + srcs = [ + "fstracker_test.go", + "startups_test.go", + ], + library = ":go_default_library", + deps = [ + "//pkg/kubelet/kubeletconfig/util/files:go_default_library", + "//pkg/kubelet/kubeletconfig/util/filesystem:go_default_library", + "//pkg/kubelet/kubeletconfig/util/test:go_default_library", + ], +) diff --git a/pkg/kubelet/kubeletconfig/startups/fstracker.go b/pkg/kubelet/kubeletconfig/startups/fstracker.go new file mode 100644 index 00000000000..1c1e5ce8e35 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/startups/fstracker.go @@ -0,0 +1,127 @@ +/* +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 startups + +import ( + "encoding/json" + "fmt" + "path/filepath" + "time" + + utilfiles "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files" + utilfs "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/filesystem" + utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" +) + +const ( + startupsFile = "startups.json" +) + +// fsTracker tracks startups in the local filesystem +type fsTracker struct { + // fs is the filesystem to use for storage operations; can be mocked for testing + fs utilfs.Filesystem + // trackingDir is the absolute path to the storage directory for fsTracker + trackingDir string +} + +// NewFsTracker returns a Tracker that will store information in the `trackingDir` +func NewFsTracker(fs utilfs.Filesystem, trackingDir string) Tracker { + return &fsTracker{ + fs: fs, + trackingDir: trackingDir, + } +} + +func (tracker *fsTracker) Initialize() error { + utillog.Infof("initializing startups tracking directory %q", tracker.trackingDir) + if err := utilfiles.EnsureDir(tracker.fs, tracker.trackingDir); err != nil { + return err + } + if err := utilfiles.EnsureFile(tracker.fs, filepath.Join(tracker.trackingDir, startupsFile)); err != nil { + return err + } + return nil +} + +func (tracker *fsTracker) RecordStartup() error { + // load the file + ls, err := tracker.load() + if err != nil { + return err + } + + ls = recordStartup(ls) + + // save the file + err = tracker.save(ls) + if err != nil { + return err + } + return nil +} + +func (tracker *fsTracker) StartupsSince(t time.Time) (int32, error) { + // load the startups-tracking file + ls, err := tracker.load() + if err != nil { + return 0, err + } + return startupsSince(ls, t) +} + +// TODO(mtaufen): refactor into encode/decode like in badconfig.go + +// load loads the startups-tracking file from disk +func (tracker *fsTracker) load() ([]string, error) { + path := filepath.Join(tracker.trackingDir, startupsFile) + + // load the file + b, err := tracker.fs.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("failed to load startups-tracking file %q, error: %v", path, err) + } + + // parse json into the slice + ls := []string{} + + // if the file is empty, just return empty slice + if len(b) == 0 { + return ls, nil + } + + // otherwise unmarshal the json + if err := json.Unmarshal(b, &ls); err != nil { + return nil, fmt.Errorf("failed to unmarshal json from startups-tracking file %q, error: %v", path, err) + } + return ls, nil +} + +// save replaces the contents of the startups-tracking file with `ls` +func (tracker *fsTracker) save(ls []string) error { + // marshal the json + b, err := json.Marshal(ls) + if err != nil { + return err + } + // save the file + path := filepath.Join(tracker.trackingDir, startupsFile) + if err := utilfiles.ReplaceFile(tracker.fs, path, b); err != nil { + return err + } + return nil +} diff --git a/pkg/kubelet/kubeletconfig/startups/fstracker_test.go b/pkg/kubelet/kubeletconfig/startups/fstracker_test.go new file mode 100644 index 00000000000..0895c945982 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/startups/fstracker_test.go @@ -0,0 +1,294 @@ +/* +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 startups + +import ( + "fmt" + "path/filepath" + "reflect" + "testing" + "time" + + utilfiles "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files" + utilfs "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/filesystem" + utiltest "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/test" +) + +const testTrackingDir = "/test-tracking-dir" + +// TODO(mtaufen): this file reuses a lot of test code from startups_test.go, should consolidate + +func newInitializedFakeFsTracker() (*fsTracker, error) { + fs := utilfs.NewFakeFs() + tracker := NewFsTracker(fs, testTrackingDir) + if err := tracker.Initialize(); err != nil { + return nil, err + } + return tracker.(*fsTracker), nil +} + +func TestFsTrackerInitialize(t *testing.T) { + tracker, err := newInitializedFakeFsTracker() + if err != nil { + t.Fatalf("tracker.Initialize() failed with error: %v", err) + } + + // check that testTrackingDir exists + _, err = tracker.fs.Stat(testTrackingDir) + if err != nil { + t.Fatalf("expect %q to exist, but stat failed with error: %v", testTrackingDir, err) + } + + // check that testTrackingDir contains the startupsFile + path := filepath.Join(testTrackingDir, startupsFile) + _, err = tracker.fs.Stat(path) + if err != nil { + t.Fatalf("expect %q to exist, but stat failed with error: %v", path, err) + } +} + +func TestFsTrackerRecordStartup(t *testing.T) { + tracker, err := newInitializedFakeFsTracker() + if err != nil { + t.Fatalf("failed to construct a tracker, error: %v", err) + } + + now := time.Now() + + fullList := func() []string { + ls := []string{} + for i := maxStartups; i > 0; i-- { + // subtract decreasing amounts so timestamps increase but remain in the past + ls = append(ls, now.Add(-time.Duration(i)*time.Second).Format(time.RFC3339)) + } + return ls + }() + cases := []struct { + desc string + ls []string + expectHead []string // what we expect the first length-1 elements to look like after recording a new timestamp + expectLen int // how long the list should be after recording + }{ + // start empty + { + "start empty", + []string{}, + []string{}, + 1, + }, + // start non-empty + { + "start non-empty", + // subtract 1 so stamps are in the past + []string{now.Add(-1 * time.Second).Format(time.RFC3339)}, + []string{now.Add(-1 * time.Second).Format(time.RFC3339)}, + 2, + }, + // rotate list + { + "rotate list", + // make a slice with len == maxStartups, containing monotonically-increasing timestamps + fullList, + fullList[1:], + maxStartups, + }, + } + + for _, c := range cases { + // save the starting point, record a "startup" time, then load list from fs + if err := tracker.save(c.ls); err != nil { + t.Fatalf("unexpected error: %v", err) + } + if err := tracker.RecordStartup(); err != nil { + t.Fatalf("unexpected error: %v", err) + } + ls, err := tracker.load() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if c.expectLen != len(ls) { + t.Errorf("case %q, expected list %q to have length %d", c.desc, ls, c.expectLen) + } + if !reflect.DeepEqual(c.expectHead, ls[:len(ls)-1]) { + t.Errorf("case %q, expected elements 0 through n-1 of list %q to equal %q", c.desc, ls, c.expectHead) + } + // timestamps should be monotonically increasing (assuming system clock isn't jumping around at least) + if sorted, err := timestampsSorted(ls); err != nil { + t.Fatalf("unexpected error: %v", err) + } else if !sorted { + t.Errorf("case %q, expected monotonically increasing timestamps, but got %q", c.desc, ls) + } + } +} + +func TestFsTrackerStartupsSince(t *testing.T) { + tracker, err := newInitializedFakeFsTracker() + if err != nil { + t.Fatalf("failed to construct a tracker, error: %v", err) + } + + now, err := time.Parse(time.RFC3339, "2017-01-02T15:04:05Z") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + cases := []struct { + desc string + ls []string + expect int32 + err string + }{ + // empty list + {"empty list", []string{}, 0, ""}, + // no startups since + { + "no startups since", + []string{"2014-01-02T15:04:05Z", "2015-01-02T15:04:05Z", "2016-01-02T15:04:05Z"}, + 0, + "", + }, + // 2 startups since + { + "some startups since", + []string{"2016-01-02T15:04:05Z", "2018-01-02T15:04:05Z", "2019-01-02T15:04:05Z"}, + 2, + "", + }, + // all startups since + { + "all startups since", + []string{"2018-01-02T15:04:05Z", "2019-01-02T15:04:05Z", "2020-01-02T15:04:05Z"}, + 3, + "", + }, + // invalid timestamp + {"invalid timestamp", []string{"2018-01-02T15:04:05Z08:00"}, 0, "failed to parse"}, + } + + for _, c := range cases { + if err := tracker.save(c.ls); err != nil { + t.Fatalf("unexected error: %v", err) + } + num, err := tracker.StartupsSince(now) + if utiltest.SkipRest(t, c.desc, err, c.err) { + continue + } + if num != c.expect { + t.Errorf("case %q, expect %d startups but got %d", c.desc, c.expect, num) + } + } +} + +func TestFsTrackerLoad(t *testing.T) { + tracker, err := newInitializedFakeFsTracker() + if err != nil { + t.Fatalf("failed to construct a tracker, error: %v", err) + } + + nowstamp := time.Now().Format(time.RFC3339) + cases := []struct { + desc string + data []byte + expect []string + err string + }{ + // empty file + {"empty file", []byte(""), []string{}, ""}, + // empty list + {"empty list", []byte("[]"), []string{}, ""}, + // valid json + {"valid json", []byte(fmt.Sprintf(`["%s"]`, nowstamp)), []string{nowstamp}, ""}, + // invalid json + {"invalid json", []byte(`*`), []string{}, "failed to unmarshal"}, + } + + for _, c := range cases { + // save a file containing the correct serialization + utilfiles.ReplaceFile(tracker.fs, filepath.Join(testTrackingDir, startupsFile), c.data) + + // loading valid json should result in an object with the correct serialization + ls, err := tracker.load() + if utiltest.SkipRest(t, c.desc, err, c.err) { + continue + } + if !reflect.DeepEqual(c.expect, ls) { + // ls should equal expected decoded object + t.Errorf("case %q, expect %#v but got %#v", c.desc, c.expect, ls) + } + } + +} + +func TestFsTrackerSave(t *testing.T) { + tracker, err := newInitializedFakeFsTracker() + if err != nil { + t.Fatalf("failed to construct a tracker, error: %v", err) + } + + nowstamp := time.Now().Format(time.RFC3339) + cases := []struct { + desc string + ls []string + expect string + err string + }{ + // empty list + {"empty list", []string{}, "[]", ""}, + // 1-entry list + {"valid json", []string{nowstamp}, fmt.Sprintf(`["%s"]`, nowstamp), ""}, + } + + for _, c := range cases { + if err := tracker.save(c.ls); utiltest.SkipRest(t, c.desc, err, c.err) { + continue + } + + data, err := tracker.fs.ReadFile(filepath.Join(testTrackingDir, startupsFile)) + if err != nil { + t.Fatalf("failed to read startups file, error: %v", err) + } + json := string(data) + + if json != c.expect { + t.Errorf("case %q, expect %q but got %q", c.desc, c.expect, json) + } + } +} + +func TestFsTrackerRoundTrip(t *testing.T) { + tracker, err := newInitializedFakeFsTracker() + if err != nil { + t.Fatalf("failed to construct a tracker, error: %v", err) + } + + nowstamp := time.Now().Format(time.RFC3339) + expect := []string{nowstamp} + + // test that saving and loading an object results in the same value + err = tracker.save(expect) + if err != nil { + t.Fatalf("failed to save startups data, error: %v", err) + } + after, err := tracker.load() + if err != nil { + t.Fatalf("failed to load startups data, error: %v", err) + } + if !reflect.DeepEqual(expect, after) { + t.Errorf("expect round-tripping %#v to result in the same value, but got %#v", expect, after) + } +} diff --git a/pkg/kubelet/kubeletconfig/startups/startups.go b/pkg/kubelet/kubeletconfig/startups/startups.go new file mode 100644 index 00000000000..10a69a1b700 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/startups/startups.go @@ -0,0 +1,69 @@ +/* +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 startups + +import ( + "fmt" + "time" + + "k8s.io/kubernetes/pkg/apis/componentconfig/validation" +) + +const ( + // we allow one extra startup to account for the startup necessary to update configuration + maxStartups = validation.MaxCrashLoopThreshold + 1 +) + +// Tracker tracks Kubelet startups in a storage layer +type Tracker interface { + // Initialize sets up the storage layer + Initialize() error + // RecordStartup records the current time as a Kubelet startup + RecordStartup() error + // StartupsSince returns the number of Kubelet startus recorded since `t` + StartupsSince(t time.Time) (int32, error) +} + +func startupsSince(ls []string, start time.Time) (int32, error) { + // since the list is append-only we only need to count the number of timestamps since `t` + startups := int32(0) + for _, stamp := range ls { + t, err := time.Parse(time.RFC3339, stamp) + if err != nil { + return 0, fmt.Errorf("failed to parse timestamp while counting startups, error: %v", err) + } + if t.After(start) { + startups++ + } + } + return startups, nil +} + +func recordStartup(ls []string) []string { + // record current time + now := time.Now() + stamp := now.Format(time.RFC3339) // use RFC3339 time format + ls = append(ls, stamp) + + // rotate the slice if necessary + if len(ls) > maxStartups { + ls = ls[1:] + } + + // return the new slice + return ls +} diff --git a/pkg/kubelet/kubeletconfig/startups/startups_test.go b/pkg/kubelet/kubeletconfig/startups/startups_test.go new file mode 100644 index 00000000000..a0eafa68e3a --- /dev/null +++ b/pkg/kubelet/kubeletconfig/startups/startups_test.go @@ -0,0 +1,157 @@ +/* +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 startups + +import ( + "reflect" + "testing" + "time" + + utiltest "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/test" +) + +func TestRecordStartup(t *testing.T) { + now := time.Now() + + fullList := func() []string { + ls := []string{} + for i := maxStartups; i > 0; i-- { + // subtract decreasing amounts so timestamps increase but remain in the past + ls = append(ls, now.Add(-time.Duration(i)*time.Second).Format(time.RFC3339)) + } + return ls + }() + cases := []struct { + desc string + ls []string + expectHead []string // what we expect the first length-1 elements to look like after recording a new timestamp + expectLen int // how long the list should be after recording + }{ + // start empty + { + "start empty", + []string{}, + []string{}, + 1, + }, + // start non-empty + { + "start non-empty", + // subtract 1 so stamps are in the past + []string{now.Add(-1 * time.Second).Format(time.RFC3339)}, + []string{now.Add(-1 * time.Second).Format(time.RFC3339)}, + 2, + }, + // rotate list + { + "rotate list", + // make a slice with len == maxStartups, containing monotonically-increasing timestamps + fullList, + fullList[1:], + maxStartups, + }, + } + + for _, c := range cases { + ls := recordStartup(c.ls) + if c.expectLen != len(ls) { + t.Errorf("case %q, expected list %q to have length %d", c.desc, ls, c.expectLen) + } + if !reflect.DeepEqual(c.expectHead, ls[:len(ls)-1]) { + t.Errorf("case %q, expected elements 0 through n-1 of list %q to equal %q", c.desc, ls, c.expectHead) + } + // timestamps should be monotonically increasing (assuming system clock isn't jumping around at least) + if sorted, err := timestampsSorted(ls); err != nil { + t.Fatalf("unexpected error: %v", err) + } else if !sorted { + t.Errorf("case %q, expected monotonically increasing timestamps, but got %q", c.desc, ls) + } + } +} + +func TestStartupsSince(t *testing.T) { + now, err := time.Parse(time.RFC3339, "2017-01-02T15:04:05Z") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + cases := []struct { + desc string + ls []string + expect int32 + err string + }{ + // empty list + {"empty list", []string{}, 0, ""}, + // no startups since + { + "no startups since", + []string{"2014-01-02T15:04:05Z", "2015-01-02T15:04:05Z", "2016-01-02T15:04:05Z"}, + 0, + "", + }, + // 2 startups since + { + "some startups since", + []string{"2016-01-02T15:04:05Z", "2018-01-02T15:04:05Z", "2019-01-02T15:04:05Z"}, + 2, + "", + }, + // all startups since + { + "all startups since", + []string{"2018-01-02T15:04:05Z", "2019-01-02T15:04:05Z", "2020-01-02T15:04:05Z"}, + 3, + "", + }, + // invalid timestamp + {"invalid timestamp", []string{"2018-01-02T15:04:05Z08:00"}, 0, "failed to parse"}, + } + + for _, c := range cases { + num, err := startupsSince(c.ls, now) + if utiltest.SkipRest(t, c.desc, err, c.err) { + continue + } + if num != c.expect { + t.Errorf("case %q, expect %d startups but got %d", c.desc, c.expect, num) + } + } + +} + +// returns true if the timestamps are monotically increasing, false otherwise +func timestampsSorted(ls []string) (bool, error) { + if len(ls) < 2 { + return true, nil + } + prev, err := time.Parse(time.RFC3339, ls[0]) + if err != nil { + return false, err + } + for _, stamp := range ls[1:] { + cur, err := time.Parse(time.RFC3339, stamp) + if err != nil { + return false, err + } + if !cur.After(prev) { + return false, nil + } + prev = cur + } + return true, nil +} diff --git a/pkg/kubelet/kubeletconfig/status/BUILD b/pkg/kubelet/kubeletconfig/status/BUILD new file mode 100644 index 00000000000..0226c794b54 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/status/BUILD @@ -0,0 +1,34 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["status.go"], + deps = [ + "//pkg/api:go_default_library", + "//pkg/kubelet/kubeletconfig/util/equal:go_default_library", + "//pkg/kubelet/kubeletconfig/util/log:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/kubelet/kubeletconfig/status/status.go b/pkg/kubelet/kubeletconfig/status/status.go new file mode 100644 index 00000000000..f1c351b3c58 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/status/status.go @@ -0,0 +1,306 @@ +/* +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 status + +import ( + "fmt" + "strings" + "sync" + "time" + + apiv1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + kuberuntime "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/strategicpatch" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/kubernetes/pkg/api" + utilequal "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/equal" + utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" +) + +const ( + configOKType = "ConfigOK" + + // CurDefaultMessage indicates the Kubelet is using it's current config, which is the default + CurDefaultMessage = "using current (default)" + // LkgDefaultMessage indicates the Kubelet is using it's last-known-good config, which is the default + LkgDefaultMessage = "using last-known-good (default)" + + // CurInitMessage indicates the Kubelet is using it's current config, which is from the init config files + CurInitMessage = "using current (init)" + // LkgInitMessage indicates the Kubelet is using it's last-known-good config, which is from the init config files + LkgInitMessage = "using last-known-good (init)" + + // CurRemoteMessageFmt indicates the Kubelet is usin it's current config, which is from an API source + CurRemoteMessageFmt = "using current (UID: %q)" + // LkgRemoteMessageFmt indicates the Kubelet is using it's last-known-good config, which is from an API source + LkgRemoteMessageFmt = "using last-known-good (UID: %q)" + + // CurDefaultOKReason indicates that no init config files were provided + CurDefaultOKReason = "current is set to the local default, and no init config was provided" + // CurInitOKReason indicates that init config files were provided + CurInitOKReason = "current is set to the local default, and an init config was provided" + // CurRemoteOKReason indicates that the config from an API source passed all checks + CurRemoteOKReason = "passed all checks" + + // CurFailLoadReasonFmt indicates that the Kubelet failed to load the current config checkpoint for an API source + CurFailLoadReasonFmt = "failed to load current (UID: %q)" + // CurFailParseReasonFmt indicates that the Kubelet failed to parse the current config checkpoint for an API source + CurFailParseReasonFmt = "failed to parse current (UID: %q)" + // CurFailValidateReasonFmt indicates that the Kubelet failed to validate the current config checkpoint for an API source + CurFailValidateReasonFmt = "failed to validate current (UID: %q)" + // CurFailCrashLoopReasonFmt indicates that the Kubelet experienced a crash loop while using the current config checkpoint for an API source + CurFailCrashLoopReasonFmt = "current failed trial period due to crash loop (UID %q)" + + // LkgFailLoadReasonFmt indicates that the Kubelet failed to load the last-known-good config checkpoint for an API source + LkgFailLoadReasonFmt = "failed to load last-known-good (UID: %q)" + // LkgFailParseReasonFmt indicates that the Kubelet failed to parse the last-known-good config checkpoint for an API source + LkgFailParseReasonFmt = "failed to parse last-known-good (UID: %q)" + // LkgFailValidateReasonFmt indicates that the Kubelet failed to validate the last-known-good config checkpoint for an API source + LkgFailValidateReasonFmt = "failed to validate last-known-good (UID: %q)" + + emptyMessage = "unknown - message not provided" + emptyReason = "unknown - reason not provided" +) + +// ConfigOKCondition represents a ConfigOK NodeCondition +type ConfigOKCondition interface { + // Set sets the Message, Reason, and Status of the condition + Set(message, reason string, status apiv1.ConditionStatus) + // SetFailedSyncCondition sets the condition for when syncing Kubelet config fails + SetFailedSyncCondition(reason string) + // ClearFailedSyncCondition resets ConfigOKCondition to the correct condition for successfully syncing the kubelet config + ClearFailedSyncCondition(current string, lastKnownGood string, currentBadReason string, initConfig bool) + // Sync patches the current condition into the Node identified by `nodeName` + Sync(client clientset.Interface, nodeName string) +} + +// configOKCondition implements ConfigOKCondition +type configOKCondition struct { + // conditionMux is a mutex on the condition, alternate between setting and syncing the condition + conditionMux sync.Mutex + // condition is the current ConfigOK node condition, which will be reported in the Node.status.conditions + condition *apiv1.NodeCondition + // pendingCondition; write to this channel to indicate that ConfigOK needs to be synced to the API server + pendingCondition chan bool +} + +// NewConfigOKCondition returns a new ConfigOKCondition +func NewConfigOKCondition() ConfigOKCondition { + return &configOKCondition{ + // channels must have capacity at least 1, since we signal with non-blocking writes + pendingCondition: make(chan bool, 1), + } +} + +// unsafeSet sets the current state of the condition +// it does not grab the conditionMux lock, so you should generally use setConfigOK unless you need to grab the lock +// at a higher level to synchronize additional operations +func (c *configOKCondition) unsafeSet(message, reason string, status apiv1.ConditionStatus) { + // We avoid an empty Message, Reason, or Status on the condition. Since we use Patch to update conditions, an empty + // field might cause a value from a previous condition to leak through, which can be very confusing. + if len(message) == 0 { + message = emptyMessage + } + if len(reason) == 0 { + reason = emptyReason + } + if len(string(status)) == 0 { + status = apiv1.ConditionUnknown + } + + c.condition = &apiv1.NodeCondition{ + Message: message, + Reason: reason, + Status: status, + Type: configOKType, + } + + c.pokeSyncWorker() +} + +func (c *configOKCondition) Set(message, reason string, status apiv1.ConditionStatus) { + c.conditionMux.Lock() + defer c.conditionMux.Unlock() + c.unsafeSet(message, reason, status) +} + +// SetFailedSyncCondition updates the ConfigOK status to reflect that we failed to sync to the latest config because we couldn't figure out what +// config to use (e.g. due to a malformed reference, a download failure, etc) +func (c *configOKCondition) SetFailedSyncCondition(reason string) { + c.Set(c.condition.Message, fmt.Sprintf("failed to sync, desired config unclear, reason: %s", reason), apiv1.ConditionUnknown) +} + +// ClearFailedSyncCondition resets ConfigOK to the correct condition for the config UIDs +// `current` and `lastKnownGood`, depending on whether current is bad (non-empty `currentBadReason`) +// and whether an init config exists (`initConfig` is true). +func (c *configOKCondition) ClearFailedSyncCondition(current string, + lastKnownGood string, + currentBadReason string, + initConfig bool) { + // since our reason-check relies on c.condition we must manually take the lock and use c.unsafeSet instead of c.Set + c.conditionMux.Lock() + defer c.conditionMux.Unlock() + if strings.Contains(c.condition.Reason, "failed to sync, desired config unclear") { + // if we should report a "current is bad, rolled back" state + if len(currentBadReason) > 0 { + if len(current) == 0 { + if initConfig { + c.unsafeSet(LkgInitMessage, currentBadReason, apiv1.ConditionFalse) + return + } + c.unsafeSet(LkgDefaultMessage, currentBadReason, apiv1.ConditionFalse) + return + } + c.unsafeSet(fmt.Sprintf(LkgRemoteMessageFmt, lastKnownGood), currentBadReason, apiv1.ConditionFalse) + return + } + // if we should report a "current is ok" state + if len(current) == 0 { + if initConfig { + c.unsafeSet(CurInitMessage, CurInitOKReason, apiv1.ConditionTrue) + return + } + c.unsafeSet(CurDefaultMessage, CurDefaultOKReason, apiv1.ConditionTrue) + return + } + c.unsafeSet(fmt.Sprintf(CurRemoteMessageFmt, current), CurRemoteOKReason, apiv1.ConditionTrue) + } +} + +// pokeSyncWorker notes that the ConfigOK condition needs to be synced to the API server +func (c *configOKCondition) pokeSyncWorker() { + select { + case c.pendingCondition <- true: + default: + } +} + +// Sync attempts to sync `c.condition` with the Node object for this Kubelet, +// if syncing fails, an error is logged, and work is queued for retry. +func (c *configOKCondition) Sync(client clientset.Interface, nodeName string) { + select { + case <-c.pendingCondition: + default: + // no work to be done, return + return + } + + // grab the lock + c.conditionMux.Lock() + defer c.conditionMux.Unlock() + + // if the sync fails, we want to retry + var err error + defer func() { + if err != nil { + utillog.Errorf(err.Error()) + c.pokeSyncWorker() + } + }() + + if c.condition == nil { + utillog.Infof("ConfigOK condition is nil, skipping ConfigOK sync") + return + } + + // get the Node so we can check the current condition + node, err := client.CoreV1().Nodes().Get(nodeName, metav1.GetOptions{}) + if err != nil { + err = fmt.Errorf("could not get Node %q, will not sync ConfigOK condition, error: %v", nodeName, err) + return + } + + // set timestamps + syncTime := metav1.NewTime(time.Now()) + c.condition.LastHeartbeatTime = syncTime + if remote := getConfigOK(node.Status.Conditions); remote == nil || !utilequal.ConfigOKEq(remote, c.condition) { + // update transition time the first time we create the condition, + // or if we are semantically changing the condition + c.condition.LastTransitionTime = syncTime + } else { + // since the conditions are semantically equal, use lastTransitionTime from the condition currently on the Node + // we need to do this because the field will always be represented in the patch generated below, and this copy + // prevents nullifying the field during the patch operation + c.condition.LastTransitionTime = remote.LastTransitionTime + } + + // generate the patch + mediaType := "application/json" + info, ok := kuberuntime.SerializerInfoForMediaType(api.Codecs.SupportedMediaTypes(), mediaType) + if !ok { + err = fmt.Errorf("unsupported media type %q", mediaType) + return + } + versions := api.Registry.EnabledVersionsForGroup(api.GroupName) + if len(versions) == 0 { + err = fmt.Errorf("no enabled versions for group %q", api.GroupName) + return + } + // the "best" version supposedly comes first in the list returned from apiv1.Registry.EnabledVersionsForGroup + encoder := api.Codecs.EncoderForVersion(info.Serializer, versions[0]) + + before, err := kuberuntime.Encode(encoder, node) + if err != nil { + err = fmt.Errorf(`failed to encode "before" node while generating patch, error: %v`, err) + return + } + + patchConfigOK(node, c.condition) + after, err := kuberuntime.Encode(encoder, node) + if err != nil { + err = fmt.Errorf(`failed to encode "after" node while generating patch, error: %v`, err) + return + } + + patch, err := strategicpatch.CreateTwoWayMergePatch(before, after, apiv1.Node{}) + if err != nil { + err = fmt.Errorf("failed to generate patch for updating ConfigOK condition, error: %v", err) + return + } + + // patch the remote Node object + _, err = client.CoreV1().Nodes().PatchStatus(nodeName, patch) + if err != nil { + err = fmt.Errorf("could not update ConfigOK condition, error: %v", err) + return + } +} + +// patchConfigOK replaces or adds the ConfigOK condition to the node +func patchConfigOK(node *apiv1.Node, configOK *apiv1.NodeCondition) { + for i := range node.Status.Conditions { + if node.Status.Conditions[i].Type == configOKType { + // edit the condition + node.Status.Conditions[i] = *configOK + return + } + } + // append the condition + node.Status.Conditions = append(node.Status.Conditions, *configOK) +} + +// getConfigOK returns the first NodeCondition in `cs` with Type == configOKType, +// or if no such condition exists, returns nil. +func getConfigOK(cs []apiv1.NodeCondition) *apiv1.NodeCondition { + for i := range cs { + if cs[i].Type == configOKType { + return &cs[i] + } + } + return nil +} diff --git a/pkg/kubelet/kubeletconfig/util/codec/BUILD b/pkg/kubelet/kubeletconfig/util/codec/BUILD new file mode 100644 index 00000000000..cf7f42f435f --- /dev/null +++ b/pkg/kubelet/kubeletconfig/util/codec/BUILD @@ -0,0 +1,32 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["codec.go"], + deps = [ + "//pkg/api:go_default_library", + "//pkg/api/install:go_default_library", + "//pkg/apis/componentconfig:go_default_library", + "//pkg/apis/componentconfig/install:go_default_library", + "//pkg/apis/componentconfig/v1alpha1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/kubelet/kubeletconfig/util/codec/codec.go b/pkg/kubelet/kubeletconfig/util/codec/codec.go new file mode 100644 index 00000000000..3046af89c02 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/util/codec/codec.go @@ -0,0 +1,77 @@ +/* +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 codec + +import ( + "fmt" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/api" + // ensure the core apis are installed + _ "k8s.io/kubernetes/pkg/api/install" + "k8s.io/kubernetes/pkg/apis/componentconfig" + // ensure the componentconfig api group is installed + _ "k8s.io/kubernetes/pkg/apis/componentconfig/install" + ccv1a1 "k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1" +) + +// TODO(mtaufen): allow an encoder to be injected into checkpoint objects at creation time? (then we could ultimately instantiate only one encoder) + +// NewJSONEncoder generates a new runtime.Encoder that encodes objects to JSON +func NewJSONEncoder(groupName string) (runtime.Encoder, error) { + // encode to json + mediaType := "application/json" + info, ok := runtime.SerializerInfoForMediaType(api.Codecs.SupportedMediaTypes(), mediaType) + if !ok { + return nil, fmt.Errorf("unsupported media type %q", mediaType) + } + + versions := api.Registry.EnabledVersionsForGroup(groupName) + if len(versions) == 0 { + return nil, fmt.Errorf("no enabled versions for group %q", groupName) + } + + // the "best" version supposedly comes first in the list returned from api.Registry.EnabledVersionsForGroup + return api.Codecs.EncoderForVersion(info.Serializer, versions[0]), nil +} + +// DecodeKubeletConfiguration decodes an encoded (v1alpha1) KubeletConfiguration object to the internal type +func DecodeKubeletConfiguration(data []byte) (*componentconfig.KubeletConfiguration, error) { + // TODO(mtaufen): when KubeletConfiguration moves out of componentconfig, will the UniversalDecoder still work? + // decode the object, note we use the external version scheme to decode, because users provide the external version + obj, err := runtime.Decode(api.Codecs.UniversalDecoder(ccv1a1.SchemeGroupVersion), data) + if err != nil { + return nil, fmt.Errorf("failed to decode, error: %v", err) + } + + externalKC, ok := obj.(*ccv1a1.KubeletConfiguration) + if !ok { + return nil, fmt.Errorf("failed to cast object to KubeletConfiguration, object: %#v", obj) + } + + // TODO(mtaufen): confirm whether api.Codecs.UniversalDecoder runs the defaulting, which would make this redundant + // run the defaulter on the decoded configuration before converting to internal type + api.Scheme.Default(externalKC) + + // convert to internal type + internalKC := &componentconfig.KubeletConfiguration{} + err = api.Scheme.Convert(externalKC, internalKC, nil) + if err != nil { + return nil, err + } + return internalKC, nil +} diff --git a/pkg/kubelet/kubeletconfig/util/equal/BUILD b/pkg/kubelet/kubeletconfig/util/equal/BUILD new file mode 100644 index 00000000000..aa0c8e0402e --- /dev/null +++ b/pkg/kubelet/kubeletconfig/util/equal/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["equal.go"], + deps = ["//vendor/k8s.io/api/core/v1:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/kubelet/kubeletconfig/util/equal/equal.go b/pkg/kubelet/kubeletconfig/util/equal/equal.go new file mode 100644 index 00000000000..ffd12cf6a49 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/util/equal/equal.go @@ -0,0 +1,51 @@ +/* +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 equal + +import apiv1 "k8s.io/api/core/v1" + +// ConfigSourceEq returns true if the two config sources are semantically equivalent in the context of dynamic config +func ConfigSourceEq(a, b *apiv1.NodeConfigSource) bool { + if a == b { + return true + } else if a == nil || b == nil { + // not equal, and one is nil + return false + } + // check equality of config source subifelds + if a.ConfigMapRef != b.ConfigMapRef { + return ObjectRefEq(a.ConfigMapRef, b.ConfigMapRef) + } + // all internal subfields of the config soruce are equal + return true +} + +// ObjectRefEq returns true if the two object references are semantically equivalent in the context of dynamic config +func ObjectRefEq(a, b *apiv1.ObjectReference) bool { + if a == b { + return true + } else if a == nil || b == nil { + // not equal, and one is nil + return false + } + return a.UID == b.UID && a.Namespace == b.Namespace && a.Name == b.Name +} + +// ConfigOKEq returns true if the two conditions are semantically equivalent in the context of dynamic config +func ConfigOKEq(a, b *apiv1.NodeCondition) bool { + return a.Message == b.Message && a.Reason == b.Reason && a.Status == b.Status +} diff --git a/pkg/kubelet/kubeletconfig/util/files/BUILD b/pkg/kubelet/kubeletconfig/util/files/BUILD new file mode 100644 index 00000000000..9c4c8cffcb8 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/util/files/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["files.go"], + deps = ["//pkg/kubelet/kubeletconfig/util/filesystem:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/kubelet/kubeletconfig/util/files/files.go b/pkg/kubelet/kubeletconfig/util/files/files.go new file mode 100644 index 00000000000..99c7de851d3 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/util/files/files.go @@ -0,0 +1,124 @@ +/* +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 files + +import ( + "fmt" + "os" + "path/filepath" + + utilfs "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/filesystem" +) + +const defaultPerm = 0666 + +// FileExists returns true if a regular file exists at `path`, false if `path` does not exist, otherwise an error +func FileExists(fs utilfs.Filesystem, path string) (bool, error) { + if info, err := fs.Stat(path); err == nil { + if info.Mode().IsRegular() { + return true, nil + } + return false, fmt.Errorf("expected regular file at %q, but mode is %q", path, info.Mode().String()) + } else if os.IsNotExist(err) { + return false, nil + } else { + return false, err + } +} + +// EnsureFile ensures that a regular file exists at `path`, and if it must create the file any +// necessary parent directories will also be created and the new file will be empty. +func EnsureFile(fs utilfs.Filesystem, path string) error { + // if file exists, don't change it, but do report any unexpected errors + if ok, err := FileExists(fs, path); ok || err != nil { + return err + } // Assert: file does not exist + + // create any necessary parents + err := fs.MkdirAll(filepath.Dir(path), defaultPerm) + if err != nil { + return err + } + + // create the file + file, err := fs.Create(path) + if err != nil { + return err + } + // close the file, since we don't intend to use it yet + return file.Close() +} + +// ReplaceFile replaces the contents of the file at `path` with `data` by writing to a tmp file in the same +// dir as `path` and renaming the tmp file over `path`. The file does not have to exist to use ReplaceFile. +func ReplaceFile(fs utilfs.Filesystem, path string, data []byte) error { + dir := filepath.Dir(path) + prefix := filepath.Base(path) + + // create the tmp file + tmpFile, err := fs.TempFile(dir, prefix) + if err != nil { + return err + } + + // Name() will be an absolute path when using utilfs.DefaultFS, because ioutil.TempFile passes + // an absolute path to os.Open, and we ensure similar behavior in utilfs.FakeFS for testing. + tmpPath := tmpFile.Name() + + // write data + if _, err := tmpFile.Write(data); err != nil { + return err + } + if err := tmpFile.Close(); err != nil { + return err + } + + // rename over existing file + if err := fs.Rename(tmpPath, path); err != nil { + return err + } + return nil +} + +// DirExists returns true if a directory exists at `path`, false if `path` does not exist, otherwise an error +func DirExists(fs utilfs.Filesystem, path string) (bool, error) { + if info, err := fs.Stat(path); err == nil { + if info.IsDir() { + return true, nil + } + return false, fmt.Errorf("expected dir at %q, but mode is is %q", path, info.Mode().String()) + } else if os.IsNotExist(err) { + return false, nil + } else { + return false, err + } +} + +// EnsureDir ensures that a directory exists at `path`, and if it must create the directory any +// necessary parent directories will also be created and the new directory will be empty. +func EnsureDir(fs utilfs.Filesystem, path string) error { + // if dir exists, don't change it, but do report any unexpected errors + if ok, err := DirExists(fs, path); ok || err != nil { + return err + } // Assert: dir does not exist + + // create the dir + if err := fs.MkdirAll(path, defaultPerm); err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/peterbourgon/diskv/BUILD b/pkg/kubelet/kubeletconfig/util/filesystem/BUILD similarity index 69% rename from vendor/github.com/peterbourgon/diskv/BUILD rename to pkg/kubelet/kubeletconfig/util/filesystem/BUILD index fcda66010b7..4b72a6e32fd 100644 --- a/vendor/github.com/peterbourgon/diskv/BUILD +++ b/pkg/kubelet/kubeletconfig/util/filesystem/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,12 +8,11 @@ load( go_library( name = "go_default_library", srcs = [ - "compression.go", - "diskv.go", - "index.go", + "defaultfs.go", + "fakefs.go", + "filesystem.go", ], - tags = ["automanaged"], - deps = ["//vendor/github.com/google/btree:go_default_library"], + deps = ["//vendor/github.com/spf13/afero:go_default_library"], ) filegroup( diff --git a/pkg/kubelet/kubeletconfig/util/filesystem/defaultfs.go b/pkg/kubelet/kubeletconfig/util/filesystem/defaultfs.go new file mode 100644 index 00000000000..3840da0cde3 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/util/filesystem/defaultfs.go @@ -0,0 +1,89 @@ +/* +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 filesystem + +import ( + "io/ioutil" + "os" + "time" +) + +// DefaultFs implements Filesystem using same-named functions from "os" and "io/ioutil" +type DefaultFs struct{} + +// Stat via os.Stat +func (DefaultFs) Stat(name string) (os.FileInfo, error) { + return os.Stat(name) +} + +// Create via os.Create +func (DefaultFs) Create(name string) (File, error) { + file, err := os.Create(name) + if err != nil { + return nil, err + } + return &defaultFile{file}, nil +} + +// Rename via os.Rename +func (DefaultFs) Rename(oldpath, newpath string) error { + return os.Rename(oldpath, newpath) +} + +// MkdirAll via os.MkdirAll +func (DefaultFs) MkdirAll(path string, perm os.FileMode) error { + return os.MkdirAll(path, perm) +} + +// Chtimes via os.Chtimes +func (DefaultFs) Chtimes(name string, atime time.Time, mtime time.Time) error { + return os.Chtimes(name, atime, mtime) +} + +// ReadFile via os.ReadFile +func (DefaultFs) ReadFile(filename string) ([]byte, error) { + return ioutil.ReadFile(filename) +} + +// TempFile via os.TempFile +func (DefaultFs) TempFile(dir, prefix string) (File, error) { + file, err := ioutil.TempFile(dir, prefix) + if err != nil { + return nil, err + } + return &defaultFile{file}, nil +} + +// defaultFile implements File using same-named functions from "os" +type defaultFile struct { + file *os.File +} + +// Name via os.File.Name +func (file *defaultFile) Name() string { + return file.file.Name() +} + +// Write via os.File.Write +func (file *defaultFile) Write(b []byte) (n int, err error) { + return file.file.Write(b) +} + +// Close via os.File.Close +func (file *defaultFile) Close() error { + return file.file.Close() +} diff --git a/pkg/kubelet/kubeletconfig/util/filesystem/fakefs.go b/pkg/kubelet/kubeletconfig/util/filesystem/fakefs.go new file mode 100644 index 00000000000..7bbce8cc5a7 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/util/filesystem/fakefs.go @@ -0,0 +1,97 @@ +/* +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 filesystem + +import ( + "os" + "time" + + "github.com/spf13/afero" +) + +// fakeFs is implemented in terms of afero +type fakeFs struct { + a afero.Afero +} + +// NewFakeFs returns a fake Filesystem that exists in-memory, useful for unit tests +func NewFakeFs() Filesystem { + return &fakeFs{a: afero.Afero{Fs: afero.NewMemMapFs()}} +} + +// Stat via afero.Fs.Stat +func (fs *fakeFs) Stat(name string) (os.FileInfo, error) { + return fs.a.Fs.Stat(name) +} + +// Create via afero.Fs.Create +func (fs *fakeFs) Create(name string) (File, error) { + file, err := fs.a.Fs.Create(name) + if err != nil { + return nil, err + } + return &fakeFile{file}, nil +} + +// Rename via afero.Fs.Rename +func (fs *fakeFs) Rename(oldpath, newpath string) error { + return fs.a.Fs.Rename(oldpath, newpath) +} + +// MkdirAll via afero.Fs.MkdirAll +func (fs *fakeFs) MkdirAll(path string, perm os.FileMode) error { + return fs.a.Fs.MkdirAll(path, perm) +} + +// Chtimes via afero.Fs.Chtimes +func (fs *fakeFs) Chtimes(name string, atime time.Time, mtime time.Time) error { + return fs.a.Fs.Chtimes(name, atime, mtime) +} + +// ReadFile via afero.Fs.ReadFile +func (fs *fakeFs) ReadFile(filename string) ([]byte, error) { + return fs.a.ReadFile(filename) +} + +// TempFile via afero.Fs.TempFile +func (fs *fakeFs) TempFile(dir, prefix string) (File, error) { + file, err := fs.a.TempFile(dir, prefix) + if err != nil { + return nil, err + } + return &fakeFile{file}, nil +} + +// fakeFile implements File; for use with fakeFs +type fakeFile struct { + file afero.File +} + +// Name via afero.File.Name +func (file *fakeFile) Name() string { + return file.file.Name() +} + +// Write via afero.File.Write +func (file *fakeFile) Write(b []byte) (n int, err error) { + return file.file.Write(b) +} + +// Close via afero.File.Close +func (file *fakeFile) Close() error { + return file.file.Close() +} diff --git a/pkg/kubelet/kubeletconfig/util/filesystem/filesystem.go b/pkg/kubelet/kubeletconfig/util/filesystem/filesystem.go new file mode 100644 index 00000000000..2396681faf0 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/util/filesystem/filesystem.go @@ -0,0 +1,45 @@ +/* +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 filesystem + +import ( + "os" + "time" +) + +// Filesystem is an interface that we can use to mock various filesystem operations +type Filesystem interface { + // from "os" + Stat(name string) (os.FileInfo, error) + Create(name string) (File, error) + Rename(oldpath, newpath string) error + MkdirAll(path string, perm os.FileMode) error + Chtimes(name string, atime time.Time, mtime time.Time) error + + // from "io/ioutil" + ReadFile(filename string) ([]byte, error) + TempFile(dir, prefix string) (File, error) +} + +// File is an interface that we can use to mock various filesystem operations typically +// accessed through the File object from the "os" package +type File interface { + // for now, the only os.File methods used are those below, add more as necessary + Name() string + Write(b []byte) (n int, err error) + Close() error +} diff --git a/pkg/kubelet/kubeletconfig/util/log/BUILD b/pkg/kubelet/kubeletconfig/util/log/BUILD new file mode 100644 index 00000000000..39e96f84c3b --- /dev/null +++ b/pkg/kubelet/kubeletconfig/util/log/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["log.go"], + deps = ["//vendor/github.com/golang/glog:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/kubelet/kubeletconfig/util/log/log.go b/pkg/kubelet/kubeletconfig/util/log/log.go new file mode 100644 index 00000000000..b4ecfe4dc99 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/util/log/log.go @@ -0,0 +1,49 @@ +/* +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 log + +import ( + "fmt" + + "github.com/golang/glog" +) + +const logFmt = "kubelet config controller: %s" + +// Errorf shim that inserts "kubelet config controller" at the beginning of the log message, +// while still reporting the call site of the logging function. +func Errorf(format string, args ...interface{}) { + var s string + if len(args) > 0 { + s = fmt.Sprintf(format, args...) + } else { + s = format + } + glog.ErrorDepth(1, fmt.Sprintf(logFmt, s)) +} + +// Infof shim that inserts "kubelet config controller" at the beginning of the log message, +// while still reporting the call site of the logging function. +func Infof(format string, args ...interface{}) { + var s string + if len(args) > 0 { + s = fmt.Sprintf(format, args...) + } else { + s = format + } + glog.InfoDepth(1, fmt.Sprintf(logFmt, s)) +} diff --git a/pkg/kubelet/kubeletconfig/util/panic/BUILD b/pkg/kubelet/kubeletconfig/util/panic/BUILD new file mode 100644 index 00000000000..eb72800ec04 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/util/panic/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["panic.go"], + deps = ["//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/kubelet/kubeletconfig/util/panic/panic.go b/pkg/kubelet/kubeletconfig/util/panic/panic.go new file mode 100644 index 00000000000..f1916ebf731 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/util/panic/panic.go @@ -0,0 +1,36 @@ +/* +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 panic + +import utilruntime "k8s.io/apimachinery/pkg/util/runtime" + +// HandlePanic returns a function that wraps `fn` with the utilruntime.PanicHandlers, and continues +// to bubble the panic after the PanicHandlers are called +func HandlePanic(fn func()) func() { + return func() { + defer func() { + if r := recover(); r != nil { + for _, fn := range utilruntime.PanicHandlers { + fn(r) + } + panic(r) + } + }() + // call the function + fn() + } +} diff --git a/pkg/kubelet/kubeletconfig/util/test/BUILD b/pkg/kubelet/kubeletconfig/util/test/BUILD new file mode 100644 index 00000000000..a346f93f23d --- /dev/null +++ b/pkg/kubelet/kubeletconfig/util/test/BUILD @@ -0,0 +1,24 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["test.go"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/kubelet/kubeletconfig/util/test/test.go b/pkg/kubelet/kubeletconfig/util/test/test.go new file mode 100644 index 00000000000..1c18e8344e6 --- /dev/null +++ b/pkg/kubelet/kubeletconfig/util/test/test.go @@ -0,0 +1,40 @@ +/* +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 test + +import ( + "strings" + "testing" +) + +// SkipRest returns true if there was a non-nil error or if we expected an error that didn't happen, +// and logs the appropriate error on the test object. +// The return value indicates whether we should skip the rest of the test case due to the error result. +func SkipRest(t *testing.T, desc string, err error, contains string) bool { + if err != nil { + if len(contains) == 0 { + t.Errorf("case %q, expect nil error but got %q", desc, err.Error()) + } else if !strings.Contains(err.Error(), contains) { + t.Errorf("case %q, expect error to contain %q but got %q", desc, contains, err.Error()) + } + return true + } else if len(contains) > 0 { + t.Errorf("case %q, expect error to contain %q but got nil error", desc, contains) + return true + } + return false +} diff --git a/pkg/kubelet/kubeletconfig/watch.go b/pkg/kubelet/kubeletconfig/watch.go new file mode 100644 index 00000000000..2c0363c7cab --- /dev/null +++ b/pkg/kubelet/kubeletconfig/watch.go @@ -0,0 +1,125 @@ +/* +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 kubeletconfig + +import ( + "math/rand" + "time" + + apiv1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + kuberuntime "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/watch" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/cache" + utilequal "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/equal" + utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" +) + +// newSharedNodeInformer returns a shared informer that uses `client` to watch the Node with +// `nodeName` for changes and respond with `addFunc`, `updateFunc`, and `deleteFunc`. +func newSharedNodeInformer(client clientset.Interface, nodeName string, + addFunc func(newObj interface{}), + updateFunc func(oldObj interface{}, newObj interface{}), + deleteFunc func(deletedObj interface{})) cache.SharedInformer { + // select nodes by name + fieldselector := fields.OneTermEqualSelector("metadata.name", nodeName) + + // add some randomness to resync period, which can help avoid controllers falling into lock-step + minResyncPeriod := 15 * time.Minute + factor := rand.Float64() + 1 + resyncPeriod := time.Duration(float64(minResyncPeriod.Nanoseconds()) * factor) + + lw := &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (kuberuntime.Object, error) { + return client.Core().Nodes().List(metav1.ListOptions{ + FieldSelector: fieldselector.String(), + }) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + return client.Core().Nodes().Watch(metav1.ListOptions{ + FieldSelector: fieldselector.String(), + ResourceVersion: options.ResourceVersion, + }) + }, + } + + handler := cache.ResourceEventHandlerFuncs{ + AddFunc: addFunc, + UpdateFunc: updateFunc, + DeleteFunc: deleteFunc, + } + + informer := cache.NewSharedInformer(lw, &apiv1.Node{}, resyncPeriod) + informer.AddEventHandler(handler) + + return informer +} + +// onAddNodeEvent calls onUpdateNodeEvent with the new object and a nil old object +func (cc *Controller) onAddNodeEvent(newObj interface{}) { + cc.onUpdateNodeEvent(nil, newObj) +} + +// onUpdateNodeEvent checks whether the configSource changed between oldObj and newObj, and pokes the +// configuration sync worker if there was a change +func (cc *Controller) onUpdateNodeEvent(oldObj interface{}, newObj interface{}) { + newNode, ok := newObj.(*apiv1.Node) + if !ok { + utillog.Errorf("failed to cast new object to Node, couldn't handle event") + return + } + if oldObj == nil { + // Node was just added, need to sync + cc.pokeConfigSourceWorker() + return + } + oldNode, ok := oldObj.(*apiv1.Node) + if !ok { + utillog.Errorf("failed to cast old object to Node, couldn't handle event") + return + } + if !utilequal.ConfigSourceEq(oldNode.Spec.ConfigSource, newNode.Spec.ConfigSource) { + cc.pokeConfigSourceWorker() + } +} + +// onDeleteNodeEvent logs a message if the Node was deleted and may log errors +// if an unexpected DeletedFinalStateUnknown was received. +// We allow the sync-loop to continue, because it is possible that the Kubelet detected +// a Node with unexpected externalID and is attempting to delete and re-create the Node +// (see pkg/kubelet/kubelet_node_status.go), or that someone accidently deleted the Node +// (the Kubelet will re-create it). +func (cc *Controller) onDeleteNodeEvent(deletedObj interface{}) { + node, ok := deletedObj.(*apiv1.Node) + if !ok { + tombstone, ok := deletedObj.(cache.DeletedFinalStateUnknown) + if !ok { + utillog.Errorf("couldn't cast deleted object to DeletedFinalStateUnknown, object: %+v", deletedObj) + return + } + node, ok = tombstone.Obj.(*apiv1.Node) + if !ok { + utillog.Errorf("received DeletedFinalStateUnknown object but it did not contain a Node, object: %+v", deletedObj) + return + } + utillog.Infof("Node was deleted (DeletedFinalStateUnknown), sync-loop will continue because the Kubelet might recreate the Node, node: %+v", node) + return + } + utillog.Infof("Node was deleted, sync-loop will continue because the Kubelet might recreate the Node, node: %+v", node) +} diff --git a/pkg/kubelet/kuberuntime/BUILD b/pkg/kubelet/kuberuntime/BUILD index e7e21dd69d5..bef4f1a062f 100644 --- a/pkg/kubelet/kuberuntime/BUILD +++ b/pkg/kubelet/kuberuntime/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -25,7 +23,6 @@ go_library( "legacy.go", "security_context.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1/helper:go_default_library", @@ -82,7 +79,6 @@ go_test( "security_context_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/credentialprovider:go_default_library", "//pkg/kubelet/apis/cri/testing:go_default_library", diff --git a/pkg/kubelet/kuberuntime/instrumented_services.go b/pkg/kubelet/kuberuntime/instrumented_services.go index ecb6cfbdcda..65c10b1f745 100644 --- a/pkg/kubelet/kuberuntime/instrumented_services.go +++ b/pkg/kubelet/kuberuntime/instrumented_services.go @@ -131,6 +131,15 @@ func (in instrumentedRuntimeService) ContainerStatus(containerID string) (*runti return out, err } +func (in instrumentedRuntimeService) UpdateContainerResources(containerID string, resources *runtimeapi.LinuxContainerResources) error { + const operation = "container_status" + defer recordOperation(operation, time.Now()) + + err := in.service.UpdateContainerResources(containerID, resources) + recordError(operation, err) + return err +} + func (in instrumentedRuntimeService) ExecSync(containerID string, cmd []string, timeout time.Duration) ([]byte, []byte, error) { const operation = "exec_sync" defer recordOperation(operation, time.Now()) diff --git a/pkg/kubelet/leaky/BUILD b/pkg/kubelet/leaky/BUILD index 5808b9b86f8..3c17746f192 100644 --- a/pkg/kubelet/leaky/BUILD +++ b/pkg/kubelet/leaky/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["leaky.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/kubelet/lifecycle/BUILD b/pkg/kubelet/lifecycle/BUILD index 244d7e90c28..0db7c55df0a 100644 --- a/pkg/kubelet/lifecycle/BUILD +++ b/pkg/kubelet/lifecycle/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "interfaces.go", "predicate.go", ], - tags = ["automanaged"], deps = [ "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/types:go_default_library", @@ -38,7 +35,6 @@ go_test( name = "go_default_test", srcs = ["handlers_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubelet/container:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/kubelet/metrics/BUILD b/pkg/kubelet/metrics/BUILD index 73a71fbd390..d64c12f4db9 100644 --- a/pkg/kubelet/metrics/BUILD +++ b/pkg/kubelet/metrics/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["metrics.go"], - tags = ["automanaged"], deps = [ "//pkg/kubelet/container:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/pkg/kubelet/network/BUILD b/pkg/kubelet/network/BUILD index c7592df73d6..913b48514b4 100644 --- a/pkg/kubelet/network/BUILD +++ b/pkg/kubelet/network/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "network.go", "plugins.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/componentconfig:go_default_library", "//pkg/kubelet/container:go_default_library", diff --git a/pkg/kubelet/network/cni/BUILD b/pkg/kubelet/network/cni/BUILD index 01b57ce3fe6..3d90ab5744e 100644 --- a/pkg/kubelet/network/cni/BUILD +++ b/pkg/kubelet/network/cni/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["cni.go"], - tags = ["automanaged"], deps = [ "//pkg/apis/componentconfig:go_default_library", "//pkg/kubelet/container:go_default_library", @@ -25,25 +22,32 @@ go_library( go_test( name = "go_default_test", - srcs = ["cni_test.go"], + srcs = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "cni_test.go", + ], + "//conditions:default": [], + }), library = ":go_default_library", - tags = ["automanaged"], - deps = [ - "//pkg/apis/componentconfig:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/network:go_default_library", - "//pkg/kubelet/network/cni/testing:go_default_library", - "//pkg/kubelet/network/hostport:go_default_library", - "//pkg/kubelet/network/testing:go_default_library", - "//vendor/github.com/containernetworking/cni/pkg/types/020:go_default_library", - "//vendor/github.com/stretchr/testify/mock:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/util/testing:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//pkg/apis/componentconfig:go_default_library", + "//pkg/kubelet/container:go_default_library", + "//pkg/kubelet/container/testing:go_default_library", + "//pkg/kubelet/network:go_default_library", + "//pkg/kubelet/network/cni/testing:go_default_library", + "//pkg/kubelet/network/hostport:go_default_library", + "//pkg/kubelet/network/testing:go_default_library", + "//vendor/github.com/containernetworking/cni/pkg/types/020:go_default_library", + "//vendor/github.com/stretchr/testify/mock:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/util/testing:go_default_library", + "//vendor/k8s.io/utils/exec:go_default_library", + "//vendor/k8s.io/utils/exec/testing:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/kubelet/network/cni/testing/BUILD b/pkg/kubelet/network/cni/testing/BUILD index 7b84030cffd..80b1bee6dcd 100644 --- a/pkg/kubelet/network/cni/testing/BUILD +++ b/pkg/kubelet/network/cni/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["mock_cni.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/containernetworking/cni/libcni:go_default_library", "//vendor/github.com/containernetworking/cni/pkg/types:go_default_library", diff --git a/pkg/kubelet/network/hairpin/BUILD b/pkg/kubelet/network/hairpin/BUILD index 5d1ef1e55e0..88096d4557b 100644 --- a/pkg/kubelet/network/hairpin/BUILD +++ b/pkg/kubelet/network/hairpin/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["hairpin.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", @@ -22,7 +19,6 @@ go_test( name = "go_default_test", srcs = ["hairpin_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/exec/testing:go_default_library", diff --git a/pkg/kubelet/network/hostport/BUILD b/pkg/kubelet/network/hostport/BUILD index c210dbea125..e38aab17930 100644 --- a/pkg/kubelet/network/hostport/BUILD +++ b/pkg/kubelet/network/hostport/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "hostport_manager.go", "hostport_syncer.go", ], - tags = ["automanaged"], deps = [ "//pkg/proxy/iptables:go_default_library", "//pkg/util/iptables:go_default_library", @@ -34,7 +31,6 @@ go_test( "hostport_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/iptables:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", diff --git a/pkg/kubelet/network/hostport/testing/BUILD b/pkg/kubelet/network/hostport/testing/BUILD index 35f2321fb6f..03a41aa5a5c 100644 --- a/pkg/kubelet/network/hostport/testing/BUILD +++ b/pkg/kubelet/network/hostport/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["fake.go"], - tags = ["automanaged"], deps = ["//pkg/kubelet/network/hostport:go_default_library"], ) diff --git a/pkg/kubelet/network/kubenet/BUILD b/pkg/kubelet/network/kubenet/BUILD index 691bdeda79e..dc5b90fad6d 100644 --- a/pkg/kubelet/network/kubenet/BUILD +++ b/pkg/kubelet/network/kubenet/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,53 +10,68 @@ go_library( name = "go_default_library", srcs = [ "kubenet.go", - "kubenet_linux.go", - ], - tags = ["automanaged"], + "kubenet_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "kubenet_linux.go", + ], + "//conditions:default": [], + }), deps = [ "//pkg/apis/componentconfig:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/network:go_default_library", - "//pkg/kubelet/network/hostport:go_default_library", - "//pkg/util/bandwidth:go_default_library", - "//pkg/util/dbus:go_default_library", - "//pkg/util/ebtables:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/sysctl:go_default_library", - "//vendor/github.com/containernetworking/cni/libcni:go_default_library", - "//vendor/github.com/containernetworking/cni/pkg/types:go_default_library", - "//vendor/github.com/containernetworking/cni/pkg/types/020:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/vishvananda/netlink:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//pkg/kubelet/network/hostport:go_default_library", + "//pkg/util/bandwidth:go_default_library", + "//pkg/util/dbus:go_default_library", + "//pkg/util/ebtables:go_default_library", + "//pkg/util/iptables:go_default_library", + "//pkg/util/sysctl:go_default_library", + "//vendor/github.com/containernetworking/cni/libcni:go_default_library", + "//vendor/github.com/containernetworking/cni/pkg/types:go_default_library", + "//vendor/github.com/containernetworking/cni/pkg/types/020:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/github.com/vishvananda/netlink:go_default_library", + "//vendor/golang.org/x/sys/unix:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//vendor/k8s.io/utils/exec:go_default_library", + ], + "//conditions:default": [], + }), ) go_test( name = "go_default_test", - srcs = ["kubenet_linux_test.go"], + srcs = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "kubenet_linux_test.go", + ], + "//conditions:default": [], + }), library = ":go_default_library", - tags = ["automanaged"], - deps = [ - "//pkg/apis/componentconfig:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/network:go_default_library", - "//pkg/kubelet/network/cni/testing:go_default_library", - "//pkg/kubelet/network/hostport/testing:go_default_library", - "//pkg/kubelet/network/testing:go_default_library", - "//pkg/util/bandwidth:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//pkg/util/sysctl/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/mock:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//pkg/apis/componentconfig:go_default_library", + "//pkg/kubelet/container:go_default_library", + "//pkg/kubelet/network:go_default_library", + "//pkg/kubelet/network/cni/testing:go_default_library", + "//pkg/kubelet/network/hostport/testing:go_default_library", + "//pkg/kubelet/network/testing:go_default_library", + "//pkg/util/bandwidth:go_default_library", + "//pkg/util/iptables/testing:go_default_library", + "//pkg/util/sysctl/testing:go_default_library", + "//vendor/github.com/stretchr/testify/assert:go_default_library", + "//vendor/github.com/stretchr/testify/mock:go_default_library", + "//vendor/k8s.io/utils/exec:go_default_library", + "//vendor/k8s.io/utils/exec/testing:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/kubelet/network/testing/BUILD b/pkg/kubelet/network/testing/BUILD index 0dbe56af506..cdc4bd5e4bf 100644 --- a/pkg/kubelet/network/testing/BUILD +++ b/pkg/kubelet/network/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_host.go", "mock_network_plugin.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/componentconfig:go_default_library", "//pkg/kubelet/container:go_default_library", @@ -32,7 +29,6 @@ go_test( name = "go_default_test", srcs = ["plugins_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/componentconfig:go_default_library", "//pkg/kubelet/container:go_default_library", diff --git a/pkg/kubelet/pleg/BUILD b/pkg/kubelet/pleg/BUILD index 6ad5cae0e5a..4bf6c7a7550 100644 --- a/pkg/kubelet/pleg/BUILD +++ b/pkg/kubelet/pleg/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "generic.go", "pleg.go", ], - tags = ["automanaged"], deps = [ "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/metrics:go_default_library", @@ -31,7 +28,6 @@ go_test( name = "go_default_test", srcs = ["generic_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/container/testing:go_default_library", diff --git a/pkg/kubelet/pod/BUILD b/pkg/kubelet/pod/BUILD index 5cad5acb0a1..937aae83c50 100644 --- a/pkg/kubelet/pod/BUILD +++ b/pkg/kubelet/pod/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "mirror_client.go", "pod_manager.go", ], - tags = ["automanaged"], deps = [ "//pkg/kubelet/configmap:go_default_library", "//pkg/kubelet/container:go_default_library", @@ -36,7 +33,6 @@ go_test( "pod_manager_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubelet/configmap:go_default_library", "//pkg/kubelet/container:go_default_library", diff --git a/pkg/kubelet/pod/testing/BUILD b/pkg/kubelet/pod/testing/BUILD index fd7e4d90550..0120951709e 100644 --- a/pkg/kubelet/pod/testing/BUILD +++ b/pkg/kubelet/pod/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["fake_mirror_client.go"], - tags = ["automanaged"], deps = [ "//pkg/kubelet/container:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/kubelet/preemption/BUILD b/pkg/kubelet/preemption/BUILD index db17a0bc9f6..cdc9c181195 100644 --- a/pkg/kubelet/preemption/BUILD +++ b/pkg/kubelet/preemption/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["preemption.go"], - tags = ["automanaged"], deps = [ "//pkg/api/v1/helper/qos:go_default_library", "//pkg/api/v1/resource:go_default_library", @@ -47,7 +44,6 @@ go_test( name = "go_default_test", srcs = ["preemption_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/kubelet/types:go_default_library", diff --git a/pkg/kubelet/prober/BUILD b/pkg/kubelet/prober/BUILD index 4019666b303..380e5f5ee6e 100644 --- a/pkg/kubelet/prober/BUILD +++ b/pkg/kubelet/prober/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "prober_manager.go", "worker.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/pod:go_default_library", "//pkg/kubelet/container:go_default_library", @@ -48,7 +45,6 @@ go_test( "worker_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/container/testing:go_default_library", diff --git a/pkg/kubelet/prober/results/BUILD b/pkg/kubelet/prober/results/BUILD index d4fa8ebbdae..b33f0f722d1 100644 --- a/pkg/kubelet/prober/results/BUILD +++ b/pkg/kubelet/prober/results/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["results_manager.go"], - tags = ["automanaged"], deps = [ "//pkg/kubelet/container:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -23,7 +20,6 @@ go_test( name = "go_default_test", srcs = ["results_manager_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubelet/container:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", diff --git a/pkg/kubelet/prober/testing/BUILD b/pkg/kubelet/prober/testing/BUILD index b723c48f904..af63bb324e5 100644 --- a/pkg/kubelet/prober/testing/BUILD +++ b/pkg/kubelet/prober/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["fake_manager.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", diff --git a/pkg/kubelet/qos/BUILD b/pkg/kubelet/qos/BUILD index 82cc939342a..c7a50447f4a 100644 --- a/pkg/kubelet/qos/BUILD +++ b/pkg/kubelet/qos/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["policy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", @@ -25,7 +22,6 @@ go_library( "doc.go", "policy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/helper/qos:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/kubelet/remote/BUILD b/pkg/kubelet/remote/BUILD index 59b1e149bed..91528ac553e 100644 --- a/pkg/kubelet/remote/BUILD +++ b/pkg/kubelet/remote/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "remote_runtime.go", "utils.go", ], - tags = ["automanaged"], deps = [ "//pkg/kubelet/apis/cri:go_default_library", "//pkg/kubelet/apis/cri/v1alpha1/runtime:go_default_library", diff --git a/pkg/kubelet/remote/remote_runtime.go b/pkg/kubelet/remote/remote_runtime.go index 250dbdb7b26..c8bfd6d1ef0 100644 --- a/pkg/kubelet/remote/remote_runtime.go +++ b/pkg/kubelet/remote/remote_runtime.go @@ -288,6 +288,23 @@ func (r *RemoteRuntimeService) ContainerStatus(containerID string) (*runtimeapi. return resp.Status, nil } +// UpdateContainerResources updates a containers resource config +func (r *RemoteRuntimeService) UpdateContainerResources(containerID string, resources *runtimeapi.LinuxContainerResources) error { + ctx, cancel := getContextWithTimeout(r.timeout) + defer cancel() + + _, err := r.runtimeClient.UpdateContainerResources(ctx, &runtimeapi.UpdateContainerResourcesRequest{ + ContainerId: containerID, + Linux: resources, + }) + if err != nil { + glog.Errorf("UpdateContainerResources %q from runtime service failed: %v", containerID, err) + return err + } + + return nil +} + // ExecSync executes a command in the container, and returns the stdout output. // If command exits with a non-zero exit code, an error is returned. func (r *RemoteRuntimeService) ExecSync(containerID string, cmd []string, timeout time.Duration) (stdout []byte, stderr []byte, err error) { diff --git a/pkg/kubelet/rkt/BUILD b/pkg/kubelet/rkt/BUILD index da2cd6969f5..5193140585a 100644 --- a/pkg/kubelet/rkt/BUILD +++ b/pkg/kubelet/rkt/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -21,7 +19,6 @@ go_library( "systemd.go", "version.go", ], - tags = ["automanaged"], deps = [ "//pkg/credentialprovider:go_default_library", "//pkg/kubelet/container:go_default_library", @@ -69,7 +66,6 @@ go_test( "rkt_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/container/testing:go_default_library", diff --git a/pkg/kubelet/rktshim/BUILD b/pkg/kubelet/rktshim/BUILD index 57a301aea63..c621cd2ca69 100644 --- a/pkg/kubelet/rktshim/BUILD +++ b/pkg/kubelet/rktshim/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "imagestore.go", "pod-level-interface.go", ], - tags = ["automanaged"], deps = [ "//pkg/kubelet/apis/cri:go_default_library", "//pkg/kubelet/apis/cri/v1alpha1/runtime:go_default_library", @@ -29,7 +26,6 @@ go_test( name = "go_default_test", srcs = ["imagestore_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//pkg/kubelet/apis/cri/v1alpha1/runtime:go_default_library"], ) diff --git a/pkg/kubelet/rktshim/app-interface.go b/pkg/kubelet/rktshim/app-interface.go index b7d9ed3b784..be01bac97fe 100644 --- a/pkg/kubelet/rktshim/app-interface.go +++ b/pkg/kubelet/rktshim/app-interface.go @@ -65,6 +65,11 @@ func (*Runtime) ContainerStatus(string) (*runtimeapi.ContainerStatus, error) { panic("not implemented") } +// UpdateContainerResources updates the resource constraints for the container. +func (*Runtime) UpdateContainerResources(string, *runtimeapi.LinuxContainerResources) error { + panic("not implemented") +} + // ExecSync executes a command in the container, and returns the stdout output. // If command exits with a non-zero exit code, an error is returned. func (*Runtime) ExecSync(containerID string, cmd []string, timeout time.Duration) (stdout []byte, stderr []byte, err error) { diff --git a/pkg/kubelet/rktshim/fake-app-interface.go b/pkg/kubelet/rktshim/fake-app-interface.go index ee6a89a6a28..b0e20d55535 100644 --- a/pkg/kubelet/rktshim/fake-app-interface.go +++ b/pkg/kubelet/rktshim/fake-app-interface.go @@ -205,6 +205,10 @@ func (r *FakeRuntime) ContainerStatus(id string) (*runtimeapi.ContainerStatus, e return &c.Status, nil } +func (r *FakeRuntime) UpdateContainerResources(string, *runtimeapi.LinuxContainerResources) error { + return nil +} + func (r *FakeRuntime) ExecSync(containerID string, cmd []string, timeout time.Duration) (stdout []byte, stderr []byte, err error) { c, ok := r.Containers[containerID] if !ok { diff --git a/pkg/kubelet/secret/BUILD b/pkg/kubelet/secret/BUILD index f652a40f399..e7be9d1a136 100644 --- a/pkg/kubelet/secret/BUILD +++ b/pkg/kubelet/secret/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["secret_manager_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -31,7 +28,6 @@ go_library( "fake_manager.go", "secret_manager.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/pod:go_default_library", "//pkg/kubelet/util:go_default_library", diff --git a/pkg/kubelet/server/BUILD b/pkg/kubelet/server/BUILD index 901302092a4..cfc4800fa04 100644 --- a/pkg/kubelet/server/BUILD +++ b/pkg/kubelet/server/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "doc.go", "server.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1/validation:go_default_library", @@ -61,7 +58,6 @@ go_test( "server_websocket_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", diff --git a/pkg/kubelet/server/portforward/BUILD b/pkg/kubelet/server/portforward/BUILD index a6f01c3ac46..23f52c98fd1 100644 --- a/pkg/kubelet/server/portforward/BUILD +++ b/pkg/kubelet/server/portforward/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "portforward.go", "websocket.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/github.com/golang/glog:go_default_library", @@ -36,7 +33,6 @@ go_test( "websocket_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", diff --git a/pkg/kubelet/server/remotecommand/BUILD b/pkg/kubelet/server/remotecommand/BUILD index 22517fdd380..f93da253f84 100644 --- a/pkg/kubelet/server/remotecommand/BUILD +++ b/pkg/kubelet/server/remotecommand/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "httpstream.go", "websocket.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/pkg/kubelet/server/stats/BUILD b/pkg/kubelet/server/stats/BUILD index 620dd6831c9..8c026960d49 100644 --- a/pkg/kubelet/server/stats/BUILD +++ b/pkg/kubelet/server/stats/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "summary.go", "volume_stat_calculator.go", ], - tags = ["automanaged"], deps = [ "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", "//pkg/kubelet/cm:go_default_library", @@ -46,7 +43,6 @@ go_test( "summary_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", "//pkg/kubelet/cm:go_default_library", diff --git a/pkg/kubelet/server/streaming/BUILD b/pkg/kubelet/server/streaming/BUILD index c2d62d4c3a9..21d1a4b6dbb 100644 --- a/pkg/kubelet/server/streaming/BUILD +++ b/pkg/kubelet/server/streaming/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "request_cache.go", "server.go", ], - tags = ["automanaged"], deps = [ "//pkg/kubelet/apis/cri/v1alpha1/runtime:go_default_library", "//pkg/kubelet/server/portforward:go_default_library", @@ -37,7 +34,6 @@ go_test( "server_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/kubelet/apis/cri/v1alpha1/runtime:go_default_library", diff --git a/pkg/kubelet/status/BUILD b/pkg/kubelet/status/BUILD index a0b08cf58bc..3064ee30df6 100644 --- a/pkg/kubelet/status/BUILD +++ b/pkg/kubelet/status/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "generate.go", "status_manager.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/pod:go_default_library", "//pkg/kubelet/container:go_default_library", @@ -41,7 +38,6 @@ go_test( "status_manager_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1/pod:go_default_library", diff --git a/pkg/kubelet/status/testing/BUILD b/pkg/kubelet/status/testing/BUILD index bb1748e0273..971b9b4335c 100644 --- a/pkg/kubelet/status/testing/BUILD +++ b/pkg/kubelet/status/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["fake_pod_deletion_safety.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/api/core/v1:go_default_library"], ) diff --git a/pkg/kubelet/sysctl/BUILD b/pkg/kubelet/sysctl/BUILD index c34865e6025..4a67fb103f9 100644 --- a/pkg/kubelet/sysctl/BUILD +++ b/pkg/kubelet/sysctl/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "runtime.go", "whitelist.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/helper:go_default_library", "//pkg/api/validation:go_default_library", @@ -33,7 +30,6 @@ go_test( "whitelist_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/api/core/v1:go_default_library"], ) diff --git a/pkg/kubelet/sysctl/runtime.go b/pkg/kubelet/sysctl/runtime.go index 0fb032bd4e3..36d8e1db3ab 100644 --- a/pkg/kubelet/sysctl/runtime.go +++ b/pkg/kubelet/sysctl/runtime.go @@ -31,6 +31,7 @@ const ( dockerMinimumAPIVersion = "1.24.0" dockerTypeName = "docker" + rktTypeName = "rkt" ) // TODO: The admission logic in this file is runtime-dependent. It should be @@ -45,7 +46,8 @@ var _ lifecycle.PodAdmitHandler = &runtimeAdmitHandler{} // NewRuntimeAdmitHandler returns a sysctlRuntimeAdmitHandler which checks whether // the given runtime support sysctls. func NewRuntimeAdmitHandler(runtime container.Runtime) (*runtimeAdmitHandler, error) { - if runtime.Type() == dockerTypeName { + switch runtime.Type() { + case dockerTypeName: v, err := runtime.APIVersion() if err != nil { return nil, fmt.Errorf("failed to get runtime version: %v", err) @@ -70,16 +72,22 @@ func NewRuntimeAdmitHandler(runtime container.Runtime) (*runtimeAdmitHandler, er Message: "Docker before 1.12 does not support sysctls", }, }, nil + case rktTypeName: + return &runtimeAdmitHandler{ + result: lifecycle.PodAdmitResult{ + Admit: false, + Reason: UnsupportedReason, + Message: "Rkt does not support sysctls", + }, + }, nil + default: + // Return admit for other runtimes. + return &runtimeAdmitHandler{ + result: lifecycle.PodAdmitResult{ + Admit: true, + }, + }, nil } - - // for other runtimes like rkt sysctls are not supported - return &runtimeAdmitHandler{ - result: lifecycle.PodAdmitResult{ - Admit: false, - Reason: UnsupportedReason, - Message: fmt.Sprintf("runtime %v does not support sysctls", runtime.Type()), - }, - }, nil } // Admit checks whether the runtime supports sysctls. diff --git a/pkg/kubelet/types/BUILD b/pkg/kubelet/types/BUILD index 622451e2aa8..c44dfba7164 100644 --- a/pkg/kubelet/types/BUILD +++ b/pkg/kubelet/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "pod_update.go", "types.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -33,7 +30,6 @@ go_test( "types_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", diff --git a/pkg/kubelet/types/pod_update.go b/pkg/kubelet/types/pod_update.go index 45a53a0145e..2b95b3b1879 100644 --- a/pkg/kubelet/types/pod_update.go +++ b/pkg/kubelet/types/pod_update.go @@ -141,11 +141,17 @@ func (sp SyncPodType) String() string { // key. Both the rescheduler and the kubelet use this key to make admission // and scheduling decisions. func IsCriticalPod(pod *v1.Pod) bool { + return IsCritical(pod.Namespace, pod.Annotations) +} + +// IsCritical returns true if parameters bear the critical pod annotation +// key. The DaemonSetController use this key directly to make scheduling decisions. +func IsCritical(ns string, annotations map[string]string) bool { // Critical pods are restricted to "kube-system" namespace as of now. - if pod.Namespace != kubeapi.NamespaceSystem { + if ns != kubeapi.NamespaceSystem { return false } - val, ok := pod.Annotations[CriticalPodAnnotationKey] + val, ok := annotations[CriticalPodAnnotationKey] if ok && val == "" { return true } diff --git a/pkg/kubelet/util/BUILD b/pkg/kubelet/util/BUILD index d02977d2107..740d2e782a6 100644 --- a/pkg/kubelet/util/BUILD +++ b/pkg/kubelet/util/BUILD @@ -1,34 +1,42 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", "go_test", ) +go_test( + name = "go_default_test", + srcs = ["util_test.go"], + library = ":go_default_library", + deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], +) + go_library( name = "go_default_library", srcs = [ "doc.go", "util.go", - "util_unix.go", - ], - tags = ["automanaged"], + "util_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "util_unix.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "util_windows.go", + ], + "//conditions:default": [], + }), deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - library = ":go_default_library", - tags = ["automanaged"], - deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/kubelet/util/cache/BUILD b/pkg/kubelet/util/cache/BUILD index 4cc478e32b3..fa2bdda5e3a 100644 --- a/pkg/kubelet/util/cache/BUILD +++ b/pkg/kubelet/util/cache/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["object_cache.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/client-go/tools/cache:go_default_library"], ) @@ -19,7 +16,6 @@ go_test( name = "go_default_test", srcs = ["object_cache_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", diff --git a/pkg/kubelet/util/csr/BUILD b/pkg/kubelet/util/csr/BUILD index 9b794039a8c..41a9a00526c 100644 --- a/pkg/kubelet/util/csr/BUILD +++ b/pkg/kubelet/util/csr/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["csr.go"], - tags = ["automanaged"], deps = [ "//pkg/apis/certificates/v1beta1:go_default_library", "//vendor/github.com/golang/glog:go_default_library", @@ -45,7 +42,6 @@ go_test( name = "go_default_test", srcs = ["csr_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/kubelet/util/format/BUILD b/pkg/kubelet/util/format/BUILD index 1775300d218..a560f2cfe34 100644 --- a/pkg/kubelet/util/format/BUILD +++ b/pkg/kubelet/util/format/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "pod.go", "resources.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", @@ -25,7 +22,6 @@ go_test( name = "go_default_test", srcs = ["resources_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", diff --git a/pkg/kubelet/util/ioutils/BUILD b/pkg/kubelet/util/ioutils/BUILD index f0ae4ad257d..52deb751060 100644 --- a/pkg/kubelet/util/ioutils/BUILD +++ b/pkg/kubelet/util/ioutils/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["ioutils.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/kubelet/util/queue/BUILD b/pkg/kubelet/util/queue/BUILD index 518ecfaa8b8..137940238c1 100644 --- a/pkg/kubelet/util/queue/BUILD +++ b/pkg/kubelet/util/queue/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["work_queue.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", @@ -22,7 +19,6 @@ go_test( name = "go_default_test", srcs = ["work_queue_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", diff --git a/pkg/kubelet/util/sliceutils/BUILD b/pkg/kubelet/util/sliceutils/BUILD index 16a0f5b0a00..1d6438571e9 100644 --- a/pkg/kubelet/util/sliceutils/BUILD +++ b/pkg/kubelet/util/sliceutils/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["sliceutils.go"], - tags = ["automanaged"], deps = [ "//pkg/kubelet/container:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -35,7 +32,6 @@ go_test( name = "go_default_test", srcs = ["sliceutils_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubelet/container:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/kubelet/volumemanager/BUILD b/pkg/kubelet/volumemanager/BUILD index 2c9d292a589..e3259fb1e84 100644 --- a/pkg/kubelet/volumemanager/BUILD +++ b/pkg/kubelet/volumemanager/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["volume_manager.go"], - tags = ["automanaged"], deps = [ "//pkg/kubelet/config:go_default_library", "//pkg/kubelet/container:go_default_library", @@ -41,7 +38,6 @@ go_test( name = "go_default_test", srcs = ["volume_manager_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubelet/config:go_default_library", "//pkg/kubelet/configmap:go_default_library", diff --git a/pkg/kubelet/volumemanager/cache/BUILD b/pkg/kubelet/volumemanager/cache/BUILD index 30a00cc2a93..ec3515c9b64 100644 --- a/pkg/kubelet/volumemanager/cache/BUILD +++ b/pkg/kubelet/volumemanager/cache/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "actual_state_of_world.go", "desired_state_of_world.go", ], - tags = ["automanaged"], deps = [ "//pkg/volume:go_default_library", "//pkg/volume/util/operationexecutor:go_default_library", @@ -33,7 +30,6 @@ go_test( "desired_state_of_world_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/volume:go_default_library", "//pkg/volume/testing:go_default_library", diff --git a/pkg/kubelet/volumemanager/populator/BUILD b/pkg/kubelet/volumemanager/populator/BUILD index 2815b77a0c2..738d8d5421b 100644 --- a/pkg/kubelet/volumemanager/populator/BUILD +++ b/pkg/kubelet/volumemanager/populator/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["desired_state_of_world_populator.go"], - tags = ["automanaged"], deps = [ "//pkg/kubelet/config:go_default_library", "//pkg/kubelet/container:go_default_library", @@ -49,7 +46,6 @@ go_test( name = "go_default_test", srcs = ["desired_state_of_world_populator_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubelet/configmap:go_default_library", "//pkg/kubelet/container/testing:go_default_library", diff --git a/pkg/kubelet/volumemanager/reconciler/BUILD b/pkg/kubelet/volumemanager/reconciler/BUILD index de414ef985d..97065574636 100644 --- a/pkg/kubelet/volumemanager/reconciler/BUILD +++ b/pkg/kubelet/volumemanager/reconciler/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["reconciler.go"], - tags = ["automanaged"], deps = [ "//cmd/kubelet/app/options:go_default_library", "//pkg/kubelet/volumemanager/cache:go_default_library", @@ -37,7 +34,6 @@ go_test( name = "go_default_test", srcs = ["reconciler_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubelet/volumemanager/cache:go_default_library", "//pkg/util/mount:go_default_library", diff --git a/pkg/kubemark/BUILD b/pkg/kubemark/BUILD index 1831c1c8398..0a1050321af 100644 --- a/pkg/kubemark/BUILD +++ b/pkg/kubemark/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,10 +8,10 @@ load( go_library( name = "go_default_library", srcs = [ + "controller.go", "hollow_kubelet.go", "hollow_proxy.go", ], - tags = ["automanaged"], deps = [ "//cmd/kube-proxy/app:go_default_library", "//cmd/kubelet/app:go_default_library", @@ -22,6 +20,7 @@ go_library( "//pkg/apis/componentconfig:go_default_library", "//pkg/apis/componentconfig/v1alpha1:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", + "//pkg/controller:go_default_library", "//pkg/kubelet:go_default_library", "//pkg/kubelet/cadvisor:go_default_library", "//pkg/kubelet/cm:go_default_library", @@ -44,9 +43,15 @@ go_library( "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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", + "//vendor/k8s.io/client-go/informers:go_default_library", + "//vendor/k8s.io/client-go/informers/core/v1:go_default_library", "//vendor/k8s.io/client-go/kubernetes: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/utils/exec:go_default_library", ], diff --git a/pkg/kubemark/controller.go b/pkg/kubemark/controller.go new file mode 100644 index 00000000000..017524b7cef --- /dev/null +++ b/pkg/kubemark/controller.go @@ -0,0 +1,405 @@ +/* +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 kubemark + +import ( + "fmt" + "math/rand" + "sync" + "time" + + apiv1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/informers" + informersv1 "k8s.io/client-go/informers/core/v1" + kubeclient "k8s.io/client-go/kubernetes" + listersv1 "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/tools/cache" + "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/controller" + + "github.com/golang/glog" +) + +const ( + namespaceKubemark = "kubemark" + nodeGroupLabel = "autoscaling.k8s.io/nodegroup" + numRetries = 3 +) + +// KubemarkController is a simplified version of cloud provider for kubemark. It allows +// to add and delete nodes from a kubemark cluster and introduces nodegroups +// by applying labels to the kubemark's hollow-nodes. +type KubemarkController struct { + nodeTemplate *apiv1.ReplicationController + externalCluster externalCluster + kubemarkCluster kubemarkCluster + rand *rand.Rand + createNodeQueue chan string + nodeGroupQueueSize map[string]int + nodeGroupQueueSizeLock sync.Mutex +} + +// externalCluster is used to communicate with the external cluster that hosts +// kubemark, in order to be able to list, create and delete hollow nodes +// by manipulating the replication controllers. +type externalCluster struct { + rcLister listersv1.ReplicationControllerLister + rcSynced cache.InformerSynced + podLister listersv1.PodLister + podSynced cache.InformerSynced + client kubeclient.Interface +} + +// kubemarkCluster is used to delete nodes from kubemark cluster once their +// respective replication controllers have been deleted and the nodes have +// become unready. This is to cover for the fact that there is no proper cloud +// provider for kubemark that would care for deleting the nodes. +type kubemarkCluster struct { + client kubeclient.Interface + nodeLister listersv1.NodeLister + nodeSynced cache.InformerSynced + nodesToDelete map[string]bool + nodesToDeleteLock sync.Mutex +} + +// NewKubemarkController creates KubemarkController using the provided clients to talk to external +// and kubemark clusters. +func NewKubemarkController(externalClient kubeclient.Interface, externalInformerFactory informers.SharedInformerFactory, + kubemarkClient kubeclient.Interface, kubemarkNodeInformer informersv1.NodeInformer) (*KubemarkController, error) { + rcInformer := externalInformerFactory.InformerFor(&apiv1.ReplicationController{}, newReplicationControllerInformer) + podInformer := externalInformerFactory.InformerFor(&apiv1.Pod{}, newPodInformer) + controller := &KubemarkController{ + externalCluster: externalCluster{ + rcLister: listersv1.NewReplicationControllerLister(rcInformer.GetIndexer()), + rcSynced: rcInformer.HasSynced, + podLister: listersv1.NewPodLister(podInformer.GetIndexer()), + podSynced: podInformer.HasSynced, + client: externalClient, + }, + kubemarkCluster: kubemarkCluster{ + nodeLister: kubemarkNodeInformer.Lister(), + nodeSynced: kubemarkNodeInformer.Informer().HasSynced, + client: kubemarkClient, + nodesToDelete: make(map[string]bool), + nodesToDeleteLock: sync.Mutex{}, + }, + rand: rand.New(rand.NewSource(time.Now().UTC().UnixNano())), + createNodeQueue: make(chan string, 1000), + nodeGroupQueueSize: make(map[string]int), + nodeGroupQueueSizeLock: sync.Mutex{}, + } + + kubemarkNodeInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + UpdateFunc: controller.kubemarkCluster.removeUnneededNodes, + }) + + return controller, nil +} + +// WaitForCacheSync waits until all caches in the controller are populated. +func (kubemarkController *KubemarkController) WaitForCacheSync(stopCh chan struct{}) bool { + return controller.WaitForCacheSync("kubemark", stopCh, + kubemarkController.externalCluster.rcSynced, + kubemarkController.externalCluster.podSynced, + kubemarkController.kubemarkCluster.nodeSynced) +} + +// Run populates the node template needed for creation of kubemark nodes and +// starts the worker routine for creating new nodes. +func (kubemarkController *KubemarkController) Run(stopCh chan struct{}) { + nodeTemplate, err := kubemarkController.getNodeTemplate() + if err != nil { + glog.Fatalf("failed to get node template: %s", err) + } + kubemarkController.nodeTemplate = nodeTemplate + + go kubemarkController.runNodeCreation(stopCh) + <-stopCh +} + +// GetNodeNamesForNodeGroup returns list of the nodes in the node group. +func (kubemarkController *KubemarkController) GetNodeNamesForNodeGroup(nodeGroup string) ([]string, error) { + selector := labels.SelectorFromSet(labels.Set{nodeGroupLabel: nodeGroup}) + pods, err := kubemarkController.externalCluster.podLister.List(selector) + if err != nil { + return nil, err + } + result := make([]string, 0, len(pods)) + for _, pod := range pods { + result = append(result, pod.ObjectMeta.Name) + } + return result, nil +} + +// GetNodeGroupSize returns the current size for the node group as observed. +func (kubemarkController *KubemarkController) GetNodeGroupSize(nodeGroup string) (int, error) { + selector := labels.SelectorFromSet(labels.Set(map[string]string{nodeGroupLabel: nodeGroup})) + nodes, err := kubemarkController.externalCluster.rcLister.List(selector) + if err != nil { + return 0, err + } + return len(nodes), nil +} + +// GetNodeGroupTargetSize returns the size of the node group as a sum of current +// observed size and number of upcoming nodes. +func (kubemarkController *KubemarkController) GetNodeGroupTargetSize(nodeGroup string) (int, error) { + kubemarkController.nodeGroupQueueSizeLock.Lock() + defer kubemarkController.nodeGroupQueueSizeLock.Unlock() + realSize, err := kubemarkController.GetNodeGroupSize(nodeGroup) + if err != nil { + return realSize, err + } + return realSize + kubemarkController.nodeGroupQueueSize[nodeGroup], nil +} + +// SetNodeGroupSize changes the size of node group by adding or removing nodes. +func (kubemarkController *KubemarkController) SetNodeGroupSize(nodeGroup string, size int) error { + currSize, err := kubemarkController.GetNodeGroupTargetSize(nodeGroup) + if err != nil { + return err + } + switch delta := size - currSize; { + case delta < 0: + absDelta := -delta + nodes, err := kubemarkController.GetNodeNamesForNodeGroup(nodeGroup) + if err != nil { + return err + } + if len(nodes) < absDelta { + return fmt.Errorf("can't remove %d nodes from %s nodegroup, not enough nodes: %d", absDelta, nodeGroup, len(nodes)) + } + for i, node := range nodes { + if i == absDelta { + return nil + } + if err := kubemarkController.removeNodeFromNodeGroup(nodeGroup, node); err != nil { + return err + } + } + case delta > 0: + kubemarkController.nodeGroupQueueSizeLock.Lock() + for i := 0; i < delta; i++ { + kubemarkController.nodeGroupQueueSize[nodeGroup]++ + kubemarkController.createNodeQueue <- nodeGroup + } + kubemarkController.nodeGroupQueueSizeLock.Unlock() + } + + return nil +} + +// GetNodeGroupForNode returns the name of the node group to which the node +// belongs. +func (kubemarkController *KubemarkController) GetNodeGroupForNode(node string) (string, error) { + pod := kubemarkController.getPodByName(node) + if pod == nil { + return "", fmt.Errorf("node %s does not exist", node) + } + nodeGroup, ok := pod.ObjectMeta.Labels[nodeGroupLabel] + if ok { + return nodeGroup, nil + } + return "", fmt.Errorf("can't find nodegroup for node %s due to missing label %s", node, nodeGroupLabel) +} + +func (kubemarkController *KubemarkController) addNodeToNodeGroup(nodeGroup string) error { + templateCopy, err := api.Scheme.Copy(kubemarkController.nodeTemplate) + if err != nil { + return err + } + node := templateCopy.(*apiv1.ReplicationController) + node.Name = fmt.Sprintf("%s-%d", nodeGroup, kubemarkController.rand.Int63()) + node.Labels = map[string]string{nodeGroupLabel: nodeGroup, "name": node.Name} + node.Spec.Template.Labels = node.Labels + + for i := 0; i < numRetries; i++ { + _, err = kubemarkController.externalCluster.client.CoreV1().ReplicationControllers(node.Namespace).Create(node) + if err == nil { + return nil + } + } + + return err +} + +func (kubemarkController *KubemarkController) removeNodeFromNodeGroup(nodeGroup string, node string) error { + pod := kubemarkController.getPodByName(node) + if pod == nil { + glog.Warningf("Can't delete node %s from nodegroup %s. Node does not exist.", node, nodeGroup) + return nil + } + if pod.ObjectMeta.Labels[nodeGroupLabel] != nodeGroup { + return fmt.Errorf("can't delete node %s from nodegroup %s. Node is not in nodegroup", node, nodeGroup) + } + policy := metav1.DeletePropagationForeground + var err error + for i := 0; i < numRetries; i++ { + err = kubemarkController.externalCluster.client.CoreV1().ReplicationControllers(namespaceKubemark).Delete( + pod.ObjectMeta.Labels["name"], + &metav1.DeleteOptions{PropagationPolicy: &policy}) + if err == nil { + glog.Infof("marking node %s for deletion", node) + // Mark node for deletion from kubemark cluster. + // Once it becomes unready after replication controller + // deletion has been noticed, we will delete it explicitly. + // This is to cover for the fact that kubemark does not + // take care of this itself. + kubemarkController.kubemarkCluster.markNodeForDeletion(node) + return nil + } + } + return fmt.Errorf("Failed to delete node %s: %v", node, err) +} + +func (kubemarkController *KubemarkController) getReplicationControllerByName(name string) *apiv1.ReplicationController { + rcs, err := kubemarkController.externalCluster.rcLister.List(labels.Everything()) + if err != nil { + return nil + } + for _, rc := range rcs { + if rc.ObjectMeta.Name == name { + return rc + } + } + return nil +} + +func (kubemarkController *KubemarkController) getPodByName(name string) *apiv1.Pod { + pods, err := kubemarkController.externalCluster.podLister.List(labels.Everything()) + if err != nil { + return nil + } + for _, pod := range pods { + if pod.ObjectMeta.Name == name { + return pod + } + } + return nil +} + +func (kubemarkController *KubemarkController) getNodeNameForPod(podName string) (string, error) { + pods, err := kubemarkController.externalCluster.podLister.List(labels.Everything()) + if err != nil { + return "", err + } + for _, pod := range pods { + if pod.ObjectMeta.Name == podName { + return pod.Labels["name"], nil + } + } + return "", fmt.Errorf("pod %s not found", podName) +} + +// getNodeTemplate returns the template for hollow node replication controllers +// by looking for an existing hollow node specification. This requires at least +// one kubemark node to be present on startup. +func (kubemarkController *KubemarkController) getNodeTemplate() (*apiv1.ReplicationController, error) { + podName, err := kubemarkController.kubemarkCluster.getHollowNodeName() + if err != nil { + return nil, err + } + hollowNodeName, err := kubemarkController.getNodeNameForPod(podName) + if err != nil { + return nil, err + } + if hollowNode := kubemarkController.getReplicationControllerByName(hollowNodeName); hollowNode != nil { + nodeTemplate := &apiv1.ReplicationController{ + Spec: apiv1.ReplicationControllerSpec{ + Template: hollowNode.Spec.Template, + }, + } + + nodeTemplate.Spec.Selector = nil + nodeTemplate.Namespace = namespaceKubemark + one := int32(1) + nodeTemplate.Spec.Replicas = &one + + return nodeTemplate, nil + } + return nil, fmt.Errorf("can't get hollow node template") +} + +func (kubemarkController *KubemarkController) runNodeCreation(stop <-chan struct{}) { + for { + select { + case nodeGroup := <-kubemarkController.createNodeQueue: + kubemarkController.nodeGroupQueueSizeLock.Lock() + err := kubemarkController.addNodeToNodeGroup(nodeGroup) + if err != nil { + glog.Errorf("failed to add node to node group %s: %v", nodeGroup, err) + } else { + kubemarkController.nodeGroupQueueSize[nodeGroup]-- + } + kubemarkController.nodeGroupQueueSizeLock.Unlock() + case <-stop: + return + } + } +} + +func (kubemarkCluster *kubemarkCluster) getHollowNodeName() (string, error) { + nodes, err := kubemarkCluster.nodeLister.List(labels.Everything()) + if err != nil { + return "", err + } + for _, node := range nodes { + return node.Name, nil + } + return "", fmt.Errorf("did not find any hollow nodes in the cluster") +} + +func (kubemarkCluster *kubemarkCluster) removeUnneededNodes(oldObj interface{}, newObj interface{}) { + node, ok := newObj.(*apiv1.Node) + if !ok { + return + } + for _, condition := range node.Status.Conditions { + // Delete node if it is in unready state, and it has been + // explicitly marked for deletion. + if condition.Type == apiv1.NodeReady && condition.Status != apiv1.ConditionTrue { + kubemarkCluster.nodesToDeleteLock.Lock() + defer kubemarkCluster.nodesToDeleteLock.Unlock() + if kubemarkCluster.nodesToDelete[node.Name] { + kubemarkCluster.nodesToDelete[node.Name] = false + if err := kubemarkCluster.client.CoreV1().Nodes().Delete(node.Name, &metav1.DeleteOptions{}); err != nil { + glog.Errorf("failed to delete node %s from kubemark cluster, err: %v", node.Name, err) + } + } + return + } + } +} + +func (kubemarkCluster *kubemarkCluster) markNodeForDeletion(name string) { + kubemarkCluster.nodesToDeleteLock.Lock() + defer kubemarkCluster.nodesToDeleteLock.Unlock() + kubemarkCluster.nodesToDelete[name] = true +} + +func newReplicationControllerInformer(kubeClient kubeclient.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + rcListWatch := cache.NewListWatchFromClient(kubeClient.CoreV1().RESTClient(), "replicationcontrollers", namespaceKubemark, fields.Everything()) + return cache.NewSharedIndexInformer(rcListWatch, &apiv1.ReplicationController{}, resyncPeriod, nil) +} + +func newPodInformer(kubeClient kubeclient.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + podListWatch := cache.NewListWatchFromClient(kubeClient.CoreV1().RESTClient(), "pods", namespaceKubemark, fields.Everything()) + return cache.NewSharedIndexInformer(podListWatch, &apiv1.Pod{}, resyncPeriod, nil) +} diff --git a/pkg/kubemark/hollow_kubelet.go b/pkg/kubemark/hollow_kubelet.go index 80de302f324..1ad3809b5a5 100644 --- a/pkg/kubemark/hollow_kubelet.go +++ b/pkg/kubemark/hollow_kubelet.go @@ -110,6 +110,7 @@ func GetHollowKubeletConfig( // Flags struct f := &options.KubeletFlags{ + RootDirectory: testRootDir, HostnameOverride: nodeName, // Use the default runtime options. ContainerRuntimeOptions: *options.NewContainerRuntimeOptions(), @@ -123,7 +124,6 @@ func GetHollowKubeletConfig( c := &componentconfig.KubeletConfiguration{} api.Scheme.Convert(tmp, c, nil) - c.RootDirectory = testRootDir c.ManifestURL = "" c.Address = "0.0.0.0" /* bind address */ c.Port = int32(kubeletPort) diff --git a/pkg/labels/BUILD b/pkg/labels/BUILD index deefdcef3c1..df044c0ebf9 100644 --- a/pkg/labels/BUILD +++ b/pkg/labels/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/master/BUILD b/pkg/master/BUILD index 54de9a3e371..1dad3bec249 100644 --- a/pkg/master/BUILD +++ b/pkg/master/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "master.go", "services.go", ], - tags = ["automanaged"], deps = [ "//cmd/kube-apiserver/app/options:go_default_library", "//pkg/api:go_default_library", @@ -80,6 +77,7 @@ go_library( "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", "//vendor/k8s.io/api/networking/v1:go_default_library", "//vendor/k8s.io/api/policy/v1beta1:go_default_library", + "//vendor/k8s.io/api/rbac/v1:go_default_library", "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", @@ -111,7 +109,6 @@ go_test( "master_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", @@ -124,6 +121,9 @@ go_test( "//pkg/client/clientset_generated/internalclientset/fake:go_default_library", "//pkg/generated/openapi:go_default_library", "//pkg/kubelet/client:go_default_library", + "//pkg/registry/certificates/rest:go_default_library", + "//pkg/registry/core/rest:go_default_library", + "//pkg/registry/registrytest:go_default_library", "//pkg/version:go_default_library", "//vendor/github.com/go-openapi/loads:go_default_library", "//vendor/github.com/go-openapi/spec:go_default_library", @@ -134,6 +134,7 @@ go_test( "//vendor/k8s.io/api/autoscaling/v1:go_default_library", "//vendor/k8s.io/api/batch/v1:go_default_library", "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", + "//vendor/k8s.io/api/certificates/v1beta1: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/apis/meta/v1:go_default_library", diff --git a/pkg/master/client_ca_hook.go b/pkg/master/client_ca_hook.go index e6d1b91001a..3a2780c92a7 100644 --- a/pkg/master/client_ca_hook.go +++ b/pkg/master/client_ca_hook.go @@ -46,7 +46,7 @@ func (h ClientCARegistrationHook) PostStartHook(hookContext genericapiserver.Pos return nil } - // intializing CAs is important so that aggregated API servers can come up with "normal" config. + // initializing CAs is important so that aggregated API servers can come up with "normal" config. // We've seen lagging etcd before, so we want to retry this a few times before we decide to crashloop // the API server on it. err := wait.Poll(1*time.Second, 30*time.Second, func() (done bool, err error) { @@ -62,7 +62,7 @@ func (h ClientCARegistrationHook) PostStartHook(hookContext genericapiserver.Pos return h.tryToWriteClientCAs(client) }) - // if we're never able to make it through intialization, kill the API server + // if we're never able to make it through initialization, kill the API server if err != nil { return fmt.Errorf("unable to initialize client CA configmap: %v", err) } diff --git a/pkg/master/controller/crdregistration/BUILD b/pkg/master/controller/crdregistration/BUILD index b079131ba03..b1e187cfd62 100644 --- a/pkg/master/controller/crdregistration/BUILD +++ b/pkg/master/controller/crdregistration/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["crdregistration_controller.go"], - tags = ["automanaged"], deps = [ "//pkg/controller:go_default_library", "//vendor/github.com/golang/glog:go_default_library", @@ -46,7 +43,6 @@ go_test( name = "go_default_test", srcs = ["crdregistration_controller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion:go_default_library", diff --git a/pkg/master/import_known_versions_test.go b/pkg/master/import_known_versions_test.go index 374c69d8918..8046105bcba 100644 --- a/pkg/master/import_known_versions_test.go +++ b/pkg/master/import_known_versions_test.go @@ -73,6 +73,7 @@ func TestTypeTags(t *testing.T) { var typesAllowedTags = map[reflect.Type]bool{ reflect.TypeOf(intstr.IntOrString{}): true, reflect.TypeOf(metav1.Time{}): true, + reflect.TypeOf(metav1.MicroTime{}): true, reflect.TypeOf(metav1.Duration{}): true, reflect.TypeOf(metav1.TypeMeta{}): true, reflect.TypeOf(metav1.ListMeta{}): true, diff --git a/pkg/master/master.go b/pkg/master/master.go index 22886c75020..107c4aabd09 100644 --- a/pkg/master/master.go +++ b/pkg/master/master.go @@ -36,6 +36,7 @@ import ( extensionsapiv1beta1 "k8s.io/api/extensions/v1beta1" networkingapiv1 "k8s.io/api/networking/v1" policyapiv1beta1 "k8s.io/api/policy/v1beta1" + rbacv1 "k8s.io/api/rbac/v1" rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" rbacv1beta1 "k8s.io/api/rbac/v1beta1" schedulingapiv1alpha1 "k8s.io/api/scheduling/v1alpha1" @@ -392,6 +393,7 @@ func DefaultAPIResourceConfigSource() *serverstorage.ResourceConfig { // TODO: enable apps/v1beta2 by default before 1.8 release, after the API changes are done // appsv1beta2.SchemeGroupVersion, policyapiv1beta1.SchemeGroupVersion, + rbacv1.SchemeGroupVersion, rbacv1beta1.SchemeGroupVersion, // Don't copy this pattern. We enable rbac/v1alpha1 and settings/v1laph1 // by default only because they were enabled in previous releases. diff --git a/pkg/master/master_test.go b/pkg/master/master_test.go index dc7d6a1af9f..40e3abeefe1 100644 --- a/pkg/master/master_test.go +++ b/pkg/master/master_test.go @@ -30,6 +30,7 @@ import ( autoscalingapiv1 "k8s.io/api/autoscaling/v1" batchapiv1 "k8s.io/api/batch/v1" batchapiv2alpha1 "k8s.io/api/batch/v2alpha1" + certificatesapiv1beta1 "k8s.io/api/certificates/v1beta1" apiv1 "k8s.io/api/core/v1" extensionsapiv1beta1 "k8s.io/api/extensions/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -56,6 +57,9 @@ import ( "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/rbac" kubeletclient "k8s.io/kubernetes/pkg/kubelet/client" + certificatesrest "k8s.io/kubernetes/pkg/registry/certificates/rest" + corerest "k8s.io/kubernetes/pkg/registry/core/rest" + "k8s.io/kubernetes/pkg/registry/registrytest" kubeversion "k8s.io/kubernetes/pkg/version" "github.com/stretchr/testify/assert" @@ -112,6 +116,61 @@ func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertion return server, *config, assert.New(t) } +// TestLegacyRestStorageStrategies ensures that all Storage objects which are using the generic registry Store have +// their various strategies properly wired up. This surfaced as a bug where strategies defined Export functions, but +// they were never used outside of unit tests because the export strategies were not assigned inside the Store. +func TestLegacyRestStorageStrategies(t *testing.T) { + _, _, masterCfg, _ := newMaster(t) + storageProvider := corerest.LegacyRESTStorageProvider{ + StorageFactory: masterCfg.StorageFactory, + ProxyTransport: masterCfg.ProxyTransport, + KubeletClientConfig: masterCfg.KubeletClientConfig, + EventTTL: masterCfg.EventTTL, + ServiceIPRange: masterCfg.ServiceIPRange, + ServiceNodePortRange: masterCfg.ServiceNodePortRange, + LoopbackClientConfig: masterCfg.GenericConfig.LoopbackClientConfig, + } + + _, apiGroupInfo, err := storageProvider.NewLegacyRESTStorage(masterCfg.GenericConfig.RESTOptionsGetter) + if err != nil { + t.Errorf("failed to create legacy REST storage: %v", err) + } + + // Any new stores with export logic will need to be added here: + exceptions := registrytest.StrategyExceptions{ + // Only these stores should have an export strategy defined: + HasExportStrategy: []string{ + "secrets", + "limitRanges", + "nodes", + "podTemplates", + }, + } + + strategyErrors := registrytest.ValidateStorageStrategies(apiGroupInfo.VersionedResourcesStorageMap["v1"], exceptions) + for _, err := range strategyErrors { + t.Error(err) + } +} + +func TestCertificatesRestStorageStrategies(t *testing.T) { + _, _, masterCfg, _ := newMaster(t) + certStorageProvider := certificatesrest.RESTStorageProvider{} + apiGroupInfo, _ := certStorageProvider.NewRESTStorage(masterCfg.APIResourceConfigSource, masterCfg.GenericConfig.RESTOptionsGetter) + + exceptions := registrytest.StrategyExceptions{ + HasExportStrategy: []string{ + "certificatesigningrequests", + }, + } + + strategyErrors := registrytest.ValidateStorageStrategies( + apiGroupInfo.VersionedResourcesStorageMap[certificatesapiv1beta1.SchemeGroupVersion.Version], exceptions) + for _, err := range strategyErrors { + t.Error(err) + } +} + func newMaster(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) { etcdserver, config, assert := setUp(t) diff --git a/pkg/master/ports/BUILD b/pkg/master/ports/BUILD index 906fb7cae08..1b047cda995 100644 --- a/pkg/master/ports/BUILD +++ b/pkg/master/ports/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "ports.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/master/tunneler/BUILD b/pkg/master/tunneler/BUILD index f31cd36f18b..906195f4b54 100644 --- a/pkg/master/tunneler/BUILD +++ b/pkg/master/tunneler/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["ssh_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", @@ -22,7 +19,6 @@ go_test( go_library( name = "go_default_library", srcs = ["ssh.go"], - tags = ["automanaged"], deps = [ "//pkg/ssh:go_default_library", "//pkg/util/file:go_default_library", diff --git a/pkg/printers/BUILD b/pkg/printers/BUILD index cc22aa2c112..b2336dc0ab4 100644 --- a/pkg/printers/BUILD +++ b/pkg/printers/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -23,7 +21,6 @@ go_library( "template.go", "versioned.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", @@ -41,10 +38,9 @@ go_library( go_test( name = "go_default_xtest", srcs = ["customcolumn_test.go"], - tags = ["automanaged"], deps = [ + ":go_default_library", "//pkg/api:go_default_library", - "//pkg/printers:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/pkg/printers/internalversion/BUILD b/pkg/printers/internalversion/BUILD index 5b2f410bd20..fa0ad5d66b0 100644 --- a/pkg/printers/internalversion/BUILD +++ b/pkg/printers/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "sorted_resource_name_list_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/client/clientset_generated/federation_clientset/fake:go_default_library", @@ -57,7 +54,6 @@ go_library( "describe.go", "printers.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//federation/apis/federation/v1beta1:go_default_library", @@ -81,7 +77,6 @@ go_library( "//pkg/apis/storage/util:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/core/internalversion:go_default_library", - "//pkg/controller:go_default_library", "//pkg/controller/deployment/util:go_default_library", "//pkg/fieldpath:go_default_library", "//pkg/printers:go_default_library", diff --git a/pkg/printers/internalversion/describe.go b/pkg/printers/internalversion/describe.go index 33f929e74c7..6f0299612af 100644 --- a/pkg/printers/internalversion/describe.go +++ b/pkg/printers/internalversion/describe.go @@ -68,7 +68,6 @@ import ( storageutil "k8s.io/kubernetes/pkg/apis/storage/util" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" - "k8s.io/kubernetes/pkg/controller" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" "k8s.io/kubernetes/pkg/fieldpath" "k8s.io/kubernetes/pkg/printers" @@ -673,7 +672,7 @@ func describePod(pod *api.Pod, events *api.EventList) (string, error) { } func printController(controllee metav1.Object) string { - if controllerRef := controller.GetControllerOf(controllee); controllerRef != nil { + if controllerRef := metav1.GetControllerOf(controllee); controllerRef != nil { return fmt.Sprintf("%s/%s", controllerRef.Kind, controllerRef.Name) } return "" @@ -2921,7 +2920,7 @@ func getPodStatusForController(c coreclient.PodInterface, selector labels.Select return } for _, pod := range rcPods.Items { - controllerRef := controller.GetControllerOf(&pod) + controllerRef := metav1.GetControllerOf(&pod) // Skip pods that are orphans or owned by other controllers. if controllerRef == nil || controllerRef.UID != uid { continue diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index 596a8f8340d..85d8a70a509 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -55,7 +55,6 @@ import ( "k8s.io/kubernetes/pkg/apis/rbac" "k8s.io/kubernetes/pkg/apis/storage" storageutil "k8s.io/kubernetes/pkg/apis/storage/util" - "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/printers" "k8s.io/kubernetes/pkg/util/node" ) @@ -836,15 +835,16 @@ func printCronJobList(list *batch.CronJobList, options printers.PrintOptions) ([ // `wide` indicates whether the returned value is meant for --o=wide output. If not, it's clipped to 16 bytes. func loadBalancerStatusStringer(s api.LoadBalancerStatus, wide bool) string { ingress := s.Ingress - result := []string{} + result := sets.NewString() for i := range ingress { if ingress[i].IP != "" { - result = append(result, ingress[i].IP) + result.Insert(ingress[i].IP) } else if ingress[i].Hostname != "" { - result = append(result, ingress[i].Hostname) + result.Insert(ingress[i].Hostname) } } - r := strings.Join(result, ",") + + r := strings.Join(result.List(), ",") if !wide && len(r) > loadBalancerWidth { r = r[0:(loadBalancerWidth-3)] + "..." } @@ -1770,7 +1770,7 @@ func printControllerRevision(obj *apps.ControllerRevision, options printers.Prin Object: runtime.RawExtension{Object: obj}, } - controllerRef := controller.GetControllerOf(obj) + controllerRef := metav1.GetControllerOf(obj) controllerName := "" if controllerRef != nil { withKind := true diff --git a/pkg/printers/internalversion/printers_test.go b/pkg/printers/internalversion/printers_test.go index 1e79699829a..74e603a9ae7 100644 --- a/pkg/printers/internalversion/printers_test.go +++ b/pkg/printers/internalversion/printers_test.go @@ -2630,6 +2630,7 @@ func TestPrintService(t *testing.T) { func TestPrintPodDisruptionBudget(t *testing.T) { minAvailable := intstr.FromInt(22) + maxUnavailable := intstr.FromInt(11) tests := []struct { pdb policy.PodDisruptionBudget expect string @@ -2649,6 +2650,22 @@ func TestPrintPodDisruptionBudget(t *testing.T) { }, }, "pdb1\t22\tN/A\t5\t0s\n", + }, + { + policy.PodDisruptionBudget{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "ns2", + Name: "pdb2", + CreationTimestamp: metav1.Time{Time: time.Now().Add(1.9e9)}, + }, + Spec: policy.PodDisruptionBudgetSpec{ + MaxUnavailable: &maxUnavailable, + }, + Status: policy.PodDisruptionBudgetStatus{ + PodDisruptionsAllowed: 5, + }, + }, + "pdb2\tN/A\t11\t5\t0s\n", }} buf := bytes.NewBuffer([]byte{}) diff --git a/pkg/printers/storage/BUILD b/pkg/printers/storage/BUILD index c5478f458e7..e73577baa88 100644 --- a/pkg/printers/storage/BUILD +++ b/pkg/printers/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/printers:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1:go_default_library", diff --git a/pkg/probe/BUILD b/pkg/probe/BUILD index 9b51fe1718c..2e21d154fd2 100644 --- a/pkg/probe/BUILD +++ b/pkg/probe/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "probe.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/probe/exec/BUILD b/pkg/probe/exec/BUILD index 7cea1c092f0..d817517657d 100644 --- a/pkg/probe/exec/BUILD +++ b/pkg/probe/exec/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["exec.go"], - tags = ["automanaged"], deps = [ "//pkg/probe:go_default_library", "//vendor/github.com/golang/glog:go_default_library", @@ -23,7 +20,6 @@ go_test( name = "go_default_test", srcs = ["exec_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//pkg/probe:go_default_library"], ) diff --git a/pkg/probe/http/BUILD b/pkg/probe/http/BUILD index 8109f37279f..40eb47fd890 100644 --- a/pkg/probe/http/BUILD +++ b/pkg/probe/http/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["http.go"], - tags = ["automanaged"], deps = [ "//pkg/probe:go_default_library", "//pkg/version:go_default_library", @@ -24,7 +21,6 @@ go_test( name = "go_default_test", srcs = ["http_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//pkg/probe:go_default_library"], ) diff --git a/pkg/probe/tcp/BUILD b/pkg/probe/tcp/BUILD index bec74fcd71a..7d19c9598ae 100644 --- a/pkg/probe/tcp/BUILD +++ b/pkg/probe/tcp/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["tcp.go"], - tags = ["automanaged"], deps = [ "//pkg/probe:go_default_library", "//vendor/github.com/golang/glog:go_default_library", @@ -22,7 +19,6 @@ go_test( name = "go_default_test", srcs = ["tcp_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//pkg/probe:go_default_library"], ) diff --git a/pkg/proxy/BUILD b/pkg/proxy/BUILD index 4ed275a0939..22bf30b13ce 100644 --- a/pkg/proxy/BUILD +++ b/pkg/proxy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "types.go", ], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/types:go_default_library"], ) diff --git a/pkg/proxy/config/BUILD b/pkg/proxy/config/BUILD index 8048f6e9d67..997dc924336 100644 --- a/pkg/proxy/config/BUILD +++ b/pkg/proxy/config/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "config.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/informers/informers_generated/internalversion/core/internalversion:go_default_library", @@ -33,7 +30,6 @@ go_test( "config_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset/fake:go_default_library", diff --git a/pkg/proxy/healthcheck/BUILD b/pkg/proxy/healthcheck/BUILD index e6442fd57d5..77b102f482f 100644 --- a/pkg/proxy/healthcheck/BUILD +++ b/pkg/proxy/healthcheck/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "healthcheck.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/github.com/golang/glog:go_default_library", @@ -31,7 +28,6 @@ go_test( name = "go_default_test", srcs = ["healthcheck_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/davecgh/go-spew/spew:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", diff --git a/pkg/proxy/iptables/BUILD b/pkg/proxy/iptables/BUILD index 3168a71c2c3..e6c45650b38 100644 --- a/pkg/proxy/iptables/BUILD +++ b/pkg/proxy/iptables/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "metrics.go", "proxier.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", @@ -43,7 +40,6 @@ go_test( name = "go_default_test", srcs = ["proxier_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/proxy:go_default_library", diff --git a/pkg/proxy/iptables/proxier.go b/pkg/proxy/iptables/proxier.go index dda2d9f6de7..aa340e96b91 100644 --- a/pkg/proxy/iptables/proxier.go +++ b/pkg/proxy/iptables/proxier.go @@ -211,7 +211,7 @@ func newServiceInfo(svcPortName proxy.ServicePortName, port *api.ServicePort, se copy(info.externalIPs, service.Spec.ExternalIPs) if apiservice.NeedsHealthCheck(service) { - p := apiservice.GetServiceHealthCheckNodePort(service) + p := service.Spec.HealthCheckNodePort if p == 0 { glog.Errorf("Service %q has no healthcheck nodeport", svcPortName.NamespacedName.String()) } else { diff --git a/pkg/proxy/iptables/proxier_test.go b/pkg/proxy/iptables/proxier_test.go index 768f0db8ff2..35f288c53b3 100644 --- a/pkg/proxy/iptables/proxier_test.go +++ b/pkg/proxy/iptables/proxier_test.go @@ -867,7 +867,7 @@ func TestOnlyLocalLoadBalancing(t *testing.T) { svc.Status.LoadBalancer.Ingress = []api.LoadBalancerIngress{{ IP: svcLBIP, }} - svc.Annotations[api.BetaAnnotationExternalTraffic] = api.AnnotationValueExternalTrafficLocal + svc.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal }), ) @@ -958,7 +958,7 @@ func onlyLocalNodePorts(t *testing.T, fp *Proxier, ipt *iptablestest.FakeIPTable Protocol: api.ProtocolTCP, NodePort: int32(svcNodePort), }} - svc.Annotations[api.BetaAnnotationExternalTraffic] = api.AnnotationValueExternalTrafficLocal + svc.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal }), ) @@ -1069,10 +1069,6 @@ func TestBuildServiceMapAddRemove(t *testing.T) { } }), makeTestService("somewhere", "only-local-load-balancer", func(svc *api.Service) { - svc.ObjectMeta.Annotations = map[string]string{ - api.BetaAnnotationExternalTraffic: api.AnnotationValueExternalTrafficLocal, - api.BetaAnnotationHealthCheckNodePort: "345", - } svc.Spec.Type = api.ServiceTypeLoadBalancer svc.Spec.ClusterIP = "172.16.55.12" svc.Spec.LoadBalancerIP = "5.6.7.8" @@ -1083,6 +1079,8 @@ func TestBuildServiceMapAddRemove(t *testing.T) { {IP: "10.1.2.3"}, }, } + svc.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal + svc.Spec.HealthCheckNodePort = 345 }), } @@ -1214,10 +1212,6 @@ func TestBuildServiceMapServiceUpdate(t *testing.T) { svc.Spec.Ports = addTestPort(svc.Spec.Ports, "somethingelse", "TCP", 1235, 5321, 0) }) servicev2 := makeTestService("somewhere", "some-service", func(svc *api.Service) { - svc.ObjectMeta.Annotations = map[string]string{ - api.BetaAnnotationExternalTraffic: api.AnnotationValueExternalTrafficLocal, - api.BetaAnnotationHealthCheckNodePort: "345", - } svc.Spec.Type = api.ServiceTypeLoadBalancer svc.Spec.ClusterIP = "172.16.55.4" svc.Spec.LoadBalancerIP = "5.6.7.8" @@ -1228,6 +1222,8 @@ func TestBuildServiceMapServiceUpdate(t *testing.T) { {IP: "10.1.2.3"}, }, } + svc.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyTypeLocal + svc.Spec.HealthCheckNodePort = 345 }) fp.OnServiceAdd(servicev1) diff --git a/pkg/proxy/userspace/BUILD b/pkg/proxy/userspace/BUILD index 3597b329da7..096f905bf7c 100644 --- a/pkg/proxy/userspace/BUILD +++ b/pkg/proxy/userspace/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,8 +16,12 @@ go_library( "rlimit.go", "roundrobin.go", "udp_server.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "rlimit_windows.go", + ], + "//conditions:default": [], + }), deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", @@ -47,7 +49,6 @@ go_test( "roundrobin_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/proxy:go_default_library", diff --git a/pkg/proxy/util/BUILD b/pkg/proxy/util/BUILD index 44a8bd1a3a9..61acf95fca0 100644 --- a/pkg/proxy/util/BUILD +++ b/pkg/proxy/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["conntrack.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", @@ -22,7 +19,6 @@ go_test( name = "go_default_test", srcs = ["conntrack_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/exec/testing:go_default_library", diff --git a/pkg/proxy/winuserspace/BUILD b/pkg/proxy/winuserspace/BUILD index 45abb77fdbd..f288701bb4b 100644 --- a/pkg/proxy/winuserspace/BUILD +++ b/pkg/proxy/winuserspace/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types.go", "udp_server.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", @@ -42,7 +39,6 @@ go_test( "roundrobin_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/proxy:go_default_library", diff --git a/pkg/quota/BUILD b/pkg/quota/BUILD index f199b0c7512..a6a27b32818 100644 --- a/pkg/quota/BUILD +++ b/pkg/quota/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "interfaces.go", "resources.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -30,7 +27,6 @@ go_test( name = "go_default_test", srcs = ["resources_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", diff --git a/pkg/quota/evaluator/core/BUILD b/pkg/quota/evaluator/core/BUILD index 017e832ebcb..efc0798d80a 100644 --- a/pkg/quota/evaluator/core/BUILD +++ b/pkg/quota/evaluator/core/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -21,7 +19,6 @@ go_library( "secrets.go", "services.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", @@ -51,7 +48,6 @@ go_test( "services_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/quota:go_default_library", diff --git a/pkg/quota/generic/BUILD b/pkg/quota/generic/BUILD index 1a3869a6321..bfb9678a52a 100644 --- a/pkg/quota/generic/BUILD +++ b/pkg/quota/generic/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "evaluator.go", "registry.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/quota:go_default_library", diff --git a/pkg/quota/install/BUILD b/pkg/quota/install/BUILD index 7855075907a..ffd846ea53e 100644 --- a/pkg/quota/install/BUILD +++ b/pkg/quota/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["registry.go"], - tags = ["automanaged"], deps = [ "//pkg/quota:go_default_library", "//pkg/quota/evaluator/core:go_default_library", diff --git a/pkg/registry/BUILD b/pkg/registry/BUILD index 57fb8090b07..c2ed8b6e87f 100644 --- a/pkg/registry/BUILD +++ b/pkg/registry/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/registry/admissionregistration/externaladmissionhookconfiguration/BUILD b/pkg/registry/admissionregistration/externaladmissionhookconfiguration/BUILD index a699ba6685f..a9da4037d28 100644 --- a/pkg/registry/admissionregistration/externaladmissionhookconfiguration/BUILD +++ b/pkg/registry/admissionregistration/externaladmissionhookconfiguration/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,18 +11,13 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/admissionregistration:go_default_library", "//pkg/apis/admissionregistration/validation: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) diff --git a/pkg/registry/admissionregistration/externaladmissionhookconfiguration/storage/BUILD b/pkg/registry/admissionregistration/externaladmissionhookconfiguration/storage/BUILD index 849d1cdc40a..e6f3f01aaa3 100644 --- a/pkg/registry/admissionregistration/externaladmissionhookconfiguration/storage/BUILD +++ b/pkg/registry/admissionregistration/externaladmissionhookconfiguration/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/admissionregistration:go_default_library", diff --git a/pkg/registry/admissionregistration/externaladmissionhookconfiguration/storage/storage.go b/pkg/registry/admissionregistration/externaladmissionhookconfiguration/storage/storage.go index 0aefa3b4521..86f5c7edd7e 100644 --- a/pkg/registry/admissionregistration/externaladmissionhookconfiguration/storage/storage.go +++ b/pkg/registry/admissionregistration/externaladmissionhookconfiguration/storage/storage.go @@ -40,15 +40,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST { ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*admissionregistration.ExternalAdmissionHookConfiguration).Name, nil }, - PredicateFunc: externaladmissionhookconfiguration.MatchExternalAdmissionHookConfiguration, - QualifiedResource: admissionregistration.Resource("externaladmissionhookconfigurations"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("externaladmissionhookconfigurations"), + DefaultQualifiedResource: admissionregistration.Resource("externaladmissionhookconfigurations"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("externaladmissionhookconfigurations"), CreateStrategy: externaladmissionhookconfiguration.Strategy, UpdateStrategy: externaladmissionhookconfiguration.Strategy, DeleteStrategy: externaladmissionhookconfiguration.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: externaladmissionhookconfiguration.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/admissionregistration/externaladmissionhookconfiguration/strategy.go b/pkg/registry/admissionregistration/externaladmissionhookconfiguration/strategy.go index 8876a40b42a..d6d26379542 100644 --- a/pkg/registry/admissionregistration/externaladmissionhookconfiguration/strategy.go +++ b/pkg/registry/admissionregistration/externaladmissionhookconfiguration/strategy.go @@ -17,16 +17,11 @@ limitations under the License. package externaladmissionhookconfiguration import ( - "fmt" "reflect" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" - apistorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/admissionregistration" @@ -93,28 +88,3 @@ func (externaladmissionhookConfigurationStrategy) ValidateUpdate(ctx genericapir func (externaladmissionhookConfigurationStrategy) AllowUnconditionalUpdate() bool { return false } - -// MatchReplicaSet is the filter used by the generic etcd backend to route -// watch events from etcd to clients of the apiserver only interested in specific -// labels/fields. -func MatchExternalAdmissionHookConfiguration(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { - return apistorage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - ic, ok := obj.(*admissionregistration.ExternalAdmissionHookConfiguration) - if !ok { - return nil, nil, false, fmt.Errorf("Given object is not a ExternalAdmissionHookConfiguration.") - } - return labels.Set(ic.ObjectMeta.Labels), ExternalAdmissionHookConfigurationToSelectableFields(ic), ic.Initializers != nil, nil -} - -// ExternalAdmissionHookConfigurationToSelectableFields returns a field set that represents the object. -func ExternalAdmissionHookConfigurationToSelectableFields(ic *admissionregistration.ExternalAdmissionHookConfiguration) fields.Set { - return generic.ObjectMetaFieldsSet(&ic.ObjectMeta, false) -} diff --git a/pkg/registry/admissionregistration/initializerconfiguration/BUILD b/pkg/registry/admissionregistration/initializerconfiguration/BUILD index 0d42bfc42e6..d62b4cec5e5 100644 --- a/pkg/registry/admissionregistration/initializerconfiguration/BUILD +++ b/pkg/registry/admissionregistration/initializerconfiguration/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,18 +11,13 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/admissionregistration:go_default_library", "//pkg/apis/admissionregistration/validation: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) diff --git a/pkg/registry/admissionregistration/initializerconfiguration/storage/BUILD b/pkg/registry/admissionregistration/initializerconfiguration/storage/BUILD index 62ece05490d..e17412bd546 100644 --- a/pkg/registry/admissionregistration/initializerconfiguration/storage/BUILD +++ b/pkg/registry/admissionregistration/initializerconfiguration/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/admissionregistration:go_default_library", diff --git a/pkg/registry/admissionregistration/initializerconfiguration/storage/storage.go b/pkg/registry/admissionregistration/initializerconfiguration/storage/storage.go index e7351fc9869..590759a9165 100644 --- a/pkg/registry/admissionregistration/initializerconfiguration/storage/storage.go +++ b/pkg/registry/admissionregistration/initializerconfiguration/storage/storage.go @@ -40,15 +40,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST { ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*admissionregistration.InitializerConfiguration).Name, nil }, - PredicateFunc: initializerconfiguration.MatchInitializerConfiguration, - QualifiedResource: admissionregistration.Resource("initializerconfigurations"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("initializerconfigurations"), + DefaultQualifiedResource: admissionregistration.Resource("initializerconfigurations"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("initializerconfigurations"), CreateStrategy: initializerconfiguration.Strategy, UpdateStrategy: initializerconfiguration.Strategy, DeleteStrategy: initializerconfiguration.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: initializerconfiguration.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/admissionregistration/initializerconfiguration/strategy.go b/pkg/registry/admissionregistration/initializerconfiguration/strategy.go index 6484e5c70b2..3f0e73925bc 100644 --- a/pkg/registry/admissionregistration/initializerconfiguration/strategy.go +++ b/pkg/registry/admissionregistration/initializerconfiguration/strategy.go @@ -17,16 +17,11 @@ limitations under the License. package initializerconfiguration import ( - "fmt" "reflect" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" - apistorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/admissionregistration" @@ -93,28 +88,3 @@ func (initializerConfigurationStrategy) ValidateUpdate(ctx genericapirequest.Con func (initializerConfigurationStrategy) AllowUnconditionalUpdate() bool { return false } - -// MatchReplicaSet is the filter used by the generic etcd backend to route -// watch events from etcd to clients of the apiserver only interested in specific -// labels/fields. -func MatchInitializerConfiguration(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { - return apistorage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - ic, ok := obj.(*admissionregistration.InitializerConfiguration) - if !ok { - return nil, nil, false, fmt.Errorf("Given object is not a InitializerConfiguration.") - } - return labels.Set(ic.ObjectMeta.Labels), InitializerConfigurationToSelectableFields(ic), ic.ObjectMeta.Initializers != nil, nil -} - -// InitializerConfigurationToSelectableFields returns a field set that represents the object. -func InitializerConfigurationToSelectableFields(ic *admissionregistration.InitializerConfiguration) fields.Set { - return generic.ObjectMetaFieldsSet(&ic.ObjectMeta, false) -} diff --git a/pkg/registry/admissionregistration/rest/BUILD b/pkg/registry/admissionregistration/rest/BUILD index 585a97265d1..ad10e541579 100644 --- a/pkg/registry/admissionregistration/rest/BUILD +++ b/pkg/registry/admissionregistration/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage_apiserver.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/admissionregistration:go_default_library", diff --git a/pkg/registry/apps/controllerrevision/BUILD b/pkg/registry/apps/controllerrevision/BUILD index e656b6cb948..bfc7313563d 100644 --- a/pkg/registry/apps/controllerrevision/BUILD +++ b/pkg/registry/apps/controllerrevision/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,10 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/apps:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/runtime:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", ], @@ -30,19 +25,14 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/apps:go_default_library", "//pkg/apis/apps/validation: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) diff --git a/pkg/registry/apps/controllerrevision/storage/BUILD b/pkg/registry/apps/controllerrevision/storage/BUILD index e892b924e61..7edd6141f2b 100644 --- a/pkg/registry/apps/controllerrevision/storage/BUILD +++ b/pkg/registry/apps/controllerrevision/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/apps:go_default_library", @@ -29,7 +26,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/apps:go_default_library", diff --git a/pkg/registry/apps/controllerrevision/storage/storage.go b/pkg/registry/apps/controllerrevision/storage/storage.go index d994c338f27..8c4d7024fdb 100644 --- a/pkg/registry/apps/controllerrevision/storage/storage.go +++ b/pkg/registry/apps/controllerrevision/storage/storage.go @@ -34,18 +34,17 @@ type REST struct { // NewREST returns a RESTStorage object that will work with ControllerRevision objects. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &apps.ControllerRevision{} }, - NewListFunc: func() runtime.Object { return &apps.ControllerRevisionList{} }, - PredicateFunc: controllerrevision.MatchControllerRevision, - QualifiedResource: apps.Resource("controllerrevisions"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("controllerrevisions"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &apps.ControllerRevision{} }, + NewListFunc: func() runtime.Object { return &apps.ControllerRevisionList{} }, + DefaultQualifiedResource: apps.Resource("controllerrevisions"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("controllerrevisions"), CreateStrategy: controllerrevision.Strategy, UpdateStrategy: controllerrevision.Strategy, DeleteStrategy: controllerrevision.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: controllerrevision.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) } diff --git a/pkg/registry/apps/controllerrevision/strategy.go b/pkg/registry/apps/controllerrevision/strategy.go index 89cb78ab9e6..f6f207b9053 100644 --- a/pkg/registry/apps/controllerrevision/strategy.go +++ b/pkg/registry/apps/controllerrevision/strategy.go @@ -17,16 +17,10 @@ limitations under the License. package controllerrevision import ( - "errors" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" - apistorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/apps" @@ -83,26 +77,3 @@ func (strategy) ValidateUpdate(ctx genericapirequest.Context, newObj, oldObj run oldRevision, newRevision := oldObj.(*apps.ControllerRevision), newObj.(*apps.ControllerRevision) return validation.ValidateControllerRevisionUpdate(newRevision, oldRevision) } - -// ControllerRevisionToSelectableFields returns a field set that represents the object for matching purposes. -func ControllerRevisionToSelectableFields(revision *apps.ControllerRevision) fields.Set { - return generic.ObjectMetaFieldsSet(&revision.ObjectMeta, true) -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - history, ok := obj.(*apps.ControllerRevision) - if !ok { - return nil, nil, false, errors.New("supplied object is not an ControllerRevision") - } - return labels.Set(history.ObjectMeta.Labels), ControllerRevisionToSelectableFields(history), history.Initializers != nil, nil -} - -// MatchControllerRevision returns a generic matcher for a given label and field selector. -func MatchControllerRevision(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { - return apistorage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} diff --git a/pkg/registry/apps/controllerrevision/strategy_test.go b/pkg/registry/apps/controllerrevision/strategy_test.go index bba85db130c..594e33277ac 100644 --- a/pkg/registry/apps/controllerrevision/strategy_test.go +++ b/pkg/registry/apps/controllerrevision/strategy_test.go @@ -20,8 +20,6 @@ import ( "testing" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/kubernetes/pkg/api" @@ -127,55 +125,6 @@ func TestStrategy_ValidateUpdate(t *testing.T) { } } -func TestControllerRevisionToSelectableFields(t *testing.T) { - rev := newControllerRevision("validname", "validns", newObject(), 0) - fieldSet := ControllerRevisionToSelectableFields(rev) - if fieldSet.Get("metadata.name") != rev.Name { - t.Errorf("expeted %s found %s", rev.Name, fieldSet.Get("metadata.name")) - } - if fieldSet.Get("metadata.namespace") != rev.Namespace { - t.Errorf("expeted %s found %s", rev.Namespace, fieldSet.Get("metadata.namespace")) - } -} - -func TestGetAttrs(t *testing.T) { - rev := newControllerRevision("validname", "validns", newObject(), 0) - labelSet, fieldSet, uninitialized, err := GetAttrs(rev) - if err != nil { - t.Fatal(err) - } - if uninitialized { - t.Errorf("unexpected attrs") - } - if fieldSet.Get("metadata.name") != rev.Name { - t.Errorf("expeted %s found %s", rev.Name, fieldSet.Get("metadata.name")) - } - if fieldSet.Get("metadata.namespace") != rev.Namespace { - t.Errorf("expeted %s found %s", rev.Namespace, fieldSet.Get("metadata.namespace")) - } - if labelSet.Get("foo") != rev.Labels["foo"] { - t.Errorf("expected %s found %s", rev.Labels["foo"], labelSet.Get("foo")) - } -} - -func TestMatchControllerRevision(t *testing.T) { - rev := newControllerRevision("validname", "validns", newObject(), 0) - ls := labels.SelectorFromSet(labels.Set(rev.Labels)) - pred := MatchControllerRevision(ls, nil) - if matches, err := pred.Matches(rev); err != nil { - t.Error(err) - } else if !matches { - t.Error("failed to match ControllerRevision by labels") - } - fs := fields.SelectorFromSet(ControllerRevisionToSelectableFields(rev)) - pred = MatchControllerRevision(ls, fs) - if matches, err := pred.Matches(rev); err != nil { - t.Error(err) - } else if !matches { - t.Error("failed to match ControllerRevision by fields") - } -} - func newControllerRevision(name, namespace string, data runtime.Object, revision int64) *apps.ControllerRevision { return &apps.ControllerRevision{ ObjectMeta: metav1.ObjectMeta{ diff --git a/pkg/registry/apps/rest/BUILD b/pkg/registry/apps/rest/BUILD index 4bb30aff1e0..50c102d96c4 100644 --- a/pkg/registry/apps/rest/BUILD +++ b/pkg/registry/apps/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage_apps.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/apps:go_default_library", diff --git a/pkg/registry/apps/rest/storage_apps.go b/pkg/registry/apps/rest/storage_apps.go index ff82d94c240..9b1b96dcbe0 100644 --- a/pkg/registry/apps/rest/storage_apps.go +++ b/pkg/registry/apps/rest/storage_apps.go @@ -63,9 +63,10 @@ func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorag storage["deployments/scale"] = deploymentStorage.Scale } if apiResourceConfigSource.ResourceEnabled(version.WithResource("statefulsets")) { - statefulsetStorage, statefulsetStatusStorage := statefulsetstore.NewREST(restOptionsGetter) - storage["statefulsets"] = statefulsetStorage - storage["statefulsets/status"] = statefulsetStatusStorage + statefulSetStorage := statefulsetstore.NewStorage(restOptionsGetter) + storage["statefulsets"] = statefulSetStorage.StatefulSet + storage["statefulsets/status"] = statefulSetStorage.Status + storage["statefulsets/scale"] = statefulSetStorage.Scale } if apiResourceConfigSource.ResourceEnabled(version.WithResource("controllerrevisions")) { historyStorage := controllerrevisionsstore.NewREST(restOptionsGetter) @@ -82,13 +83,13 @@ func (p RESTStorageProvider) v1beta2Storage(apiResourceConfigSource serverstorag deploymentStorage := deploymentstore.NewStorage(restOptionsGetter) storage["deployments"] = deploymentStorage.Deployment storage["deployments/status"] = deploymentStorage.Status - storage["deployments/rollback"] = deploymentStorage.Rollback storage["deployments/scale"] = deploymentStorage.Scale } if apiResourceConfigSource.ResourceEnabled(version.WithResource("statefulsets")) { - statefulsetStorage, statefulsetStatusStorage := statefulsetstore.NewREST(restOptionsGetter) - storage["statefulsets"] = statefulsetStorage - storage["statefulsets/status"] = statefulsetStatusStorage + statefulSetStorage := statefulsetstore.NewStorage(restOptionsGetter) + storage["statefulsets"] = statefulSetStorage.StatefulSet + storage["statefulsets/status"] = statefulSetStorage.Status + storage["statefulsets/scale"] = statefulSetStorage.Scale } if apiResourceConfigSource.ResourceEnabled(version.WithResource("daemonsets")) { daemonSetStorage, daemonSetStatusStorage := daemonsetstore.NewREST(restOptionsGetter) diff --git a/pkg/registry/apps/statefulset/BUILD b/pkg/registry/apps/statefulset/BUILD index ca2c3e58142..d57cf948611 100644 --- a/pkg/registry/apps/statefulset/BUILD +++ b/pkg/registry/apps/statefulset/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,22 +10,22 @@ go_library( name = "go_default_library", srcs = [ "doc.go", + "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/apps:go_default_library", "//pkg/apis/apps/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality: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/api/errors:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) @@ -36,7 +34,6 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/apps:go_default_library", diff --git a/pkg/registry/apps/statefulset/registry.go b/pkg/registry/apps/statefulset/registry.go new file mode 100644 index 00000000000..25d136f8620 --- /dev/null +++ b/pkg/registry/apps/statefulset/registry.go @@ -0,0 +1,95 @@ +/* +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 statefulset + +import ( + "fmt" + + "k8s.io/apimachinery/pkg/api/errors" + metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/watch" + genericapirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/apiserver/pkg/registry/rest" + "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/apis/apps" +) + +// Registry is an interface for things that know how to store StatefulSets. +type Registry interface { + ListStatefulSets(ctx genericapirequest.Context, options *metainternalversion.ListOptions) (*apps.StatefulSetList, error) + WatchStatefulSets(ctx genericapirequest.Context, options *metainternalversion.ListOptions) (watch.Interface, error) + GetStatefulSet(ctx genericapirequest.Context, statefulSetID string, options *metav1.GetOptions) (*apps.StatefulSet, error) + CreateStatefulSet(ctx genericapirequest.Context, statefulSet *apps.StatefulSet) (*apps.StatefulSet, error) + UpdateStatefulSet(ctx genericapirequest.Context, statefulSet *apps.StatefulSet) (*apps.StatefulSet, error) + DeleteStatefulSet(ctx genericapirequest.Context, statefulSetID string) error +} + +// storage puts strong typing around storage calls +type storage struct { + rest.StandardStorage +} + +// NewRegistry returns a new Registry interface for the given Storage. Any mismatched +// types will panic. +func NewRegistry(s rest.StandardStorage) Registry { + return &storage{s} +} + +func (s *storage) ListStatefulSets(ctx genericapirequest.Context, options *metainternalversion.ListOptions) (*apps.StatefulSetList, error) { + if options != nil && options.FieldSelector != nil && !options.FieldSelector.Empty() { + return nil, fmt.Errorf("field selector not supported yet") + } + obj, err := s.List(ctx, options) + if err != nil { + return nil, err + } + return obj.(*apps.StatefulSetList), err +} + +func (s *storage) WatchStatefulSets(ctx genericapirequest.Context, options *metainternalversion.ListOptions) (watch.Interface, error) { + return s.Watch(ctx, options) +} + +func (s *storage) GetStatefulSet(ctx genericapirequest.Context, statefulSetID string, options *metav1.GetOptions) (*apps.StatefulSet, error) { + obj, err := s.Get(ctx, statefulSetID, options) + if err != nil { + return nil, errors.NewNotFound(apps.Resource("statefulsets/scale"), statefulSetID) + } + return obj.(*apps.StatefulSet), nil +} + +func (s *storage) CreateStatefulSet(ctx genericapirequest.Context, statefulSet *apps.StatefulSet) (*apps.StatefulSet, error) { + obj, err := s.Create(ctx, statefulSet, false) + if err != nil { + return nil, err + } + return obj.(*apps.StatefulSet), nil +} + +func (s *storage) UpdateStatefulSet(ctx genericapirequest.Context, statefulSet *apps.StatefulSet) (*apps.StatefulSet, error) { + obj, _, err := s.Update(ctx, statefulSet.Name, rest.DefaultUpdatedObjectInfo(statefulSet, api.Scheme)) + if err != nil { + return nil, err + } + return obj.(*apps.StatefulSet), nil +} + +func (s *storage) DeleteStatefulSet(ctx genericapirequest.Context, statefulSetID string) error { + _, _, err := s.Delete(ctx, statefulSetID, nil) + return err +} diff --git a/pkg/registry/apps/statefulset/storage/BUILD b/pkg/registry/apps/statefulset/storage/BUILD index 9efc691e4fc..1d3a58e6573 100644 --- a/pkg/registry/apps/statefulset/storage/BUILD +++ b/pkg/registry/apps/statefulset/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,17 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/apps:go_default_library", + "//pkg/apis/extensions:go_default_library", "//pkg/registry/registrytest:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/util/diff:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", @@ -30,12 +31,14 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/apps:go_default_library", + "//pkg/apis/extensions:go_default_library", + "//pkg/apis/extensions/validation:go_default_library", "//pkg/registry/apps/statefulset:go_default_library", "//pkg/registry/cachesize:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", diff --git a/pkg/registry/apps/statefulset/storage/storage.go b/pkg/registry/apps/statefulset/storage/storage.go index fc6d417c7fe..80375251a96 100644 --- a/pkg/registry/apps/statefulset/storage/storage.go +++ b/pkg/registry/apps/statefulset/storage/storage.go @@ -17,6 +17,9 @@ limitations under the License. package storage import ( + "fmt" + + "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" @@ -24,31 +27,50 @@ import ( genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" "k8s.io/apiserver/pkg/registry/rest" "k8s.io/kubernetes/pkg/api" - appsapi "k8s.io/kubernetes/pkg/apis/apps" + "k8s.io/kubernetes/pkg/apis/apps" + "k8s.io/kubernetes/pkg/apis/extensions" + extvalidation "k8s.io/kubernetes/pkg/apis/extensions/validation" "k8s.io/kubernetes/pkg/registry/apps/statefulset" "k8s.io/kubernetes/pkg/registry/cachesize" ) -// rest implements a RESTStorage for replication controllers against etcd +// StatefulSetStorage includes dummy storage for StatefulSets, and their Status and Scale subresource. +type StatefulSetStorage struct { + StatefulSet *REST + Status *StatusREST + Scale *ScaleREST +} + +func NewStorage(optsGetter generic.RESTOptionsGetter) StatefulSetStorage { + statefulSetRest, statefulSetStatusRest := NewREST(optsGetter) + statefulSetRegistry := statefulset.NewRegistry(statefulSetRest) + + return StatefulSetStorage{ + StatefulSet: statefulSetRest, + Status: statefulSetStatusRest, + Scale: &ScaleREST{registry: statefulSetRegistry}, + } +} + +// rest implements a RESTStorage for statefulsets against etcd type REST struct { *genericregistry.Store } -// NewREST returns a RESTStorage object that will work against replication controllers. +// NewREST returns a RESTStorage object that will work against statefulsets. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &appsapi.StatefulSet{} }, - NewListFunc: func() runtime.Object { return &appsapi.StatefulSetList{} }, - PredicateFunc: statefulset.MatchStatefulSet, - QualifiedResource: appsapi.Resource("statefulsets"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("statefulsets"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &apps.StatefulSet{} }, + NewListFunc: func() runtime.Object { return &apps.StatefulSetList{} }, + DefaultQualifiedResource: apps.Resource("statefulsets"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("statefulsets"), CreateStrategy: statefulset.Strategy, UpdateStrategy: statefulset.Strategy, DeleteStrategy: statefulset.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: statefulset.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } @@ -72,7 +94,7 @@ type StatusREST struct { } func (r *StatusREST) New() runtime.Object { - return &appsapi.StatefulSet{} + return &apps.StatefulSet{} } // Get retrieves the object from the storage. It is required to support Patch. @@ -92,3 +114,88 @@ var _ rest.ShortNamesProvider = &REST{} func (r *REST) ShortNames() []string { return []string{"sts"} } + +type ScaleREST struct { + registry statefulset.Registry +} + +// ScaleREST implements Patcher +var _ = rest.Patcher(&ScaleREST{}) + +// New creates a new Scale object +func (r *ScaleREST) New() runtime.Object { + return &extensions.Scale{} +} + +func (r *ScaleREST) Get(ctx genericapirequest.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { + ss, err := r.registry.GetStatefulSet(ctx, name, options) + if err != nil { + return nil, err + } + scale, err := scaleFromStatefulSet(ss) + if err != nil { + return nil, errors.NewBadRequest(fmt.Sprintf("%v", err)) + } + return scale, err +} + +func (r *ScaleREST) Update(ctx genericapirequest.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) { + ss, err := r.registry.GetStatefulSet(ctx, name, &metav1.GetOptions{}) + if err != nil { + return nil, false, err + } + + oldScale, err := scaleFromStatefulSet(ss) + if err != nil { + return nil, false, err + } + + obj, err := objInfo.UpdatedObject(ctx, oldScale) + if err != nil { + return nil, false, err + } + if obj == nil { + return nil, false, errors.NewBadRequest(fmt.Sprintf("nil update passed to Scale")) + } + scale, ok := obj.(*extensions.Scale) + if !ok { + return nil, false, errors.NewBadRequest(fmt.Sprintf("wrong object passed to Scale update: %v", obj)) + } + + if errs := extvalidation.ValidateScale(scale); len(errs) > 0 { + return nil, false, errors.NewInvalid(extensions.Kind("Scale"), scale.Name, errs) + } + + ss.Spec.Replicas = scale.Spec.Replicas + ss.ResourceVersion = scale.ResourceVersion + ss, err = r.registry.UpdateStatefulSet(ctx, ss) + if err != nil { + return nil, false, err + } + newScale, err := scaleFromStatefulSet(ss) + if err != nil { + return nil, false, errors.NewBadRequest(fmt.Sprintf("%v", err)) + } + return newScale, false, err +} + +// scaleFromStatefulSet returns a scale subresource for a statefulset. +func scaleFromStatefulSet(ss *apps.StatefulSet) (*extensions.Scale, error) { + return &extensions.Scale{ + // TODO: Create a variant of ObjectMeta type that only contains the fields below. + ObjectMeta: metav1.ObjectMeta{ + Name: ss.Name, + Namespace: ss.Namespace, + UID: ss.UID, + ResourceVersion: ss.ResourceVersion, + CreationTimestamp: ss.CreationTimestamp, + }, + Spec: extensions.ScaleSpec{ + Replicas: ss.Spec.Replicas, + }, + Status: extensions.ScaleStatus{ + Replicas: ss.Status.Replicas, + Selector: ss.Spec.Selector, + }, + }, nil +} diff --git a/pkg/registry/apps/statefulset/storage/storage_test.go b/pkg/registry/apps/statefulset/storage/storage_test.go index 9d4001d82ea..933d99b2d42 100644 --- a/pkg/registry/apps/statefulset/storage/storage_test.go +++ b/pkg/registry/apps/statefulset/storage/storage_test.go @@ -19,24 +19,28 @@ package storage import ( "testing" + apiequality "k8s.io/apimachinery/pkg/api/equality" + "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/util/diff" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" etcdtesting "k8s.io/apiserver/pkg/storage/etcd/testing" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/apps" + "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/registry/registrytest" ) // TODO: allow for global factory override -func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) { +func newStorage(t *testing.T) (StatefulSetStorage, *etcdtesting.EtcdTestServer) { etcdStorage, server := registrytest.NewEtcdStorage(t, apps.GroupName) restOptions := generic.RESTOptions{StorageConfig: etcdStorage, Decorator: generic.UndecoratedStorage, DeleteCollectionWorkers: 1, ResourcePrefix: "statefulsets"} - statefulSetStorage, statusStorage := NewREST(restOptions) - return statefulSetStorage, statusStorage, server + storage := NewStorage(restOptions) + return storage, server } // createStatefulSet is a helper function that returns a StatefulSet with the updated resource version. @@ -83,11 +87,13 @@ func validNewStatefulSet() *apps.StatefulSet { } } +var validStatefulSet = *validNewStatefulSet() + func TestCreate(t *testing.T) { - storage, _, server := newStorage(t) + storage, server := newStorage(t) defer server.Terminate(t) - defer storage.Store.DestroyFunc() - test := registrytest.New(t, storage.Store) + defer storage.StatefulSet.Store.DestroyFunc() + test := registrytest.New(t, storage.StatefulSet.Store) ps := validNewStatefulSet() ps.ObjectMeta = metav1.ObjectMeta{} test.TestCreate( @@ -100,13 +106,13 @@ func TestCreate(t *testing.T) { // TODO: Test updates to spec when we allow them. func TestStatusUpdate(t *testing.T) { - storage, statusStorage, server := newStorage(t) + storage, server := newStorage(t) defer server.Terminate(t) - defer storage.Store.DestroyFunc() + defer storage.StatefulSet.Store.DestroyFunc() ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), metav1.NamespaceDefault) key := "/statefulsets/" + metav1.NamespaceDefault + "/foo" validStatefulSet := validNewStatefulSet() - if err := storage.Storage.Create(ctx, key, validStatefulSet, nil, 0); err != nil { + if err := storage.StatefulSet.Storage.Create(ctx, key, validStatefulSet, nil, 0); err != nil { t.Fatalf("unexpected error: %v", err) } update := apps.StatefulSet{ @@ -119,10 +125,10 @@ func TestStatusUpdate(t *testing.T) { }, } - if _, _, err := statusStorage.Update(ctx, update.Name, rest.DefaultUpdatedObjectInfo(&update, api.Scheme)); err != nil { + if _, _, err := storage.Status.Update(ctx, update.Name, rest.DefaultUpdatedObjectInfo(&update, api.Scheme)); err != nil { t.Fatalf("unexpected error: %v", err) } - obj, err := storage.Get(ctx, "foo", &metav1.GetOptions{}) + obj, err := storage.StatefulSet.Get(ctx, "foo", &metav1.GetOptions{}) if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -137,34 +143,34 @@ func TestStatusUpdate(t *testing.T) { } func TestGet(t *testing.T) { - storage, _, server := newStorage(t) + storage, server := newStorage(t) defer server.Terminate(t) - defer storage.Store.DestroyFunc() - test := registrytest.New(t, storage.Store) + defer storage.StatefulSet.Store.DestroyFunc() + test := registrytest.New(t, storage.StatefulSet.Store) test.TestGet(validNewStatefulSet()) } func TestList(t *testing.T) { - storage, _, server := newStorage(t) + storage, server := newStorage(t) defer server.Terminate(t) - defer storage.Store.DestroyFunc() - test := registrytest.New(t, storage.Store) + defer storage.StatefulSet.Store.DestroyFunc() + test := registrytest.New(t, storage.StatefulSet.Store) test.TestList(validNewStatefulSet()) } func TestDelete(t *testing.T) { - storage, _, server := newStorage(t) + storage, server := newStorage(t) defer server.Terminate(t) - defer storage.Store.DestroyFunc() - test := registrytest.New(t, storage.Store) + defer storage.StatefulSet.Store.DestroyFunc() + test := registrytest.New(t, storage.StatefulSet.Store) test.TestDelete(validNewStatefulSet()) } func TestWatch(t *testing.T) { - storage, _, server := newStorage(t) + storage, server := newStorage(t) defer server.Terminate(t) - defer storage.Store.DestroyFunc() - test := registrytest.New(t, storage.Store) + defer storage.StatefulSet.Store.DestroyFunc() + test := registrytest.New(t, storage.StatefulSet.Store) test.TestWatch( validNewStatefulSet(), // matching labels @@ -189,11 +195,104 @@ func TestWatch(t *testing.T) { } func TestCategories(t *testing.T) { - storage, _, server := newStorage(t) + storage, server := newStorage(t) defer server.Terminate(t) - defer storage.Store.DestroyFunc() + defer storage.StatefulSet.Store.DestroyFunc() expected := []string{"all"} - registrytest.AssertCategories(t, storage, expected) + registrytest.AssertCategories(t, storage.StatefulSet, expected) +} + +func TestShortNames(t *testing.T) { + storage, server := newStorage(t) + defer server.Terminate(t) + defer storage.StatefulSet.Store.DestroyFunc() + expected := []string{"sts"} + registrytest.AssertShortNames(t, storage.StatefulSet, expected) +} + +func TestScaleGet(t *testing.T) { + storage, server := newStorage(t) + defer server.Terminate(t) + defer storage.StatefulSet.Store.DestroyFunc() + + name := "foo" + + var sts apps.StatefulSet + ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), metav1.NamespaceDefault) + key := "/statefulsets/" + metav1.NamespaceDefault + "/" + name + if err := storage.StatefulSet.Storage.Create(ctx, key, &validStatefulSet, &sts, 0); err != nil { + t.Fatalf("error setting new statefulset (key: %s) %v: %v", key, validStatefulSet, err) + } + + want := &extensions.Scale{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: metav1.NamespaceDefault, + UID: sts.UID, + ResourceVersion: sts.ResourceVersion, + CreationTimestamp: sts.CreationTimestamp, + }, + Spec: extensions.ScaleSpec{ + Replicas: validStatefulSet.Spec.Replicas, + }, + Status: extensions.ScaleStatus{ + Replicas: validStatefulSet.Status.Replicas, + Selector: validStatefulSet.Spec.Selector, + }, + } + obj, err := storage.Scale.Get(ctx, name, &metav1.GetOptions{}) + got := obj.(*extensions.Scale) + if err != nil { + t.Fatalf("error fetching scale for %s: %v", name, err) + } + if !apiequality.Semantic.DeepEqual(got, want) { + t.Errorf("unexpected scale: %s", diff.ObjectDiff(got, want)) + } +} + +func TestScaleUpdate(t *testing.T) { + storage, server := newStorage(t) + defer server.Terminate(t) + defer storage.StatefulSet.Store.DestroyFunc() + + name := "foo" + + var sts apps.StatefulSet + ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), metav1.NamespaceDefault) + key := "/statefulsets/" + metav1.NamespaceDefault + "/" + name + if err := storage.StatefulSet.Storage.Create(ctx, key, &validStatefulSet, &sts, 0); err != nil { + t.Fatalf("error setting new statefulset (key: %s) %v: %v", key, validStatefulSet, err) + } + replicas := 12 + update := extensions.Scale{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: metav1.NamespaceDefault, + }, + Spec: extensions.ScaleSpec{ + Replicas: int32(replicas), + }, + } + + if _, _, err := storage.Scale.Update(ctx, update.Name, rest.DefaultUpdatedObjectInfo(&update, api.Scheme)); err != nil { + t.Fatalf("error updating scale %v: %v", update, err) + } + + obj, err := storage.Scale.Get(ctx, name, &metav1.GetOptions{}) + if err != nil { + t.Fatalf("error fetching scale for %s: %v", name, err) + } + scale := obj.(*extensions.Scale) + if scale.Spec.Replicas != int32(replicas) { + t.Errorf("wrong replicas count expected: %d got: %d", replicas, scale.Spec.Replicas) + } + + update.ResourceVersion = sts.ResourceVersion + update.Spec.Replicas = 15 + + if _, _, err = storage.Scale.Update(ctx, update.Name, rest.DefaultUpdatedObjectInfo(&update, api.Scheme)); err != nil && !errors.IsConflict(err) { + t.Fatalf("unexpected error, expecting an update conflict but got %v", err) + } } // TODO: Test generation number. diff --git a/pkg/registry/apps/statefulset/strategy.go b/pkg/registry/apps/statefulset/strategy.go index eda0b2a1fe8..9a737e8cfd2 100644 --- a/pkg/registry/apps/statefulset/strategy.go +++ b/pkg/registry/apps/statefulset/strategy.go @@ -17,17 +17,11 @@ limitations under the License. package statefulset import ( - "fmt" - apiequality "k8s.io/apimachinery/pkg/api/equality" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" - "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/apps" @@ -106,30 +100,6 @@ func (statefulSetStrategy) AllowUnconditionalUpdate() bool { return true } -// StatefulSetToSelectableFields returns a field set that represents the object. -func StatefulSetToSelectableFields(statefulSet *apps.StatefulSet) fields.Set { - return generic.ObjectMetaFieldsSet(&statefulSet.ObjectMeta, true) -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - statefulSet, ok := obj.(*apps.StatefulSet) - if !ok { - return nil, nil, false, fmt.Errorf("given object is not an StatefulSet.") - } - return labels.Set(statefulSet.ObjectMeta.Labels), StatefulSetToSelectableFields(statefulSet), statefulSet.Initializers != nil, nil -} - -// MatchStatefulSet is the filter used by the generic etcd backend to watch events -// from etcd to clients of the apiserver only interested in specific labels/fields. -func MatchStatefulSet(label labels.Selector, field fields.Selector) storage.SelectionPredicate { - return storage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - type statefulSetStatusStrategy struct { statefulSetStrategy } diff --git a/pkg/registry/authentication/rest/BUILD b/pkg/registry/authentication/rest/BUILD index 5131719015c..51806bec798 100644 --- a/pkg/registry/authentication/rest/BUILD +++ b/pkg/registry/authentication/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage_authentication.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/authentication:go_default_library", diff --git a/pkg/registry/authentication/tokenreview/BUILD b/pkg/registry/authentication/tokenreview/BUILD index f5744057e5f..d5ab8782e09 100644 --- a/pkg/registry/authentication/tokenreview/BUILD +++ b/pkg/registry/authentication/tokenreview/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/apis/authentication:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/pkg/registry/authorization/localsubjectaccessreview/BUILD b/pkg/registry/authorization/localsubjectaccessreview/BUILD index d9a4fb070d9..183187ecac5 100644 --- a/pkg/registry/authorization/localsubjectaccessreview/BUILD +++ b/pkg/registry/authorization/localsubjectaccessreview/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["rest.go"], - tags = ["automanaged"], deps = [ "//pkg/apis/authorization:go_default_library", "//pkg/apis/authorization/validation:go_default_library", diff --git a/pkg/registry/authorization/rest/BUILD b/pkg/registry/authorization/rest/BUILD index 4c5b8f77d7d..00520bd895c 100644 --- a/pkg/registry/authorization/rest/BUILD +++ b/pkg/registry/authorization/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage_authorization.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/authorization:go_default_library", diff --git a/pkg/registry/authorization/selfsubjectaccessreview/BUILD b/pkg/registry/authorization/selfsubjectaccessreview/BUILD index d9a4fb070d9..183187ecac5 100644 --- a/pkg/registry/authorization/selfsubjectaccessreview/BUILD +++ b/pkg/registry/authorization/selfsubjectaccessreview/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["rest.go"], - tags = ["automanaged"], deps = [ "//pkg/apis/authorization:go_default_library", "//pkg/apis/authorization/validation:go_default_library", diff --git a/pkg/registry/authorization/subjectaccessreview/BUILD b/pkg/registry/authorization/subjectaccessreview/BUILD index 701e1b43aa3..48a8ed0edeb 100644 --- a/pkg/registry/authorization/subjectaccessreview/BUILD +++ b/pkg/registry/authorization/subjectaccessreview/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["rest.go"], - tags = ["automanaged"], deps = [ "//pkg/apis/authorization:go_default_library", "//pkg/apis/authorization/validation:go_default_library", @@ -40,7 +37,6 @@ go_test( name = "go_default_test", srcs = ["rest_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/authorization:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", diff --git a/pkg/registry/authorization/util/BUILD b/pkg/registry/authorization/util/BUILD index 666444bb7e9..b87df6971b7 100644 --- a/pkg/registry/authorization/util/BUILD +++ b/pkg/registry/authorization/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["helpers.go"], - tags = ["automanaged"], deps = [ "//pkg/apis/authorization:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", @@ -36,7 +33,6 @@ go_test( name = "go_default_test", srcs = ["helpers_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/authorization:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", diff --git a/pkg/registry/autoscaling/horizontalpodautoscaler/BUILD b/pkg/registry/autoscaling/horizontalpodautoscaler/BUILD index 8a4f6c8af45..8eb0c99ba17 100644 --- a/pkg/registry/autoscaling/horizontalpodautoscaler/BUILD +++ b/pkg/registry/autoscaling/horizontalpodautoscaler/BUILD @@ -1,11 +1,8 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", - "go_test", ) go_library( @@ -14,34 +11,17 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/autoscaling:go_default_library", "//pkg/apis/autoscaling/validation: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - library = ":go_default_library", - tags = ["automanaged"], - deps = [ - "//pkg/api:go_default_library", - "//pkg/api/testapi:go_default_library", - "//pkg/api/testing:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - ], -) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/pkg/registry/autoscaling/horizontalpodautoscaler/storage/BUILD b/pkg/registry/autoscaling/horizontalpodautoscaler/storage/BUILD index f2b7e65435b..047c4477e71 100644 --- a/pkg/registry/autoscaling/horizontalpodautoscaler/storage/BUILD +++ b/pkg/registry/autoscaling/horizontalpodautoscaler/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/autoscaling:go_default_library", @@ -30,7 +27,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/autoscaling:go_default_library", diff --git a/pkg/registry/autoscaling/horizontalpodautoscaler/storage/storage.go b/pkg/registry/autoscaling/horizontalpodautoscaler/storage/storage.go index 33280d82233..fb5b598d3a3 100644 --- a/pkg/registry/autoscaling/horizontalpodautoscaler/storage/storage.go +++ b/pkg/registry/autoscaling/horizontalpodautoscaler/storage/storage.go @@ -36,18 +36,17 @@ type REST struct { // NewREST returns a RESTStorage object that will work against horizontal pod autoscalers. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &autoscaling.HorizontalPodAutoscaler{} }, - NewListFunc: func() runtime.Object { return &autoscaling.HorizontalPodAutoscalerList{} }, - PredicateFunc: horizontalpodautoscaler.MatchAutoscaler, - QualifiedResource: autoscaling.Resource("horizontalpodautoscalers"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("horizontalpodautoscalers"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &autoscaling.HorizontalPodAutoscaler{} }, + NewListFunc: func() runtime.Object { return &autoscaling.HorizontalPodAutoscalerList{} }, + DefaultQualifiedResource: autoscaling.Resource("horizontalpodautoscalers"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("horizontalpodautoscalers"), CreateStrategy: horizontalpodautoscaler.Strategy, UpdateStrategy: horizontalpodautoscaler.Strategy, DeleteStrategy: horizontalpodautoscaler.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: horizontalpodautoscaler.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/autoscaling/horizontalpodautoscaler/strategy.go b/pkg/registry/autoscaling/horizontalpodautoscaler/strategy.go index e7b05126e18..d9c81ab07e5 100644 --- a/pkg/registry/autoscaling/horizontalpodautoscaler/strategy.go +++ b/pkg/registry/autoscaling/horizontalpodautoscaler/strategy.go @@ -17,14 +17,9 @@ limitations under the License. package horizontalpodautoscaler import ( - "fmt" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/autoscaling" @@ -86,27 +81,6 @@ func (autoscalerStrategy) AllowUnconditionalUpdate() bool { return true } -func AutoscalerToSelectableFields(hpa *autoscaling.HorizontalPodAutoscaler) fields.Set { - return nil -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - hpa, ok := obj.(*autoscaling.HorizontalPodAutoscaler) - if !ok { - return nil, nil, false, fmt.Errorf("given object is not a horizontal pod autoscaler.") - } - return labels.Set(hpa.ObjectMeta.Labels), AutoscalerToSelectableFields(hpa), hpa.Initializers != nil, nil -} - -func MatchAutoscaler(label labels.Selector, field fields.Selector) storage.SelectionPredicate { - return storage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - type autoscalerStatusStrategy struct { autoscalerStrategy } diff --git a/pkg/registry/autoscaling/rest/BUILD b/pkg/registry/autoscaling/rest/BUILD index 1e2997d5097..d49d4915172 100644 --- a/pkg/registry/autoscaling/rest/BUILD +++ b/pkg/registry/autoscaling/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage_autoscaling.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/autoscaling:go_default_library", diff --git a/pkg/registry/batch/cronjob/BUILD b/pkg/registry/batch/cronjob/BUILD index 0a894be8683..efcde007372 100644 --- a/pkg/registry/batch/cronjob/BUILD +++ b/pkg/registry/batch/cronjob/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/batch:go_default_library", @@ -31,7 +28,6 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/batch:go_default_library", diff --git a/pkg/registry/batch/cronjob/storage/BUILD b/pkg/registry/batch/cronjob/storage/BUILD index f8bf84bc979..2d8b18208f0 100644 --- a/pkg/registry/batch/cronjob/storage/BUILD +++ b/pkg/registry/batch/cronjob/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", @@ -31,7 +28,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/batch:go_default_library", diff --git a/pkg/registry/batch/cronjob/storage/storage.go b/pkg/registry/batch/cronjob/storage/storage.go index f4ada18bc6b..dbff7059b24 100644 --- a/pkg/registry/batch/cronjob/storage/storage.go +++ b/pkg/registry/batch/cronjob/storage/storage.go @@ -37,15 +37,14 @@ type REST struct { // NewREST returns a RESTStorage object that will work against CronJobs. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &batch.CronJob{} }, - NewListFunc: func() runtime.Object { return &batch.CronJobList{} }, - QualifiedResource: batch.Resource("cronjobs"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("cronjobs"), - - CreateStrategy: cronjob.Strategy, - UpdateStrategy: cronjob.Strategy, - DeleteStrategy: cronjob.Strategy, + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &batch.CronJob{} }, + NewListFunc: func() runtime.Object { return &batch.CronJobList{} }, + DefaultQualifiedResource: batch.Resource("cronjobs"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("cronjobs"), + CreateStrategy: cronjob.Strategy, + UpdateStrategy: cronjob.Strategy, + DeleteStrategy: cronjob.Strategy, } options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { diff --git a/pkg/registry/batch/job/BUILD b/pkg/registry/batch/job/BUILD index c4a356516e1..1361d89b64c 100644 --- a/pkg/registry/batch/job/BUILD +++ b/pkg/registry/batch/job/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/batch:go_default_library", @@ -36,7 +33,6 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", diff --git a/pkg/registry/batch/job/storage/BUILD b/pkg/registry/batch/job/storage/BUILD index 8a29b7de137..90b02b45ff2 100644 --- a/pkg/registry/batch/job/storage/BUILD +++ b/pkg/registry/batch/job/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/batch:go_default_library", @@ -29,7 +26,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/batch:go_default_library", diff --git a/pkg/registry/batch/job/storage/storage.go b/pkg/registry/batch/job/storage/storage.go index 912c86e4827..aa52d251023 100644 --- a/pkg/registry/batch/job/storage/storage.go +++ b/pkg/registry/batch/job/storage/storage.go @@ -52,12 +52,12 @@ type REST struct { // NewREST returns a RESTStorage object that will work against Jobs. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &batch.Job{} }, - NewListFunc: func() runtime.Object { return &batch.JobList{} }, - PredicateFunc: job.MatchJob, - QualifiedResource: batch.Resource("jobs"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("jobs"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &batch.Job{} }, + NewListFunc: func() runtime.Object { return &batch.JobList{} }, + PredicateFunc: job.MatchJob, + DefaultQualifiedResource: batch.Resource("jobs"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("jobs"), CreateStrategy: job.Strategy, UpdateStrategy: job.Strategy, diff --git a/pkg/registry/batch/rest/BUILD b/pkg/registry/batch/rest/BUILD index cbf3b217776..75043c19a93 100644 --- a/pkg/registry/batch/rest/BUILD +++ b/pkg/registry/batch/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage_batch.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/batch:go_default_library", @@ -18,7 +15,6 @@ go_library( "//pkg/registry/batch/job/storage:go_default_library", "//vendor/k8s.io/api/batch/v1:go_default_library", "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", "//vendor/k8s.io/apiserver/pkg/server:go_default_library", diff --git a/pkg/registry/batch/rest/storage_batch.go b/pkg/registry/batch/rest/storage_batch.go index bc16427c305..c11d1ddc155 100644 --- a/pkg/registry/batch/rest/storage_batch.go +++ b/pkg/registry/batch/rest/storage_batch.go @@ -19,7 +19,6 @@ package rest import ( batchapiv1 "k8s.io/api/batch/v1" batchapiv2alpha1 "k8s.io/api/batch/v2alpha1" - "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" @@ -37,18 +36,14 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorag // If you add a version here, be sure to add an entry in `k8s.io/kubernetes/cmd/kube-apiserver/app/aggregator.go with specific priorities. // TODO refactor the plumbing to provide the information in the APIGroupInfo - if apiResourceConfigSource.AnyResourcesForVersionEnabled(batchapiv2alpha1.SchemeGroupVersion) { - apiGroupInfo.VersionedResourcesStorageMap[batchapiv2alpha1.SchemeGroupVersion.Version] = p.v2alpha1Storage(apiResourceConfigSource, restOptionsGetter) - apiGroupInfo.GroupMeta.GroupVersion = batchapiv2alpha1.SchemeGroupVersion - apiGroupInfo.SubresourceGroupVersionKind = map[string]schema.GroupVersionKind{ - "scheduledjobs": batchapiv2alpha1.SchemeGroupVersion.WithKind("ScheduledJob"), - "scheduledjobs/status": batchapiv2alpha1.SchemeGroupVersion.WithKind("ScheduledJob"), - } - } if apiResourceConfigSource.AnyResourcesForVersionEnabled(batchapiv1.SchemeGroupVersion) { apiGroupInfo.VersionedResourcesStorageMap[batchapiv1.SchemeGroupVersion.Version] = p.v1Storage(apiResourceConfigSource, restOptionsGetter) apiGroupInfo.GroupMeta.GroupVersion = batchapiv1.SchemeGroupVersion } + if apiResourceConfigSource.AnyResourcesForVersionEnabled(batchapiv2alpha1.SchemeGroupVersion) { + apiGroupInfo.VersionedResourcesStorageMap[batchapiv2alpha1.SchemeGroupVersion.Version] = p.v2alpha1Storage(apiResourceConfigSource, restOptionsGetter) + apiGroupInfo.GroupMeta.GroupVersion = batchapiv2alpha1.SchemeGroupVersion + } return apiGroupInfo, true } @@ -73,8 +68,6 @@ func (p RESTStorageProvider) v2alpha1Storage(apiResourceConfigSource serverstora cronJobsStorage, cronJobsStatusStorage := cronjobstore.NewREST(restOptionsGetter) storage["cronjobs"] = cronJobsStorage storage["cronjobs/status"] = cronJobsStatusStorage - storage["scheduledjobs"] = cronJobsStorage - storage["scheduledjobs/status"] = cronJobsStatusStorage } return storage } diff --git a/pkg/registry/cachesize/BUILD b/pkg/registry/cachesize/BUILD index 13c29e2ef22..e3aa4ce9244 100644 --- a/pkg/registry/cachesize/BUILD +++ b/pkg/registry/cachesize/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["cachesize.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/glog:go_default_library"], ) diff --git a/pkg/registry/cachesize/cachesize.go b/pkg/registry/cachesize/cachesize.go index cea62fe5f4d..20a566fbd60 100644 --- a/pkg/registry/cachesize/cachesize.go +++ b/pkg/registry/cachesize/cachesize.go @@ -105,6 +105,10 @@ func SetWatchCacheSizes(cacheSizes []string) { glog.Errorf("invalid size of watch cache capabilities: %s", c) continue } + if size < 0 { + glog.Errorf("watch cache size cannot be negative: %s", c) + continue + } watchCacheSizes[Resource(strings.ToLower(tokens[0]))] = size } diff --git a/pkg/registry/certificates/certificates/BUILD b/pkg/registry/certificates/certificates/BUILD index 87f6427ff28..664b1617c9d 100644 --- a/pkg/registry/certificates/certificates/BUILD +++ b/pkg/registry/certificates/certificates/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,22 +13,17 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/certificates:go_default_library", "//pkg/apis/certificates/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) @@ -39,7 +32,6 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/certificates:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/pkg/registry/certificates/certificates/storage/BUILD b/pkg/registry/certificates/certificates/storage/BUILD index 2476e94261f..728c179baac 100644 --- a/pkg/registry/certificates/certificates/storage/BUILD +++ b/pkg/registry/certificates/certificates/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/certificates:go_default_library", diff --git a/pkg/registry/certificates/certificates/storage/storage.go b/pkg/registry/certificates/certificates/storage/storage.go index f8f719a6642..715dbbe848c 100644 --- a/pkg/registry/certificates/certificates/storage/storage.go +++ b/pkg/registry/certificates/certificates/storage/storage.go @@ -36,18 +36,18 @@ type REST struct { // NewREST returns a registry which will store CertificateSigningRequest in the given helper func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *ApprovalREST) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &certificates.CertificateSigningRequest{} }, - NewListFunc: func() runtime.Object { return &certificates.CertificateSigningRequestList{} }, - PredicateFunc: csrregistry.Matcher, - QualifiedResource: certificates.Resource("certificatesigningrequests"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("certificatesigningrequests"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &certificates.CertificateSigningRequest{} }, + NewListFunc: func() runtime.Object { return &certificates.CertificateSigningRequestList{} }, + DefaultQualifiedResource: certificates.Resource("certificatesigningrequests"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("certificatesigningrequests"), CreateStrategy: csrregistry.Strategy, UpdateStrategy: csrregistry.Strategy, DeleteStrategy: csrregistry.Strategy, + ExportStrategy: csrregistry.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: csrregistry.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/certificates/certificates/strategy.go b/pkg/registry/certificates/certificates/strategy.go index 15a3794e6f7..8ef65a2c01a 100644 --- a/pkg/registry/certificates/certificates/strategy.go +++ b/pkg/registry/certificates/certificates/strategy.go @@ -19,13 +19,9 @@ package certificates import ( "fmt" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" - apistorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/certificates" @@ -176,26 +172,3 @@ func (csrApprovalStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, func (csrApprovalStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList { return validation.ValidateCertificateSigningRequestUpdate(obj.(*certificates.CertificateSigningRequest), old.(*certificates.CertificateSigningRequest)) } - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - sa, ok := obj.(*certificates.CertificateSigningRequest) - if !ok { - return nil, nil, false, fmt.Errorf("not a CertificateSigningRequest") - } - return labels.Set(sa.Labels), SelectableFields(sa), sa.Initializers != nil, nil -} - -// Matcher returns a generic matcher for a given label and field selector. -func Matcher(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { - return apistorage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - -// SelectableFields returns a field set that can be used for filter selection -func SelectableFields(obj *certificates.CertificateSigningRequest) fields.Set { - return generic.ObjectMetaFieldsSet(&obj.ObjectMeta, false) -} diff --git a/pkg/registry/certificates/rest/BUILD b/pkg/registry/certificates/rest/BUILD index 25d6266e8c9..bce4c0e1990 100644 --- a/pkg/registry/certificates/rest/BUILD +++ b/pkg/registry/certificates/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage_certificates.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/certificates:go_default_library", diff --git a/pkg/registry/core/componentstatus/BUILD b/pkg/registry/core/componentstatus/BUILD index 45a3fe07048..626fa212837 100644 --- a/pkg/registry/core/componentstatus/BUILD +++ b/pkg/registry/core/componentstatus/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "rest.go", "validator.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/probe:go_default_library", @@ -36,7 +33,6 @@ go_test( "validator_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/probe:go_default_library", diff --git a/pkg/registry/core/configmap/BUILD b/pkg/registry/core/configmap/BUILD index 6fb83539718..bfde09681bf 100644 --- a/pkg/registry/core/configmap/BUILD +++ b/pkg/registry/core/configmap/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,21 +13,16 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) @@ -38,10 +31,8 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", - "//pkg/api/testing:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", ], diff --git a/pkg/registry/core/configmap/storage/BUILD b/pkg/registry/core/configmap/storage/BUILD index 11a639ba6d8..09ad1d6562d 100644 --- a/pkg/registry/core/configmap/storage/BUILD +++ b/pkg/registry/core/configmap/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/registrytest:go_default_library", @@ -28,7 +25,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/cachesize:go_default_library", diff --git a/pkg/registry/core/configmap/storage/storage.go b/pkg/registry/core/configmap/storage/storage.go index 9931f24ff07..4a22ed8a310 100644 --- a/pkg/registry/core/configmap/storage/storage.go +++ b/pkg/registry/core/configmap/storage/storage.go @@ -34,18 +34,17 @@ type REST struct { // NewREST returns a RESTStorage object that will work with ConfigMap objects. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &api.ConfigMap{} }, - NewListFunc: func() runtime.Object { return &api.ConfigMapList{} }, - PredicateFunc: configmap.MatchConfigMap, - QualifiedResource: api.Resource("configmaps"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("configmaps"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &api.ConfigMap{} }, + NewListFunc: func() runtime.Object { return &api.ConfigMapList{} }, + DefaultQualifiedResource: api.Resource("configmaps"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("configmaps"), CreateStrategy: configmap.Strategy, UpdateStrategy: configmap.Strategy, DeleteStrategy: configmap.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: configmap.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/core/configmap/strategy.go b/pkg/registry/core/configmap/strategy.go index abb663882fd..b44da007423 100644 --- a/pkg/registry/core/configmap/strategy.go +++ b/pkg/registry/core/configmap/strategy.go @@ -17,16 +17,10 @@ limitations under the License. package configmap import ( - "fmt" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" - apistorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/validation" @@ -84,26 +78,3 @@ func (strategy) ValidateUpdate(ctx genericapirequest.Context, newObj, oldObj run return validation.ValidateConfigMapUpdate(newCfg, oldCfg) } - -// ConfigMapToSelectableFields returns a field set that represents the object for matching purposes. -func ConfigMapToSelectableFields(cfg *api.ConfigMap) fields.Set { - return generic.ObjectMetaFieldsSet(&cfg.ObjectMeta, true) -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - cfg, ok := obj.(*api.ConfigMap) - if !ok { - return nil, nil, false, fmt.Errorf("given object is not a ConfigMap") - } - return labels.Set(cfg.ObjectMeta.Labels), ConfigMapToSelectableFields(cfg), cfg.Initializers != nil, nil -} - -// MatchConfigMap returns a generic matcher for a given label and field selector. -func MatchConfigMap(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { - return apistorage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} diff --git a/pkg/registry/core/configmap/strategy_test.go b/pkg/registry/core/configmap/strategy_test.go index c001f59c420..a6ec3254e19 100644 --- a/pkg/registry/core/configmap/strategy_test.go +++ b/pkg/registry/core/configmap/strategy_test.go @@ -22,7 +22,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/kubernetes/pkg/api" - apitesting "k8s.io/kubernetes/pkg/api/testing" ) func TestConfigMapStrategy(t *testing.T) { @@ -69,12 +68,3 @@ func TestConfigMapStrategy(t *testing.T) { t.Errorf("Expected a validation error") } } - -func TestSelectableFieldLabelConversions(t *testing.T) { - apitesting.TestSelectableFieldLabelConversionsOfKind(t, - api.Registry.GroupOrDie(api.GroupName).GroupVersion.String(), - "ConfigMap", - ConfigMapToSelectableFields(&api.ConfigMap{}), - nil, - ) -} diff --git a/pkg/registry/core/endpoint/BUILD b/pkg/registry/core/endpoint/BUILD index 0c6153559b9..7b69243684e 100644 --- a/pkg/registry/core/endpoint/BUILD +++ b/pkg/registry/core/endpoint/BUILD @@ -1,11 +1,8 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", - "go_test", ) go_library( @@ -15,37 +12,21 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/endpoints:go_default_library", "//pkg/api/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - library = ":go_default_library", - tags = ["automanaged"], - deps = [ - "//pkg/api:go_default_library", - "//pkg/api/testing:go_default_library", - ], -) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/pkg/registry/core/endpoint/storage/BUILD b/pkg/registry/core/endpoint/storage/BUILD index a1f1ae10523..3721e1a89c9 100644 --- a/pkg/registry/core/endpoint/storage/BUILD +++ b/pkg/registry/core/endpoint/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/registrytest:go_default_library", @@ -28,7 +25,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/cachesize:go_default_library", diff --git a/pkg/registry/core/endpoint/storage/storage.go b/pkg/registry/core/endpoint/storage/storage.go index f440066ac44..28e30837199 100644 --- a/pkg/registry/core/endpoint/storage/storage.go +++ b/pkg/registry/core/endpoint/storage/storage.go @@ -33,18 +33,17 @@ type REST struct { // NewREST returns a RESTStorage object that will work against endpoints. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &api.Endpoints{} }, - NewListFunc: func() runtime.Object { return &api.EndpointsList{} }, - PredicateFunc: endpoint.MatchEndpoints, - QualifiedResource: api.Resource("endpoints"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("endpoints"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &api.Endpoints{} }, + NewListFunc: func() runtime.Object { return &api.EndpointsList{} }, + DefaultQualifiedResource: api.Resource("endpoints"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("endpoints"), CreateStrategy: endpoint.Strategy, UpdateStrategy: endpoint.Strategy, DeleteStrategy: endpoint.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: endpoint.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/core/endpoint/strategy.go b/pkg/registry/core/endpoint/strategy.go index c50894b2e69..b3a6d4ee78b 100644 --- a/pkg/registry/core/endpoint/strategy.go +++ b/pkg/registry/core/endpoint/strategy.go @@ -17,15 +17,9 @@ limitations under the License. package endpoint import ( - "fmt" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" - pkgstorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" endptspkg "k8s.io/kubernetes/pkg/api/endpoints" @@ -80,27 +74,3 @@ func (endpointsStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old func (endpointsStrategy) AllowUnconditionalUpdate() bool { return true } - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - endpoints, ok := obj.(*api.Endpoints) - if !ok { - return nil, nil, false, fmt.Errorf("invalid object type %#v", obj) - } - return endpoints.Labels, EndpointsToSelectableFields(endpoints), endpoints.Initializers != nil, nil -} - -// MatchEndpoints returns a generic matcher for a given label and field selector. -func MatchEndpoints(label labels.Selector, field fields.Selector) pkgstorage.SelectionPredicate { - return pkgstorage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - -// EndpointsToSelectableFields returns a field set that represents the object -// TODO: fields are not labels, and the validation rules for them do not apply. -func EndpointsToSelectableFields(endpoints *api.Endpoints) fields.Set { - return generic.ObjectMetaFieldsSet(&endpoints.ObjectMeta, true) -} diff --git a/pkg/registry/core/event/BUILD b/pkg/registry/core/event/BUILD index 4a9fd1b4daa..543db1db613 100644 --- a/pkg/registry/core/event/BUILD +++ b/pkg/registry/core/event/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation:go_default_library", @@ -34,9 +31,9 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", + "//pkg/api/testapi:go_default_library", "//pkg/api/testing:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", diff --git a/pkg/registry/core/event/storage/BUILD b/pkg/registry/core/event/storage/BUILD index 4babb1714fa..d8b3f471935 100644 --- a/pkg/registry/core/event/storage/BUILD +++ b/pkg/registry/core/event/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/registrytest:go_default_library", @@ -26,7 +23,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/cachesize:go_default_library", diff --git a/pkg/registry/core/event/storage/storage.go b/pkg/registry/core/event/storage/storage.go index 125f36de5c6..abc030be1fb 100644 --- a/pkg/registry/core/event/storage/storage.go +++ b/pkg/registry/core/event/storage/storage.go @@ -50,8 +50,8 @@ func NewREST(optsGetter generic.RESTOptionsGetter, ttl uint64) *REST { TTLFunc: func(runtime.Object, uint64, bool) (uint64, error) { return ttl, nil }, - QualifiedResource: resource, - WatchCacheSize: cachesize.GetWatchCacheSizeByResource(resource.Resource), + DefaultQualifiedResource: resource, + WatchCacheSize: cachesize.GetWatchCacheSizeByResource(resource.Resource), CreateStrategy: event.Strategy, UpdateStrategy: event.Strategy, diff --git a/pkg/registry/core/event/strategy_test.go b/pkg/registry/core/event/strategy_test.go index 9b5e5959abd..be78b5aa0f8 100644 --- a/pkg/registry/core/event/strategy_test.go +++ b/pkg/registry/core/event/strategy_test.go @@ -25,6 +25,9 @@ import ( "k8s.io/apimachinery/pkg/util/diff" "k8s.io/kubernetes/pkg/api" apitesting "k8s.io/kubernetes/pkg/api/testing" + + // install all api groups for testing + _ "k8s.io/kubernetes/pkg/api/testapi" ) func testEvent(name string) *api.Event { diff --git a/pkg/registry/core/limitrange/BUILD b/pkg/registry/core/limitrange/BUILD index 12732c4d4a4..3399ff6c1c3 100644 --- a/pkg/registry/core/limitrange/BUILD +++ b/pkg/registry/core/limitrange/BUILD @@ -1,11 +1,8 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", - "go_test", ) go_library( @@ -14,32 +11,17 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - library = ":go_default_library", - tags = ["automanaged"], - deps = [ - "//pkg/api:go_default_library", - "//pkg/api/testing:go_default_library", - ], -) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/pkg/registry/core/limitrange/storage/BUILD b/pkg/registry/core/limitrange/storage/BUILD index 4ccde31dda9..d94d65f4575 100644 --- a/pkg/registry/core/limitrange/storage/BUILD +++ b/pkg/registry/core/limitrange/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/registrytest:go_default_library", @@ -29,7 +26,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/cachesize:go_default_library", diff --git a/pkg/registry/core/limitrange/storage/storage.go b/pkg/registry/core/limitrange/storage/storage.go index bfe7e91a3b7..68d43499d64 100644 --- a/pkg/registry/core/limitrange/storage/storage.go +++ b/pkg/registry/core/limitrange/storage/storage.go @@ -33,19 +33,18 @@ type REST struct { // NewREST returns a RESTStorage object that will work against horizontal pod autoscalers. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &api.LimitRange{} }, - NewListFunc: func() runtime.Object { return &api.LimitRangeList{} }, - PredicateFunc: limitrange.MatchLimitRange, - QualifiedResource: api.Resource("limitranges"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("limitranges"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &api.LimitRange{} }, + NewListFunc: func() runtime.Object { return &api.LimitRangeList{} }, + DefaultQualifiedResource: api.Resource("limitranges"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("limitranges"), CreateStrategy: limitrange.Strategy, UpdateStrategy: limitrange.Strategy, DeleteStrategy: limitrange.Strategy, ExportStrategy: limitrange.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: limitrange.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/core/limitrange/strategy.go b/pkg/registry/core/limitrange/strategy.go index 7f49d635a4f..25b9f14135a 100644 --- a/pkg/registry/core/limitrange/strategy.go +++ b/pkg/registry/core/limitrange/strategy.go @@ -17,15 +17,10 @@ limitations under the License. package limitrange import ( - "fmt" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/uuid" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/validation" @@ -76,30 +71,9 @@ func (limitrangeStrategy) AllowUnconditionalUpdate() bool { return true } -func LimitRangeToSelectableFields(limitRange *api.LimitRange) fields.Set { - return nil -} - func (limitrangeStrategy) Export(genericapirequest.Context, runtime.Object, bool) error { // Copied from OpenShift exporter // TODO: this needs to be fixed // limitrange.Strategy.PrepareForCreate(ctx, obj) return nil } - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - lr, ok := obj.(*api.LimitRange) - if !ok { - return nil, nil, false, fmt.Errorf("given object is not a limit range.") - } - return labels.Set(lr.ObjectMeta.Labels), LimitRangeToSelectableFields(lr), lr.Initializers != nil, nil -} - -func MatchLimitRange(label labels.Selector, field fields.Selector) storage.SelectionPredicate { - return storage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} diff --git a/pkg/registry/core/namespace/BUILD b/pkg/registry/core/namespace/BUILD index 95123b7ccbd..a01b00ac55d 100644 --- a/pkg/registry/core/namespace/BUILD +++ b/pkg/registry/core/namespace/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation:go_default_library", @@ -38,9 +35,9 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", + "//pkg/api/testapi:go_default_library", "//pkg/api/testing:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", diff --git a/pkg/registry/core/namespace/storage/BUILD b/pkg/registry/core/namespace/storage/BUILD index 55fbc1d478f..564c4a67f88 100644 --- a/pkg/registry/core/namespace/storage/BUILD +++ b/pkg/registry/core/namespace/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/registrytest:go_default_library", @@ -28,7 +25,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/cachesize:go_default_library", diff --git a/pkg/registry/core/namespace/storage/storage.go b/pkg/registry/core/namespace/storage/storage.go index f1c7ffc2df2..0b3edf132d5 100644 --- a/pkg/registry/core/namespace/storage/storage.go +++ b/pkg/registry/core/namespace/storage/storage.go @@ -54,12 +54,12 @@ type FinalizeREST struct { // NewREST returns a RESTStorage object that will work against namespaces. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *FinalizeREST) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &api.Namespace{} }, - NewListFunc: func() runtime.Object { return &api.NamespaceList{} }, - PredicateFunc: namespace.MatchNamespace, - QualifiedResource: api.Resource("namespaces"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("namespaces"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &api.Namespace{} }, + NewListFunc: func() runtime.Object { return &api.NamespaceList{} }, + PredicateFunc: namespace.MatchNamespace, + DefaultQualifiedResource: api.Resource("namespaces"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("namespaces"), CreateStrategy: namespace.Strategy, UpdateStrategy: namespace.Strategy, diff --git a/pkg/registry/core/namespace/strategy_test.go b/pkg/registry/core/namespace/strategy_test.go index 37691ac7201..8e3dbc3e800 100644 --- a/pkg/registry/core/namespace/strategy_test.go +++ b/pkg/registry/core/namespace/strategy_test.go @@ -23,6 +23,9 @@ import ( genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/kubernetes/pkg/api" apitesting "k8s.io/kubernetes/pkg/api/testing" + + // install all api groups for testing + _ "k8s.io/kubernetes/pkg/api/testapi" ) func TestNamespaceStrategy(t *testing.T) { diff --git a/pkg/registry/core/node/BUILD b/pkg/registry/core/node/BUILD index b8791bcac12..2cfe69090f2 100644 --- a/pkg/registry/core/node/BUILD +++ b/pkg/registry/core/node/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation:go_default_library", @@ -42,9 +39,9 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", + "//pkg/api/testapi:go_default_library", "//pkg/api/testing:go_default_library", "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", diff --git a/pkg/registry/core/node/rest/BUILD b/pkg/registry/core/node/rest/BUILD index 96593785340..5af1784d1d3 100644 --- a/pkg/registry/core/node/rest/BUILD +++ b/pkg/registry/core/node/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["proxy.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/capabilities:go_default_library", diff --git a/pkg/registry/core/node/rest/proxy.go b/pkg/registry/core/node/rest/proxy.go index 7535acade1a..5da6392c60a 100644 --- a/pkg/registry/core/node/rest/proxy.go +++ b/pkg/registry/core/node/rest/proxy.go @@ -76,7 +76,7 @@ func (r *ProxyREST) Connect(ctx genericapirequest.Context, id string, opts runti } func newThrottledUpgradeAwareProxyHandler(location *url.URL, transport http.RoundTripper, wrapTransport, upgradeRequired bool, responder rest.Responder) *proxy.UpgradeAwareHandler { - handler := proxy.NewUpgradeAwareHandler(location, transport, wrapTransport, upgradeRequired, responder) + handler := proxy.NewUpgradeAwareHandler(location, transport, wrapTransport, upgradeRequired, proxy.NewErrorResponder(responder)) handler.MaxBytesPerSec = capabilities.Get().PerConnectionBandwidthLimitBytesPerSec return handler } diff --git a/pkg/registry/core/node/storage/BUILD b/pkg/registry/core/node/storage/BUILD index dfbb500ac5e..04d1942af5f 100644 --- a/pkg/registry/core/node/storage/BUILD +++ b/pkg/registry/core/node/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/kubelet/client:go_default_library", @@ -30,7 +27,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1:go_default_library", diff --git a/pkg/registry/core/node/storage/storage.go b/pkg/registry/core/node/storage/storage.go index 32aab18e7be..fb9e6c2fcdb 100644 --- a/pkg/registry/core/node/storage/storage.go +++ b/pkg/registry/core/node/storage/storage.go @@ -73,12 +73,12 @@ func (r *StatusREST) Update(ctx genericapirequest.Context, name string, objInfo // NewStorage returns a NodeStorage object that will work against nodes. func NewStorage(optsGetter generic.RESTOptionsGetter, kubeletClientConfig client.KubeletClientConfig, proxyTransport http.RoundTripper) (*NodeStorage, error) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &api.Node{} }, - NewListFunc: func() runtime.Object { return &api.NodeList{} }, - PredicateFunc: node.MatchNode, - QualifiedResource: api.Resource("nodes"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("nodes"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &api.Node{} }, + NewListFunc: func() runtime.Object { return &api.NodeList{} }, + PredicateFunc: node.MatchNode, + DefaultQualifiedResource: api.Resource("nodes"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("nodes"), CreateStrategy: node.Strategy, UpdateStrategy: node.Strategy, diff --git a/pkg/registry/core/node/strategy_test.go b/pkg/registry/core/node/strategy_test.go index 2fd33f6ac73..ec740efdc2f 100644 --- a/pkg/registry/core/node/strategy_test.go +++ b/pkg/registry/core/node/strategy_test.go @@ -23,6 +23,9 @@ import ( "k8s.io/apimachinery/pkg/labels" "k8s.io/kubernetes/pkg/api" apitesting "k8s.io/kubernetes/pkg/api/testing" + + // install all api groups for testing + _ "k8s.io/kubernetes/pkg/api/testapi" ) func TestMatchNode(t *testing.T) { diff --git a/pkg/registry/core/persistentvolume/BUILD b/pkg/registry/core/persistentvolume/BUILD index 2d2df364970..8ca7cf31ddf 100644 --- a/pkg/registry/core/persistentvolume/BUILD +++ b/pkg/registry/core/persistentvolume/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation:go_default_library", @@ -34,9 +31,9 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", + "//pkg/api/testapi:go_default_library", "//pkg/api/testing:go_default_library", ], ) diff --git a/pkg/registry/core/persistentvolume/storage/BUILD b/pkg/registry/core/persistentvolume/storage/BUILD index 935a40582ff..61998e0d5a1 100644 --- a/pkg/registry/core/persistentvolume/storage/BUILD +++ b/pkg/registry/core/persistentvolume/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/registrytest:go_default_library", @@ -33,7 +30,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/cachesize:go_default_library", diff --git a/pkg/registry/core/persistentvolume/storage/storage.go b/pkg/registry/core/persistentvolume/storage/storage.go index 8bc34e578ba..7c69f7eb812 100644 --- a/pkg/registry/core/persistentvolume/storage/storage.go +++ b/pkg/registry/core/persistentvolume/storage/storage.go @@ -35,12 +35,12 @@ type REST struct { // NewREST returns a RESTStorage object that will work against persistent volumes. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &api.PersistentVolume{} }, - NewListFunc: func() runtime.Object { return &api.PersistentVolumeList{} }, - PredicateFunc: persistentvolume.MatchPersistentVolumes, - QualifiedResource: api.Resource("persistentvolumes"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("persistentvolumes"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &api.PersistentVolume{} }, + NewListFunc: func() runtime.Object { return &api.PersistentVolumeList{} }, + PredicateFunc: persistentvolume.MatchPersistentVolumes, + DefaultQualifiedResource: api.Resource("persistentvolumes"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("persistentvolumes"), CreateStrategy: persistentvolume.Strategy, UpdateStrategy: persistentvolume.Strategy, diff --git a/pkg/registry/core/persistentvolume/strategy_test.go b/pkg/registry/core/persistentvolume/strategy_test.go index 65b975e8b9b..1bec01dac3c 100644 --- a/pkg/registry/core/persistentvolume/strategy_test.go +++ b/pkg/registry/core/persistentvolume/strategy_test.go @@ -21,6 +21,9 @@ import ( "k8s.io/kubernetes/pkg/api" apitesting "k8s.io/kubernetes/pkg/api/testing" + + // install all api groups for testing + _ "k8s.io/kubernetes/pkg/api/testapi" ) func TestSelectableFieldLabelConversions(t *testing.T) { diff --git a/pkg/registry/core/persistentvolumeclaim/BUILD b/pkg/registry/core/persistentvolumeclaim/BUILD index c19290269dd..156985bb5ee 100644 --- a/pkg/registry/core/persistentvolumeclaim/BUILD +++ b/pkg/registry/core/persistentvolumeclaim/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation:go_default_library", @@ -33,9 +30,9 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", + "//pkg/api/testapi:go_default_library", "//pkg/api/testing:go_default_library", ], ) diff --git a/pkg/registry/core/persistentvolumeclaim/storage/BUILD b/pkg/registry/core/persistentvolumeclaim/storage/BUILD index eb1980fbeff..29a3ebbc8ac 100644 --- a/pkg/registry/core/persistentvolumeclaim/storage/BUILD +++ b/pkg/registry/core/persistentvolumeclaim/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/registrytest:go_default_library", @@ -33,7 +30,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/cachesize:go_default_library", diff --git a/pkg/registry/core/persistentvolumeclaim/storage/storage.go b/pkg/registry/core/persistentvolumeclaim/storage/storage.go index 79c23de7f0d..d5295dbf631 100644 --- a/pkg/registry/core/persistentvolumeclaim/storage/storage.go +++ b/pkg/registry/core/persistentvolumeclaim/storage/storage.go @@ -35,12 +35,12 @@ type REST struct { // NewREST returns a RESTStorage object that will work against persistent volume claims. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &api.PersistentVolumeClaim{} }, - NewListFunc: func() runtime.Object { return &api.PersistentVolumeClaimList{} }, - PredicateFunc: persistentvolumeclaim.MatchPersistentVolumeClaim, - QualifiedResource: api.Resource("persistentvolumeclaims"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("persistentvolumeclaims"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &api.PersistentVolumeClaim{} }, + NewListFunc: func() runtime.Object { return &api.PersistentVolumeClaimList{} }, + PredicateFunc: persistentvolumeclaim.MatchPersistentVolumeClaim, + DefaultQualifiedResource: api.Resource("persistentvolumeclaims"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("persistentvolumeclaims"), CreateStrategy: persistentvolumeclaim.Strategy, UpdateStrategy: persistentvolumeclaim.Strategy, diff --git a/pkg/registry/core/persistentvolumeclaim/strategy_test.go b/pkg/registry/core/persistentvolumeclaim/strategy_test.go index e8fe5e60273..90824c4db2a 100644 --- a/pkg/registry/core/persistentvolumeclaim/strategy_test.go +++ b/pkg/registry/core/persistentvolumeclaim/strategy_test.go @@ -21,6 +21,9 @@ import ( "k8s.io/kubernetes/pkg/api" apitesting "k8s.io/kubernetes/pkg/api/testing" + + // install all api groups for testing + _ "k8s.io/kubernetes/pkg/api/testapi" ) func TestSelectableFieldLabelConversions(t *testing.T) { diff --git a/pkg/registry/core/pod/BUILD b/pkg/registry/core/pod/BUILD index 429a1a9d672..36a4b049f6c 100644 --- a/pkg/registry/core/pod/BUILD +++ b/pkg/registry/core/pod/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper/qos:go_default_library", @@ -39,9 +36,9 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", + "//pkg/api/testapi:go_default_library", "//pkg/api/testing:go_default_library", "//pkg/kubelet/client:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/pkg/registry/core/pod/rest/BUILD b/pkg/registry/core/pod/rest/BUILD index ffce1b67636..110bbda79d3 100644 --- a/pkg/registry/core/pod/rest/BUILD +++ b/pkg/registry/core/pod/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "log.go", "subresources.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation:go_default_library", @@ -37,7 +34,6 @@ go_test( name = "go_default_test", srcs = ["log_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/registrytest:go_default_library", diff --git a/pkg/registry/core/pod/rest/subresources.go b/pkg/registry/core/pod/rest/subresources.go index ec6f7ac4857..76e789a5a6f 100644 --- a/pkg/registry/core/pod/rest/subresources.go +++ b/pkg/registry/core/pod/rest/subresources.go @@ -192,7 +192,7 @@ func (r *PortForwardREST) Connect(ctx genericapirequest.Context, name string, op } func newThrottledUpgradeAwareProxyHandler(location *url.URL, transport http.RoundTripper, wrapTransport, upgradeRequired, interceptRedirects bool, responder rest.Responder) *proxy.UpgradeAwareHandler { - handler := proxy.NewUpgradeAwareHandler(location, transport, wrapTransport, upgradeRequired, responder) + handler := proxy.NewUpgradeAwareHandler(location, transport, wrapTransport, upgradeRequired, proxy.NewErrorResponder(responder)) handler.InterceptRedirects = interceptRedirects && utilfeature.DefaultFeatureGate.Enabled(genericfeatures.StreamingProxyRedirects) handler.MaxBytesPerSec = capabilities.Get().PerConnectionBandwidthLimitBytesPerSec return handler diff --git a/pkg/registry/core/pod/storage/BUILD b/pkg/registry/core/pod/storage/BUILD index 893af871a47..969c096caa6 100644 --- a/pkg/registry/core/pod/storage/BUILD +++ b/pkg/registry/core/pod/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/registrytest:go_default_library", @@ -42,7 +39,6 @@ go_library( "eviction.go", "storage.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/pod:go_default_library", diff --git a/pkg/registry/core/pod/storage/storage.go b/pkg/registry/core/pod/storage/storage.go index ca58827d832..83b20d588ef 100644 --- a/pkg/registry/core/pod/storage/storage.go +++ b/pkg/registry/core/pod/storage/storage.go @@ -66,12 +66,12 @@ type REST struct { func NewStorage(optsGetter generic.RESTOptionsGetter, k client.ConnectionInfoGetter, proxyTransport http.RoundTripper, podDisruptionBudgetClient policyclient.PodDisruptionBudgetsGetter) PodStorage { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &api.Pod{} }, - NewListFunc: func() runtime.Object { return &api.PodList{} }, - PredicateFunc: pod.MatchPod, - QualifiedResource: api.Resource("pods"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("pods"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &api.Pod{} }, + NewListFunc: func() runtime.Object { return &api.PodList{} }, + PredicateFunc: pod.MatchPod, + DefaultQualifiedResource: api.Resource("pods"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("pods"), CreateStrategy: pod.Strategy, UpdateStrategy: pod.Strategy, diff --git a/pkg/registry/core/pod/strategy.go b/pkg/registry/core/pod/strategy.go index 00a3c4f991e..9337ef9b994 100644 --- a/pkg/registry/core/pod/strategy.go +++ b/pkg/registry/core/pod/strategy.go @@ -196,10 +196,11 @@ func PodToSelectableFields(pod *api.Pod) fields.Set { // amount of allocations needed to create the fields.Set. If you add any // field here or the number of object-meta related fields changes, this should // be adjusted. - podSpecificFieldsSet := make(fields.Set, 5) + podSpecificFieldsSet := make(fields.Set, 6) podSpecificFieldsSet["spec.nodeName"] = pod.Spec.NodeName podSpecificFieldsSet["spec.restartPolicy"] = string(pod.Spec.RestartPolicy) podSpecificFieldsSet["status.phase"] = string(pod.Status.Phase) + podSpecificFieldsSet["status.podIP"] = string(pod.Status.PodIP) return generic.AddObjectMetaFieldsSet(podSpecificFieldsSet, &pod.ObjectMeta, true) } diff --git a/pkg/registry/core/pod/strategy_test.go b/pkg/registry/core/pod/strategy_test.go index 1f9e78c25cc..e2f34621085 100644 --- a/pkg/registry/core/pod/strategy_test.go +++ b/pkg/registry/core/pod/strategy_test.go @@ -32,6 +32,9 @@ import ( "k8s.io/kubernetes/pkg/api" apitesting "k8s.io/kubernetes/pkg/api/testing" "k8s.io/kubernetes/pkg/kubelet/client" + + // install all api groups for testing + _ "k8s.io/kubernetes/pkg/api/testapi" ) func TestMatchPod(t *testing.T) { @@ -82,6 +85,20 @@ func TestMatchPod(t *testing.T) { fieldSelector: fields.ParseSelectorOrDie("status.phase=Pending"), expectMatch: false, }, + { + in: &api.Pod{ + Status: api.PodStatus{PodIP: "1.2.3.4"}, + }, + fieldSelector: fields.ParseSelectorOrDie("status.podIP=1.2.3.4"), + expectMatch: true, + }, + { + in: &api.Pod{ + Status: api.PodStatus{PodIP: "1.2.3.4"}, + }, + fieldSelector: fields.ParseSelectorOrDie("status.podIP=4.3.2.1"), + expectMatch: false, + }, } for _, testCase := range testCases { m := MatchPod(labels.Everything(), testCase.fieldSelector) diff --git a/pkg/registry/core/podtemplate/BUILD b/pkg/registry/core/podtemplate/BUILD index ae3e776b5b8..56c64540e27 100644 --- a/pkg/registry/core/podtemplate/BUILD +++ b/pkg/registry/core/podtemplate/BUILD @@ -1,11 +1,8 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", - "go_test", ) go_library( @@ -14,31 +11,16 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - library = ":go_default_library", - tags = ["automanaged"], - deps = [ - "//pkg/api:go_default_library", - "//pkg/api/testing:go_default_library", - ], -) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/pkg/registry/core/podtemplate/storage/BUILD b/pkg/registry/core/podtemplate/storage/BUILD index b7ad3e74633..94aeadfdbd6 100644 --- a/pkg/registry/core/podtemplate/storage/BUILD +++ b/pkg/registry/core/podtemplate/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/registrytest:go_default_library", @@ -28,7 +25,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/cachesize:go_default_library", diff --git a/pkg/registry/core/podtemplate/storage/storage.go b/pkg/registry/core/podtemplate/storage/storage.go index 0a9e67c1ffc..9376d4b4ba4 100644 --- a/pkg/registry/core/podtemplate/storage/storage.go +++ b/pkg/registry/core/podtemplate/storage/storage.go @@ -32,12 +32,11 @@ type REST struct { // NewREST returns a RESTStorage object that will work against pod templates. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &api.PodTemplate{} }, - NewListFunc: func() runtime.Object { return &api.PodTemplateList{} }, - PredicateFunc: podtemplate.MatchPodTemplate, - QualifiedResource: api.Resource("podtemplates"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("podtemplates"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &api.PodTemplate{} }, + NewListFunc: func() runtime.Object { return &api.PodTemplateList{} }, + DefaultQualifiedResource: api.Resource("podtemplates"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("podtemplates"), CreateStrategy: podtemplate.Strategy, UpdateStrategy: podtemplate.Strategy, @@ -46,7 +45,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST { ReturnDeletedObject: true, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: podtemplate.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/core/podtemplate/strategy.go b/pkg/registry/core/podtemplate/strategy.go index 87012c541cb..77a1dee56a3 100644 --- a/pkg/registry/core/podtemplate/strategy.go +++ b/pkg/registry/core/podtemplate/strategy.go @@ -17,14 +17,9 @@ limitations under the License. package podtemplate import ( - "fmt" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/validation" @@ -83,24 +78,3 @@ func (podTemplateStrategy) Export(ctx genericapirequest.Context, obj runtime.Obj // Do nothing return nil } - -func PodTemplateToSelectableFields(podTemplate *api.PodTemplate) fields.Set { - return nil -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - pt, ok := obj.(*api.PodTemplate) - if !ok { - return nil, nil, false, fmt.Errorf("given object is not a pod template.") - } - return labels.Set(pt.ObjectMeta.Labels), PodTemplateToSelectableFields(pt), pt.Initializers != nil, nil -} - -func MatchPodTemplate(label labels.Selector, field fields.Selector) storage.SelectionPredicate { - return storage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} diff --git a/pkg/registry/core/rangeallocation/BUILD b/pkg/registry/core/rangeallocation/BUILD index 2cde70f40aa..bf1d577e3a7 100644 --- a/pkg/registry/core/rangeallocation/BUILD +++ b/pkg/registry/core/rangeallocation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "registry.go", ], - tags = ["automanaged"], deps = ["//pkg/api:go_default_library"], ) diff --git a/pkg/registry/core/replicationcontroller/BUILD b/pkg/registry/core/replicationcontroller/BUILD index 2082af00556..6f3f74e28e2 100644 --- a/pkg/registry/core/replicationcontroller/BUILD +++ b/pkg/registry/core/replicationcontroller/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", @@ -40,9 +37,9 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", + "//pkg/api/testapi:go_default_library", "//pkg/api/testing:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", diff --git a/pkg/registry/core/replicationcontroller/storage/BUILD b/pkg/registry/core/replicationcontroller/storage/BUILD index e80c94b6dba..ffef9f4d1d3 100644 --- a/pkg/registry/core/replicationcontroller/storage/BUILD +++ b/pkg/registry/core/replicationcontroller/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/autoscaling:go_default_library", @@ -34,7 +31,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/autoscaling:go_default_library", diff --git a/pkg/registry/core/replicationcontroller/storage/storage.go b/pkg/registry/core/replicationcontroller/storage/storage.go index 54b84f4246a..1d0bb1e76e9 100644 --- a/pkg/registry/core/replicationcontroller/storage/storage.go +++ b/pkg/registry/core/replicationcontroller/storage/storage.go @@ -61,12 +61,12 @@ type REST struct { // NewREST returns a RESTStorage object that will work against replication controllers. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &api.ReplicationController{} }, - NewListFunc: func() runtime.Object { return &api.ReplicationControllerList{} }, - PredicateFunc: replicationcontroller.MatchController, - QualifiedResource: api.Resource("replicationcontrollers"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("replicationcontrollers"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &api.ReplicationController{} }, + NewListFunc: func() runtime.Object { return &api.ReplicationControllerList{} }, + PredicateFunc: replicationcontroller.MatchController, + DefaultQualifiedResource: api.Resource("replicationcontrollers"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("replicationcontrollers"), CreateStrategy: replicationcontroller.Strategy, UpdateStrategy: replicationcontroller.Strategy, diff --git a/pkg/registry/core/replicationcontroller/strategy_test.go b/pkg/registry/core/replicationcontroller/strategy_test.go index 6c9513cc7bf..1b20fbada47 100644 --- a/pkg/registry/core/replicationcontroller/strategy_test.go +++ b/pkg/registry/core/replicationcontroller/strategy_test.go @@ -24,6 +24,9 @@ import ( genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/kubernetes/pkg/api" apitesting "k8s.io/kubernetes/pkg/api/testing" + + // install all api groups for testing + _ "k8s.io/kubernetes/pkg/api/testapi" ) func TestControllerStrategy(t *testing.T) { diff --git a/pkg/registry/core/resourcequota/BUILD b/pkg/registry/core/resourcequota/BUILD index d77733d99bb..a7d75810c4b 100644 --- a/pkg/registry/core/resourcequota/BUILD +++ b/pkg/registry/core/resourcequota/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,17 +12,12 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) @@ -33,10 +26,8 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", - "//pkg/api/testing: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/apiserver/pkg/endpoints/request:go_default_library", diff --git a/pkg/registry/core/resourcequota/storage/BUILD b/pkg/registry/core/resourcequota/storage/BUILD index b689bd9d42b..6780ca26cbd 100644 --- a/pkg/registry/core/resourcequota/storage/BUILD +++ b/pkg/registry/core/resourcequota/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/registrytest:go_default_library", @@ -32,7 +29,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/cachesize:go_default_library", diff --git a/pkg/registry/core/resourcequota/storage/storage.go b/pkg/registry/core/resourcequota/storage/storage.go index a54df9271ae..c708d114a41 100644 --- a/pkg/registry/core/resourcequota/storage/storage.go +++ b/pkg/registry/core/resourcequota/storage/storage.go @@ -35,19 +35,18 @@ type REST struct { // NewREST returns a RESTStorage object that will work against resource quotas. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &api.ResourceQuota{} }, - NewListFunc: func() runtime.Object { return &api.ResourceQuotaList{} }, - PredicateFunc: resourcequota.MatchResourceQuota, - QualifiedResource: api.Resource("resourcequotas"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("resourcequotas"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &api.ResourceQuota{} }, + NewListFunc: func() runtime.Object { return &api.ResourceQuotaList{} }, + DefaultQualifiedResource: api.Resource("resourcequotas"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("resourcequotas"), CreateStrategy: resourcequota.Strategy, UpdateStrategy: resourcequota.Strategy, DeleteStrategy: resourcequota.Strategy, ReturnDeletedObject: true, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: resourcequota.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/core/resourcequota/strategy.go b/pkg/registry/core/resourcequota/strategy.go index 6211e8f4bb0..e9c26c009ca 100644 --- a/pkg/registry/core/resourcequota/strategy.go +++ b/pkg/registry/core/resourcequota/strategy.go @@ -17,15 +17,9 @@ limitations under the License. package resourcequota import ( - "fmt" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" - "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/validation" @@ -99,26 +93,3 @@ func (resourcequotaStatusStrategy) PrepareForUpdate(ctx genericapirequest.Contex func (resourcequotaStatusStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList { return validation.ValidateResourceQuotaStatusUpdate(obj.(*api.ResourceQuota), old.(*api.ResourceQuota)) } - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - resourcequotaObj, ok := obj.(*api.ResourceQuota) - if !ok { - return nil, nil, false, fmt.Errorf("not a resourcequota") - } - return labels.Set(resourcequotaObj.Labels), ResourceQuotaToSelectableFields(resourcequotaObj), resourcequotaObj.Initializers != nil, nil -} - -// MatchResourceQuota returns a generic matcher for a given label and field selector. -func MatchResourceQuota(label labels.Selector, field fields.Selector) storage.SelectionPredicate { - return storage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - -// ResourceQuotaToSelectableFields returns a field set that represents the object -func ResourceQuotaToSelectableFields(resourcequota *api.ResourceQuota) fields.Set { - return generic.ObjectMetaFieldsSet(&resourcequota.ObjectMeta, true) -} diff --git a/pkg/registry/core/resourcequota/strategy_test.go b/pkg/registry/core/resourcequota/strategy_test.go index bde07ac7a6f..6ec3816fc06 100644 --- a/pkg/registry/core/resourcequota/strategy_test.go +++ b/pkg/registry/core/resourcequota/strategy_test.go @@ -23,7 +23,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/kubernetes/pkg/api" - apitesting "k8s.io/kubernetes/pkg/api/testing" ) func TestResourceQuotaStrategy(t *testing.T) { @@ -59,12 +58,3 @@ func TestResourceQuotaStrategy(t *testing.T) { t.Errorf("ResourceQuota does not allow setting status on create") } } - -func TestSelectableFieldLabelConversions(t *testing.T) { - apitesting.TestSelectableFieldLabelConversionsOfKind(t, - api.Registry.GroupOrDie(api.GroupName).GroupVersion.String(), - "ResourceQuota", - ResourceQuotaToSelectableFields(&api.ResourceQuota{}), - nil, - ) -} diff --git a/pkg/registry/core/rest/BUILD b/pkg/registry/core/rest/BUILD index 5c12c71800d..d18bc4989b5 100644 --- a/pkg/registry/core/rest/BUILD +++ b/pkg/registry/core/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_core_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apiserver/pkg/server/storage:go_default_library", @@ -23,7 +20,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage_core.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/policy/internalversion:go_default_library", diff --git a/pkg/registry/core/secret/BUILD b/pkg/registry/core/secret/BUILD index bc1ccf4563e..ade27419594 100644 --- a/pkg/registry/core/secret/BUILD +++ b/pkg/registry/core/secret/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation:go_default_library", @@ -39,9 +36,9 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", + "//pkg/api/testapi:go_default_library", "//pkg/api/testing:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/pkg/registry/core/secret/storage/BUILD b/pkg/registry/core/secret/storage/BUILD index d62212924bf..a7f546c8f00 100644 --- a/pkg/registry/core/secret/storage/BUILD +++ b/pkg/registry/core/secret/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/registrytest:go_default_library", @@ -28,7 +25,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/cachesize:go_default_library", diff --git a/pkg/registry/core/secret/storage/storage.go b/pkg/registry/core/secret/storage/storage.go index 7bb7b268752..2827bdb1614 100644 --- a/pkg/registry/core/secret/storage/storage.go +++ b/pkg/registry/core/secret/storage/storage.go @@ -32,16 +32,17 @@ type REST struct { // NewREST returns a RESTStorage object that will work against secrets. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &api.Secret{} }, - NewListFunc: func() runtime.Object { return &api.SecretList{} }, - PredicateFunc: secret.Matcher, - QualifiedResource: api.Resource("secrets"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("secrets"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &api.Secret{} }, + NewListFunc: func() runtime.Object { return &api.SecretList{} }, + PredicateFunc: secret.Matcher, + DefaultQualifiedResource: api.Resource("secrets"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("secrets"), CreateStrategy: secret.Strategy, UpdateStrategy: secret.Strategy, DeleteStrategy: secret.Strategy, + ExportStrategy: secret.Strategy, } options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: secret.GetAttrs} if err := store.CompleteWithOptions(options); err != nil { diff --git a/pkg/registry/core/secret/strategy_test.go b/pkg/registry/core/secret/strategy_test.go index f021be5d64e..1e284efa5b9 100644 --- a/pkg/registry/core/secret/strategy_test.go +++ b/pkg/registry/core/secret/strategy_test.go @@ -25,6 +25,9 @@ import ( genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/kubernetes/pkg/api" apitesting "k8s.io/kubernetes/pkg/api/testing" + + // install all api groups for testing + _ "k8s.io/kubernetes/pkg/api/testapi" ) func TestExportSecret(t *testing.T) { diff --git a/pkg/registry/core/service/BUILD b/pkg/registry/core/service/BUILD index 727511864b4..c6375b665da 100644 --- a/pkg/registry/core/service/BUILD +++ b/pkg/registry/core/service/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "rest.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", @@ -32,8 +29,6 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/proxy:go_default_library", @@ -41,9 +36,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", ], @@ -56,12 +49,10 @@ go_test( "strategy_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", "//pkg/api/service:go_default_library", - "//pkg/api/testing:go_default_library", "//pkg/features:go_default_library", "//pkg/registry/core/service/ipallocator:go_default_library", "//pkg/registry/core/service/portallocator:go_default_library", diff --git a/pkg/registry/core/service/allocator/BUILD b/pkg/registry/core/service/allocator/BUILD index 9b148e93a84..f397ec4b6d7 100644 --- a/pkg/registry/core/service/allocator/BUILD +++ b/pkg/registry/core/service/allocator/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "interfaces.go", "utils.go", ], - tags = ["automanaged"], ) go_test( @@ -25,7 +22,6 @@ go_test( "utils_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library"], ) diff --git a/pkg/registry/core/service/allocator/storage/BUILD b/pkg/registry/core/service/allocator/storage/BUILD index a6d734cfbb5..d24f9872c36 100644 --- a/pkg/registry/core/service/allocator/storage/BUILD +++ b/pkg/registry/core/service/allocator/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/core/service/allocator:go_default_library", @@ -26,7 +23,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/core/rangeallocation:go_default_library", diff --git a/pkg/registry/core/service/ipallocator/BUILD b/pkg/registry/core/service/ipallocator/BUILD index dcfc3899289..eea401e7bfe 100644 --- a/pkg/registry/core/service/ipallocator/BUILD +++ b/pkg/registry/core/service/ipallocator/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["allocator.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/core/service/allocator:go_default_library", @@ -22,7 +19,6 @@ go_test( name = "go_default_test", srcs = ["allocator_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", diff --git a/pkg/registry/core/service/ipallocator/controller/BUILD b/pkg/registry/core/service/ipallocator/controller/BUILD index d244b787525..90f1dbbe109 100644 --- a/pkg/registry/core/service/ipallocator/controller/BUILD +++ b/pkg/registry/core/service/ipallocator/controller/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["repair.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", @@ -30,7 +27,6 @@ go_test( name = "go_default_test", srcs = ["repair_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset/fake:go_default_library", diff --git a/pkg/registry/core/service/ipallocator/storage/BUILD b/pkg/registry/core/service/ipallocator/storage/BUILD index b1f77a08ec6..a4e52455a16 100644 --- a/pkg/registry/core/service/ipallocator/storage/BUILD +++ b/pkg/registry/core/service/ipallocator/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/core/service/allocator:go_default_library", @@ -30,7 +27,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/registry/core/service/portallocator/BUILD b/pkg/registry/core/service/portallocator/BUILD index cc7cab369b0..483d8041834 100644 --- a/pkg/registry/core/service/portallocator/BUILD +++ b/pkg/registry/core/service/portallocator/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "allocator.go", "operation.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/core/service/allocator:go_default_library", @@ -27,7 +24,6 @@ go_test( name = "go_default_test", srcs = ["allocator_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", diff --git a/pkg/registry/core/service/portallocator/controller/BUILD b/pkg/registry/core/service/portallocator/controller/BUILD index 6f54e2f35c8..a0127bfb73b 100644 --- a/pkg/registry/core/service/portallocator/controller/BUILD +++ b/pkg/registry/core/service/portallocator/controller/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["repair.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/core/internalversion:go_default_library", @@ -31,7 +28,6 @@ go_test( name = "go_default_test", srcs = ["repair_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset/fake:go_default_library", diff --git a/pkg/registry/core/service/proxy.go b/pkg/registry/core/service/proxy.go index 7875e58a69a..4b24847478e 100644 --- a/pkg/registry/core/service/proxy.go +++ b/pkg/registry/core/service/proxy.go @@ -72,7 +72,7 @@ func (r *ProxyREST) Connect(ctx genericapirequest.Context, id string, opts runti } func newThrottledUpgradeAwareProxyHandler(location *url.URL, transport http.RoundTripper, wrapTransport, upgradeRequired bool, responder rest.Responder) *proxy.UpgradeAwareHandler { - handler := proxy.NewUpgradeAwareHandler(location, transport, wrapTransport, upgradeRequired, responder) + handler := proxy.NewUpgradeAwareHandler(location, transport, wrapTransport, upgradeRequired, proxy.NewErrorResponder(responder)) handler.MaxBytesPerSec = capabilities.Get().PerConnectionBandwidthLimitBytesPerSec return handler } diff --git a/pkg/registry/core/service/rest.go b/pkg/registry/core/service/rest.go index e35dea95fea..46ac0100e37 100644 --- a/pkg/registry/core/service/rest.go +++ b/pkg/registry/core/service/rest.go @@ -183,7 +183,7 @@ func (rs *REST) Delete(ctx genericapirequest.Context, id string) (runtime.Object if utilfeature.DefaultFeatureGate.Enabled(features.ExternalTrafficLocalOnly) && apiservice.NeedsHealthCheck(service) { - nodePort := apiservice.GetServiceHealthCheckNodePort(service) + nodePort := service.Spec.HealthCheckNodePort if nodePort > 0 { err := rs.serviceNodePorts.Release(int(nodePort)) if err != nil { @@ -238,7 +238,7 @@ func externalTrafficPolicyUpdate(oldService, service *api.Service) { } if neededExternalTraffic && !needsExternalTraffic { // Clear ExternalTrafficPolicy to prevent confusion from ineffective field. - apiservice.ClearExternalTrafficPolicy(service) + service.Spec.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyType("") } } @@ -246,10 +246,10 @@ func externalTrafficPolicyUpdate(oldService, service *api.Service) { // and adjusts HealthCheckNodePort during service update if needed. func (rs *REST) healthCheckNodePortUpdate(oldService, service *api.Service) (bool, error) { neededHealthCheckNodePort := apiservice.NeedsHealthCheck(oldService) - oldHealthCheckNodePort := apiservice.GetServiceHealthCheckNodePort(oldService) + oldHealthCheckNodePort := oldService.Spec.HealthCheckNodePort needsHealthCheckNodePort := apiservice.NeedsHealthCheck(service) - newHealthCheckNodePort := apiservice.GetServiceHealthCheckNodePort(service) + newHealthCheckNodePort := service.Spec.HealthCheckNodePort switch { // Case 1: Transition from don't need HealthCheckNodePort to needs HealthCheckNodePort. @@ -272,19 +272,14 @@ func (rs *REST) healthCheckNodePortUpdate(oldService, service *api.Service) (boo } glog.Infof("Freed health check nodePort: %d", oldHealthCheckNodePort) // Clear the HealthCheckNodePort field. - apiservice.SetServiceHealthCheckNodePort(service, 0) + service.Spec.HealthCheckNodePort = 0 // Case 3: Remain in needs HealthCheckNodePort. // Reject changing the value of the HealthCheckNodePort field. case neededHealthCheckNodePort && needsHealthCheckNodePort: if oldHealthCheckNodePort != newHealthCheckNodePort { glog.Warningf("Attempt to change value of health check node port DENIED") - var fldPath *field.Path - if _, ok := service.Annotations[api.BetaAnnotationHealthCheckNodePort]; ok { - fldPath = field.NewPath("metadata", "annotations").Key(api.BetaAnnotationHealthCheckNodePort) - } else { - fldPath = field.NewPath("spec", "healthCheckNodePort") - } + fldPath := field.NewPath("spec", "healthCheckNodePort") el := field.ErrorList{field.Invalid(fldPath, newHealthCheckNodePort, "cannot change healthCheckNodePort on loadBalancer service with externalTraffic=Local during update")} return false, errors.NewInvalid(api.Kind("Service"), service.Name, el) @@ -480,7 +475,7 @@ func findRequestedNodePort(port int, servicePorts []api.ServicePort) int { // allocateHealthCheckNodePort allocates health check node port to service. func (rs *REST) allocateHealthCheckNodePort(service *api.Service) error { - healthCheckNodePort := apiservice.GetServiceHealthCheckNodePort(service) + healthCheckNodePort := service.Spec.HealthCheckNodePort if healthCheckNodePort != 0 { // If the request has a health check nodePort in mind, attempt to reserve it. err := rs.serviceNodePorts.Allocate(int(healthCheckNodePort)) @@ -495,7 +490,7 @@ func (rs *REST) allocateHealthCheckNodePort(service *api.Service) error { if err != nil { return fmt.Errorf("failed to allocate a HealthCheck NodePort %v: %v", healthCheckNodePort, err) } - apiservice.SetServiceHealthCheckNodePort(service, int32(healthCheckNodePort)) + service.Spec.HealthCheckNodePort = int32(healthCheckNodePort) glog.Infof("Reserved allocated nodePort: %d", healthCheckNodePort) } return nil diff --git a/pkg/registry/core/service/rest_test.go b/pkg/registry/core/service/rest_test.go index 36cdf1be00f..a3fba863597 100644 --- a/pkg/registry/core/service/rest_test.go +++ b/pkg/registry/core/service/rest_test.go @@ -19,7 +19,6 @@ package service import ( "testing" - "fmt" "net" "reflect" "strings" @@ -994,47 +993,7 @@ func TestServiceRegistryExternalTrafficHealthCheckNodePortAllocation(t *testing. if !service.NeedsHealthCheck(created_service) { t.Errorf("Expecting health check needed, returned health check not needed instead") } - port := service.GetServiceHealthCheckNodePort(created_service) - if port == 0 { - t.Errorf("Failed to allocate health check node port and set the HealthCheckNodePort") - } else { - // Release the node port at the end of the test case. - storage.serviceNodePorts.Release(int(port)) - } -} - -// Validate allocation of a nodePort when ExternalTraffic beta annotation is set to OnlyLocal -// and type is LoadBalancer. -func TestServiceRegistryExternalTrafficHealthCheckNodePortAllocationBeta(t *testing.T) { - ctx := genericapirequest.NewDefaultContext() - storage, _ := NewTestREST(t, nil) - svc := &api.Service{ - ObjectMeta: metav1.ObjectMeta{ - Name: "external-lb-esipp", - Annotations: map[string]string{ - api.BetaAnnotationExternalTraffic: api.AnnotationValueExternalTrafficLocal, - }, - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{"bar": "baz"}, - SessionAffinity: api.ServiceAffinityNone, - Type: api.ServiceTypeLoadBalancer, - Ports: []api.ServicePort{{ - Port: 6502, - Protocol: api.ProtocolTCP, - TargetPort: intstr.FromInt(6502), - }}, - }, - } - created_svc, err := storage.Create(ctx, svc, false) - if created_svc == nil || err != nil { - t.Errorf("Unexpected failure creating service %v", err) - } - created_service := created_svc.(*api.Service) - if !service.NeedsHealthCheck(created_service) { - t.Errorf("Expecting health check needed, returned health check not needed instead") - } - port := service.GetServiceHealthCheckNodePort(created_service) + port := created_service.Spec.HealthCheckNodePort if port == 0 { t.Errorf("Failed to allocate health check node port and set the HealthCheckNodePort") } else { @@ -1072,54 +1031,7 @@ func TestServiceRegistryExternalTrafficHealthCheckNodePortUserAllocation(t *test if !service.NeedsHealthCheck(created_service) { t.Errorf("Expecting health check needed, returned health check not needed instead") } - port := service.GetServiceHealthCheckNodePort(created_service) - if port == 0 { - t.Errorf("Failed to allocate health check node port and set the HealthCheckNodePort") - } - if port != randomNodePort { - t.Errorf("Failed to allocate requested nodePort expected %d, got %d", randomNodePort, port) - } - - if port != 0 { - // Release the node port at the end of the test case. - storage.serviceNodePorts.Release(int(port)) - } -} - -// Validate using the user specified nodePort when ExternalTraffic beta annotation is set to OnlyLocal -// and type is LoadBalancer. -func TestServiceRegistryExternalTrafficHealthCheckNodePortUserAllocationBeta(t *testing.T) { - randomNodePort := generateRandomNodePort() - ctx := genericapirequest.NewDefaultContext() - storage, _ := NewTestREST(t, nil) - svc := &api.Service{ - ObjectMeta: metav1.ObjectMeta{ - Name: "external-lb-esipp", - Annotations: map[string]string{ - api.BetaAnnotationExternalTraffic: api.AnnotationValueExternalTrafficLocal, - api.BetaAnnotationHealthCheckNodePort: fmt.Sprintf("%v", randomNodePort), - }, - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{"bar": "baz"}, - SessionAffinity: api.ServiceAffinityNone, - Type: api.ServiceTypeLoadBalancer, - Ports: []api.ServicePort{{ - Port: 6502, - Protocol: api.ProtocolTCP, - TargetPort: intstr.FromInt(6502), - }}, - }, - } - created_svc, err := storage.Create(ctx, svc, false) - if created_svc == nil || err != nil { - t.Fatalf("Unexpected failure creating service :%v", err) - } - created_service := created_svc.(*api.Service) - if !service.NeedsHealthCheck(created_service) { - t.Errorf("Expecting health check needed, returned health check not needed instead") - } - port := service.GetServiceHealthCheckNodePort(created_service) + port := created_service.Spec.HealthCheckNodePort if port == 0 { t.Errorf("Failed to allocate health check node port and set the HealthCheckNodePort") } @@ -1159,36 +1071,6 @@ func TestServiceRegistryExternalTrafficHealthCheckNodePortNegative(t *testing.T) t.Errorf("Unexpected creation of service with invalid HealthCheckNodePort specified") } -// Validate that the service creation fails when the requested port number in beta annotation is -1. -func TestServiceRegistryExternalTrafficHealthCheckNodePortNegativeBeta(t *testing.T) { - ctx := genericapirequest.NewDefaultContext() - storage, _ := NewTestREST(t, nil) - svc := &api.Service{ - ObjectMeta: metav1.ObjectMeta{ - Name: "external-lb-esipp", - Annotations: map[string]string{ - api.BetaAnnotationExternalTraffic: api.AnnotationValueExternalTrafficLocal, - api.BetaAnnotationHealthCheckNodePort: "-1", - }, - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{"bar": "baz"}, - SessionAffinity: api.ServiceAffinityNone, - Type: api.ServiceTypeLoadBalancer, - Ports: []api.ServicePort{{ - Port: 6502, - Protocol: api.ProtocolTCP, - TargetPort: intstr.FromInt(6502), - }}, - }, - } - created_svc, err := storage.Create(ctx, svc, false) - if created_svc == nil || err != nil { - return - } - t.Errorf("Unexpected creation of service with invalid HealthCheckNodePort specified") -} - // Validate that the health check nodePort is not allocated when ExternalTrafficPolicy is set to Global. func TestServiceRegistryExternalTrafficGlobal(t *testing.T) { ctx := genericapirequest.NewDefaultContext() @@ -1216,7 +1098,7 @@ func TestServiceRegistryExternalTrafficGlobal(t *testing.T) { t.Errorf("Expecting health check not needed, returned health check needed instead") } // Make sure the service does not have the health check node port allocated - port := service.GetServiceHealthCheckNodePort(created_service) + port := created_service.Spec.HealthCheckNodePort if port != 0 { // Release the node port at the end of the test case. storage.serviceNodePorts.Release(int(port)) @@ -1224,80 +1106,6 @@ func TestServiceRegistryExternalTrafficGlobal(t *testing.T) { } } -// Validate that the health check nodePort is not allocated when ExternalTraffic beta annotation is set to Global. -func TestServiceRegistryExternalTrafficGlobalBeta(t *testing.T) { - ctx := genericapirequest.NewDefaultContext() - storage, _ := NewTestREST(t, nil) - svc := &api.Service{ - ObjectMeta: metav1.ObjectMeta{ - Name: "external-lb-esipp", - Annotations: map[string]string{ - api.BetaAnnotationExternalTraffic: api.AnnotationValueExternalTrafficGlobal, - }, - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{"bar": "baz"}, - SessionAffinity: api.ServiceAffinityNone, - Type: api.ServiceTypeLoadBalancer, - Ports: []api.ServicePort{{ - Port: 6502, - Protocol: api.ProtocolTCP, - TargetPort: intstr.FromInt(6502), - }}, - }, - } - created_svc, err := storage.Create(ctx, svc, false) - if created_svc == nil || err != nil { - t.Errorf("Unexpected failure creating service %v", err) - } - created_service := created_svc.(*api.Service) - if service.NeedsHealthCheck(created_service) { - t.Errorf("Expecting health check not needed, returned health check needed instead") - } - // Make sure the service does not have the health check node port allocated - port := service.GetServiceHealthCheckNodePort(created_service) - if port != 0 { - // Release the node port at the end of the test case. - storage.serviceNodePorts.Release(int(port)) - t.Errorf("Unexpected allocation of health check node port: %v", port) - } -} - -// Validate that the health check nodePort is not allocated when service type is ClusterIP -func TestServiceRegistryExternalTrafficAnnotationClusterIP(t *testing.T) { - ctx := genericapirequest.NewDefaultContext() - storage, _ := NewTestREST(t, nil) - svc := &api.Service{ - ObjectMeta: metav1.ObjectMeta{Name: "external-lb-esipp", - Annotations: map[string]string{ - api.BetaAnnotationExternalTraffic: api.AnnotationValueExternalTrafficGlobal, - }, - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{"bar": "baz"}, - SessionAffinity: api.ServiceAffinityNone, - Type: api.ServiceTypeClusterIP, - Ports: []api.ServicePort{{ - Port: 6502, - Protocol: api.ProtocolTCP, - TargetPort: intstr.FromInt(6502), - }}, - }, - } - created_svc, err := storage.Create(ctx, svc, false) - if created_svc == nil || err != nil { - t.Errorf("Unexpected failure creating service %v", err) - } - created_service := created_svc.(*api.Service) - // Make sure that ClusterIP services do not have the health check node port allocated - port := service.GetServiceHealthCheckNodePort(created_service) - if port != 0 { - // Release the node port at the end of the test case. - storage.serviceNodePorts.Release(int(port)) - t.Errorf("Unexpected allocation of health check node port annotation %s", api.BetaAnnotationHealthCheckNodePort) - } -} - func TestInitClusterIP(t *testing.T) { storage, _ := NewTestREST(t, nil) diff --git a/pkg/registry/core/service/storage/BUILD b/pkg/registry/core/service/storage/BUILD index 6a653a7706c..faece9dd9ed 100644 --- a/pkg/registry/core/service/storage/BUILD +++ b/pkg/registry/core/service/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/registrytest:go_default_library", @@ -29,7 +26,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/cachesize:go_default_library", diff --git a/pkg/registry/core/service/storage/storage.go b/pkg/registry/core/service/storage/storage.go index 4551ba39715..886f227592e 100644 --- a/pkg/registry/core/service/storage/storage.go +++ b/pkg/registry/core/service/storage/storage.go @@ -35,19 +35,18 @@ type REST struct { // NewREST returns a RESTStorage object that will work against services. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &api.Service{} }, - NewListFunc: func() runtime.Object { return &api.ServiceList{} }, - PredicateFunc: service.MatchServices, - QualifiedResource: api.Resource("services"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("services"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &api.Service{} }, + NewListFunc: func() runtime.Object { return &api.ServiceList{} }, + DefaultQualifiedResource: api.Resource("services"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("services"), CreateStrategy: service.Strategy, UpdateStrategy: service.Strategy, DeleteStrategy: service.Strategy, ExportStrategy: service.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: service.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/core/service/strategy.go b/pkg/registry/core/service/strategy.go index 7736f6c2cce..1d3da254978 100644 --- a/pkg/registry/core/service/strategy.go +++ b/pkg/registry/core/service/strategy.go @@ -19,13 +19,9 @@ package service import ( "fmt" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" - apistorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/validation" @@ -103,27 +99,6 @@ func (svcStrategy) Export(ctx genericapirequest.Context, obj runtime.Object, exa return nil } -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - service, ok := obj.(*api.Service) - if !ok { - return nil, nil, false, fmt.Errorf("given object is not a service") - } - return labels.Set(service.ObjectMeta.Labels), ServiceToSelectableFields(service), service.Initializers != nil, nil -} - -func MatchServices(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { - return apistorage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - -func ServiceToSelectableFields(service *api.Service) fields.Set { - return generic.ObjectMetaFieldsSet(&service.ObjectMeta, true) -} - type serviceStatusStrategy struct { svcStrategy } diff --git a/pkg/registry/core/service/strategy_test.go b/pkg/registry/core/service/strategy_test.go index 7f01450bfda..46e3c65546e 100644 --- a/pkg/registry/core/service/strategy_test.go +++ b/pkg/registry/core/service/strategy_test.go @@ -27,7 +27,6 @@ import ( genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/rest" "k8s.io/kubernetes/pkg/api" - apitesting "k8s.io/kubernetes/pkg/api/testing" ) func TestExportService(t *testing.T) { @@ -212,15 +211,6 @@ func TestBeforeUpdate(t *testing.T) { } } -func TestSelectableFieldLabelConversions(t *testing.T) { - apitesting.TestSelectableFieldLabelConversionsOfKind(t, - api.Registry.GroupOrDie(api.GroupName).GroupVersion.String(), - "Service", - ServiceToSelectableFields(&api.Service{}), - nil, - ) -} - func TestServiceStatusStrategy(t *testing.T) { ctx := genericapirequest.NewDefaultContext() if !StatusStrategy.NamespaceScoped() { diff --git a/pkg/registry/core/serviceaccount/BUILD b/pkg/registry/core/serviceaccount/BUILD index d3e815ffc36..152f2c6a452 100644 --- a/pkg/registry/core/serviceaccount/BUILD +++ b/pkg/registry/core/serviceaccount/BUILD @@ -1,11 +1,8 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", - "go_test", ) go_library( @@ -15,36 +12,20 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - library = ":go_default_library", - tags = ["automanaged"], - deps = [ - "//pkg/api:go_default_library", - "//pkg/api/testing:go_default_library", - ], -) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/pkg/registry/core/serviceaccount/storage/BUILD b/pkg/registry/core/serviceaccount/storage/BUILD index bf2d7f084af..d66058c932e 100644 --- a/pkg/registry/core/serviceaccount/storage/BUILD +++ b/pkg/registry/core/serviceaccount/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/registrytest:go_default_library", @@ -28,7 +25,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/registry/cachesize:go_default_library", diff --git a/pkg/registry/core/serviceaccount/storage/storage.go b/pkg/registry/core/serviceaccount/storage/storage.go index 7fb488aea79..9d6b8c1ffbb 100644 --- a/pkg/registry/core/serviceaccount/storage/storage.go +++ b/pkg/registry/core/serviceaccount/storage/storage.go @@ -33,19 +33,18 @@ type REST struct { // NewREST returns a RESTStorage object that will work against service accounts. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &api.ServiceAccount{} }, - NewListFunc: func() runtime.Object { return &api.ServiceAccountList{} }, - PredicateFunc: serviceaccount.Matcher, - QualifiedResource: api.Resource("serviceaccounts"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("serviceaccounts"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &api.ServiceAccount{} }, + NewListFunc: func() runtime.Object { return &api.ServiceAccountList{} }, + DefaultQualifiedResource: api.Resource("serviceaccounts"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("serviceaccounts"), CreateStrategy: serviceaccount.Strategy, UpdateStrategy: serviceaccount.Strategy, DeleteStrategy: serviceaccount.Strategy, ReturnDeletedObject: true, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: serviceaccount.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/core/serviceaccount/strategy.go b/pkg/registry/core/serviceaccount/strategy.go index 2ff37ecd94a..501e0436189 100644 --- a/pkg/registry/core/serviceaccount/strategy.go +++ b/pkg/registry/core/serviceaccount/strategy.go @@ -17,15 +17,9 @@ limitations under the License. package serviceaccount import ( - "fmt" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" - apistorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/validation" @@ -78,26 +72,3 @@ func (strategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.O func (strategy) AllowUnconditionalUpdate() bool { return true } - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - sa, ok := obj.(*api.ServiceAccount) - if !ok { - return nil, nil, false, fmt.Errorf("not a serviceaccount") - } - return labels.Set(sa.Labels), SelectableFields(sa), sa.Initializers != nil, nil -} - -// Matcher returns a generic matcher for a given label and field selector. -func Matcher(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { - return apistorage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - -// SelectableFields returns a field set that represents the object -func SelectableFields(obj *api.ServiceAccount) fields.Set { - return generic.ObjectMetaFieldsSet(&obj.ObjectMeta, true) -} diff --git a/pkg/registry/extensions/controller/storage/BUILD b/pkg/registry/extensions/controller/storage/BUILD index 13bd87d5db0..7884e65a740 100644 --- a/pkg/registry/extensions/controller/storage/BUILD +++ b/pkg/registry/extensions/controller/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", @@ -30,7 +27,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/registry/extensions/daemonset/BUILD b/pkg/registry/extensions/daemonset/BUILD index 294aaec3378..1f1dd0be240 100644 --- a/pkg/registry/extensions/daemonset/BUILD +++ b/pkg/registry/extensions/daemonset/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,20 +12,15 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", "//pkg/apis/extensions/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) @@ -36,12 +29,8 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", - "//pkg/api/testapi:go_default_library", - "//pkg/api/testing:go_default_library", - "//pkg/apis/extensions:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", ], ) diff --git a/pkg/registry/extensions/daemonset/storage/BUILD b/pkg/registry/extensions/daemonset/storage/BUILD index 7a91565cb3a..176dae98bc9 100644 --- a/pkg/registry/extensions/daemonset/storage/BUILD +++ b/pkg/registry/extensions/daemonset/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", @@ -29,7 +26,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/registry/extensions/daemonset/storage/storage.go b/pkg/registry/extensions/daemonset/storage/storage.go index 233b4d61e12..0ba0dc9b3cd 100644 --- a/pkg/registry/extensions/daemonset/storage/storage.go +++ b/pkg/registry/extensions/daemonset/storage/storage.go @@ -37,18 +37,17 @@ type REST struct { // NewREST returns a RESTStorage object that will work against DaemonSets. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &extensions.DaemonSet{} }, - NewListFunc: func() runtime.Object { return &extensions.DaemonSetList{} }, - PredicateFunc: daemonset.MatchDaemonSet, - QualifiedResource: extensions.Resource("daemonsets"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("daemonsets"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &extensions.DaemonSet{} }, + NewListFunc: func() runtime.Object { return &extensions.DaemonSetList{} }, + DefaultQualifiedResource: extensions.Resource("daemonsets"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("daemonsets"), CreateStrategy: daemonset.Strategy, UpdateStrategy: daemonset.Strategy, DeleteStrategy: daemonset.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: daemonset.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } @@ -67,6 +66,13 @@ func (r *REST) ShortNames() []string { return []string{"ds"} } +var _ rest.CategoriesProvider = &REST{} + +// Categories implements the CategoriesProvider interface. Returns a list of categories a resource is part of. +func (r *REST) Categories() []string { + return []string{"all"} +} + // StatusREST implements the REST endpoint for changing the status of a daemonset type StatusREST struct { store *genericregistry.Store diff --git a/pkg/registry/extensions/daemonset/strategy.go b/pkg/registry/extensions/daemonset/strategy.go index 80e03dc1665..c75fa365237 100644 --- a/pkg/registry/extensions/daemonset/strategy.go +++ b/pkg/registry/extensions/daemonset/strategy.go @@ -17,17 +17,11 @@ limitations under the License. package daemonset import ( - "fmt" - apiequality "k8s.io/apimachinery/pkg/api/equality" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" - "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" @@ -125,31 +119,6 @@ func (daemonSetStrategy) AllowUnconditionalUpdate() bool { return true } -// DaemonSetToSelectableFields returns a field set that represents the object. -func DaemonSetToSelectableFields(daemon *extensions.DaemonSet) fields.Set { - return generic.ObjectMetaFieldsSet(&daemon.ObjectMeta, true) -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - ds, ok := obj.(*extensions.DaemonSet) - if !ok { - return nil, nil, false, fmt.Errorf("given object is not a ds.") - } - return labels.Set(ds.ObjectMeta.Labels), DaemonSetToSelectableFields(ds), ds.Initializers != nil, nil -} - -// MatchSetDaemon is the filter used by the generic etcd backend to route -// watch events from etcd to clients of the apiserver only interested in specific -// labels/fields. -func MatchDaemonSet(label labels.Selector, field fields.Selector) storage.SelectionPredicate { - return storage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - type daemonSetStatusStrategy struct { daemonSetStrategy } diff --git a/pkg/registry/extensions/daemonset/strategy_test.go b/pkg/registry/extensions/daemonset/strategy_test.go index 0590c76473a..0f16ce4d96d 100644 --- a/pkg/registry/extensions/daemonset/strategy_test.go +++ b/pkg/registry/extensions/daemonset/strategy_test.go @@ -21,20 +21,8 @@ import ( "k8s.io/apiserver/pkg/registry/rest" _ "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" - "k8s.io/kubernetes/pkg/apis/extensions" ) -func TestSelectableFieldLabelConversions(t *testing.T) { - apitesting.TestSelectableFieldLabelConversionsOfKind(t, - testapi.Extensions.GroupVersion().String(), - "DaemonSet", - DaemonSetToSelectableFields(&extensions.DaemonSet{}), - nil, - ) -} - func TestDefaultGarbageCollectionPolicy(t *testing.T) { // Make sure we correctly implement the interface. // Otherwise a typo could silently change the default. diff --git a/pkg/registry/extensions/deployment/BUILD b/pkg/registry/extensions/deployment/BUILD index c4280eaaed3..fcc9466f1ce 100644 --- a/pkg/registry/extensions/deployment/BUILD +++ b/pkg/registry/extensions/deployment/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", @@ -23,14 +20,10 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) @@ -39,11 +32,8 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", - "//pkg/api/testapi:go_default_library", - "//pkg/api/testing:go_default_library", "//pkg/apis/extensions:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/pkg/registry/extensions/deployment/storage/BUILD b/pkg/registry/extensions/deployment/storage/BUILD index 47f6fbbc0a2..49b8a085384 100644 --- a/pkg/registry/extensions/deployment/storage/BUILD +++ b/pkg/registry/extensions/deployment/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", @@ -36,7 +33,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/registry/extensions/deployment/storage/storage.go b/pkg/registry/extensions/deployment/storage/storage.go index 55fa90b6cbc..1e6fcbe83d5 100644 --- a/pkg/registry/extensions/deployment/storage/storage.go +++ b/pkg/registry/extensions/deployment/storage/storage.go @@ -63,18 +63,17 @@ type REST struct { // NewREST returns a RESTStorage object that will work against deployments. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *RollbackREST) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &extensions.Deployment{} }, - NewListFunc: func() runtime.Object { return &extensions.DeploymentList{} }, - PredicateFunc: deployment.MatchDeployment, - QualifiedResource: extensions.Resource("deployments"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("deployments"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &extensions.Deployment{} }, + NewListFunc: func() runtime.Object { return &extensions.DeploymentList{} }, + DefaultQualifiedResource: extensions.Resource("deployments"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("deployments"), CreateStrategy: deployment.Strategy, UpdateStrategy: deployment.Strategy, DeleteStrategy: deployment.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: deployment.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/extensions/deployment/strategy.go b/pkg/registry/extensions/deployment/strategy.go index 819ca5e965f..a90aeb89bae 100644 --- a/pkg/registry/extensions/deployment/strategy.go +++ b/pkg/registry/extensions/deployment/strategy.go @@ -17,17 +17,11 @@ limitations under the License. package deployment import ( - "fmt" - apiequality "k8s.io/apimachinery/pkg/api/equality" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" - apistorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" @@ -119,28 +113,3 @@ func (deploymentStatusStrategy) PrepareForUpdate(ctx genericapirequest.Context, func (deploymentStatusStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList { return validation.ValidateDeploymentStatusUpdate(obj.(*extensions.Deployment), old.(*extensions.Deployment)) } - -// DeploymentToSelectableFields returns a field set that represents the object. -func DeploymentToSelectableFields(deployment *extensions.Deployment) fields.Set { - return generic.ObjectMetaFieldsSet(&deployment.ObjectMeta, true) -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - deployment, ok := obj.(*extensions.Deployment) - if !ok { - return nil, nil, false, fmt.Errorf("given object is not a deployment.") - } - return labels.Set(deployment.ObjectMeta.Labels), DeploymentToSelectableFields(deployment), deployment.Initializers != nil, nil -} - -// MatchDeployment is the filter used by the generic etcd backend to route -// watch events from etcd to clients of the apiserver only interested in specific -// labels/fields. -func MatchDeployment(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { - return apistorage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} diff --git a/pkg/registry/extensions/deployment/strategy_test.go b/pkg/registry/extensions/deployment/strategy_test.go index c166457f121..74668493540 100644 --- a/pkg/registry/extensions/deployment/strategy_test.go +++ b/pkg/registry/extensions/deployment/strategy_test.go @@ -24,20 +24,9 @@ import ( "k8s.io/apimachinery/pkg/runtime" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" "k8s.io/kubernetes/pkg/apis/extensions" ) -func TestSelectableFieldLabelConversions(t *testing.T) { - apitesting.TestSelectableFieldLabelConversionsOfKind(t, - testapi.Extensions.GroupVersion().String(), - "Deployment", - DeploymentToSelectableFields(&extensions.Deployment{}), - nil, - ) -} - func TestStatusUpdates(t *testing.T) { tests := []struct { old runtime.Object diff --git a/pkg/registry/extensions/ingress/BUILD b/pkg/registry/extensions/ingress/BUILD index d849d82d872..838e8927171 100644 --- a/pkg/registry/extensions/ingress/BUILD +++ b/pkg/registry/extensions/ingress/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,19 +12,14 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", "//pkg/apis/extensions/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) @@ -35,11 +28,8 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", - "//pkg/api/testapi:go_default_library", - "//pkg/api/testing:go_default_library", "//pkg/apis/extensions:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", diff --git a/pkg/registry/extensions/ingress/storage/BUILD b/pkg/registry/extensions/ingress/storage/BUILD index 5cc7ac193b0..0b538d6b2cf 100644 --- a/pkg/registry/extensions/ingress/storage/BUILD +++ b/pkg/registry/extensions/ingress/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", @@ -30,7 +27,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/registry/extensions/ingress/storage/storage.go b/pkg/registry/extensions/ingress/storage/storage.go index e4e8601ef3b..f6c7d6a915c 100644 --- a/pkg/registry/extensions/ingress/storage/storage.go +++ b/pkg/registry/extensions/ingress/storage/storage.go @@ -37,18 +37,17 @@ type REST struct { // NewREST returns a RESTStorage object that will work against replication controllers. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &extensions.Ingress{} }, - NewListFunc: func() runtime.Object { return &extensions.IngressList{} }, - PredicateFunc: ingress.MatchIngress, - QualifiedResource: extensions.Resource("ingresses"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("ingresses"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &extensions.Ingress{} }, + NewListFunc: func() runtime.Object { return &extensions.IngressList{} }, + DefaultQualifiedResource: extensions.Resource("ingresses"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("ingresses"), CreateStrategy: ingress.Strategy, UpdateStrategy: ingress.Strategy, DeleteStrategy: ingress.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: ingress.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/extensions/ingress/strategy.go b/pkg/registry/extensions/ingress/strategy.go index add1e0a3276..41edf5bc7f4 100644 --- a/pkg/registry/extensions/ingress/strategy.go +++ b/pkg/registry/extensions/ingress/strategy.go @@ -17,16 +17,10 @@ limitations under the License. package ingress import ( - "fmt" - apiequality "k8s.io/apimachinery/pkg/api/equality" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" - "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" @@ -100,31 +94,6 @@ func (ingressStrategy) AllowUnconditionalUpdate() bool { return true } -// IngressToSelectableFields returns a field set that represents the object. -func IngressToSelectableFields(ingress *extensions.Ingress) fields.Set { - return generic.ObjectMetaFieldsSet(&ingress.ObjectMeta, true) -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - ingress, ok := obj.(*extensions.Ingress) - if !ok { - return nil, nil, false, fmt.Errorf("given object is not an Ingress.") - } - return labels.Set(ingress.ObjectMeta.Labels), IngressToSelectableFields(ingress), ingress.Initializers != nil, nil -} - -// MatchIngress is the filter used by the generic etcd backend to ingress -// watch events from etcd to clients of the apiserver only interested in specific -// labels/fields. -func MatchIngress(label labels.Selector, field fields.Selector) storage.SelectionPredicate { - return storage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - type ingressStatusStrategy struct { ingressStrategy } diff --git a/pkg/registry/extensions/ingress/strategy_test.go b/pkg/registry/extensions/ingress/strategy_test.go index 3e381eca41b..15db6711ff5 100644 --- a/pkg/registry/extensions/ingress/strategy_test.go +++ b/pkg/registry/extensions/ingress/strategy_test.go @@ -23,8 +23,6 @@ import ( "k8s.io/apimachinery/pkg/util/intstr" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" "k8s.io/kubernetes/pkg/apis/extensions" ) @@ -132,12 +130,3 @@ func TestIngressStatusStrategy(t *testing.T) { t.Errorf("Unexpected error %v", errs) } } - -func TestSelectableFieldLabelConversions(t *testing.T) { - apitesting.TestSelectableFieldLabelConversionsOfKind(t, - testapi.Extensions.GroupVersion().String(), - "Ingress", - IngressToSelectableFields(&extensions.Ingress{}), - nil, - ) -} diff --git a/pkg/registry/extensions/networkpolicy/BUILD b/pkg/registry/extensions/networkpolicy/BUILD index 782847dde18..b4938c02746 100644 --- a/pkg/registry/extensions/networkpolicy/BUILD +++ b/pkg/registry/extensions/networkpolicy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,19 +12,14 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", "//pkg/apis/extensions/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) @@ -35,7 +28,6 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/extensions:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/registry/extensions/networkpolicy/storage/BUILD b/pkg/registry/extensions/networkpolicy/storage/BUILD index 53d378aa7e6..17f20ad9480 100644 --- a/pkg/registry/extensions/networkpolicy/storage/BUILD +++ b/pkg/registry/extensions/networkpolicy/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/extensions:go_default_library", "//pkg/registry/registrytest:go_default_library", @@ -30,7 +27,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/registry/extensions/networkpolicy/storage/storage.go b/pkg/registry/extensions/networkpolicy/storage/storage.go index 5f4ebaa31b2..cb69d55ee47 100644 --- a/pkg/registry/extensions/networkpolicy/storage/storage.go +++ b/pkg/registry/extensions/networkpolicy/storage/storage.go @@ -34,18 +34,17 @@ type REST struct { // NewREST returns a RESTStorage object that will work against network policies. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &extensionsapi.NetworkPolicy{} }, - NewListFunc: func() runtime.Object { return &extensionsapi.NetworkPolicyList{} }, - PredicateFunc: networkpolicy.MatchNetworkPolicy, - QualifiedResource: extensionsapi.Resource("networkpolicies"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("networkpolicies"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &extensionsapi.NetworkPolicy{} }, + NewListFunc: func() runtime.Object { return &extensionsapi.NetworkPolicyList{} }, + DefaultQualifiedResource: extensionsapi.Resource("networkpolicies"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("networkpolicies"), CreateStrategy: networkpolicy.Strategy, UpdateStrategy: networkpolicy.Strategy, DeleteStrategy: networkpolicy.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: networkpolicy.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/extensions/networkpolicy/strategy.go b/pkg/registry/extensions/networkpolicy/strategy.go index 63eb28b719f..1c1ea71377d 100644 --- a/pkg/registry/extensions/networkpolicy/strategy.go +++ b/pkg/registry/extensions/networkpolicy/strategy.go @@ -17,16 +17,10 @@ limitations under the License. package networkpolicy import ( - "fmt" - apiequality "k8s.io/apimachinery/pkg/api/equality" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" - "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" @@ -92,27 +86,3 @@ func (networkPolicyStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, func (networkPolicyStrategy) AllowUnconditionalUpdate() bool { return true } - -// NetworkPolicyToSelectableFields returns a field set that represents the object. -func NetworkPolicyToSelectableFields(networkPolicy *extensions.NetworkPolicy) fields.Set { - return generic.ObjectMetaFieldsSet(&networkPolicy.ObjectMeta, true) -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - networkPolicy, ok := obj.(*extensions.NetworkPolicy) - if !ok { - return nil, nil, false, fmt.Errorf("given object is not a NetworkPolicy.") - } - return labels.Set(networkPolicy.ObjectMeta.Labels), NetworkPolicyToSelectableFields(networkPolicy), networkPolicy.Initializers != nil, nil -} - -// MatchNetworkPolicy is the filter used by the generic etcd backend to watch events -// from etcd to clients of the apiserver only interested in specific labels/fields. -func MatchNetworkPolicy(label labels.Selector, field fields.Selector) storage.SelectionPredicate { - return storage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} diff --git a/pkg/registry/extensions/podsecuritypolicy/BUILD b/pkg/registry/extensions/podsecuritypolicy/BUILD index 658ab4cdc29..c0956317452 100644 --- a/pkg/registry/extensions/podsecuritypolicy/BUILD +++ b/pkg/registry/extensions/podsecuritypolicy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,19 +11,14 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", "//pkg/apis/extensions/validation: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) diff --git a/pkg/registry/extensions/podsecuritypolicy/storage/BUILD b/pkg/registry/extensions/podsecuritypolicy/storage/BUILD index 4bde3924750..38ff3892446 100644 --- a/pkg/registry/extensions/podsecuritypolicy/storage/BUILD +++ b/pkg/registry/extensions/podsecuritypolicy/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/extensions:go_default_library", "//pkg/registry/registrytest:go_default_library", @@ -29,7 +26,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/registry/extensions/podsecuritypolicy/storage/storage.go b/pkg/registry/extensions/podsecuritypolicy/storage/storage.go index 7ba363699f7..7f4eed37aa5 100644 --- a/pkg/registry/extensions/podsecuritypolicy/storage/storage.go +++ b/pkg/registry/extensions/podsecuritypolicy/storage/storage.go @@ -34,19 +34,18 @@ type REST struct { // NewREST returns a RESTStorage object that will work against PodSecurityPolicy objects. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &extensions.PodSecurityPolicy{} }, - NewListFunc: func() runtime.Object { return &extensions.PodSecurityPolicyList{} }, - PredicateFunc: podsecuritypolicy.MatchPodSecurityPolicy, - QualifiedResource: extensions.Resource("podsecuritypolicies"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("podsecuritypolicies"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &extensions.PodSecurityPolicy{} }, + NewListFunc: func() runtime.Object { return &extensions.PodSecurityPolicyList{} }, + DefaultQualifiedResource: extensions.Resource("podsecuritypolicies"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("podsecuritypolicies"), CreateStrategy: podsecuritypolicy.Strategy, UpdateStrategy: podsecuritypolicy.Strategy, DeleteStrategy: podsecuritypolicy.Strategy, ReturnDeletedObject: true, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: podsecuritypolicy.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/extensions/podsecuritypolicy/strategy.go b/pkg/registry/extensions/podsecuritypolicy/strategy.go index d9213619da3..130b90d338b 100644 --- a/pkg/registry/extensions/podsecuritypolicy/strategy.go +++ b/pkg/registry/extensions/podsecuritypolicy/strategy.go @@ -17,16 +17,10 @@ limitations under the License. package podsecuritypolicy import ( - "fmt" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" - "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" @@ -75,26 +69,3 @@ func (strategy) Validate(ctx genericapirequest.Context, obj runtime.Object) fiel func (strategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList { return validation.ValidatePodSecurityPolicyUpdate(old.(*extensions.PodSecurityPolicy), obj.(*extensions.PodSecurityPolicy)) } - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - psp, ok := obj.(*extensions.PodSecurityPolicy) - if !ok { - return nil, nil, false, fmt.Errorf("given object is not a pod security policy.") - } - return labels.Set(psp.ObjectMeta.Labels), PodSecurityPolicyToSelectableFields(psp), psp.Initializers != nil, nil -} - -// Matcher returns a generic matcher for a given label and field selector. -func MatchPodSecurityPolicy(label labels.Selector, field fields.Selector) storage.SelectionPredicate { - return storage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - -// PodSecurityPolicyToSelectableFields returns a label set that represents the object -func PodSecurityPolicyToSelectableFields(obj *extensions.PodSecurityPolicy) fields.Set { - return generic.ObjectMetaFieldsSet(&obj.ObjectMeta, false) -} diff --git a/pkg/registry/extensions/replicaset/BUILD b/pkg/registry/extensions/replicaset/BUILD index e798f6e15a9..7d0fe9e135a 100644 --- a/pkg/registry/extensions/replicaset/BUILD +++ b/pkg/registry/extensions/replicaset/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", @@ -40,7 +37,6 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/registry/extensions/replicaset/storage/BUILD b/pkg/registry/extensions/replicaset/storage/BUILD index f0b04812469..7ccbe4d101b 100644 --- a/pkg/registry/extensions/replicaset/storage/BUILD +++ b/pkg/registry/extensions/replicaset/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", @@ -34,7 +31,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/registry/extensions/replicaset/storage/storage.go b/pkg/registry/extensions/replicaset/storage/storage.go index 78e0ecc6567..b10c455ae91 100644 --- a/pkg/registry/extensions/replicaset/storage/storage.go +++ b/pkg/registry/extensions/replicaset/storage/storage.go @@ -60,12 +60,12 @@ type REST struct { // NewREST returns a RESTStorage object that will work against ReplicaSet. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &extensions.ReplicaSet{} }, - NewListFunc: func() runtime.Object { return &extensions.ReplicaSetList{} }, - PredicateFunc: replicaset.MatchReplicaSet, - QualifiedResource: extensions.Resource("replicasets"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("replicasets"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &extensions.ReplicaSet{} }, + NewListFunc: func() runtime.Object { return &extensions.ReplicaSetList{} }, + PredicateFunc: replicaset.MatchReplicaSet, + DefaultQualifiedResource: extensions.Resource("replicasets"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("replicasets"), CreateStrategy: replicaset.Strategy, UpdateStrategy: replicaset.Strategy, diff --git a/pkg/registry/extensions/rest/BUILD b/pkg/registry/extensions/rest/BUILD index c88831d6bb5..1b4193ccb56 100644 --- a/pkg/registry/extensions/rest/BUILD +++ b/pkg/registry/extensions/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage_extensions.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/registry/networking/networkpolicy/BUILD b/pkg/registry/networking/networkpolicy/BUILD index 6a09bac280d..8479ea5f251 100644 --- a/pkg/registry/networking/networkpolicy/BUILD +++ b/pkg/registry/networking/networkpolicy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,22 +12,17 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/networking:go_default_library", "//pkg/apis/networking/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) diff --git a/pkg/registry/networking/networkpolicy/storage/BUILD b/pkg/registry/networking/networkpolicy/storage/BUILD index 616452a56cb..0ac35764831 100644 --- a/pkg/registry/networking/networkpolicy/storage/BUILD +++ b/pkg/registry/networking/networkpolicy/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/networking:go_default_library", diff --git a/pkg/registry/networking/networkpolicy/storage/storage.go b/pkg/registry/networking/networkpolicy/storage/storage.go index 4779813a4f9..0ee45bde784 100644 --- a/pkg/registry/networking/networkpolicy/storage/storage.go +++ b/pkg/registry/networking/networkpolicy/storage/storage.go @@ -35,18 +35,17 @@ type REST struct { // NewREST returns a RESTStorage object that will work against NetworkPolicies func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &networkingapi.NetworkPolicy{} }, - NewListFunc: func() runtime.Object { return &networkingapi.NetworkPolicyList{} }, - PredicateFunc: networkpolicy.Matcher, - QualifiedResource: networkingapi.Resource("networkpolicies"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("networkpolicies"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &networkingapi.NetworkPolicy{} }, + NewListFunc: func() runtime.Object { return &networkingapi.NetworkPolicyList{} }, + DefaultQualifiedResource: networkingapi.Resource("networkpolicies"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("networkpolicies"), CreateStrategy: networkpolicy.Strategy, UpdateStrategy: networkpolicy.Strategy, DeleteStrategy: networkpolicy.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: networkpolicy.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/networking/networkpolicy/strategy.go b/pkg/registry/networking/networkpolicy/strategy.go index 2b58c6c1288..fe66f6f62e2 100644 --- a/pkg/registry/networking/networkpolicy/strategy.go +++ b/pkg/registry/networking/networkpolicy/strategy.go @@ -17,16 +17,11 @@ limitations under the License. package networkpolicy import ( - "fmt" "reflect" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" - apistorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/networking" @@ -91,27 +86,3 @@ func (networkPolicyStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, func (networkPolicyStrategy) AllowUnconditionalUpdate() bool { return true } - -// SelectableFields returns a field set that represents the object. -func SelectableFields(networkPolicy *networking.NetworkPolicy) fields.Set { - return generic.ObjectMetaFieldsSet(&networkPolicy.ObjectMeta, true) -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - networkPolicy, ok := obj.(*networking.NetworkPolicy) - if !ok { - return nil, nil, false, fmt.Errorf("given object is not a NetworkPolicy.") - } - return labels.Set(networkPolicy.ObjectMeta.Labels), SelectableFields(networkPolicy), networkPolicy.Initializers != nil, nil -} - -// Matcher is the filter used by the generic etcd backend to watch events -// from etcd to clients of the apiserver only interested in specific labels/fields. -func Matcher(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { - return apistorage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} diff --git a/pkg/registry/networking/rest/BUILD b/pkg/registry/networking/rest/BUILD index a075de515c7..34b6c7889f4 100644 --- a/pkg/registry/networking/rest/BUILD +++ b/pkg/registry/networking/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage_settings.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/networking:go_default_library", diff --git a/pkg/registry/policy/poddisruptionbudget/BUILD b/pkg/registry/policy/poddisruptionbudget/BUILD index b492e7221ed..f1ad0fb6033 100644 --- a/pkg/registry/policy/poddisruptionbudget/BUILD +++ b/pkg/registry/policy/poddisruptionbudget/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,19 +12,14 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/policy:go_default_library", "//pkg/apis/policy/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) @@ -35,7 +28,6 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/policy:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/registry/policy/poddisruptionbudget/storage/BUILD b/pkg/registry/policy/poddisruptionbudget/storage/BUILD index 5a1790e64bb..5c0c85eca3f 100644 --- a/pkg/registry/policy/poddisruptionbudget/storage/BUILD +++ b/pkg/registry/policy/poddisruptionbudget/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/policy:go_default_library", @@ -31,7 +28,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/policy:go_default_library", diff --git a/pkg/registry/policy/poddisruptionbudget/storage/storage.go b/pkg/registry/policy/poddisruptionbudget/storage/storage.go index 99777872c15..e97136c2958 100644 --- a/pkg/registry/policy/poddisruptionbudget/storage/storage.go +++ b/pkg/registry/policy/poddisruptionbudget/storage/storage.go @@ -37,18 +37,17 @@ type REST struct { // NewREST returns a RESTStorage object that will work against pod disruption budgets. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &policyapi.PodDisruptionBudget{} }, - NewListFunc: func() runtime.Object { return &policyapi.PodDisruptionBudgetList{} }, - PredicateFunc: poddisruptionbudget.MatchPodDisruptionBudget, - QualifiedResource: policyapi.Resource("poddisruptionbudgets"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("poddisruptionbudgets"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &policyapi.PodDisruptionBudget{} }, + NewListFunc: func() runtime.Object { return &policyapi.PodDisruptionBudgetList{} }, + DefaultQualifiedResource: policyapi.Resource("poddisruptionbudgets"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("poddisruptionbudgets"), CreateStrategy: poddisruptionbudget.Strategy, UpdateStrategy: poddisruptionbudget.Strategy, DeleteStrategy: poddisruptionbudget.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: poddisruptionbudget.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/policy/poddisruptionbudget/strategy.go b/pkg/registry/policy/poddisruptionbudget/strategy.go index a0f6a71d22a..43ef18c0a7a 100644 --- a/pkg/registry/policy/poddisruptionbudget/strategy.go +++ b/pkg/registry/policy/poddisruptionbudget/strategy.go @@ -17,16 +17,10 @@ limitations under the License. package poddisruptionbudget import ( - "fmt" - apiequality "k8s.io/apimachinery/pkg/api/equality" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" - "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/policy" @@ -99,30 +93,6 @@ func (podDisruptionBudgetStrategy) AllowUnconditionalUpdate() bool { return false } -// PodDisruptionBudgetToSelectableFields returns a field set that represents the object. -func PodDisruptionBudgetToSelectableFields(podDisruptionBudget *policy.PodDisruptionBudget) fields.Set { - return generic.ObjectMetaFieldsSet(&podDisruptionBudget.ObjectMeta, true) -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - podDisruptionBudget, ok := obj.(*policy.PodDisruptionBudget) - if !ok { - return nil, nil, false, fmt.Errorf("given object is not a PodDisruptionBudget.") - } - return labels.Set(podDisruptionBudget.ObjectMeta.Labels), PodDisruptionBudgetToSelectableFields(podDisruptionBudget), podDisruptionBudget.Initializers != nil, nil -} - -// MatchPodDisruptionBudget is the filter used by the generic etcd backend to watch events -// from etcd to clients of the apiserver only interested in specific labels/fields. -func MatchPodDisruptionBudget(label labels.Selector, field fields.Selector) storage.SelectionPredicate { - return storage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - type podDisruptionBudgetStatusStrategy struct { podDisruptionBudgetStrategy } diff --git a/pkg/registry/policy/rest/BUILD b/pkg/registry/policy/rest/BUILD index e663dd5390b..8d0ca5bb348 100644 --- a/pkg/registry/policy/rest/BUILD +++ b/pkg/registry/policy/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage_policy.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/policy:go_default_library", diff --git a/pkg/registry/rbac/BUILD b/pkg/registry/rbac/BUILD index 48ae4f78f87..fa207aa7cbb 100644 --- a/pkg/registry/rbac/BUILD +++ b/pkg/registry/rbac/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "escalation_check.go", "helpers.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", @@ -54,7 +51,6 @@ go_test( name = "go_default_test", srcs = ["helpers_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", diff --git a/pkg/registry/rbac/clusterrole/BUILD b/pkg/registry/rbac/clusterrole/BUILD index caa3362b1aa..4bcf7f99248 100644 --- a/pkg/registry/rbac/clusterrole/BUILD +++ b/pkg/registry/rbac/clusterrole/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,21 +12,17 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", "//pkg/apis/rbac/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) diff --git a/pkg/registry/rbac/clusterrole/policybased/BUILD b/pkg/registry/rbac/clusterrole/policybased/BUILD index be6e7944441..a00c40e80a7 100644 --- a/pkg/registry/rbac/clusterrole/policybased/BUILD +++ b/pkg/registry/rbac/clusterrole/policybased/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api/helper:go_default_library", "//pkg/apis/rbac:go_default_library", diff --git a/pkg/registry/rbac/clusterrole/storage/BUILD b/pkg/registry/rbac/clusterrole/storage/BUILD index a703513d66d..e37949c0a94 100644 --- a/pkg/registry/rbac/clusterrole/storage/BUILD +++ b/pkg/registry/rbac/clusterrole/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", diff --git a/pkg/registry/rbac/clusterrole/storage/storage.go b/pkg/registry/rbac/clusterrole/storage/storage.go index 119dca07613..9c8dbc86279 100644 --- a/pkg/registry/rbac/clusterrole/storage/storage.go +++ b/pkg/registry/rbac/clusterrole/storage/storage.go @@ -34,18 +34,17 @@ type REST struct { // NewREST returns a RESTStorage object that will work against ClusterRole objects. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &rbac.ClusterRole{} }, - NewListFunc: func() runtime.Object { return &rbac.ClusterRoleList{} }, - PredicateFunc: clusterrole.Matcher, - QualifiedResource: rbac.Resource("clusterroles"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("clusterroles"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &rbac.ClusterRole{} }, + NewListFunc: func() runtime.Object { return &rbac.ClusterRoleList{} }, + DefaultQualifiedResource: rbac.Resource("clusterroles"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("clusterroles"), CreateStrategy: clusterrole.Strategy, UpdateStrategy: clusterrole.Strategy, DeleteStrategy: clusterrole.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: clusterrole.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/rbac/clusterrole/strategy.go b/pkg/registry/rbac/clusterrole/strategy.go index ead2a876f27..301418a1411 100644 --- a/pkg/registry/rbac/clusterrole/strategy.go +++ b/pkg/registry/rbac/clusterrole/strategy.go @@ -17,15 +17,10 @@ limitations under the License. package clusterrole import ( - "fmt" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/rest" - apistorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/rbac" @@ -98,30 +93,3 @@ func (strategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.O func (strategy) AllowUnconditionalUpdate() bool { return true } - -func (s strategy) Export(ctx genericapirequest.Context, obj runtime.Object, exact bool) error { - return nil -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - role, ok := obj.(*rbac.ClusterRole) - if !ok { - return nil, nil, false, fmt.Errorf("not a ClusterRole") - } - return labels.Set(role.Labels), SelectableFields(role), role.Initializers != nil, nil -} - -// Matcher returns a generic matcher for a given label and field selector. -func Matcher(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { - return apistorage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - -// SelectableFields returns a field set that can be used for filter selection -func SelectableFields(obj *rbac.ClusterRole) fields.Set { - return nil -} diff --git a/pkg/registry/rbac/clusterrolebinding/BUILD b/pkg/registry/rbac/clusterrolebinding/BUILD index f08b0a01342..f1d671f61bf 100644 --- a/pkg/registry/rbac/clusterrolebinding/BUILD +++ b/pkg/registry/rbac/clusterrolebinding/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,21 +12,17 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", "//pkg/apis/rbac/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) diff --git a/pkg/registry/rbac/clusterrolebinding/policybased/BUILD b/pkg/registry/rbac/clusterrolebinding/policybased/BUILD index 8d8ebefd171..d9de68520bb 100644 --- a/pkg/registry/rbac/clusterrolebinding/policybased/BUILD +++ b/pkg/registry/rbac/clusterrolebinding/policybased/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api/helper:go_default_library", "//pkg/apis/rbac:go_default_library", diff --git a/pkg/registry/rbac/clusterrolebinding/storage/BUILD b/pkg/registry/rbac/clusterrolebinding/storage/BUILD index ab61c95f37b..00cdd8d4ff4 100644 --- a/pkg/registry/rbac/clusterrolebinding/storage/BUILD +++ b/pkg/registry/rbac/clusterrolebinding/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", diff --git a/pkg/registry/rbac/clusterrolebinding/storage/storage.go b/pkg/registry/rbac/clusterrolebinding/storage/storage.go index ccc7f8df76f..31eefd21911 100644 --- a/pkg/registry/rbac/clusterrolebinding/storage/storage.go +++ b/pkg/registry/rbac/clusterrolebinding/storage/storage.go @@ -34,18 +34,17 @@ type REST struct { // NewREST returns a RESTStorage object that will work against ClusterRoleBinding objects. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &rbac.ClusterRoleBinding{} }, - NewListFunc: func() runtime.Object { return &rbac.ClusterRoleBindingList{} }, - PredicateFunc: clusterrolebinding.Matcher, - QualifiedResource: rbac.Resource("clusterrolebindings"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("clusterrolebindings"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &rbac.ClusterRoleBinding{} }, + NewListFunc: func() runtime.Object { return &rbac.ClusterRoleBindingList{} }, + DefaultQualifiedResource: rbac.Resource("clusterrolebindings"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("clusterrolebindings"), CreateStrategy: clusterrolebinding.Strategy, UpdateStrategy: clusterrolebinding.Strategy, DeleteStrategy: clusterrolebinding.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: clusterrolebinding.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/rbac/clusterrolebinding/strategy.go b/pkg/registry/rbac/clusterrolebinding/strategy.go index bb9168d51d4..e1d83ecf4ab 100644 --- a/pkg/registry/rbac/clusterrolebinding/strategy.go +++ b/pkg/registry/rbac/clusterrolebinding/strategy.go @@ -17,15 +17,10 @@ limitations under the License. package clusterrolebinding import ( - "fmt" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/rest" - apistorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/rbac" @@ -98,30 +93,3 @@ func (strategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.O func (strategy) AllowUnconditionalUpdate() bool { return true } - -func (s strategy) Export(ctx genericapirequest.Context, obj runtime.Object, exact bool) error { - return nil -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - roleBinding, ok := obj.(*rbac.ClusterRoleBinding) - if !ok { - return nil, nil, false, fmt.Errorf("not a ClusterRoleBinding") - } - return labels.Set(roleBinding.Labels), SelectableFields(roleBinding), roleBinding.Initializers != nil, nil -} - -// Matcher returns a generic matcher for a given label and field selector. -func Matcher(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { - return apistorage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - -// SelectableFields returns a field set that can be used for filter selection -func SelectableFields(obj *rbac.ClusterRoleBinding) fields.Set { - return nil -} diff --git a/pkg/registry/rbac/reconciliation/BUILD b/pkg/registry/rbac/reconciliation/BUILD index 7ffc2828e0c..887010372a9 100644 --- a/pkg/registry/rbac/reconciliation/BUILD +++ b/pkg/registry/rbac/reconciliation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "reconcile_rolebindings_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api/helper:go_default_library", "//pkg/apis/rbac:go_default_library", @@ -33,7 +30,6 @@ go_library( "role_interfaces.go", "rolebinding_interfaces.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", diff --git a/pkg/registry/rbac/rest/BUILD b/pkg/registry/rbac/rest/BUILD index 38d373335f6..d8e52cadb9a 100644 --- a/pkg/registry/rbac/rest/BUILD +++ b/pkg/registry/rbac/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage_rbac.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", @@ -33,6 +30,7 @@ go_library( "//pkg/registry/rbac/validation:go_default_library", "//plugin/pkg/auth/authorizer/rbac/bootstrappolicy:go_default_library", "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/api/rbac/v1:go_default_library", "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/registry/rbac/rest/storage_rbac.go b/pkg/registry/rbac/rest/storage_rbac.go index cdb38b5328b..663f6233a09 100644 --- a/pkg/registry/rbac/rest/storage_rbac.go +++ b/pkg/registry/rbac/rest/storage_rbac.go @@ -23,6 +23,7 @@ import ( "github.com/golang/glog" + rbacapiv1 "k8s.io/api/rbac/v1" rbacapiv1alpha1 "k8s.io/api/rbac/v1alpha1" rbacapiv1beta1 "k8s.io/api/rbac/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -73,6 +74,11 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorag apiGroupInfo.VersionedResourcesStorageMap[rbacapiv1alpha1.SchemeGroupVersion.Version] = p.storage(rbacapiv1alpha1.SchemeGroupVersion, apiResourceConfigSource, restOptionsGetter) apiGroupInfo.GroupMeta.GroupVersion = rbacapiv1alpha1.SchemeGroupVersion } + // TODO: move this after v1beta1 in 1.9, so RBAC objects write to storage in v1 + if apiResourceConfigSource.AnyResourcesForVersionEnabled(rbacapiv1.SchemeGroupVersion) { + apiGroupInfo.VersionedResourcesStorageMap[rbacapiv1.SchemeGroupVersion.Version] = p.storage(rbacapiv1.SchemeGroupVersion, apiResourceConfigSource, restOptionsGetter) + apiGroupInfo.GroupMeta.GroupVersion = rbacapiv1.SchemeGroupVersion + } if apiResourceConfigSource.AnyResourcesForVersionEnabled(rbacapiv1beta1.SchemeGroupVersion) { apiGroupInfo.VersionedResourcesStorageMap[rbacapiv1beta1.SchemeGroupVersion.Version] = p.storage(rbacapiv1beta1.SchemeGroupVersion, apiResourceConfigSource, restOptionsGetter) apiGroupInfo.GroupMeta.GroupVersion = rbacapiv1beta1.SchemeGroupVersion diff --git a/pkg/registry/rbac/role/BUILD b/pkg/registry/rbac/role/BUILD index 6f4756a478e..e24ad971db5 100644 --- a/pkg/registry/rbac/role/BUILD +++ b/pkg/registry/rbac/role/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,21 +12,17 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", "//pkg/apis/rbac/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) diff --git a/pkg/registry/rbac/role/policybased/BUILD b/pkg/registry/rbac/role/policybased/BUILD index be6e7944441..a00c40e80a7 100644 --- a/pkg/registry/rbac/role/policybased/BUILD +++ b/pkg/registry/rbac/role/policybased/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api/helper:go_default_library", "//pkg/apis/rbac:go_default_library", diff --git a/pkg/registry/rbac/role/storage/BUILD b/pkg/registry/rbac/role/storage/BUILD index f6f93724e3f..a541dd7f5e7 100644 --- a/pkg/registry/rbac/role/storage/BUILD +++ b/pkg/registry/rbac/role/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", diff --git a/pkg/registry/rbac/role/storage/storage.go b/pkg/registry/rbac/role/storage/storage.go index 039587d411e..4717f9371f2 100644 --- a/pkg/registry/rbac/role/storage/storage.go +++ b/pkg/registry/rbac/role/storage/storage.go @@ -34,18 +34,17 @@ type REST struct { // NewREST returns a RESTStorage object that will work against Role objects. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &rbac.Role{} }, - NewListFunc: func() runtime.Object { return &rbac.RoleList{} }, - PredicateFunc: role.Matcher, - QualifiedResource: rbac.Resource("roles"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("roles"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &rbac.Role{} }, + NewListFunc: func() runtime.Object { return &rbac.RoleList{} }, + DefaultQualifiedResource: rbac.Resource("roles"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("roles"), CreateStrategy: role.Strategy, UpdateStrategy: role.Strategy, DeleteStrategy: role.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: role.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/rbac/role/strategy.go b/pkg/registry/rbac/role/strategy.go index aaf2a56abb8..619cfeed125 100644 --- a/pkg/registry/rbac/role/strategy.go +++ b/pkg/registry/rbac/role/strategy.go @@ -17,15 +17,10 @@ limitations under the License. package role import ( - "fmt" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/rest" - apistorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/rbac" @@ -98,30 +93,3 @@ func (strategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.O func (strategy) AllowUnconditionalUpdate() bool { return true } - -func (s strategy) Export(ctx genericapirequest.Context, obj runtime.Object, exact bool) error { - return nil -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - role, ok := obj.(*rbac.Role) - if !ok { - return nil, nil, false, fmt.Errorf("not a Role") - } - return labels.Set(role.Labels), SelectableFields(role), role.Initializers != nil, nil -} - -// Matcher returns a generic matcher for a given label and field selector. -func Matcher(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { - return apistorage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - -// SelectableFields returns a field set that can be used for filter selection -func SelectableFields(obj *rbac.Role) fields.Set { - return nil -} diff --git a/pkg/registry/rbac/rolebinding/BUILD b/pkg/registry/rbac/rolebinding/BUILD index 18f5138a017..2549da198ce 100644 --- a/pkg/registry/rbac/rolebinding/BUILD +++ b/pkg/registry/rbac/rolebinding/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,21 +12,17 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", "//pkg/apis/rbac/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) diff --git a/pkg/registry/rbac/rolebinding/policybased/BUILD b/pkg/registry/rbac/rolebinding/policybased/BUILD index 2e940d1e774..40148153bf3 100644 --- a/pkg/registry/rbac/rolebinding/policybased/BUILD +++ b/pkg/registry/rbac/rolebinding/policybased/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api/helper:go_default_library", "//pkg/apis/rbac:go_default_library", diff --git a/pkg/registry/rbac/rolebinding/storage/BUILD b/pkg/registry/rbac/rolebinding/storage/BUILD index bc9317bc873..63ef06d9410 100644 --- a/pkg/registry/rbac/rolebinding/storage/BUILD +++ b/pkg/registry/rbac/rolebinding/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", diff --git a/pkg/registry/rbac/rolebinding/storage/storage.go b/pkg/registry/rbac/rolebinding/storage/storage.go index 641ffab63f9..25ff81aad0d 100644 --- a/pkg/registry/rbac/rolebinding/storage/storage.go +++ b/pkg/registry/rbac/rolebinding/storage/storage.go @@ -34,18 +34,17 @@ type REST struct { // NewREST returns a RESTStorage object that will work against RoleBinding objects. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &rbac.RoleBinding{} }, - NewListFunc: func() runtime.Object { return &rbac.RoleBindingList{} }, - PredicateFunc: rolebinding.Matcher, - QualifiedResource: rbac.Resource("rolebindings"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("rolebindings"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &rbac.RoleBinding{} }, + NewListFunc: func() runtime.Object { return &rbac.RoleBindingList{} }, + DefaultQualifiedResource: rbac.Resource("rolebindings"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("rolebindings"), CreateStrategy: rolebinding.Strategy, UpdateStrategy: rolebinding.Strategy, DeleteStrategy: rolebinding.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: rolebinding.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/rbac/rolebinding/strategy.go b/pkg/registry/rbac/rolebinding/strategy.go index f5291ab0b23..9d4781a50c3 100644 --- a/pkg/registry/rbac/rolebinding/strategy.go +++ b/pkg/registry/rbac/rolebinding/strategy.go @@ -17,15 +17,10 @@ limitations under the License. package rolebinding import ( - "fmt" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/rest" - apistorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/rbac" @@ -98,30 +93,3 @@ func (strategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.O func (strategy) AllowUnconditionalUpdate() bool { return true } - -func (s strategy) Export(ctx genericapirequest.Context, obj runtime.Object, exact bool) error { - return nil -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - roleBinding, ok := obj.(*rbac.RoleBinding) - if !ok { - return nil, nil, false, fmt.Errorf("not a RoleBinding") - } - return labels.Set(roleBinding.Labels), SelectableFields(roleBinding), roleBinding.Initializers != nil, nil -} - -// Matcher returns a generic matcher for a given label and field selector. -func Matcher(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { - return apistorage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - -// SelectableFields returns a field set that can be used for filter selection -func SelectableFields(obj *rbac.RoleBinding) fields.Set { - return nil -} diff --git a/pkg/registry/rbac/validation/BUILD b/pkg/registry/rbac/validation/BUILD index dac4ac52465..d73421f5a94 100644 --- a/pkg/registry/rbac/validation/BUILD +++ b/pkg/registry/rbac/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "rule_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", @@ -33,7 +30,6 @@ go_library( "policy_comparator.go", "rule.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", diff --git a/pkg/registry/registrytest/BUILD b/pkg/registry/registrytest/BUILD index a485cae0130..6013380c741 100644 --- a/pkg/registry/registrytest/BUILD +++ b/pkg/registry/registrytest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,11 +15,12 @@ go_library( "node.go", "service.go", "shortNamesProvider.go", + "validate.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", + "//pkg/util/slice:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", diff --git a/pkg/registry/registrytest/validate.go b/pkg/registry/registrytest/validate.go new file mode 100644 index 00000000000..40b92270020 --- /dev/null +++ b/pkg/registry/registrytest/validate.go @@ -0,0 +1,79 @@ +/* +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 registrytest + +import ( + "fmt" + "k8s.io/apiserver/pkg/registry/generic/registry" + "k8s.io/apiserver/pkg/registry/rest" + "k8s.io/kubernetes/pkg/util/slice" +) + +// ValidateStorageStrategies ensures any instances of the generic registry.Store in the given storage map +// have expected strategies defined. +func ValidateStorageStrategies(storageMap map[string]rest.Storage, exceptions StrategyExceptions) []error { + errs := []error{} + + // Used to ensure we saw all the expected exceptions: + hasExportExceptionsSeen := []string{} + + for k, storage := range storageMap { + switch t := storage.(type) { + case registry.GenericStore: + // At this point it appears all uses of the generic registry store should have a create, update, and + // delete strategy set: + if t.GetCreateStrategy() == nil { + errs = append(errs, fmt.Errorf("store for type [%v] does not have a CreateStrategy", k)) + } + if t.GetUpdateStrategy() == nil { + errs = append(errs, fmt.Errorf("store for type [%v] does not have an UpdateStrategy", k)) + } + if t.GetDeleteStrategy() == nil { + errs = append(errs, fmt.Errorf("store for type [%v] does not have a DeleteStrategy", k)) + } + + // Check that ExportStrategy is set if applicable: + if slice.ContainsString(exceptions.HasExportStrategy, k, nil) { + hasExportExceptionsSeen = append(hasExportExceptionsSeen, k) + if t.GetExportStrategy() == nil { + errs = append(errs, fmt.Errorf("store for type [%v] does not have an ExportStrategy", k)) + } + } else { + // By default we expect Stores to not have additional export logic: + if t.GetExportStrategy() != nil { + errs = append(errs, fmt.Errorf("store for type [%v] has an unexpected ExportStrategy", k)) + } + } + + } + } + + // Ensure that we saw all our expected exceptions: + for _, expKey := range exceptions.HasExportStrategy { + if !slice.ContainsString(hasExportExceptionsSeen, expKey, nil) { + errs = append(errs, fmt.Errorf("no generic store seen for expected ExportStrategy: %v", expKey)) + } + } + + return errs +} + +// StrategyExceptions carries information on what exceptions to default strategy expectations are expected. +type StrategyExceptions struct { + // HasExportStrategy is a list of the resource keys whose store should have a custom export strategy. + HasExportStrategy []string +} diff --git a/pkg/registry/scheduling/priorityclass/BUILD b/pkg/registry/scheduling/priorityclass/BUILD index ffea9f8a5b4..2e62a31485e 100644 --- a/pkg/registry/scheduling/priorityclass/BUILD +++ b/pkg/registry/scheduling/priorityclass/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/scheduling:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -27,22 +24,17 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/scheduling:go_default_library", "//pkg/apis/scheduling/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) diff --git a/pkg/registry/scheduling/priorityclass/storage/BUILD b/pkg/registry/scheduling/priorityclass/storage/BUILD index 15fb367e7ea..92f42f8da00 100644 --- a/pkg/registry/scheduling/priorityclass/storage/BUILD +++ b/pkg/registry/scheduling/priorityclass/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/scheduling:go_default_library", "//pkg/registry/registrytest:go_default_library", @@ -28,7 +25,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/scheduling:go_default_library", diff --git a/pkg/registry/scheduling/priorityclass/storage/storage.go b/pkg/registry/scheduling/priorityclass/storage/storage.go index e24a319f680..6390381f1f1 100644 --- a/pkg/registry/scheduling/priorityclass/storage/storage.go +++ b/pkg/registry/scheduling/priorityclass/storage/storage.go @@ -35,18 +35,17 @@ type REST struct { // NewREST returns a RESTStorage object that will work against priority classes. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &schedulingapi.PriorityClass{} }, - NewListFunc: func() runtime.Object { return &schedulingapi.PriorityClassList{} }, - PredicateFunc: priorityclass.Matcher, - QualifiedResource: schedulingapi.Resource("priorityclasses"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("priorityclasses"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &schedulingapi.PriorityClass{} }, + NewListFunc: func() runtime.Object { return &schedulingapi.PriorityClassList{} }, + DefaultQualifiedResource: schedulingapi.Resource("priorityclasses"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("priorityclasses"), CreateStrategy: priorityclass.Strategy, UpdateStrategy: priorityclass.Strategy, DeleteStrategy: priorityclass.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: priorityclass.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/scheduling/priorityclass/strategy.go b/pkg/registry/scheduling/priorityclass/strategy.go index 64be7365f81..6a6e060eef7 100644 --- a/pkg/registry/scheduling/priorityclass/strategy.go +++ b/pkg/registry/scheduling/priorityclass/strategy.go @@ -17,15 +17,9 @@ limitations under the License. package priorityclass import ( - "fmt" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" - apistorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/scheduling" @@ -83,27 +77,3 @@ func (priorityClassStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, func (priorityClassStrategy) AllowUnconditionalUpdate() bool { return true } - -// SelectableFields returns a field set that represents the object. -func SelectableFields(pc *scheduling.PriorityClass) fields.Set { - return generic.ObjectMetaFieldsSet(&pc.ObjectMeta, false) -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - pc, ok := obj.(*scheduling.PriorityClass) - if !ok { - return nil, nil, false, fmt.Errorf("given object is not a PriorityClass") - } - return labels.Set(pc.ObjectMeta.Labels), SelectableFields(pc), pc.Initializers != nil, nil -} - -// Matcher is the filter used by the generic etcd backend to watch events -// from etcd to clients of the apiserver only interested in specific labels/fields. -func Matcher(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { - return apistorage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} diff --git a/pkg/registry/scheduling/rest/BUILD b/pkg/registry/scheduling/rest/BUILD index 8eb45833ad2..7a316a4473c 100644 --- a/pkg/registry/scheduling/rest/BUILD +++ b/pkg/registry/scheduling/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage_scheduling.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/scheduling:go_default_library", diff --git a/pkg/registry/settings/podpreset/BUILD b/pkg/registry/settings/podpreset/BUILD index 4868f51f3c9..648ef350e86 100644 --- a/pkg/registry/settings/podpreset/BUILD +++ b/pkg/registry/settings/podpreset/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,22 +12,17 @@ go_library( "registry.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/settings:go_default_library", "//pkg/apis/settings/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) diff --git a/pkg/registry/settings/podpreset/storage/BUILD b/pkg/registry/settings/podpreset/storage/BUILD index 57123658e11..a85b1d7dcaa 100644 --- a/pkg/registry/settings/podpreset/storage/BUILD +++ b/pkg/registry/settings/podpreset/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/settings:go_default_library", diff --git a/pkg/registry/settings/podpreset/storage/storage.go b/pkg/registry/settings/podpreset/storage/storage.go index 233146c3194..7a40f2c9f62 100644 --- a/pkg/registry/settings/podpreset/storage/storage.go +++ b/pkg/registry/settings/podpreset/storage/storage.go @@ -34,18 +34,17 @@ type REST struct { // NewREST returns a RESTStorage object that will work against replication controllers. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &settingsapi.PodPreset{} }, - NewListFunc: func() runtime.Object { return &settingsapi.PodPresetList{} }, - PredicateFunc: podpreset.Matcher, - QualifiedResource: settingsapi.Resource("podpresets"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("podpresets"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &settingsapi.PodPreset{} }, + NewListFunc: func() runtime.Object { return &settingsapi.PodPresetList{} }, + DefaultQualifiedResource: settingsapi.Resource("podpresets"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("podpresets"), CreateStrategy: podpreset.Strategy, UpdateStrategy: podpreset.Strategy, DeleteStrategy: podpreset.Strategy, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: podpreset.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/settings/podpreset/strategy.go b/pkg/registry/settings/podpreset/strategy.go index 6eb0f94acd8..2d53ed16e68 100644 --- a/pkg/registry/settings/podpreset/strategy.go +++ b/pkg/registry/settings/podpreset/strategy.go @@ -17,15 +17,9 @@ limitations under the License. package podpreset import ( - "fmt" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" - apistorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/settings" @@ -86,27 +80,3 @@ func (podPresetStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old func (podPresetStrategy) AllowUnconditionalUpdate() bool { return true } - -// SelectableFields returns a field set that represents the object. -func SelectableFields(pip *settings.PodPreset) fields.Set { - return generic.ObjectMetaFieldsSet(&pip.ObjectMeta, true) -} - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - pip, ok := obj.(*settings.PodPreset) - if !ok { - return nil, nil, false, fmt.Errorf("given object is not a PodPreset.") - } - return labels.Set(pip.ObjectMeta.Labels), SelectableFields(pip), pip.Initializers != nil, nil -} - -// Matcher is the filter used by the generic etcd backend to watch events -// from etcd to clients of the apiserver only interested in specific labels/fields. -func Matcher(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { - return apistorage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} diff --git a/pkg/registry/settings/rest/BUILD b/pkg/registry/settings/rest/BUILD index 5eb729343c8..0251054ff15 100644 --- a/pkg/registry/settings/rest/BUILD +++ b/pkg/registry/settings/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage_settings.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/settings:go_default_library", diff --git a/pkg/registry/storage/rest/BUILD b/pkg/registry/storage/rest/BUILD index fb0b35de2c2..c5cb419e8b9 100644 --- a/pkg/registry/storage/rest/BUILD +++ b/pkg/registry/storage/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["storage_storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/storage:go_default_library", diff --git a/pkg/registry/storage/storageclass/BUILD b/pkg/registry/storage/storageclass/BUILD index c11ddcf4ddf..e3216aa9075 100644 --- a/pkg/registry/storage/storageclass/BUILD +++ b/pkg/registry/storage/storageclass/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,18 +12,13 @@ go_library( "doc.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/storage:go_default_library", "//pkg/apis/storage/validation: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", ], ) @@ -34,7 +27,6 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/storage:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/registry/storage/storageclass/storage/BUILD b/pkg/registry/storage/storageclass/storage/BUILD index 6b411cdcadc..481ceb7d59a 100644 --- a/pkg/registry/storage/storageclass/storage/BUILD +++ b/pkg/registry/storage/storageclass/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["storage_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/storage:go_default_library", "//pkg/registry/registrytest:go_default_library", @@ -28,7 +25,6 @@ go_test( go_library( name = "go_default_library", srcs = ["storage.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/storage:go_default_library", diff --git a/pkg/registry/storage/storageclass/storage/storage.go b/pkg/registry/storage/storageclass/storage/storage.go index e8d98c8332f..25c1807e49f 100644 --- a/pkg/registry/storage/storageclass/storage/storage.go +++ b/pkg/registry/storage/storageclass/storage/storage.go @@ -34,19 +34,18 @@ type REST struct { // NewREST returns a RESTStorage object that will work against persistent volumes. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ - Copier: api.Scheme, - NewFunc: func() runtime.Object { return &storageapi.StorageClass{} }, - NewListFunc: func() runtime.Object { return &storageapi.StorageClassList{} }, - PredicateFunc: storageclass.MatchStorageClasses, - QualifiedResource: storageapi.Resource("storageclasses"), - WatchCacheSize: cachesize.GetWatchCacheSizeByResource("storageclass"), + Copier: api.Scheme, + NewFunc: func() runtime.Object { return &storageapi.StorageClass{} }, + NewListFunc: func() runtime.Object { return &storageapi.StorageClassList{} }, + DefaultQualifiedResource: storageapi.Resource("storageclasses"), + WatchCacheSize: cachesize.GetWatchCacheSizeByResource("storageclass"), CreateStrategy: storageclass.Strategy, UpdateStrategy: storageclass.Strategy, DeleteStrategy: storageclass.Strategy, ReturnDeletedObject: true, } - options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: storageclass.GetAttrs} + options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } diff --git a/pkg/registry/storage/storageclass/strategy.go b/pkg/registry/storage/storageclass/strategy.go index 73aa7d2b37f..216cc7ddc26 100644 --- a/pkg/registry/storage/storageclass/strategy.go +++ b/pkg/registry/storage/storageclass/strategy.go @@ -17,15 +17,9 @@ limitations under the License. package storageclass import ( - "fmt" - - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/apiserver/pkg/registry/generic" - apistorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/storage" @@ -78,26 +72,3 @@ func (storageClassStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, o func (storageClassStrategy) AllowUnconditionalUpdate() bool { return true } - -// GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { - cls, ok := obj.(*storage.StorageClass) - if !ok { - return nil, nil, false, fmt.Errorf("given object is not of type StorageClass") - } - return labels.Set(cls.ObjectMeta.Labels), StorageClassToSelectableFields(cls), cls.Initializers != nil, nil -} - -// MatchStorageClass returns a generic matcher for a given label and field selector. -func MatchStorageClasses(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { - return apistorage.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: GetAttrs, - } -} - -// StorageClassToSelectableFields returns a label set that represents the object -func StorageClassToSelectableFields(storageClass *storage.StorageClass) fields.Set { - return generic.ObjectMetaFieldsSet(&storageClass.ObjectMeta, false) -} diff --git a/pkg/routes/BUILD b/pkg/routes/BUILD index e0fbe065637..276015ae586 100644 --- a/pkg/routes/BUILD +++ b/pkg/routes/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "logs.go", "ui.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/emicklei/go-restful:go_default_library", "//vendor/k8s.io/apiserver/pkg/server/mux:go_default_library", diff --git a/pkg/runtime/BUILD b/pkg/runtime/BUILD index 7a99431d6e9..b12028fcce5 100644 --- a/pkg/runtime/BUILD +++ b/pkg/runtime/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/runtime/serializer/BUILD b/pkg/runtime/serializer/BUILD index aebc6ca6454..8e7996bfd89 100644 --- a/pkg/runtime/serializer/BUILD +++ b/pkg/runtime/serializer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/runtime/serializer/json/BUILD b/pkg/runtime/serializer/json/BUILD index deefdcef3c1..df044c0ebf9 100644 --- a/pkg/runtime/serializer/json/BUILD +++ b/pkg/runtime/serializer/json/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/runtime/serializer/protobuf/BUILD b/pkg/runtime/serializer/protobuf/BUILD index deefdcef3c1..df044c0ebf9 100644 --- a/pkg/runtime/serializer/protobuf/BUILD +++ b/pkg/runtime/serializer/protobuf/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/runtime/serializer/recognizer/BUILD b/pkg/runtime/serializer/recognizer/BUILD index deefdcef3c1..df044c0ebf9 100644 --- a/pkg/runtime/serializer/recognizer/BUILD +++ b/pkg/runtime/serializer/recognizer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/runtime/serializer/streaming/BUILD b/pkg/runtime/serializer/streaming/BUILD index deefdcef3c1..df044c0ebf9 100644 --- a/pkg/runtime/serializer/streaming/BUILD +++ b/pkg/runtime/serializer/streaming/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/runtime/serializer/versioning/BUILD b/pkg/runtime/serializer/versioning/BUILD index deefdcef3c1..df044c0ebf9 100644 --- a/pkg/runtime/serializer/versioning/BUILD +++ b/pkg/runtime/serializer/versioning/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/security/BUILD b/pkg/security/BUILD index af17441b3ab..0017dc79e7e 100644 --- a/pkg/security/BUILD +++ b/pkg/security/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/security/apparmor/BUILD b/pkg/security/apparmor/BUILD index 4dbadae70ad..c114e75e5e1 100644 --- a/pkg/security/apparmor/BUILD +++ b/pkg/security/apparmor/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,8 +11,8 @@ go_library( srcs = [ "helpers.go", "validate.go", + "validate_disabled.go", ], - tags = ["automanaged"], deps = [ "//pkg/features:go_default_library", "//pkg/util/file:go_default_library", @@ -30,7 +28,6 @@ go_test( "testdata/profiles", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/security/podsecuritypolicy/BUILD b/pkg/security/podsecuritypolicy/BUILD index a3abb744acc..20b6c7e26b0 100644 --- a/pkg/security/podsecuritypolicy/BUILD +++ b/pkg/security/podsecuritypolicy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "provider.go", "types.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", @@ -38,7 +35,6 @@ go_test( name = "go_default_test", srcs = ["provider_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1:go_default_library", diff --git a/pkg/security/podsecuritypolicy/apparmor/BUILD b/pkg/security/podsecuritypolicy/apparmor/BUILD index 7a746a4743b..4edc68a8d67 100644 --- a/pkg/security/podsecuritypolicy/apparmor/BUILD +++ b/pkg/security/podsecuritypolicy/apparmor/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["strategy.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/security/apparmor:go_default_library", @@ -24,7 +21,6 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/security/apparmor:go_default_library", diff --git a/pkg/security/podsecuritypolicy/capabilities/BUILD b/pkg/security/podsecuritypolicy/capabilities/BUILD index 809e34d2651..ad9478633f8 100644 --- a/pkg/security/podsecuritypolicy/capabilities/BUILD +++ b/pkg/security/podsecuritypolicy/capabilities/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "mustrunas.go", "types.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", @@ -27,7 +24,6 @@ go_test( name = "go_default_test", srcs = ["mustrunas_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//pkg/api:go_default_library"], ) diff --git a/pkg/security/podsecuritypolicy/group/BUILD b/pkg/security/podsecuritypolicy/group/BUILD index d5992815002..b820249ccff 100644 --- a/pkg/security/podsecuritypolicy/group/BUILD +++ b/pkg/security/podsecuritypolicy/group/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "runasany.go", "types.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", @@ -32,7 +29,6 @@ go_test( "runasany_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/security/podsecuritypolicy/seccomp/BUILD b/pkg/security/podsecuritypolicy/seccomp/BUILD index fad7e2e9731..e53a2d778f3 100644 --- a/pkg/security/podsecuritypolicy/seccomp/BUILD +++ b/pkg/security/podsecuritypolicy/seccomp/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["strategy.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", @@ -22,7 +19,6 @@ go_test( name = "go_default_test", srcs = ["strategy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/security/podsecuritypolicy/selinux/BUILD b/pkg/security/podsecuritypolicy/selinux/BUILD index 587074816cc..9231a39ae26 100644 --- a/pkg/security/podsecuritypolicy/selinux/BUILD +++ b/pkg/security/podsecuritypolicy/selinux/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "runasany.go", "types.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", @@ -31,7 +28,6 @@ go_test( "runasany_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/security/podsecuritypolicy/sysctl/BUILD b/pkg/security/podsecuritypolicy/sysctl/BUILD index 74ddce70481..8da68d4a8d6 100644 --- a/pkg/security/podsecuritypolicy/sysctl/BUILD +++ b/pkg/security/podsecuritypolicy/sysctl/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "mustmatchpatterns.go", "types.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", @@ -26,7 +23,6 @@ go_test( name = "go_default_test", srcs = ["mustmatchpatterns_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", diff --git a/pkg/security/podsecuritypolicy/user/BUILD b/pkg/security/podsecuritypolicy/user/BUILD index e7bed5b3ef6..9cb2bf4053e 100644 --- a/pkg/security/podsecuritypolicy/user/BUILD +++ b/pkg/security/podsecuritypolicy/user/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "runasany.go", "types.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", @@ -34,7 +31,6 @@ go_test( "runasany_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/security/podsecuritypolicy/util/BUILD b/pkg/security/podsecuritypolicy/util/BUILD index 2343551c4dc..88e320d98c9 100644 --- a/pkg/security/podsecuritypolicy/util/BUILD +++ b/pkg/security/podsecuritypolicy/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "util.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", @@ -26,7 +23,6 @@ go_test( name = "go_default_test", srcs = ["util_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/pkg/securitycontext/BUILD b/pkg/securitycontext/BUILD index f7b0ed567c3..38fd8d83145 100644 --- a/pkg/securitycontext/BUILD +++ b/pkg/securitycontext/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "fake.go", "util.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -26,7 +23,6 @@ go_test( name = "go_default_test", srcs = ["util_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/api/core/v1:go_default_library"], ) diff --git a/pkg/serviceaccount/BUILD b/pkg/serviceaccount/BUILD index c0babddda4c..259190977ad 100644 --- a/pkg/serviceaccount/BUILD +++ b/pkg/serviceaccount/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "jwt.go", "util.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/github.com/dgrijalva/jwt-go:go_default_library", @@ -29,10 +26,9 @@ go_library( go_test( name = "go_default_xtest", srcs = ["jwt_test.go"], - tags = ["automanaged"], deps = [ + ":go_default_library", "//pkg/controller/serviceaccount:go_default_library", - "//pkg/serviceaccount:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", diff --git a/pkg/ssh/BUILD b/pkg/ssh/BUILD index 742cbc3304c..b2d85c491f8 100644 --- a/pkg/ssh/BUILD +++ b/pkg/ssh/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["ssh_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/golang.org/x/crypto/ssh:go_default_library", @@ -23,7 +20,6 @@ go_test( go_library( name = "go_default_library", srcs = ["ssh.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", diff --git a/pkg/types/BUILD b/pkg/types/BUILD index deefdcef3c1..df044c0ebf9 100644 --- a/pkg/types/BUILD +++ b/pkg/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/BUILD b/pkg/util/BUILD index a2916a9a137..e3129ef8c39 100644 --- a/pkg/util/BUILD +++ b/pkg/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - filegroup( name = "package-srcs", srcs = glob(["**"]), @@ -33,7 +31,6 @@ filegroup( "//pkg/util/keymutex:all-srcs", "//pkg/util/labels:all-srcs", "//pkg/util/limitwriter:all-srcs", - "//pkg/util/logs:all-srcs", "//pkg/util/maps:all-srcs", "//pkg/util/metrics:all-srcs", "//pkg/util/mount:all-srcs", diff --git a/pkg/util/async/BUILD b/pkg/util/async/BUILD index 67ba72fe84b..72cae5beeca 100644 --- a/pkg/util/async/BUILD +++ b/pkg/util/async/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "bounded_frequency_runner.go", "runner.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", @@ -28,7 +25,6 @@ go_test( "runner_test.go", ], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/bandwidth/BUILD b/pkg/util/bandwidth/BUILD index 7b8676c7f14..4b73efbe35d 100644 --- a/pkg/util/bandwidth/BUILD +++ b/pkg/util/bandwidth/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,33 +12,48 @@ go_library( "doc.go", "fake_shaper.go", "interfaces.go", - "linux.go", + "unsupported.go", "utils.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "linux.go", + ], + "//conditions:default": [], + }), deps = [ - "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//vendor/k8s.io/utils/exec:go_default_library", + ], + "//conditions:default": [], + }), ) go_test( name = "go_default_test", srcs = [ - "linux_test.go", "utils_test.go", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "linux_test.go", + ], + "//conditions:default": [], + }), library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api: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/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/k8s.io/utils/exec:go_default_library", + "//vendor/k8s.io/utils/exec/testing:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/util/config/BUILD b/pkg/util/config/BUILD index 6d28d4754d9..5bed8fca326 100644 --- a/pkg/util/config/BUILD +++ b/pkg/util/config/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "config.go", "doc.go", ], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library"], ) @@ -22,7 +19,6 @@ go_test( name = "go_default_test", srcs = ["config_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/configz/BUILD b/pkg/util/configz/BUILD index 821b4cd711b..e9e60ce3c10 100644 --- a/pkg/util/configz/BUILD +++ b/pkg/util/configz/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,14 +9,12 @@ load( go_library( name = "go_default_library", srcs = ["configz.go"], - tags = ["automanaged"], ) go_test( name = "go_default_test", srcs = ["configz_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/dbus/BUILD b/pkg/util/dbus/BUILD index 6a58b535007..2356cfe90fd 100644 --- a/pkg/util/dbus/BUILD +++ b/pkg/util/dbus/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "doc.go", "fake_dbus.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/godbus/dbus:go_default_library"], ) @@ -23,7 +20,6 @@ go_test( name = "go_default_test", srcs = ["dbus_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/github.com/godbus/dbus:go_default_library"], ) diff --git a/pkg/util/ebtables/BUILD b/pkg/util/ebtables/BUILD index cb8e66850bd..814c30418ac 100644 --- a/pkg/util/ebtables/BUILD +++ b/pkg/util/ebtables/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["ebtables.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/utils/exec:go_default_library"], ) @@ -19,7 +16,6 @@ go_test( name = "go_default_test", srcs = ["ebtables_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/exec/testing:go_default_library", diff --git a/pkg/util/env/BUILD b/pkg/util/env/BUILD index 17d09ff2651..646c4e6f619 100644 --- a/pkg/util/env/BUILD +++ b/pkg/util/env/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,14 +9,12 @@ load( go_library( name = "go_default_library", srcs = ["env.go"], - tags = ["automanaged"], ) go_test( name = "go_default_test", srcs = ["env_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], ) diff --git a/pkg/util/file/BUILD b/pkg/util/file/BUILD index 1e8e96cee50..5e7263154a0 100644 --- a/pkg/util/file/BUILD +++ b/pkg/util/file/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["file.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/flock/BUILD b/pkg/util/flock/BUILD index 2d2e6b40a89..b5c07a60f8a 100644 --- a/pkg/util/flock/BUILD +++ b/pkg/util/flock/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,9 +7,26 @@ load( go_library( name = "go_default_library", - srcs = ["flock_unix.go"], - tags = ["automanaged"], - deps = ["//vendor/golang.org/x/sys/unix:go_default_library"], + srcs = [ + "flock_other.go", + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "flock_unix.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "flock_unix.go", + ], + "//conditions:default": [], + }), + deps = select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/util/goroutinemap/BUILD b/pkg/util/goroutinemap/BUILD index aa0a59ce0ed..8565a939eff 100644 --- a/pkg/util/goroutinemap/BUILD +++ b/pkg/util/goroutinemap/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["goroutinemap.go"], - tags = ["automanaged"], deps = [ "//pkg/util/goroutinemap/exponentialbackoff:go_default_library", "//vendor/github.com/golang/glog:go_default_library", @@ -23,7 +20,6 @@ go_test( name = "go_default_test", srcs = ["goroutinemap_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library"], ) diff --git a/pkg/util/goroutinemap/exponentialbackoff/BUILD b/pkg/util/goroutinemap/exponentialbackoff/BUILD index 24f609447e4..92904289752 100644 --- a/pkg/util/goroutinemap/exponentialbackoff/BUILD +++ b/pkg/util/goroutinemap/exponentialbackoff/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["exponential_backoff.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/hash/BUILD b/pkg/util/hash/BUILD index f4d50e5d23e..0a066741af9 100644 --- a/pkg/util/hash/BUILD +++ b/pkg/util/hash/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["hash.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/davecgh/go-spew/spew:go_default_library"], ) @@ -19,7 +16,6 @@ go_test( name = "go_default_test", srcs = ["hash_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/github.com/davecgh/go-spew/spew:go_default_library"], ) diff --git a/pkg/util/i18n/BUILD b/pkg/util/i18n/BUILD index b58e9d58a26..d309f09b19d 100644 --- a/pkg/util/i18n/BUILD +++ b/pkg/util/i18n/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["i18n.go"], - tags = ["automanaged"], deps = [ "//pkg/generated:go_default_library", "//vendor/github.com/chai2010/gettext-go/gettext:go_default_library", @@ -23,7 +20,6 @@ go_test( name = "go_default_test", srcs = ["i18n_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/initsystem/BUILD b/pkg/util/initsystem/BUILD index b16f14e1894..a6de3a23c08 100644 --- a/pkg/util/initsystem/BUILD +++ b/pkg/util/initsystem/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["initsystem.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/interrupt/BUILD b/pkg/util/interrupt/BUILD index 81df599e7c9..7c2a621e7c6 100644 --- a/pkg/util/interrupt/BUILD +++ b/pkg/util/interrupt/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interrupt.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/io/BUILD b/pkg/util/io/BUILD index 7c9d0733ec3..78d933bf94f 100644 --- a/pkg/util/io/BUILD +++ b/pkg/util/io/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["writer.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/glog:go_default_library"], ) diff --git a/pkg/util/ipconfig/BUILD b/pkg/util/ipconfig/BUILD index f9c248951c2..ea22fd91dce 100644 --- a/pkg/util/ipconfig/BUILD +++ b/pkg/util/ipconfig/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "ipconfig.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", @@ -25,7 +22,6 @@ go_test( name = "go_default_test", srcs = ["ipconfig_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/utils/exec:go_default_library"], ) diff --git a/pkg/util/iptables/BUILD b/pkg/util/iptables/BUILD index 276e464cd9b..c7970e748c6 100644 --- a/pkg/util/iptables/BUILD +++ b/pkg/util/iptables/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,34 +11,49 @@ go_library( srcs = [ "doc.go", "iptables.go", - "iptables_linux.go", + "iptables_unsupported.go", "save_restore.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "iptables_linux.go", + ], + "//conditions:default": [], + }), deps = [ "//pkg/util/dbus:go_default_library", "//pkg/util/version:go_default_library", "//vendor/github.com/godbus/dbus:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + ], + "//conditions:default": [], + }), ) go_test( name = "go_default_test", - srcs = ["iptables_test.go"], + srcs = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "iptables_test.go", + ], + "//conditions:default": [], + }), library = ":go_default_library", - tags = ["automanaged"], - deps = [ - "//pkg/util/dbus:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//pkg/util/dbus:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//vendor/k8s.io/utils/exec:go_default_library", + "//vendor/k8s.io/utils/exec/testing:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/util/iptables/testing/BUILD b/pkg/util/iptables/testing/BUILD index 39de98464bc..1b3fa699cc0 100644 --- a/pkg/util/iptables/testing/BUILD +++ b/pkg/util/iptables/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["fake.go"], - tags = ["automanaged"], deps = ["//pkg/util/iptables:go_default_library"], ) diff --git a/pkg/util/keymutex/BUILD b/pkg/util/keymutex/BUILD index af5bcdf095d..bde4b1f9f57 100644 --- a/pkg/util/keymutex/BUILD +++ b/pkg/util/keymutex/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["keymutex.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/glog:go_default_library"], ) @@ -19,7 +16,6 @@ go_test( name = "go_default_test", srcs = ["keymutex_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/labels/BUILD b/pkg/util/labels/BUILD index afa148c33e4..0b1a9d448f9 100644 --- a/pkg/util/labels/BUILD +++ b/pkg/util/labels/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "labels.go", ], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], ) @@ -22,7 +19,6 @@ go_test( name = "go_default_test", srcs = ["labels_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], ) diff --git a/pkg/util/limitwriter/BUILD b/pkg/util/limitwriter/BUILD index b2d81cffe34..b827e9523bd 100644 --- a/pkg/util/limitwriter/BUILD +++ b/pkg/util/limitwriter/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,14 +12,12 @@ go_library( "doc.go", "limitwriter.go", ], - tags = ["automanaged"], ) go_test( name = "go_default_test", srcs = ["limitwriter_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/maps/BUILD b/pkg/util/maps/BUILD index a7a44fbd17e..264cdadecf7 100644 --- a/pkg/util/maps/BUILD +++ b/pkg/util/maps/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "string.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/metrics/BUILD b/pkg/util/metrics/BUILD index c040e00eb4e..6c330b8f1e0 100644 --- a/pkg/util/metrics/BUILD +++ b/pkg/util/metrics/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", diff --git a/pkg/util/mount/BUILD b/pkg/util/mount/BUILD index 497f64c991d..66aa2cbb6d0 100644 --- a/pkg/util/mount/BUILD +++ b/pkg/util/mount/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,27 +12,39 @@ go_library( "doc.go", "fake.go", "mount.go", - "mount_linux.go", - "nsenter_mount.go", - ], - tags = ["automanaged"], + "mount_unsupported.go", + "nsenter_mount_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "mount_linux.go", + "nsenter_mount.go", + ], + "//conditions:default": [], + }), deps = [ "//vendor/github.com/golang/glog:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + ], + "//conditions:default": [], + }), ) go_test( name = "go_default_test", srcs = [ - "mount_linux_test.go", - "nsenter_mount_test.go", "safe_format_and_mount_test.go", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "mount_linux_test.go", + "nsenter_mount_test.go", + ], + "//conditions:default": [], + }), library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/exec/testing:go_default_library", diff --git a/pkg/util/mount/mount.go b/pkg/util/mount/mount.go index 00813a19a72..eab2889951d 100644 --- a/pkg/util/mount/mount.go +++ b/pkg/util/mount/mount.go @@ -107,15 +107,6 @@ func (mounter *SafeFormatAndMount) FormatAndMount(source string, target string, return mounter.formatAndMount(source, target, fstype, options) } -// New returns a mount.Interface for the current system. -// It provides options to override the default mounter behavior. -// mounterPath allows using an alternative to `/bin/mount` for mounting. -func New(mounterPath string) Interface { - return &Mounter{ - mounterPath: mounterPath, - } -} - // GetMountRefs finds all other references to the device referenced // by mountPath; returns a list of paths. func GetMountRefs(mounter Interface, mountPath string) ([]string, error) { diff --git a/pkg/util/mount/mount_linux.go b/pkg/util/mount/mount_linux.go index 84e2e68eeb6..65715db6cc2 100644 --- a/pkg/util/mount/mount_linux.go +++ b/pkg/util/mount/mount_linux.go @@ -56,6 +56,17 @@ const ( // kubelet is running in the host's root mount namespace. type Mounter struct { mounterPath string + withSystemd bool +} + +// New returns a mount.Interface for the current system. +// It provides options to override the default mounter behavior. +// mounterPath allows using an alternative to `/bin/mount` for mounting. +func New(mounterPath string) Interface { + return &Mounter{ + mounterPath: mounterPath, + withSystemd: detectSystemd(), + } } // Mount mounts source to target as fstype with given options. 'source' and 'fstype' must @@ -69,18 +80,18 @@ func (mounter *Mounter) Mount(source string, target string, fstype string, optio mounterPath := "" bind, bindRemountOpts := isBind(options) if bind { - err := doMount(mounterPath, defaultMountCommand, source, target, fstype, []string{"bind"}) + err := mounter.doMount(mounterPath, defaultMountCommand, source, target, fstype, []string{"bind"}) if err != nil { return err } - return doMount(mounterPath, defaultMountCommand, source, target, fstype, bindRemountOpts) + return mounter.doMount(mounterPath, defaultMountCommand, source, target, fstype, bindRemountOpts) } // The list of filesystems that require containerized mounter on GCI image cluster fsTypesNeedMounter := sets.NewString("nfs", "glusterfs", "ceph", "cifs") if fsTypesNeedMounter.Has(fstype) { mounterPath = mounter.mounterPath } - return doMount(mounterPath, defaultMountCommand, source, target, fstype, options) + return mounter.doMount(mounterPath, defaultMountCommand, source, target, fstype, options) } // isBind detects whether a bind mount is being requested and makes the remount options to @@ -109,24 +120,80 @@ func isBind(options []string) (bool, []string) { } // doMount runs the mount command. mounterPath is the path to mounter binary if containerized mounter is used. -func doMount(mounterPath string, mountCmd string, source string, target string, fstype string, options []string) error { +func (m *Mounter) doMount(mounterPath string, mountCmd string, source string, target string, fstype string, options []string) error { mountArgs := makeMountArgs(source, target, fstype, options) if len(mounterPath) > 0 { mountArgs = append([]string{mountCmd}, mountArgs...) mountCmd = mounterPath } + if m.withSystemd { + // Try to run mount via systemd-run --scope. This will escape the + // service where kubelet runs and any fuse daemons will be started in a + // specific scope. kubelet service than can be restarted without killing + // these fuse daemons. + // + // Complete command line (when mounterPath is not used): + // systemd-run --description=... --scope -- mount -t + // + // Expected flow: + // * systemd-run creates a transient scope (=~ cgroup) and executes its + // argument (/bin/mount) there. + // * mount does its job, forks a fuse daemon if necessary and finishes. + // (systemd-run --scope finishes at this point, returning mount's exit + // code and stdout/stderr - thats one of --scope benefits). + // * systemd keeps the fuse daemon running in the scope (i.e. in its own + // cgroup) until the fuse daemon dies (another --scope benefit). + // Kubelet service can be restarted and the fuse daemon survives. + // * When the fuse daemon dies (e.g. during unmount) systemd removes the + // scope automatically. + // + // systemd-mount is not used because it's too new for older distros + // (CentOS 7, Debian Jessie). + mountCmd, mountArgs = addSystemdScope("systemd-run", target, mountCmd, mountArgs) + } else { + // No systemd-run on the host (or we failed to check it), assume kubelet + // does not run as a systemd service. + // No code here, mountCmd and mountArgs are already populated. + } + glog.V(4).Infof("Mounting cmd (%s) with arguments (%s)", mountCmd, mountArgs) command := exec.Command(mountCmd, mountArgs...) output, err := command.CombinedOutput() if err != nil { - glog.Errorf("Mount failed: %v\nMounting command: %s\nMounting arguments: %s %s %s %v\nOutput: %s\n", err, mountCmd, source, target, fstype, options, string(output)) - return fmt.Errorf("mount failed: %v\nMounting command: %s\nMounting arguments: %s %s %s %v\nOutput: %s\n", - err, mountCmd, source, target, fstype, options, string(output)) + args := strings.Join(mountArgs, " ") + glog.Errorf("Mount failed: %v\nMounting command: %s\nMounting arguments: %s\nOutput: %s\n", err, mountCmd, args, string(output)) + return fmt.Errorf("mount failed: %v\nMounting command: %s\nMounting arguments: %s\nOutput: %s\n", + err, mountCmd, args, string(output)) } return err } +// 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 +// systemd-runs (needed by Mount()) works. +func detectSystemd() bool { + if _, err := exec.LookPath("systemd-run"); err != nil { + glog.V(2).Infof("Detected OS without systemd") + return false + } + // Try to run systemd-run --scope /bin/true, that should be enough + // to make sure that systemd is really running and not just installed, + // which happens when running in a container with a systemd-based image + // but with different pid 1. + cmd := exec.Command("systemd-run", "--description=Kubernetes systemd probe", "--scope", "true") + output, err := cmd.CombinedOutput() + if err != nil { + glog.V(2).Infof("Cannot run systemd-run, assuming non-systemd OS") + glog.V(4).Infof("systemd-run failed with: %v", err) + glog.V(4).Infof("systemd-run output: %s", string(output)) + return false + } + glog.V(2).Infof("Detected OS with systemd") + return true +} + // makeMountArgs makes the arguments to the mount(8) command. func makeMountArgs(source, target, fstype string, options []string) []string { // Build mount command as follows: @@ -146,6 +213,13 @@ func makeMountArgs(source, target, fstype string, options []string) []string { return mountArgs } +// addSystemdScope adds "system-run --scope" to given command line +func addSystemdScope(systemdRunPath, mountName, command string, args []string) (string, []string) { + descriptionArg := fmt.Sprintf("--description=Kubernetes transient mount for %s", mountName) + systemdRunArgs := []string{descriptionArg, "--scope", "--", command} + return systemdRunPath, append(systemdRunArgs, args...) +} + // Unmount unmounts the target. func (mounter *Mounter) Unmount(target string) error { glog.V(4).Infof("Unmounting %s", target) diff --git a/pkg/util/mount/mount_unsupported.go b/pkg/util/mount/mount_unsupported.go index 632ad0606ee..6c4000a0ee8 100644 --- a/pkg/util/mount/mount_unsupported.go +++ b/pkg/util/mount/mount_unsupported.go @@ -22,6 +22,15 @@ type Mounter struct { mounterPath string } +// New returns a mount.Interface for the current system. +// It provides options to override the default mounter behavior. +// mounterPath allows using an alternative to `/bin/mount` for mounting. +func New(mounterPath string) Interface { + return &Mounter{ + mounterPath: mounterPath, + } +} + func (mounter *Mounter) Mount(source string, target string, fstype string, options []string) error { return nil } diff --git a/pkg/util/mount/nsenter_mount.go b/pkg/util/mount/nsenter_mount.go index 04c88bea44e..3f0e6efeb8d 100644 --- a/pkg/util/mount/nsenter_mount.go +++ b/pkg/util/mount/nsenter_mount.go @@ -51,7 +51,7 @@ import ( // contents. TODO: remove this requirement. // 6. The host image must have mount, findmnt, and umount binaries in /bin, // /usr/sbin, or /usr/bin -// +// 7. The host image should have systemd-run in /bin, /usr/sbin, or /usr/bin // For more information about mount propagation modes, see: // https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt type NsenterMounter struct { @@ -62,9 +62,10 @@ type NsenterMounter struct { func NewNsenterMounter() *NsenterMounter { m := &NsenterMounter{ paths: map[string]string{ - "mount": "", - "findmnt": "", - "umount": "", + "mount": "", + "findmnt": "", + "umount": "", + "systemd-run": "", }, } // search for the mount command in other locations besides /usr/bin @@ -80,6 +81,7 @@ func NewNsenterMounter() *NsenterMounter { break } // TODO: error, so that the kubelet can stop if the mounts don't exist + // (don't forget that systemd-run is optional) } return m } @@ -128,15 +130,47 @@ func (n *NsenterMounter) doNsenterMount(source, target, fstype string, options [ // makeNsenterArgs makes a list of argument to nsenter in order to do the // requested mount. func (n *NsenterMounter) makeNsenterArgs(source, target, fstype string, options []string) []string { + mountCmd := n.absHostPath("mount") + mountArgs := makeMountArgs(source, target, fstype, options) + + if systemdRunPath, hasSystemd := n.paths["systemd-run"]; hasSystemd { + // Complete command line: + // nsenter --mount=/rootfs/proc/1/ns/mnt -- /bin/systemd-run --description=... --scope -- /bin/mount -t + // Expected flow is: + // * nsenter breaks out of container's mount namespace and executes + // host's systemd-run. + // * systemd-run creates a transient scope (=~ cgroup) and executes its + // argument (/bin/mount) there. + // * mount does its job, forks a fuse daemon if necessary and finishes. + // (systemd-run --scope finishes at this point, returning mount's exit + // code and stdout/stderr - thats one of --scope benefits). + // * systemd keeps the fuse daemon running in the scope (i.e. in its own + // cgroup) until the fuse daemon dies (another --scope benefit). + // Kubelet container can be restarted and the fuse daemon survives. + // * When the daemon dies (e.g. during unmount) systemd removes the + // scope automatically. + mountCmd, mountArgs = addSystemdScope(systemdRunPath, target, mountCmd, mountArgs) + } else { + // Fall back to simple mount when the host has no systemd. + // Complete command line: + // nsenter --mount=/rootfs/proc/1/ns/mnt -- /bin/mount -t + // Expected flow is: + // * nsenter breaks out of container's mount namespace and executes host's /bin/mount. + // * mount does its job, forks a fuse daemon if necessary and finishes. + // * Any fuse daemon runs in cgroup of kubelet docker container, + // restart of kubelet container will kill it! + + // No code here, mountCmd and mountArgs use /bin/mount + } + nsenterArgs := []string{ "--mount=/rootfs/proc/1/ns/mnt", "--", - n.absHostPath("mount"), + mountCmd, } + nsenterArgs = append(nsenterArgs, mountArgs...) - args := makeMountArgs(source, target, fstype, options) - - return append(nsenterArgs, args...) + return nsenterArgs } // Unmount runs umount(8) in the host's mount namespace. @@ -147,7 +181,9 @@ func (n *NsenterMounter) Unmount(target string) error { n.absHostPath("umount"), target, } - + // No need to execute systemd-run here, it's enough that unmount is executed + // in the host's mount namespace. It will finish appropriate fuse daemon(s) + // running in any scope. glog.V(5).Infof("Unmount command: %v %v", nsenterPath, args) exec := exec.New() outputBytes, err := exec.Command(nsenterPath, args...).CombinedOutput() diff --git a/pkg/util/net/BUILD b/pkg/util/net/BUILD index 0c027b3bd46..d52a7782248 100644 --- a/pkg/util/net/BUILD +++ b/pkg/util/net/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/pkg/util/net/sets/BUILD b/pkg/util/net/sets/BUILD index 6084ba4d634..176ae688822 100644 --- a/pkg/util/net/sets/BUILD +++ b/pkg/util/net/sets/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,14 +12,12 @@ go_library( "doc.go", "ipnet.go", ], - tags = ["automanaged"], ) go_test( name = "go_default_test", srcs = ["ipnet_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/netsh/BUILD b/pkg/util/netsh/BUILD index aad5d109a52..54f502de1d6 100644 --- a/pkg/util/netsh/BUILD +++ b/pkg/util/netsh/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "netsh.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", diff --git a/pkg/util/netsh/testing/BUILD b/pkg/util/netsh/testing/BUILD index 6ef79785b2f..f3816d117e5 100644 --- a/pkg/util/netsh/testing/BUILD +++ b/pkg/util/netsh/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["fake.go"], - tags = ["automanaged"], deps = ["//pkg/util/netsh:go_default_library"], ) diff --git a/pkg/util/node/BUILD b/pkg/util/node/BUILD index b9db2d0b6c1..0c1f2348f77 100644 --- a/pkg/util/node/BUILD +++ b/pkg/util/node/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["node.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/kubelet/apis:go_default_library", @@ -28,7 +25,6 @@ go_test( name = "go_default_test", srcs = ["node_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubelet/apis:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/util/oom/BUILD b/pkg/util/oom/BUILD index 698ba71dfcf..11d79ceaab0 100644 --- a/pkg/util/oom/BUILD +++ b/pkg/util/oom/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,21 +12,37 @@ go_library( "doc.go", "oom.go", "oom_fake.go", - "oom_linux.go", - ], - tags = ["automanaged"], - deps = [ - "//pkg/kubelet/cm/util:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - ], + "oom_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "oom_linux.go", + ], + "//conditions:default": [], + }), + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//pkg/kubelet/cm/util:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + ], + "//conditions:default": [], + }), ) go_test( name = "go_default_test", - srcs = ["oom_linux_test.go"], + srcs = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "oom_linux_test.go", + ], + "//conditions:default": [], + }), library = ":go_default_library", - tags = ["automanaged"], - deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/stretchr/testify/assert:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/util/parsers/BUILD b/pkg/util/parsers/BUILD index f55eef73d24..a3b04cd6298 100644 --- a/pkg/util/parsers/BUILD +++ b/pkg/util/parsers/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["parsers.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/docker/distribution/reference:go_default_library"], ) @@ -19,7 +16,6 @@ go_test( name = "go_default_test", srcs = ["parsers_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/pointer/BUILD b/pkg/util/pointer/BUILD index ae1e6f269a5..3e75d456ee6 100644 --- a/pkg/util/pointer/BUILD +++ b/pkg/util/pointer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["pointer_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["pointer.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/procfs/BUILD b/pkg/util/procfs/BUILD index 141c693af87..999226f1f17 100644 --- a/pkg/util/procfs/BUILD +++ b/pkg/util/procfs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,26 +12,40 @@ go_library( "doc.go", "procfs.go", "procfs_fake.go", - "procfs_linux.go", - ], - tags = ["automanaged"], - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - ], + "procfs_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "procfs_linux.go", + ], + "//conditions:default": [], + }), + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", + ], + "//conditions:default": [], + }), ) go_test( name = "go_default_test", - srcs = ["procfs_linux_test.go"], + srcs = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "procfs_linux_test.go", + ], + "//conditions:default": [], + }), data = [ "example_proc_cgroup", ], library = ":go_default_library", - tags = [ - "automanaged", - ], - deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/stretchr/testify/assert:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/util/reflector/prometheus/BUILD b/pkg/util/reflector/prometheus/BUILD index f3d62fa0875..a13edbe11fe 100644 --- a/pkg/util/reflector/prometheus/BUILD +++ b/pkg/util/reflector/prometheus/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["prometheus.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", diff --git a/pkg/util/removeall/BUILD b/pkg/util/removeall/BUILD index 139d2f32df0..4de7ab0c4ed 100644 --- a/pkg/util/removeall/BUILD +++ b/pkg/util/removeall/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["removeall_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//vendor/k8s.io/client-go/util/testing:go_default_library", @@ -22,7 +19,6 @@ go_test( go_library( name = "go_default_library", srcs = ["removeall.go"], - tags = ["automanaged"], deps = ["//pkg/util/mount:go_default_library"], ) diff --git a/pkg/util/resourcecontainer/BUILD b/pkg/util/resourcecontainer/BUILD index 0aa3a24abeb..aa49ef97f07 100644 --- a/pkg/util/resourcecontainer/BUILD +++ b/pkg/util/resourcecontainer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,12 +7,21 @@ load( go_library( name = "go_default_library", - srcs = ["resource_container_linux.go"], - tags = ["automanaged"], - deps = [ - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", - ], + srcs = [ + "resource_container_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "resource_container_linux.go", + ], + "//conditions:default": [], + }), + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/util/rlimit/BUILD b/pkg/util/rlimit/BUILD index 757e2e7da4d..61c3f1d153b 100644 --- a/pkg/util/rlimit/BUILD +++ b/pkg/util/rlimit/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,9 +7,20 @@ load( go_library( name = "go_default_library", - srcs = ["rlimit_linux.go"], - tags = ["automanaged"], - deps = ["//vendor/golang.org/x/sys/unix:go_default_library"], + srcs = [ + "rlimit_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "rlimit_linux.go", + ], + "//conditions:default": [], + }), + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/util/selinux/BUILD b/pkg/util/selinux/BUILD index 7332ff366ba..933f123da00 100644 --- a/pkg/util/selinux/BUILD +++ b/pkg/util/selinux/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,10 +10,19 @@ go_library( srcs = [ "doc.go", "selinux.go", - "selinux_linux.go", - ], - tags = ["automanaged"], - deps = ["//vendor/github.com/opencontainers/runc/libcontainer/selinux:go_default_library"], + "selinux_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "selinux_linux.go", + ], + "//conditions:default": [], + }), + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/opencontainers/runc/libcontainer/selinux:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/util/slice/BUILD b/pkg/util/slice/BUILD index e7fe8c8adb9..ce8ed8d49e8 100644 --- a/pkg/util/slice/BUILD +++ b/pkg/util/slice/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["slice.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/util/rand:go_default_library"], ) @@ -19,7 +16,6 @@ go_test( name = "go_default_test", srcs = ["slice_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/strings/BUILD b/pkg/util/strings/BUILD index 3ef9877675c..abda343d558 100644 --- a/pkg/util/strings/BUILD +++ b/pkg/util/strings/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "line_delimiter.go", "strings.go", ], - tags = ["automanaged"], ) go_test( @@ -26,7 +23,6 @@ go_test( "strings_test.go", ], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/sysctl/BUILD b/pkg/util/sysctl/BUILD index 0819393af91..8e3964e0831 100644 --- a/pkg/util/sysctl/BUILD +++ b/pkg/util/sysctl/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["sysctl.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/sysctl/testing/BUILD b/pkg/util/sysctl/testing/BUILD index 11db51c9d03..35f916e9c5f 100644 --- a/pkg/util/sysctl/testing/BUILD +++ b/pkg/util/sysctl/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["fake.go"], - tags = ["automanaged"], deps = ["//pkg/util/sysctl:go_default_library"], ) diff --git a/pkg/util/system/BUILD b/pkg/util/system/BUILD index 58ef995bdd3..76994cf9ba7 100644 --- a/pkg/util/system/BUILD +++ b/pkg/util/system/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,14 +9,12 @@ load( go_library( name = "go_default_library", srcs = ["system_utils.go"], - tags = ["automanaged"], ) go_test( name = "go_default_test", srcs = ["system_utils_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/util/tail/BUILD b/pkg/util/tail/BUILD index 5d7a1b54c4f..ab15a92fe5f 100644 --- a/pkg/util/tail/BUILD +++ b/pkg/util/tail/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -25,11 +23,9 @@ go_test( name = "go_default_test", srcs = ["tail_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["tail.go"], - tags = ["automanaged"], ) diff --git a/pkg/util/taints/BUILD b/pkg/util/taints/BUILD index 70b7d555a81..b4a657494c8 100644 --- a/pkg/util/taints/BUILD +++ b/pkg/util/taints/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["taints.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", @@ -26,7 +23,6 @@ go_test( name = "go_default_test", srcs = ["taints_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/pkg/util/template/BUILD b/pkg/util/template/BUILD index 139097947d9..acac1110463 100644 --- a/pkg/util/template/BUILD +++ b/pkg/util/template/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,12 @@ go_test( name = "go_default_test", srcs = ["template_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], ) go_library( name = "go_default_library", srcs = ["template.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/term/BUILD b/pkg/util/term/BUILD index 0182b46ed25..1edebf3653c 100644 --- a/pkg/util/term/BUILD +++ b/pkg/util/term/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,8 +7,14 @@ load( go_library( name = "go_default_library", - srcs = ["setsize.go"], - tags = ["automanaged"], + srcs = [ + "setsize.go", + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "setsize_unsupported.go", + ], + "//conditions:default": [], + }), deps = [ "//vendor/github.com/docker/docker/pkg/term:go_default_library", "//vendor/k8s.io/client-go/tools/remotecommand:go_default_library", diff --git a/pkg/util/threading/BUILD b/pkg/util/threading/BUILD index 9dbcf74ee1f..9223edc9881 100644 --- a/pkg/util/threading/BUILD +++ b/pkg/util/threading/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["deadlock-detector.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/glog:go_default_library"], ) @@ -19,7 +16,6 @@ go_test( name = "go_default_test", srcs = ["deadlock-detector_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/tolerations/BUILD b/pkg/util/tolerations/BUILD index 95fa6fd3255..69e92874db9 100644 --- a/pkg/util/tolerations/BUILD +++ b/pkg/util/tolerations/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "tolerations.go", ], - tags = ["automanaged"], deps = ["//pkg/api:go_default_library"], ) @@ -35,6 +32,5 @@ go_test( name = "go_default_test", srcs = ["tolerations_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//pkg/api:go_default_library"], ) diff --git a/pkg/util/version/BUILD b/pkg/util/version/BUILD index dad16cf548a..ae2668b46cd 100644 --- a/pkg/util/version/BUILD +++ b/pkg/util/version/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,14 +12,12 @@ go_library( "doc.go", "version.go", ], - tags = ["automanaged"], ) go_test( name = "go_default_test", srcs = ["version_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/pkg/util/workqueue/prometheus/BUILD b/pkg/util/workqueue/prometheus/BUILD index 8953f349f8f..671ebf7bcfd 100644 --- a/pkg/util/workqueue/prometheus/BUILD +++ b/pkg/util/workqueue/prometheus/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["prometheus.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/k8s.io/client-go/util/workqueue:go_default_library", diff --git a/pkg/version/BUILD b/pkg/version/BUILD index 8aae1e53544..29363797f19 100644 --- a/pkg/version/BUILD +++ b/pkg/version/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "version.go", ], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/version:go_default_library"], ) diff --git a/pkg/version/prometheus/BUILD b/pkg/version/prometheus/BUILD index 133e737c356..fe9f8edc852 100644 --- a/pkg/version/prometheus/BUILD +++ b/pkg/version/prometheus/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["prometheus.go"], - tags = ["automanaged"], deps = [ "//pkg/version:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", diff --git a/pkg/version/verflag/BUILD b/pkg/version/verflag/BUILD index 114c8c4da8b..e3c7e41aabd 100644 --- a/pkg/version/verflag/BUILD +++ b/pkg/version/verflag/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["verflag.go"], - tags = ["automanaged"], deps = [ "//pkg/version:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/pkg/volume/BUILD b/pkg/volume/BUILD index dfd782201f8..d9646c1e06e 100644 --- a/pkg/volume/BUILD +++ b/pkg/volume/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -20,9 +18,13 @@ go_library( "plugins.go", "util.go", "volume.go", - "volume_linux.go", - ], - tags = ["automanaged"], + "volume_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "volume_linux.go", + ], + "//conditions:default": [], + }), deps = [ "//pkg/cloudprovider:go_default_library", "//pkg/util/io:go_default_library", @@ -51,7 +53,6 @@ go_test( "util_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/util/slice:go_default_library", @@ -68,16 +69,23 @@ go_test( go_test( name = "go_default_xtest", srcs = [ - "metrics_du_test.go", "metrics_statfs_test.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "metrics_du_test.go", + ], + "//conditions:default": [], + }), deps = [ - "//pkg/volume:go_default_library", + ":go_default_library", "//pkg/volume/testing:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", "//vendor/k8s.io/client-go/util/testing:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/volume/aws_ebs/BUILD b/pkg/volume/aws_ebs/BUILD index f5146d16c26..7b623b5f43a 100644 --- a/pkg/volume/aws_ebs/BUILD +++ b/pkg/volume/aws_ebs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "aws_util.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//pkg/cloudprovider/providers/aws:go_default_library", @@ -41,7 +38,6 @@ go_test( "aws_ebs_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/cloudprovider/providers/aws:go_default_library", "//pkg/util/mount:go_default_library", diff --git a/pkg/volume/azure_dd/BUILD b/pkg/volume/azure_dd/BUILD index 4a83820bba8..db2313fe564 100644 --- a/pkg/volume/azure_dd/BUILD +++ b/pkg/volume/azure_dd/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "azure_mounter.go", "azure_provision.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/cloudprovider:go_default_library", @@ -60,7 +57,6 @@ go_test( "azure_dd_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/volume:go_default_library", "//pkg/volume/testing:go_default_library", diff --git a/pkg/volume/azure_file/BUILD b/pkg/volume/azure_file/BUILD index cb14f5d3e78..c80778dfeec 100644 --- a/pkg/volume/azure_file/BUILD +++ b/pkg/volume/azure_file/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "azure_util.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//pkg/cloudprovider/providers/azure:go_default_library", @@ -38,7 +35,6 @@ go_test( name = "go_default_test", srcs = ["azure_file_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/cloudprovider/providers/azure:go_default_library", "//pkg/cloudprovider/providers/fake:go_default_library", diff --git a/pkg/volume/cephfs/BUILD b/pkg/volume/cephfs/BUILD index a1bd2227ae7..0680a740a8c 100644 --- a/pkg/volume/cephfs/BUILD +++ b/pkg/volume/cephfs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "cephfs.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/util/strings:go_default_library", @@ -31,7 +28,6 @@ go_test( name = "go_default_test", srcs = ["cephfs_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", diff --git a/pkg/volume/cinder/BUILD b/pkg/volume/cinder/BUILD index 7171735ea1c..d89b25de895 100644 --- a/pkg/volume/cinder/BUILD +++ b/pkg/volume/cinder/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "cinder_util.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//pkg/cloudprovider/providers/openstack:go_default_library", @@ -47,7 +44,6 @@ go_test( "cinder_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//pkg/util/mount:go_default_library", diff --git a/pkg/volume/configmap/BUILD b/pkg/volume/configmap/BUILD index 8945e3005b0..9e3537b6291 100644 --- a/pkg/volume/configmap/BUILD +++ b/pkg/volume/configmap/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "configmap.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//pkg/util/io:go_default_library", "//pkg/util/mount:go_default_library", @@ -33,7 +30,6 @@ go_test( name = "go_default_test", srcs = ["configmap_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/volume:go_default_library", "//pkg/volume/empty_dir:go_default_library", diff --git a/pkg/volume/downwardapi/BUILD b/pkg/volume/downwardapi/BUILD index 1cabf1aba86..36ca1489344 100644 --- a/pkg/volume/downwardapi/BUILD +++ b/pkg/volume/downwardapi/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["downwardapi.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1/resource:go_default_library", @@ -30,7 +27,6 @@ go_test( name = "go_default_test", srcs = ["downwardapi_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/fieldpath:go_default_library", "//pkg/volume:go_default_library", diff --git a/pkg/volume/empty_dir/BUILD b/pkg/volume/empty_dir/BUILD index c117c552d1a..f16bc3941ba 100644 --- a/pkg/volume/empty_dir/BUILD +++ b/pkg/volume/empty_dir/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,37 +11,52 @@ go_library( srcs = [ "doc.go", "empty_dir.go", - "empty_dir_linux.go", - ], - tags = ["automanaged"], + "empty_dir_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "empty_dir_linux.go", + ], + "//conditions:default": [], + }), deps = [ "//pkg/util/mount:go_default_library", "//pkg/util/strings:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/util:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "//conditions:default": [], + }), ) go_test( name = "go_default_test", - srcs = ["empty_dir_test.go"], + srcs = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "empty_dir_test.go", + ], + "//conditions:default": [], + }), library = ":go_default_library", - tags = ["automanaged"], - deps = [ - "//pkg/util/mount:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/client-go/util/testing:go_default_library", - ], + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//pkg/util/mount:go_default_library", + "//pkg/volume:go_default_library", + "//pkg/volume/testing:go_default_library", + "//pkg/volume/util:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/k8s.io/client-go/util/testing:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/volume/fc/BUILD b/pkg/volume/fc/BUILD index 09e8d9a561f..df6f13d053f 100644 --- a/pkg/volume/fc/BUILD +++ b/pkg/volume/fc/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "fc.go", "fc_util.go", ], - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/util/strings:go_default_library", @@ -37,7 +34,6 @@ go_test( "fc_util_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", diff --git a/pkg/volume/fc/attacher.go b/pkg/volume/fc/attacher.go index c582a03ea42..c0e469c35bf 100644 --- a/pkg/volume/fc/attacher.go +++ b/pkg/volume/fc/attacher.go @@ -20,6 +20,7 @@ import ( "fmt" "os" "strconv" + "strings" "time" "github.com/golang/glog" @@ -167,18 +168,27 @@ func volumeSpecToMounter(spec *volume.Spec, host volume.VolumeHost) (*fcDiskMoun if err != nil { return nil, err } - if fc.Lun == nil { - return nil, fmt.Errorf("empty lun") + var lun string + var wwids []string + if fc.Lun != nil && len(fc.TargetWWNs) != 0 { + lun = strconv.Itoa(int(*fc.Lun)) + } else if len(fc.WWIDs) != 0 { + for _, wwid := range fc.WWIDs { + wwids = append(wwids, strings.Replace(wwid, " ", "_", -1)) + } + } else { + return nil, fmt.Errorf("fc: no fc disk information found. failed to make a new mounter") } - lun := strconv.Itoa(int(*fc.Lun)) + return &fcDiskMounter{ fcDisk: &fcDisk{ plugin: &fcPlugin{ host: host, }, - wwns: fc.TargetWWNs, - lun: lun, - io: &osIOHandler{}, + wwns: fc.TargetWWNs, + lun: lun, + wwids: wwids, + io: &osIOHandler{}, }, fsType: fc.FSType, readOnly: readOnly, diff --git a/pkg/volume/fc/fc.go b/pkg/volume/fc/fc.go index 634cdb4ca63..26e69bd709f 100644 --- a/pkg/volume/fc/fc.go +++ b/pkg/volume/fc/fc.go @@ -19,12 +19,13 @@ package fc import ( "fmt" "strconv" + "strings" "github.com/golang/glog" "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/util/mount" - "k8s.io/kubernetes/pkg/util/strings" + utilstrings "k8s.io/kubernetes/pkg/util/strings" "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util" "k8s.io/utils/exec" @@ -62,8 +63,15 @@ func (plugin *fcPlugin) GetVolumeName(spec *volume.Spec) (string, error) { return "", err } - // TargetWWNs are the FibreChannel target worldwide names - return fmt.Sprintf("%v", volumeSource.TargetWWNs), nil + if len(volumeSource.TargetWWNs) != 0 { + // TargetWWNs are the FibreChannel target worldwide names + return fmt.Sprintf("%v", volumeSource.TargetWWNs), nil + } else if len(volumeSource.WWIDs) != 0 { + // WWIDs are the FibreChannel World Wide Identifiers + return fmt.Sprintf("%v", volumeSource.WWIDs), nil + } + + return "", err } func (plugin *fcPlugin) CanSupport(spec *volume.Spec) bool { @@ -106,18 +114,25 @@ func (plugin *fcPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, return nil, err } - if fc.Lun == nil { - return nil, fmt.Errorf("empty lun") + var lun string + var wwids []string + if fc.Lun != nil && len(fc.TargetWWNs) != 0 { + lun = strconv.Itoa(int(*fc.Lun)) + } else if len(fc.WWIDs) != 0 { + for _, wwid := range fc.WWIDs { + wwids = append(wwids, strings.Replace(wwid, " ", "_", -1)) + } + } else { + return nil, fmt.Errorf("fc: no fc disk information found. failed to make a new mounter") } - lun := strconv.Itoa(int(*fc.Lun)) - return &fcDiskMounter{ fcDisk: &fcDisk{ podUID: podUID, volName: spec.Name(), wwns: fc.TargetWWNs, lun: lun, + wwids: wwids, manager: manager, io: &osIOHandler{}, plugin: plugin}, @@ -166,6 +181,7 @@ type fcDisk struct { portal string wwns []string lun string + wwids []string plugin *fcPlugin // Utility interface that provides API calls to the provider to attach/detach disks. manager diskManager @@ -177,7 +193,7 @@ type fcDisk struct { func (fc *fcDisk) GetPath() string { name := fcPluginName // safe to use PodVolumeDir now: volume teardown occurs before pod is cleaned up - return fc.plugin.host.GetPodVolumeDir(fc.podUID, strings.EscapeQualifiedNameForDisk(name), fc.volName) + return fc.plugin.host.GetPodVolumeDir(fc.podUID, utilstrings.EscapeQualifiedNameForDisk(name), fc.volName) } type fcDiskMounter struct { diff --git a/pkg/volume/fc/fc_test.go b/pkg/volume/fc/fc_test.go index 2675f923ac1..e2662d2c909 100644 --- a/pkg/volume/fc/fc_test.go +++ b/pkg/volume/fc/fc_test.go @@ -193,13 +193,39 @@ func doTestPlugin(t *testing.T, spec *volume.Spec) { } } +func doTestPluginNilMounter(t *testing.T, spec *volume.Spec) { + tmpDir, err := utiltesting.MkTmpdir("fc_test") + if err != nil { + t.Fatalf("error creating temp dir: %v", err) + } + defer os.RemoveAll(tmpDir) + + plugMgr := volume.VolumePluginMgr{} + plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + + plug, err := plugMgr.FindPluginByName("kubernetes.io/fc") + if err != nil { + t.Errorf("Can't find the plugin by name") + } + fakeManager := NewFakeDiskManager() + defer fakeManager.Cleanup() + fakeMounter := &mount.FakeMounter{} + mounter, err := plug.(*fcPlugin).newMounterInternal(spec, types.UID("poduid"), fakeManager, fakeMounter) + if err == nil { + t.Errorf("Error failed to make a new Mounter is expected: %v", err) + } + if mounter != nil { + t.Errorf("A nil Mounter is expected: %v", err) + } +} + func TestPluginVolume(t *testing.T) { lun := int32(0) vol := &v1.Volume{ Name: "vol1", VolumeSource: v1.VolumeSource{ FC: &v1.FCVolumeSource{ - TargetWWNs: []string{"some_wwn"}, + TargetWWNs: []string{"500a0981891b8dc5"}, FSType: "ext4", Lun: &lun, }, @@ -217,7 +243,7 @@ func TestPluginPersistentVolume(t *testing.T) { Spec: v1.PersistentVolumeSpec{ PersistentVolumeSource: v1.PersistentVolumeSource{ FC: &v1.FCVolumeSource{ - TargetWWNs: []string{"some_wwn"}, + TargetWWNs: []string{"500a0981891b8dc5"}, FSType: "ext4", Lun: &lun, }, @@ -227,6 +253,64 @@ func TestPluginPersistentVolume(t *testing.T) { doTestPlugin(t, volume.NewSpecFromPersistentVolume(vol, false)) } +func TestPluginVolumeWWIDs(t *testing.T) { + vol := &v1.Volume{ + Name: "vol1", + VolumeSource: v1.VolumeSource{ + FC: &v1.FCVolumeSource{ + WWIDs: []string{"3600508b400105e210000900000490000"}, + FSType: "ext4", + }, + }, + } + doTestPlugin(t, volume.NewSpecFromVolume(vol)) +} + +func TestPluginPersistentVolumeWWIDs(t *testing.T) { + vol := &v1.PersistentVolume{ + ObjectMeta: metav1.ObjectMeta{ + Name: "vol1", + }, + Spec: v1.PersistentVolumeSpec{ + PersistentVolumeSource: v1.PersistentVolumeSource{ + FC: &v1.FCVolumeSource{ + WWIDs: []string{"3600508b400105e21 000900000490000"}, + FSType: "ext4", + }, + }, + }, + } + doTestPlugin(t, volume.NewSpecFromPersistentVolume(vol, false)) +} + +func TestPluginVolumeNoDiskInfo(t *testing.T) { + vol := &v1.Volume{ + Name: "vol1", + VolumeSource: v1.VolumeSource{ + FC: &v1.FCVolumeSource{ + FSType: "ext4", + }, + }, + } + doTestPluginNilMounter(t, volume.NewSpecFromVolume(vol)) +} + +func TestPluginPersistentVolumeNoDiskInfo(t *testing.T) { + vol := &v1.PersistentVolume{ + ObjectMeta: metav1.ObjectMeta{ + Name: "vol1", + }, + Spec: v1.PersistentVolumeSpec{ + PersistentVolumeSource: v1.PersistentVolumeSource{ + FC: &v1.FCVolumeSource{ + FSType: "ext4", + }, + }, + }, + } + doTestPluginNilMounter(t, volume.NewSpecFromPersistentVolume(vol, false)) +} + func TestPersistentClaimReadOnlyFlag(t *testing.T) { tmpDir, err := utiltesting.MkTmpdir("fc_test") if err != nil { diff --git a/pkg/volume/fc/fc_util.go b/pkg/volume/fc/fc_util.go index feded0c2723..5ad268c4b2f 100644 --- a/pkg/volume/fc/fc_util.go +++ b/pkg/volume/fc/fc_util.go @@ -89,6 +89,40 @@ func findDisk(wwn, lun string, io ioHandler) (string, string) { return "", "" } +// given a wwid, find the device and associated devicemapper parent +func findDiskWWIDs(wwid string, io ioHandler) (string, string) { + // Example wwid format: + // 3600508b400105e210000900000490000 + // + // Example of symlink under by-id: + // /dev/by-id/scsi-3600508b400105e210000900000490000 + // /dev/by-id/scsi-_ + // The wwid could contain white space and it will be replaced + // underscore when wwid is exposed under /dev/by-id. + + fc_path := "scsi-" + wwid + dev_id := "/dev/disk/by-id/" + if dirs, err := io.ReadDir(dev_id); err == nil { + for _, f := range dirs { + name := f.Name() + if name == fc_path { + disk, err := io.EvalSymlinks(dev_id + name) + if err != nil { + glog.V(2).Infof("fc: failed to find a corresponding disk from symlink[%s], error %v", dev_id+name, err) + return "", "" + } + arr := strings.Split(disk, "/") + l := len(arr) - 1 + dev := arr[l] + dm := findMultipathDeviceMapper(dev, io) + return disk, dm + } + } + } + glog.V(2).Infof("fc: failed to find a disk [%s]", dev_id+fc_path) + return "", "" +} + // Removes a scsi device based upon /dev/sdX name func removeFromScsiSubsystem(deviceName string, io ioHandler) { fileName := "/sys/block/" + deviceName + "/device/delete" @@ -110,27 +144,46 @@ func scsiHostRescan(io ioHandler) { } // make a directory like /var/lib/kubelet/plugins/kubernetes.io/pod/fc/target-lun-0 -func makePDNameInternal(host volume.VolumeHost, wwns []string, lun string) string { - return path.Join(host.GetPluginDir(fcPluginName), wwns[0]+"-lun-"+lun) +func makePDNameInternal(host volume.VolumeHost, wwns []string, lun string, wwids []string) string { + if len(wwns) != 0 { + return path.Join(host.GetPluginDir(fcPluginName), wwns[0]+"-lun-"+lun) + } else { + return path.Join(host.GetPluginDir(fcPluginName), wwids[0]) + } } type FCUtil struct{} func (util *FCUtil) MakeGlobalPDName(fc fcDisk) string { - return makePDNameInternal(fc.plugin.host, fc.wwns, fc.lun) + return makePDNameInternal(fc.plugin.host, fc.wwns, fc.lun, fc.wwids) } -func searchDisk(wwns []string, lun string, io ioHandler) (string, string) { - disk := "" - dm := "" +func searchDisk(b fcDiskMounter) (string, string) { + var diskIds []string + var disk string + var dm string + io := b.io + wwids := b.wwids + wwns := b.wwns + lun := b.lun + + if len(wwns) != 0 { + diskIds = wwns + } else { + diskIds = wwids + } rescaned := false // two-phase search: // first phase, search existing device path, if a multipath dm is found, exit loop // otherwise, in second phase, rescan scsi bus and search again, return with any findings for true { - for _, wwn := range wwns { - disk, dm = findDisk(wwn, lun, io) + for _, diskId := range diskIds { + if len(wwns) != 0 { + disk, dm = findDisk(diskId, lun, io) + } else { + disk, dm = findDiskWWIDs(diskId, io) + } // if multipath device is found, break if dm != "" { break @@ -150,10 +203,9 @@ func searchDisk(wwns []string, lun string, io ioHandler) (string, string) { func (util *FCUtil) AttachDisk(b fcDiskMounter) (string, error) { devicePath := "" - wwns := b.wwns - lun := b.lun - io := b.io - disk, dm := searchDisk(wwns, lun, io) + var disk, dm string + + disk, dm = searchDisk(b) // if no disk matches input wwn and lun, exit if disk == "" && dm == "" { return "", fmt.Errorf("no fc disk found") diff --git a/pkg/volume/fc/fc_util_test.go b/pkg/volume/fc/fc_util_test.go index e6ae7a6f2c2..d9f609592b4 100644 --- a/pkg/volume/fc/fc_util_test.go +++ b/pkg/volume/fc/fc_util_test.go @@ -63,6 +63,11 @@ func (handler *fakeIOHandler) ReadDir(dirname string) ([]os.FileInfo, error) { name: "dm-1", } return []os.FileInfo{f}, nil + case "/dev/disk/by-id/": + f := &fakeFileInfo{ + name: "scsi-3600508b400105e210000900000490000", + } + return []os.FileInfo{f}, nil } return nil, nil } @@ -79,13 +84,31 @@ func (handler *fakeIOHandler) WriteFile(filename string, data []byte, perm os.Fi return nil } -func TestIoHandler(t *testing.T) { - io := &fakeIOHandler{} - wwns := []string{"500a0981891b8dc5"} - lun := "0" - disk, dm := searchDisk(wwns, lun, io) +func TestSearchDisk(t *testing.T) { + fakeMounter := fcDiskMounter{ + fcDisk: &fcDisk{ + wwns: []string{"500a0981891b8dc5"}, + lun: "0", + io: &fakeIOHandler{}, + }, + } + disk, dm := searchDisk(fakeMounter) // if no disk matches input wwn and lun, exit if disk == "" && dm == "" { t.Errorf("no fc disk found") } } + +func TestSearchDiskWWID(t *testing.T) { + fakeMounter := fcDiskMounter{ + fcDisk: &fcDisk{ + wwids: []string{"3600508b400105e210000900000490000"}, + io: &fakeIOHandler{}, + }, + } + disk, dm := searchDisk(fakeMounter) + // if no disk matches input wwid, exit + if disk == "" && dm == "" { + t.Errorf("no fc disk found") + } +} diff --git a/pkg/volume/flexvolume/BUILD b/pkg/volume/flexvolume/BUILD index ff746d60cc7..3a78103ab86 100644 --- a/pkg/volume/flexvolume/BUILD +++ b/pkg/volume/flexvolume/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -26,7 +24,6 @@ go_library( "util.go", "volume.go", ], - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/util/strings:go_default_library", @@ -51,7 +48,6 @@ go_test( "unmounter_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", diff --git a/pkg/volume/flocker/BUILD b/pkg/volume/flocker/BUILD index 7a49a89d8de..468438111e9 100644 --- a/pkg/volume/flocker/BUILD +++ b/pkg/volume/flocker/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "flocker_util.go", "flocker_volume.go", ], - tags = ["automanaged"], deps = [ "//pkg/util/env:go_default_library", "//pkg/util/mount:go_default_library", @@ -42,7 +39,6 @@ go_test( "flocker_volume_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", diff --git a/pkg/volume/gce_pd/BUILD b/pkg/volume/gce_pd/BUILD index 1282d7a6746..a3d28e7a1f4 100644 --- a/pkg/volume/gce_pd/BUILD +++ b/pkg/volume/gce_pd/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "gce_pd.go", "gce_util.go", ], - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//pkg/cloudprovider/providers/gce:go_default_library", @@ -42,7 +39,6 @@ go_test( "gce_pd_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", diff --git a/pkg/volume/git_repo/BUILD b/pkg/volume/git_repo/BUILD index 2bf3b257f78..be57c22489e 100644 --- a/pkg/volume/git_repo/BUILD +++ b/pkg/volume/git_repo/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "git_repo.go", ], - tags = ["automanaged"], deps = [ "//pkg/util/strings:go_default_library", "//pkg/volume:go_default_library", @@ -29,7 +26,6 @@ go_test( name = "go_default_test", srcs = ["git_repo_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/volume:go_default_library", "//pkg/volume/empty_dir:go_default_library", diff --git a/pkg/volume/glusterfs/BUILD b/pkg/volume/glusterfs/BUILD index 081e5b6caf9..b895c99116a 100644 --- a/pkg/volume/glusterfs/BUILD +++ b/pkg/volume/glusterfs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "glusterfs_minmax.go", "glusterfs_util.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/helper:go_default_library", "//pkg/util/mount:go_default_library", @@ -33,6 +30,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", ], @@ -45,7 +43,6 @@ go_test( "glusterfs_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", diff --git a/pkg/volume/glusterfs/glusterfs.go b/pkg/volume/glusterfs/glusterfs.go index d24b903f34d..9088688f3b1 100644 --- a/pkg/volume/glusterfs/glusterfs.go +++ b/pkg/volume/glusterfs/glusterfs.go @@ -35,6 +35,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/sets" clientset "k8s.io/client-go/kubernetes" v1helper "k8s.io/kubernetes/pkg/api/v1/helper" "k8s.io/kubernetes/pkg/util/mount" @@ -322,12 +323,14 @@ func (b *glusterfsMounter) setUpAtInternal(dir string) error { if b.hosts == nil { return fmt.Errorf("glusterfs: endpoint is nil") } - addr := make(map[string]struct{}) + addr := sets.String{} if b.hosts.Subsets != nil { for _, s := range b.hosts.Subsets { for _, a := range s.Addresses { - addr[a.IP] = struct{}{} - addrlist = append(addrlist, a.IP) + if !addr.Has(a.IP) { + addr.Insert(a.IP) + addrlist = append(addrlist, a.IP) + } } } @@ -374,7 +377,6 @@ func (b *glusterfsMounter) setUpAtInternal(dir string) error { // it all goes in a log file, we will read the log file logErr := readGlusterLog(log, b.pod.Name) if logErr != nil { - // return fmt.Errorf("glusterfs: mount failed: %v", logErr) return fmt.Errorf("glusterfs: mount failed: %v the following error information was pulled from the glusterfs log to help diagnose this issue: %v", errs, logErr) } return fmt.Errorf("glusterfs: mount failed: %v", errs) @@ -390,7 +392,7 @@ func getVolumeSource( return spec.PersistentVolume.Spec.Glusterfs, spec.ReadOnly, nil } - return nil, false, fmt.Errorf("Spec does not reference a GlusterFS volume type") + return nil, false, fmt.Errorf("Spec does not reference a Glusterfs volume type") } func (plugin *glusterfsPlugin) NewProvisioner(options volume.VolumeOptions) (volume.Provisioner, error) { @@ -488,10 +490,8 @@ func (d *glusterfsVolumeDeleter) GetPath() string { return d.plugin.host.GetPodVolumeDir(d.glusterfsMounter.glusterfs.pod.UID, strings.EscapeQualifiedNameForDisk(name), d.glusterfsMounter.glusterfs.volName) } -// // Traverse the PVs, fetching all the GIDs from those // in a given storage class, and mark them in the table. -// func (plugin *glusterfsPlugin) collectGids(className string, gidTable *MinMaxAllocator) error { kubeClient := plugin.host.GetKubeClient() if kubeClient == nil { @@ -535,12 +535,10 @@ func (plugin *glusterfsPlugin) collectGids(className string, gidTable *MinMaxAll return nil } -// // Return the gid table for a storage class. // - If this is the first time, fill it with all the gids // used in PVs of this storage class by traversing the PVs. // - Adapt the range of the table to the current range of the SC. -// func (plugin *glusterfsPlugin) getGidTable(className string, min int, max int) (*MinMaxAllocator, error) { plugin.gidTableLock.Lock() gidTable, ok := plugin.gidTable[className] diff --git a/pkg/volume/host_path/BUILD b/pkg/volume/host_path/BUILD index ecc3b5e96b7..d55dabee5ce 100644 --- a/pkg/volume/host_path/BUILD +++ b/pkg/volume/host_path/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "host_path.go", ], - tags = ["automanaged"], deps = [ "//pkg/volume:go_default_library", "//pkg/volume/util/volumehelper:go_default_library", @@ -28,20 +25,27 @@ go_library( go_test( name = "go_default_test", - srcs = ["host_path_test.go"], + srcs = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "host_path_test.go", + ], + "//conditions:default": [], + }), library = ":go_default_library", - tags = ["automanaged"], - deps = [ - "//pkg/util/file:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//vendor/k8s.io/api/core/v1: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/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", - ], + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//pkg/util/file:go_default_library", + "//pkg/volume:go_default_library", + "//pkg/volume/testing:go_default_library", + "//vendor/k8s.io/api/core/v1: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/types:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/volume/iscsi/BUILD b/pkg/volume/iscsi/BUILD index a3573775a01..823e394c847 100644 --- a/pkg/volume/iscsi/BUILD +++ b/pkg/volume/iscsi/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "iscsi.go", "iscsi_util.go", ], - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/util/strings:go_default_library", @@ -36,7 +33,6 @@ go_test( "iscsi_util_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", diff --git a/pkg/volume/local/BUILD b/pkg/volume/local/BUILD index c1594670e15..beab00e289c 100644 --- a/pkg/volume/local/BUILD +++ b/pkg/volume/local/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "local.go", ], - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/util/strings:go_default_library", @@ -32,7 +29,6 @@ go_test( name = "go_default_test", srcs = ["local_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/volume:go_default_library", "//pkg/volume/testing:go_default_library", diff --git a/pkg/volume/nfs/BUILD b/pkg/volume/nfs/BUILD index 41fc7be5835..40a22756059 100644 --- a/pkg/volume/nfs/BUILD +++ b/pkg/volume/nfs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "nfs.go", ], - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/util/strings:go_default_library", @@ -32,7 +29,6 @@ go_test( name = "go_default_test", srcs = ["nfs_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", diff --git a/pkg/volume/photon_pd/BUILD b/pkg/volume/photon_pd/BUILD index e213563435a..d35face84e1 100644 --- a/pkg/volume/photon_pd/BUILD +++ b/pkg/volume/photon_pd/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "photon_pd.go", "photon_util.go", ], - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//pkg/cloudprovider/providers/photon:go_default_library", @@ -40,7 +37,6 @@ go_test( "photon_pd_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/cloudprovider/providers/photon:go_default_library", "//pkg/util/mount:go_default_library", diff --git a/pkg/volume/photon_pd/attacher.go b/pkg/volume/photon_pd/attacher.go index 9dd7e3f7677..b68fcc26534 100644 --- a/pkg/volume/photon_pd/attacher.go +++ b/pkg/volume/photon_pd/attacher.go @@ -67,14 +67,21 @@ func (attacher *photonPersistentDiskAttacher) Attach(spec *volume.Spec, nodeName glog.Errorf("Photon Controller attacher: Attach failed to get volume source") return "", err } + attached, err := attacher.photonDisks.DiskIsAttached(volumeSource.PdID, nodeName) - glog.V(4).Infof("Photon Controller: Attach disk called for host %s", hostName) - - // TODO: if disk is already attached? - err = attacher.photonDisks.AttachDisk(volumeSource.PdID, nodeName) if err != nil { - glog.Errorf("Error attaching volume %q to node %q: %+v", volumeSource.PdID, nodeName, err) - return "", err + glog.Warningf("Photon Controller: couldn't check if disk is Attached for host %s, will try attach disk: %+v", hostName, err) + attached = false + } + + if !attached { + glog.V(4).Infof("Photon Controller: Attach disk called for host %s", hostName) + + err = attacher.photonDisks.AttachDisk(volumeSource.PdID, nodeName) + if err != nil { + glog.Errorf("Error attaching volume %q to node %q: %+v", volumeSource.PdID, nodeName, err) + return "", err + } } PdidWithNoHypens := strings.Replace(volumeSource.PdID, "-", "", -1) diff --git a/pkg/volume/photon_pd/attacher_test.go b/pkg/volume/photon_pd/attacher_test.go index 9cdbe364adc..47f89077f18 100644 --- a/pkg/volume/photon_pd/attacher_test.go +++ b/pkg/volume/photon_pd/attacher_test.go @@ -78,14 +78,14 @@ func TestAttachDetach(t *testing.T) { nodeName := types.NodeName("instance") readOnly := false spec := createVolSpec(diskName, readOnly) - attachError := errors.New("Fake attach error") detachError := errors.New("Fake detach error") diskCheckError := errors.New("Fake DiskIsAttached error") tests := []testcase{ // Successful Attach call { - name: "Attach_Positive", - attach: attachCall{diskName, nodeName, nil}, + name: "Attach_Positive", + diskIsAttached: diskIsAttachedCall{diskName, nodeName, false, diskCheckError}, + attach: attachCall{diskName, nodeName, nil}, test: func(testcase *testcase) (string, error) { attacher := newAttacher(testcase) return attacher.Attach(spec, nodeName) @@ -93,15 +93,16 @@ func TestAttachDetach(t *testing.T) { expectedDevice: "/dev/disk/by-id/wwn-0x000000000", }, - // Attach call fails + // Disk is already attached { - name: "Attach_Negative", - attach: attachCall{diskName, nodeName, attachError}, + name: "Attach_Positive_AlreadyAttached", + diskIsAttached: diskIsAttachedCall{diskName, nodeName, false, diskCheckError}, + attach: attachCall{diskName, nodeName, nil}, test: func(testcase *testcase) (string, error) { attacher := newAttacher(testcase) return attacher.Attach(spec, nodeName) }, - expectedError: attachError, + expectedDevice: "/dev/disk/by-id/wwn-0x000000000", }, // Detach succeeds diff --git a/pkg/volume/portworx/BUILD b/pkg/volume/portworx/BUILD index ada0894b698..5f7d8abe3ce 100644 --- a/pkg/volume/portworx/BUILD +++ b/pkg/volume/portworx/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["portworx_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", @@ -30,7 +27,6 @@ go_library( "portworx.go", "portworx_util.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/util/mount:go_default_library", diff --git a/pkg/volume/projected/BUILD b/pkg/volume/projected/BUILD index dd94b5d13b9..32d9792192b 100644 --- a/pkg/volume/projected/BUILD +++ b/pkg/volume/projected/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["projected_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/volume:go_default_library", "//pkg/volume/empty_dir:go_default_library", @@ -29,7 +26,6 @@ go_test( go_library( name = "go_default_library", srcs = ["projected.go"], - tags = ["automanaged"], deps = [ "//pkg/util/strings:go_default_library", "//pkg/volume:go_default_library", diff --git a/pkg/volume/quobyte/BUILD b/pkg/volume/quobyte/BUILD index 08baef4b446..d72c52334e8 100644 --- a/pkg/volume/quobyte/BUILD +++ b/pkg/volume/quobyte/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "quobyte.go", "quobyte_util.go", ], - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/util/strings:go_default_library", @@ -37,7 +34,6 @@ go_test( name = "go_default_test", srcs = ["quobyte_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", diff --git a/pkg/volume/rbd/BUILD b/pkg/volume/rbd/BUILD index e88adf13f98..32b6efcfab8 100644 --- a/pkg/volume/rbd/BUILD +++ b/pkg/volume/rbd/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "rbd.go", "rbd_util.go", ], - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/util/node:go_default_library", @@ -40,7 +37,6 @@ go_test( name = "go_default_test", srcs = ["rbd_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", diff --git a/pkg/volume/scaleio/BUILD b/pkg/volume/scaleio/BUILD index 5fa4a9b5111..cdd168fd922 100644 --- a/pkg/volume/scaleio/BUILD +++ b/pkg/volume/scaleio/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "sio_volume_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", @@ -40,7 +37,6 @@ go_library( "sio_util.go", "sio_volume.go", ], - tags = ["automanaged"], deps = [ "//pkg/util/keymutex:go_default_library", "//pkg/util/mount:go_default_library", diff --git a/pkg/volume/secret/BUILD b/pkg/volume/secret/BUILD index b0a73270a0a..7743e788fb3 100644 --- a/pkg/volume/secret/BUILD +++ b/pkg/volume/secret/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "secret.go", ], - tags = ["automanaged"], deps = [ "//pkg/util/io:go_default_library", "//pkg/util/mount:go_default_library", @@ -33,7 +30,6 @@ go_test( name = "go_default_test", srcs = ["secret_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/volume:go_default_library", "//pkg/volume/empty_dir:go_default_library", diff --git a/pkg/volume/storageos/BUILD b/pkg/volume/storageos/BUILD index 2e5268c9b97..14e5a73d016 100644 --- a/pkg/volume/storageos/BUILD +++ b/pkg/volume/storageos/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "storageos.go", "storageos_util.go", ], - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/util/strings:go_default_library", @@ -41,7 +38,6 @@ go_test( "storageos_util_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", diff --git a/pkg/volume/testing/BUILD b/pkg/volume/testing/BUILD index 1199cf8edb2..511fc72710b 100644 --- a/pkg/volume/testing/BUILD +++ b/pkg/volume/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "mock_volume.go", "testing.go", ], - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//pkg/util/io:go_default_library", diff --git a/pkg/volume/util/BUILD b/pkg/volume/util/BUILD index 62a1814fd68..85c3ee9423b 100644 --- a/pkg/volume/util/BUILD +++ b/pkg/volume/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,19 +11,26 @@ go_library( srcs = [ "atomic_writer.go", "device_util.go", - "device_util_linux.go", + "device_util_unsupported.go", "doc.go", - "fs.go", + "fs_unsupported.go", "io_util.go", "util.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "fs.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "device_util_linux.go", + "fs.go", + ], + "//conditions:default": [], + }), deps = [ "//pkg/api:go_default_library", "//pkg/api/v1/helper:go_default_library", "//pkg/util/mount:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/storage/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", @@ -34,26 +39,41 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "//conditions:default": [], + }), ) go_test( name = "go_default_test", srcs = [ - "atomic_writer_test.go", - "device_util_linux_test.go", "util_test.go", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "atomic_writer_test.go", + "device_util_linux_test.go", + ], + "//conditions:default": [], + }), library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api/install:go_default_library", "//pkg/api/v1/helper:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/client-go/util/testing:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//vendor/k8s.io/client-go/util/testing:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/pkg/volume/util/nestedpendingoperations/BUILD b/pkg/volume/util/nestedpendingoperations/BUILD index cc7a4516f5d..60efd00a211 100644 --- a/pkg/volume/util/nestedpendingoperations/BUILD +++ b/pkg/volume/util/nestedpendingoperations/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["nestedpendingoperations.go"], - tags = ["automanaged"], deps = [ "//pkg/util/goroutinemap/exponentialbackoff:go_default_library", "//pkg/volume/util/types:go_default_library", @@ -25,7 +22,6 @@ go_test( name = "go_default_test", srcs = ["nestedpendingoperations_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/volume/util/types:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/volume/util/operationexecutor/BUILD b/pkg/volume/util/operationexecutor/BUILD index 031def0ad60..dae1131fc3a 100644 --- a/pkg/volume/util/operationexecutor/BUILD +++ b/pkg/volume/util/operationexecutor/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "operation_executor.go", "operation_generator.go", ], - tags = ["automanaged"], deps = [ "//pkg/features:go_default_library", "//pkg/kubelet/events:go_default_library", @@ -39,7 +36,6 @@ go_test( name = "go_default_test", srcs = ["operation_executor_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", diff --git a/pkg/volume/util/types/BUILD b/pkg/volume/util/types/BUILD index 84e820bbc83..5d7380241eb 100644 --- a/pkg/volume/util/types/BUILD +++ b/pkg/volume/util/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["types.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/types:go_default_library"], ) diff --git a/pkg/volume/util/volumehelper/BUILD b/pkg/volume/util/volumehelper/BUILD index 690386c03be..1880d21c058 100644 --- a/pkg/volume/util/volumehelper/BUILD +++ b/pkg/volume/util/volumehelper/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["volumehelper.go"], - tags = ["automanaged"], deps = [ "//pkg/volume:go_default_library", "//pkg/volume/util/types:go_default_library", diff --git a/pkg/volume/validation/BUILD b/pkg/volume/validation/BUILD index d171e0f0a2d..b64dc983784 100644 --- a/pkg/volume/validation/BUILD +++ b/pkg/volume/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["pv_validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", @@ -23,7 +20,6 @@ go_test( go_library( name = "go_default_library", srcs = ["pv_validation.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", diff --git a/pkg/volume/vsphere_volume/BUILD b/pkg/volume/vsphere_volume/BUILD index 452fe1ae8bb..e118362772b 100644 --- a/pkg/volume/vsphere_volume/BUILD +++ b/pkg/volume/vsphere_volume/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,10 +13,10 @@ go_library( "vsphere_volume.go", "vsphere_volume_util.go", ], - tags = ["automanaged"], deps = [ "//pkg/cloudprovider:go_default_library", "//pkg/cloudprovider/providers/vsphere:go_default_library", + "//pkg/cloudprovider/providers/vsphere/vclib:go_default_library", "//pkg/util/keymutex:go_default_library", "//pkg/util/mount:go_default_library", "//pkg/util/strings:go_default_library", @@ -41,9 +39,8 @@ go_test( "vsphere_volume_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ - "//pkg/cloudprovider/providers/vsphere:go_default_library", + "//pkg/cloudprovider/providers/vsphere/vclib:go_default_library", "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/testing:go_default_library", diff --git a/pkg/volume/vsphere_volume/attacher.go b/pkg/volume/vsphere_volume/attacher.go index 9155d84adaf..f7a58c80d4e 100644 --- a/pkg/volume/vsphere_volume/attacher.go +++ b/pkg/volume/vsphere_volume/attacher.go @@ -75,7 +75,7 @@ func (attacher *vsphereVMDKAttacher) Attach(spec *volume.Spec, nodeName types.No // vsphereCloud.AttachDisk checks if disk is already attached to host and // succeeds in that case, so no need to do that separately. - _, diskUUID, err := attacher.vsphereVolumes.AttachDisk(volumeSource.VolumePath, volumeSource.StoragePolicyID, nodeName) + diskUUID, err := attacher.vsphereVolumes.AttachDisk(volumeSource.VolumePath, volumeSource.StoragePolicyID, nodeName) if err != nil { glog.Errorf("Error attaching volume %q to node %q: %+v", volumeSource.VolumePath, nodeName, err) return "", err diff --git a/pkg/volume/vsphere_volume/attacher_test.go b/pkg/volume/vsphere_volume/attacher_test.go index a6f07625334..dbd007dfb06 100644 --- a/pkg/volume/vsphere_volume/attacher_test.go +++ b/pkg/volume/vsphere_volume/attacher_test.go @@ -21,7 +21,7 @@ import ( "testing" "k8s.io/api/core/v1" - "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere" + "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib" "k8s.io/kubernetes/pkg/volume" volumetest "k8s.io/kubernetes/pkg/volume/testing" @@ -233,29 +233,29 @@ type diskIsAttachedCall struct { ret error } -func (testcase *testcase) AttachDisk(diskName string, storagePolicyName string, nodeName types.NodeName) (string, string, error) { +func (testcase *testcase) AttachDisk(diskName string, storagePolicyName string, nodeName types.NodeName) (string, error) { expected := &testcase.attach if expected.diskName == "" && expected.nodeName == "" { // testcase.attach looks uninitialized, test did not expect to call // AttachDisk testcase.t.Errorf("Unexpected AttachDisk call!") - return "", "", errors.New("Unexpected AttachDisk call!") + return "", errors.New("Unexpected AttachDisk call!") } if expected.diskName != diskName { testcase.t.Errorf("Unexpected AttachDisk call: expected diskName %s, got %s", expected.diskName, diskName) - return "", "", errors.New("Unexpected AttachDisk call: wrong diskName") + return "", errors.New("Unexpected AttachDisk call: wrong diskName") } if expected.nodeName != nodeName { testcase.t.Errorf("Unexpected AttachDisk call: expected nodeName %s, got %s", expected.nodeName, nodeName) - return "", "", errors.New("Unexpected AttachDisk call: wrong nodeName") + return "", errors.New("Unexpected AttachDisk call: wrong nodeName") } glog.V(4).Infof("AttachDisk call: %s, %s, returning %q, %v", diskName, nodeName, expected.retDeviceUUID, expected.ret) - return "", expected.retDeviceUUID, expected.ret + return expected.retDeviceUUID, expected.ret } func (testcase *testcase) DetachDisk(diskName string, nodeName types.NodeName) error { @@ -312,7 +312,7 @@ func (testcase *testcase) DisksAreAttached(diskNames []string, nodeName types.No return nil, errors.New("Not implemented") } -func (testcase *testcase) CreateVolume(volumeOptions *vsphere.VolumeOptions) (volumePath string, err error) { +func (testcase *testcase) CreateVolume(volumeOptions *vclib.VolumeOptions) (volumePath string, err error) { return "", errors.New("Not implemented") } diff --git a/pkg/volume/vsphere_volume/vsphere_volume_util.go b/pkg/volume/vsphere_volume/vsphere_volume_util.go index 4a43402a61c..62ce1f7620b 100644 --- a/pkg/volume/vsphere_volume/vsphere_volume_util.go +++ b/pkg/volume/vsphere_volume/vsphere_volume_util.go @@ -27,6 +27,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere" + "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib" "k8s.io/kubernetes/pkg/volume" volumeutil "k8s.io/kubernetes/pkg/volume/util" ) @@ -94,7 +95,7 @@ func (util *VsphereDiskUtil) CreateVolume(v *vsphereVolumeProvisioner) (volSpec // vSphere works with kilobytes, convert to KiB with rounding up volSizeKB := int(volume.RoundUpSize(volSizeBytes, 1024)) name := volume.GenerateVolumeName(v.options.ClusterName, v.options.PVName, 255) - volumeOptions := &vsphere.VolumeOptions{ + volumeOptions := &vclib.VolumeOptions{ CapacityKB: volSizeKB, Tags: *v.options.CloudTags, Name: name, @@ -129,7 +130,7 @@ func (util *VsphereDiskUtil) CreateVolume(v *vsphereVolumeProvisioner) (volSpec if volumeOptions.VSANStorageProfileData != "" { if volumeOptions.StoragePolicyName != "" { - return nil, fmt.Errorf("Cannot specify storage policy capabilities along with storage policy name. Please specify only one.") + return nil, fmt.Errorf("Cannot specify storage policy capabilities along with storage policy name. Please specify only one") } volumeOptions.VSANStorageProfileData = "(" + volumeOptions.VSANStorageProfileData + ")" } @@ -141,7 +142,6 @@ func (util *VsphereDiskUtil) CreateVolume(v *vsphereVolumeProvisioner) (volSpec vmDiskPath, err := cloud.CreateVolume(volumeOptions) if err != nil { - glog.V(2).Infof("Error creating vsphere volume: %v", err) return nil, err } volSpec = &VolumeSpec{ diff --git a/pkg/watch/BUILD b/pkg/watch/BUILD index af76644e94f..79e41daa4b8 100644 --- a/pkg/watch/BUILD +++ b/pkg/watch/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/pkg/watch/json/BUILD b/pkg/watch/json/BUILD index 2de7ce5216d..bfaa1692627 100644 --- a/pkg/watch/json/BUILD +++ b/pkg/watch/json/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "types.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", diff --git a/pkg/watch/versioned/BUILD b/pkg/watch/versioned/BUILD index de4fac951c2..50c3c3b82cb 100644 --- a/pkg/watch/versioned/BUILD +++ b/pkg/watch/versioned/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["readonly.go"], - tags = ["automanaged"], ) filegroup( diff --git a/plugin/BUILD b/plugin/BUILD index 88d9d0e0633..a58f83e180b 100644 --- a/plugin/BUILD +++ b/plugin/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/plugin/cmd/kube-scheduler/BUILD b/plugin/cmd/kube-scheduler/BUILD index 3027519483f..52bea2b6b93 100644 --- a/plugin/cmd/kube-scheduler/BUILD +++ b/plugin/cmd/kube-scheduler/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -18,14 +16,12 @@ go_binary( "-static", ], library = ":go_default_library", - tags = ["automanaged"], x_defs = version_x_defs(), ) go_library( name = "go_default_library", srcs = ["scheduler.go"], - tags = ["automanaged"], deps = [ "//pkg/version/verflag:go_default_library", "//plugin/cmd/kube-scheduler/app:go_default_library", diff --git a/plugin/cmd/kube-scheduler/app/BUILD b/plugin/cmd/kube-scheduler/app/BUILD index b1a5d104a33..64325cbaac0 100644 --- a/plugin/cmd/kube-scheduler/app/BUILD +++ b/plugin/cmd/kube-scheduler/app/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "configurator.go", "server.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/controller:go_default_library", @@ -69,5 +66,4 @@ go_test( name = "go_default_test", srcs = ["configurator_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) diff --git a/plugin/cmd/kube-scheduler/app/options/BUILD b/plugin/cmd/kube-scheduler/app/options/BUILD index 6aa7266cf21..5d036472025 100644 --- a/plugin/cmd/kube-scheduler/app/options/BUILD +++ b/plugin/cmd/kube-scheduler/app/options/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["options.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/componentconfig:go_default_library", diff --git a/plugin/pkg/admission/admit/BUILD b/plugin/pkg/admission/admit/BUILD index 7697bee41a6..49e9ec1e477 100644 --- a/plugin/pkg/admission/admit/BUILD +++ b/plugin/pkg/admission/admit/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["admission.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/admission:go_default_library"], ) @@ -19,7 +16,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", diff --git a/plugin/pkg/admission/alwayspullimages/BUILD b/plugin/pkg/admission/alwayspullimages/BUILD index 2cfb8e7c247..4066801864f 100644 --- a/plugin/pkg/admission/alwayspullimages/BUILD +++ b/plugin/pkg/admission/alwayspullimages/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["admission.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", @@ -23,7 +20,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/plugin/pkg/admission/antiaffinity/BUILD b/plugin/pkg/admission/antiaffinity/BUILD index fa22043d791..908646924d0 100644 --- a/plugin/pkg/admission/antiaffinity/BUILD +++ b/plugin/pkg/admission/antiaffinity/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "admission.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/kubelet/apis:go_default_library", @@ -27,7 +24,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/kubelet/apis:go_default_library", diff --git a/plugin/pkg/admission/defaulttolerationseconds/BUILD b/plugin/pkg/admission/defaulttolerationseconds/BUILD index 9bea286a77f..f61605ff3b7 100644 --- a/plugin/pkg/admission/defaulttolerationseconds/BUILD +++ b/plugin/pkg/admission/defaulttolerationseconds/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", @@ -24,7 +21,6 @@ go_test( go_library( name = "go_default_library", srcs = ["admission.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", diff --git a/plugin/pkg/admission/deny/BUILD b/plugin/pkg/admission/deny/BUILD index 7697bee41a6..49e9ec1e477 100644 --- a/plugin/pkg/admission/deny/BUILD +++ b/plugin/pkg/admission/deny/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["admission.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/admission:go_default_library"], ) @@ -19,7 +16,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", diff --git a/plugin/pkg/admission/exec/BUILD b/plugin/pkg/admission/exec/BUILD index d4b9c5ca6b1..c416af3b002 100644 --- a/plugin/pkg/admission/exec/BUILD +++ b/plugin/pkg/admission/exec/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["admission.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", @@ -27,7 +24,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset/fake:go_default_library", diff --git a/plugin/pkg/admission/gc/BUILD b/plugin/pkg/admission/gc/BUILD index 83cce318604..d4adb0f97a4 100644 --- a/plugin/pkg/admission/gc/BUILD +++ b/plugin/pkg/admission/gc/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["gc_admission.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", @@ -28,7 +25,6 @@ go_test( name = "go_default_test", srcs = ["gc_admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/kubeapiserver/admission:go_default_library", diff --git a/plugin/pkg/admission/imagepolicy/BUILD b/plugin/pkg/admission/imagepolicy/BUILD index 6439a85f742..eaee9ef8625 100644 --- a/plugin/pkg/admission/imagepolicy/BUILD +++ b/plugin/pkg/admission/imagepolicy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "config.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/imagepolicy/install:go_default_library", @@ -39,7 +36,6 @@ go_test( "config_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/imagepolicy/install:go_default_library", diff --git a/plugin/pkg/admission/initialization/BUILD b/plugin/pkg/admission/initialization/BUILD index 8d850826c03..54529cc258b 100644 --- a/plugin/pkg/admission/initialization/BUILD +++ b/plugin/pkg/admission/initialization/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["initialization.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/kubeapiserver/admission/configuration:go_default_library", @@ -47,7 +44,6 @@ go_test( name = "go_default_test", srcs = ["initialization_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/plugin/pkg/admission/initialresources/BUILD b/plugin/pkg/admission/initialresources/BUILD index 5331990fdbe..81a1c340334 100644 --- a/plugin/pkg/admission/initialresources/BUILD +++ b/plugin/pkg/admission/initialresources/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "hawkular.go", "influxdb.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/cloud.google.com/go/compute/metadata:go_default_library", @@ -46,7 +43,6 @@ go_test( "influxdb_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", diff --git a/plugin/pkg/admission/limitranger/BUILD b/plugin/pkg/admission/limitranger/BUILD index 1146d6d8cde..9307f02c311 100644 --- a/plugin/pkg/admission/limitranger/BUILD +++ b/plugin/pkg/admission/limitranger/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "admission.go", "interfaces.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", @@ -36,7 +33,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/plugin/pkg/admission/namespace/autoprovision/BUILD b/plugin/pkg/admission/namespace/autoprovision/BUILD index 9a0641a5f88..3343556bda3 100644 --- a/plugin/pkg/admission/namespace/autoprovision/BUILD +++ b/plugin/pkg/admission/namespace/autoprovision/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["admission.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", @@ -28,7 +25,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/plugin/pkg/admission/namespace/exists/BUILD b/plugin/pkg/admission/namespace/exists/BUILD index 63de816572c..881ab061bc5 100644 --- a/plugin/pkg/admission/namespace/exists/BUILD +++ b/plugin/pkg/admission/namespace/exists/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["admission.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", @@ -28,7 +25,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/plugin/pkg/admission/noderestriction/BUILD b/plugin/pkg/admission/noderestriction/BUILD index 4bf848152f4..b81cb1c09fa 100644 --- a/plugin/pkg/admission/noderestriction/BUILD +++ b/plugin/pkg/admission/noderestriction/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["admission.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/pod:go_default_library", @@ -20,6 +17,7 @@ go_library( "//pkg/client/clientset_generated/internalclientset:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/core/internalversion:go_default_library", "//pkg/kubeapiserver/admission:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", @@ -30,7 +28,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/policy:go_default_library", diff --git a/plugin/pkg/admission/noderestriction/admission.go b/plugin/pkg/admission/noderestriction/admission.go index 8fdcb4aea06..f1f77a95569 100644 --- a/plugin/pkg/admission/noderestriction/admission.go +++ b/plugin/pkg/admission/noderestriction/admission.go @@ -20,6 +20,7 @@ import ( "fmt" "io" + apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apiserver/pkg/admission" @@ -242,18 +243,44 @@ func (c *nodePlugin) admitPodEviction(nodeName string, a admission.Attributes) e func (c *nodePlugin) admitNode(nodeName string, a admission.Attributes) error { requestedName := a.GetName() - - // On create, get name from new object if unset in admission - if len(requestedName) == 0 && a.GetOperation() == admission.Create { + if a.GetOperation() == admission.Create { node, ok := a.GetObject().(*api.Node) if !ok { return admission.NewForbidden(a, fmt.Errorf("unexpected type %T", a.GetObject())) } - requestedName = node.Name - } + // Don't allow a node to create its Node API object with the config source set. + // We scope node access to things listed in the Node.Spec, so allowing this would allow a view escalation. + if node.Spec.ConfigSource != nil { + return admission.NewForbidden(a, fmt.Errorf("cannot create with non-nil configSource")) + } + + // On create, get name from new object if unset in admission + if len(requestedName) == 0 { + requestedName = node.Name + } + } if requestedName != nodeName { return admission.NewForbidden(a, fmt.Errorf("node %q cannot modify node %q", nodeName, requestedName)) } + + if a.GetOperation() == admission.Update { + node, ok := a.GetObject().(*api.Node) + if !ok { + return admission.NewForbidden(a, fmt.Errorf("unexpected type %T", a.GetObject())) + } + oldNode, ok := a.GetOldObject().(*api.Node) + if !ok { + return admission.NewForbidden(a, fmt.Errorf("unexpected type %T", a.GetObject())) + } + + // Don't allow a node to update the config source on its Node API object. + // We scope node access to things listed in the Node.Spec, so allowing this would allow a view escalation. + // We only do the check if the new node's configSource is non-nil; old kubelets might drop the field during a status update. + if node.Spec.ConfigSource != nil && !apiequality.Semantic.DeepEqual(node.Spec.ConfigSource, oldNode.Spec.ConfigSource) { + return admission.NewForbidden(a, fmt.Errorf("cannot update configSource to a new non-nil configSource")) + } + } + return nil } diff --git a/plugin/pkg/admission/noderestriction/admission_test.go b/plugin/pkg/admission/noderestriction/admission_test.go index 25f263cf972..7c109b2d3f0 100644 --- a/plugin/pkg/admission/noderestriction/admission_test.go +++ b/plugin/pkg/admission/noderestriction/admission_test.go @@ -53,7 +53,12 @@ func Test_nodePlugin_Admit(t *testing.T) { mynode = &user.DefaultInfo{Name: "system:node:mynode", Groups: []string{"system:nodes"}} bob = &user.DefaultInfo{Name: "bob"} - mynodeObj = &api.Node{ObjectMeta: metav1.ObjectMeta{Name: "mynode"}} + mynodeObjMeta = metav1.ObjectMeta{Name: "mynode"} + mynodeObj = &api.Node{ObjectMeta: mynodeObjMeta} + mynodeObjConfigA = &api.Node{ObjectMeta: mynodeObjMeta, Spec: api.NodeSpec{ConfigSource: &api.NodeConfigSource{ + ConfigMapRef: &api.ObjectReference{Name: "foo", Namespace: "bar", UID: "fooUID"}}}} + mynodeObjConfigB = &api.Node{ObjectMeta: mynodeObjMeta, Spec: api.NodeSpec{ConfigSource: &api.NodeConfigSource{ + ConfigMapRef: &api.ObjectReference{Name: "qux", Namespace: "bar", UID: "quxUID"}}}} othernodeObj = &api.Node{ObjectMeta: metav1.ObjectMeta{Name: "othernode"}} mymirrorpod = makeTestPod("ns", "mymirrorpod", "mynode", true) @@ -586,6 +591,36 @@ func Test_nodePlugin_Admit(t *testing.T) { attributes: admission.NewAttributesRecord(mynodeObj, mynodeObj, nodeKind, mynodeObj.Namespace, mynodeObj.Name, nodeResource, "status", admission.Update, mynode), err: "", }, + { + name: "forbid create of my node with non-nil configSource", + podsGetter: noExistingPods, + attributes: admission.NewAttributesRecord(mynodeObjConfigA, nil, nodeKind, mynodeObj.Namespace, mynodeObj.Name, nodeResource, "", admission.Create, mynode), + err: "create with non-nil configSource", + }, + { + name: "forbid update of my node: nil configSource to new non-nil configSource", + podsGetter: existingPods, + attributes: admission.NewAttributesRecord(mynodeObjConfigA, mynodeObj, nodeKind, mynodeObj.Namespace, mynodeObj.Name, nodeResource, "", admission.Update, mynode), + err: "update configSource to a new non-nil configSource", + }, + { + name: "forbid update of my node: non-nil configSource to new non-nil configSource", + podsGetter: existingPods, + attributes: admission.NewAttributesRecord(mynodeObjConfigB, mynodeObjConfigA, nodeKind, mynodeObj.Namespace, mynodeObj.Name, nodeResource, "", admission.Update, mynode), + err: "update configSource to a new non-nil configSource", + }, + { + name: "allow update of my node: non-nil configSource unchanged", + podsGetter: existingPods, + attributes: admission.NewAttributesRecord(mynodeObjConfigA, mynodeObjConfigA, nodeKind, mynodeObj.Namespace, mynodeObj.Name, nodeResource, "", admission.Update, mynode), + err: "", + }, + { + name: "allow update of my node: non-nil configSource to nil configSource", + podsGetter: existingPods, + attributes: admission.NewAttributesRecord(mynodeObj, mynodeObjConfigA, nodeKind, mynodeObj.Namespace, mynodeObj.Name, nodeResource, "", admission.Update, mynode), + err: "", + }, // Other node object { diff --git a/plugin/pkg/admission/persistentvolume/label/BUILD b/plugin/pkg/admission/persistentvolume/label/BUILD index 8a456e756b1..cbf4432c59e 100644 --- a/plugin/pkg/admission/persistentvolume/label/BUILD +++ b/plugin/pkg/admission/persistentvolume/label/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "admission.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/cloudprovider:go_default_library", @@ -31,7 +28,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/cloudprovider/providers/aws:go_default_library", diff --git a/plugin/pkg/admission/podnodeselector/BUILD b/plugin/pkg/admission/podnodeselector/BUILD index 74e6effbd03..e89110ebb08 100644 --- a/plugin/pkg/admission/podnodeselector/BUILD +++ b/plugin/pkg/admission/podnodeselector/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["admission.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", @@ -31,7 +28,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/plugin/pkg/admission/podpreset/BUILD b/plugin/pkg/admission/podpreset/BUILD index b8a8997ab99..a7210dc67ad 100644 --- a/plugin/pkg/admission/podpreset/BUILD +++ b/plugin/pkg/admission/podpreset/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/settings:go_default_library", @@ -30,7 +27,6 @@ go_test( go_library( name = "go_default_library", srcs = ["admission.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/ref:go_default_library", diff --git a/plugin/pkg/admission/podtolerationrestriction/BUILD b/plugin/pkg/admission/podtolerationrestriction/BUILD index 8b4f692b6b6..3492b2a840e 100644 --- a/plugin/pkg/admission/podtolerationrestriction/BUILD +++ b/plugin/pkg/admission/podtolerationrestriction/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", @@ -32,7 +29,6 @@ go_library( "admission.go", "config.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1:go_default_library", diff --git a/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/BUILD b/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/BUILD index f93ff7c8378..c2cb617aaea 100644 --- a/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/BUILD +++ b/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/install/BUILD b/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/install/BUILD index 3d2b50a484f..0671d3e6af1 100644 --- a/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/install/BUILD +++ b/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction:go_default_library", "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1:go_default_library", diff --git a/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1/BUILD b/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1/BUILD index e08a263d3a5..78f31098ac7 100644 --- a/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1/BUILD +++ b/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction:go_default_library", diff --git a/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/validation/BUILD b/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/validation/BUILD index 6b658f6975f..7ef9df74fdd 100644 --- a/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/validation/BUILD +++ b/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//pkg/api/validation:go_default_library", "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction:go_default_library", @@ -36,7 +33,6 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction:go_default_library", diff --git a/plugin/pkg/admission/resourcequota/BUILD b/plugin/pkg/admission/resourcequota/BUILD index 7f7a577e2e2..44fbd1a74cf 100644 --- a/plugin/pkg/admission/resourcequota/BUILD +++ b/plugin/pkg/admission/resourcequota/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "doc.go", "resource_access.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", @@ -54,7 +51,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset/fake:go_default_library", diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/BUILD b/plugin/pkg/admission/resourcequota/apis/resourcequota/BUILD index 63676316312..5a73d3cc9e3 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/BUILD +++ b/plugin/pkg/admission/resourcequota/apis/resourcequota/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/install/BUILD b/plugin/pkg/admission/resourcequota/apis/resourcequota/install/BUILD index dbe702f8d40..abe44299735 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/install/BUILD +++ b/plugin/pkg/admission/resourcequota/apis/resourcequota/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//plugin/pkg/admission/resourcequota/apis/resourcequota:go_default_library", "//plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1:go_default_library", diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/BUILD b/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/BUILD index 61d88730425..0d3f4a995a2 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/BUILD +++ b/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//plugin/pkg/admission/resourcequota/apis/resourcequota:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/validation/BUILD b/plugin/pkg/admission/resourcequota/apis/resourcequota/validation/BUILD index 95508b9150d..d5e5f6e1bde 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/validation/BUILD +++ b/plugin/pkg/admission/resourcequota/apis/resourcequota/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//plugin/pkg/admission/resourcequota/apis/resourcequota:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", @@ -35,6 +32,5 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//plugin/pkg/admission/resourcequota/apis/resourcequota:go_default_library"], ) diff --git a/plugin/pkg/admission/security/BUILD b/plugin/pkg/admission/security/BUILD index 89be9dd5488..a68b7c1318a 100644 --- a/plugin/pkg/admission/security/BUILD +++ b/plugin/pkg/admission/security/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/plugin/pkg/admission/security/podsecuritypolicy/BUILD b/plugin/pkg/admission/security/podsecuritypolicy/BUILD index 475d0384d20..a377da0fb28 100644 --- a/plugin/pkg/admission/security/podsecuritypolicy/BUILD +++ b/plugin/pkg/admission/security/podsecuritypolicy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["admission.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", @@ -36,7 +33,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", diff --git a/plugin/pkg/admission/securitycontext/scdeny/BUILD b/plugin/pkg/admission/securitycontext/scdeny/BUILD index 207311ec378..7d32bd9f819 100644 --- a/plugin/pkg/admission/securitycontext/scdeny/BUILD +++ b/plugin/pkg/admission/securitycontext/scdeny/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["admission.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", @@ -23,7 +20,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", diff --git a/plugin/pkg/admission/serviceaccount/BUILD b/plugin/pkg/admission/serviceaccount/BUILD index 7faad45f80d..dc51db0a95a 100644 --- a/plugin/pkg/admission/serviceaccount/BUILD +++ b/plugin/pkg/admission/serviceaccount/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "admission.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/pod:go_default_library", @@ -37,7 +34,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset/fake:go_default_library", diff --git a/plugin/pkg/admission/storageclass/setdefault/BUILD b/plugin/pkg/admission/storageclass/setdefault/BUILD index 2f034cbbe4a..5726f14e635 100644 --- a/plugin/pkg/admission/storageclass/setdefault/BUILD +++ b/plugin/pkg/admission/storageclass/setdefault/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["admission.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/helper:go_default_library", @@ -31,7 +28,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/storage:go_default_library", diff --git a/plugin/pkg/admission/webhook/BUILD b/plugin/pkg/admission/webhook/BUILD index 36855c34a76..0221e3ffbe3 100644 --- a/plugin/pkg/admission/webhook/BUILD +++ b/plugin/pkg/admission/webhook/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "rules_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/admission/install:go_default_library", @@ -36,7 +33,6 @@ go_library( "doc.go", "rules.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/admission/install:go_default_library", diff --git a/plugin/pkg/auth/BUILD b/plugin/pkg/auth/BUILD index 423becf165d..97f02acf0f5 100644 --- a/plugin/pkg/auth/BUILD +++ b/plugin/pkg/auth/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/plugin/pkg/auth/authenticator/token/bootstrap/BUILD b/plugin/pkg/auth/authenticator/token/bootstrap/BUILD index 96335c84268..abba54f6eee 100644 --- a/plugin/pkg/auth/authenticator/token/bootstrap/BUILD +++ b/plugin/pkg/auth/authenticator/token/bootstrap/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["bootstrap_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/bootstrap/api:go_default_library", @@ -27,7 +24,6 @@ go_test( go_library( name = "go_default_library", srcs = ["bootstrap.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/bootstrap/api:go_default_library", diff --git a/plugin/pkg/auth/authorizer/BUILD b/plugin/pkg/auth/authorizer/BUILD index 48e484004c3..946700d631d 100644 --- a/plugin/pkg/auth/authorizer/BUILD +++ b/plugin/pkg/auth/authorizer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/plugin/pkg/auth/authorizer/node/BUILD b/plugin/pkg/auth/authorizer/node/BUILD index 8569eb1f87b..926c876ee3b 100644 --- a/plugin/pkg/auth/authorizer/node/BUILD +++ b/plugin/pkg/auth/authorizer/node/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["node_authorizer_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/auth/nodeidentifier:go_default_library", @@ -30,7 +27,6 @@ go_library( "graph_populator.go", "node_authorizer.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/persistentvolume:go_default_library", diff --git a/plugin/pkg/auth/authorizer/rbac/BUILD b/plugin/pkg/auth/authorizer/rbac/BUILD index 598ff353545..37fdbaaf0c5 100644 --- a/plugin/pkg/auth/authorizer/rbac/BUILD +++ b/plugin/pkg/auth/authorizer/rbac/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "rbac.go", "subject_locator.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/rbac:go_default_library", "//pkg/registry/rbac/validation:go_default_library", @@ -32,7 +29,6 @@ go_test( "subject_locator_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/apis/rbac:go_default_library", "//pkg/registry/rbac/validation:go_default_library", diff --git a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/BUILD b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/BUILD index 5320c75b389..b3243e18ff5 100644 --- a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/BUILD +++ b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "namespace_policy.go", "policy.go", ], - tags = ["automanaged"], deps = [ "//pkg/apis/rbac:go_default_library", "//pkg/features:go_default_library", @@ -34,14 +31,13 @@ go_test( data = glob([ "testdata/*", ]), - tags = ["automanaged"], deps = [ + ":go_default_library", "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", "//pkg/apis/rbac:go_default_library", "//pkg/apis/rbac/install:go_default_library", "//pkg/registry/rbac/validation:go_default_library", - "//plugin/pkg/auth/authorizer/rbac/bootstrappolicy:go_default_library", "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", @@ -55,8 +51,8 @@ go_test( go_test( name = "go_default_test", srcs = ["controller_policy_test.go"], + data = glob(["testdata/**"]), library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", diff --git a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go index 9ae96202416..f69dfabd6ea 100644 --- a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go +++ b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go @@ -181,7 +181,7 @@ func ClusterRoles() []rbac.ClusterRole { rbac.NewRule(ReadWrite...).Groups(autoscalingGroup).Resources("horizontalpodautoscalers").RuleOrDie(), - rbac.NewRule(ReadWrite...).Groups(batchGroup).Resources("jobs", "cronjobs", "scheduledjobs").RuleOrDie(), + rbac.NewRule(ReadWrite...).Groups(batchGroup).Resources("jobs", "cronjobs").RuleOrDie(), rbac.NewRule(ReadWrite...).Groups(extensionsGroup).Resources("daemonsets", "deployments", "deployments/scale", "deployments/rollback", "ingresses", @@ -213,7 +213,7 @@ func ClusterRoles() []rbac.ClusterRole { rbac.NewRule(ReadWrite...).Groups(autoscalingGroup).Resources("horizontalpodautoscalers").RuleOrDie(), - rbac.NewRule(ReadWrite...).Groups(batchGroup).Resources("jobs", "cronjobs", "scheduledjobs").RuleOrDie(), + rbac.NewRule(ReadWrite...).Groups(batchGroup).Resources("jobs", "cronjobs").RuleOrDie(), rbac.NewRule(ReadWrite...).Groups(extensionsGroup).Resources("daemonsets", "deployments", "deployments/scale", "deployments/rollback", "ingresses", @@ -237,7 +237,7 @@ func ClusterRoles() []rbac.ClusterRole { rbac.NewRule(Read...).Groups(autoscalingGroup).Resources("horizontalpodautoscalers").RuleOrDie(), - rbac.NewRule(Read...).Groups(batchGroup).Resources("jobs", "cronjobs", "scheduledjobs").RuleOrDie(), + rbac.NewRule(Read...).Groups(batchGroup).Resources("jobs", "cronjobs").RuleOrDie(), rbac.NewRule(Read...).Groups(extensionsGroup).Resources("daemonsets", "deployments", "deployments/scale", "ingresses", "replicasets", "replicasets/scale", "replicationcontrollers/scale").RuleOrDie(), diff --git a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/cluster-roles.yaml b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/cluster-roles.yaml index f183249bb52..309fab58f27 100644 --- a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/cluster-roles.yaml +++ b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/cluster-roles.yaml @@ -112,7 +112,6 @@ items: resources: - cronjobs - jobs - - scheduledjobs verbs: - create - delete @@ -294,7 +293,6 @@ items: resources: - cronjobs - jobs - - scheduledjobs verbs: - create - delete @@ -957,7 +955,6 @@ items: resources: - cronjobs - jobs - - scheduledjobs verbs: - get - list diff --git a/plugin/pkg/scheduler/BUILD b/plugin/pkg/scheduler/BUILD index 72ad6705015..1683e48c637 100644 --- a/plugin/pkg/scheduler/BUILD +++ b/plugin/pkg/scheduler/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["scheduler_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//plugin/pkg/scheduler/algorithm:go_default_library", @@ -38,7 +35,6 @@ go_library( "scheduler.go", "testutil.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//plugin/pkg/scheduler/algorithm:go_default_library", diff --git a/plugin/pkg/scheduler/algorithm/BUILD b/plugin/pkg/scheduler/algorithm/BUILD index 3790d1dc271..b1e89a9fb16 100644 --- a/plugin/pkg/scheduler/algorithm/BUILD +++ b/plugin/pkg/scheduler/algorithm/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "types.go", "well_known_labels.go", ], - tags = ["automanaged"], deps = [ "//plugin/pkg/scheduler/api:go_default_library", "//plugin/pkg/scheduler/schedulercache:go_default_library", @@ -34,7 +31,6 @@ go_test( "types_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//plugin/pkg/scheduler/schedulercache:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/plugin/pkg/scheduler/algorithm/predicates/BUILD b/plugin/pkg/scheduler/algorithm/predicates/BUILD index f0e59586150..fc15e457b30 100644 --- a/plugin/pkg/scheduler/algorithm/predicates/BUILD +++ b/plugin/pkg/scheduler/algorithm/predicates/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "predicates.go", "utils.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/helper:go_default_library", "//pkg/api/v1/helper/qos:go_default_library", @@ -47,7 +44,6 @@ go_test( "utils_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api/v1/helper:go_default_library", "//pkg/kubelet/apis:go_default_library", diff --git a/plugin/pkg/scheduler/algorithm/priorities/BUILD b/plugin/pkg/scheduler/algorithm/priorities/BUILD index 9fe5d74f466..eff8faba1ea 100644 --- a/plugin/pkg/scheduler/algorithm/priorities/BUILD +++ b/plugin/pkg/scheduler/algorithm/priorities/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -24,7 +22,6 @@ go_library( "taint_toleration.go", "test_util.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/helper:go_default_library", "//pkg/kubelet/apis:go_default_library", @@ -59,7 +56,6 @@ go_test( "taint_toleration_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/kubelet/apis:go_default_library", "//plugin/pkg/scheduler/algorithm/priorities/util:go_default_library", diff --git a/plugin/pkg/scheduler/algorithm/priorities/util/BUILD b/plugin/pkg/scheduler/algorithm/priorities/util/BUILD index 79a6cc05e1b..a034d550960 100644 --- a/plugin/pkg/scheduler/algorithm/priorities/util/BUILD +++ b/plugin/pkg/scheduler/algorithm/priorities/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["topologies_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -26,7 +23,6 @@ go_library( "topologies.go", "util.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/plugin/pkg/scheduler/algorithmprovider/BUILD b/plugin/pkg/scheduler/algorithmprovider/BUILD index 0081e74f65a..883faf0bf0d 100644 --- a/plugin/pkg/scheduler/algorithmprovider/BUILD +++ b/plugin/pkg/scheduler/algorithmprovider/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["plugins.go"], - tags = ["automanaged"], deps = ["//plugin/pkg/scheduler/algorithmprovider/defaults:go_default_library"], ) @@ -19,9 +16,6 @@ go_test( name = "go_default_test", srcs = ["plugins_test.go"], library = ":go_default_library", - tags = [ - "automanaged", - ], deps = ["//plugin/pkg/scheduler/factory:go_default_library"], ) diff --git a/plugin/pkg/scheduler/algorithmprovider/defaults/BUILD b/plugin/pkg/scheduler/algorithmprovider/defaults/BUILD index 93a44c9e3d4..f0bb6ef2301 100644 --- a/plugin/pkg/scheduler/algorithmprovider/defaults/BUILD +++ b/plugin/pkg/scheduler/algorithmprovider/defaults/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["defaults.go"], - tags = ["automanaged"], deps = [ "//pkg/cloudprovider/providers/aws:go_default_library", "//plugin/pkg/scheduler/algorithm:go_default_library", @@ -31,7 +28,6 @@ go_test( "defaults_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", diff --git a/plugin/pkg/scheduler/api/BUILD b/plugin/pkg/scheduler/api/BUILD index 74fbf6c2834..4475d9e7bb3 100644 --- a/plugin/pkg/scheduler/api/BUILD +++ b/plugin/pkg/scheduler/api/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/plugin/pkg/scheduler/api/latest/BUILD b/plugin/pkg/scheduler/api/latest/BUILD index 1b8214cd151..e2d6f0d1bbe 100644 --- a/plugin/pkg/scheduler/api/latest/BUILD +++ b/plugin/pkg/scheduler/api/latest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["latest.go"], - tags = ["automanaged"], deps = [ "//plugin/pkg/scheduler/api:go_default_library", "//plugin/pkg/scheduler/api/v1:go_default_library", diff --git a/plugin/pkg/scheduler/api/v1/BUILD b/plugin/pkg/scheduler/api/v1/BUILD index db003a8a00a..0a160932f6d 100644 --- a/plugin/pkg/scheduler/api/v1/BUILD +++ b/plugin/pkg/scheduler/api/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//plugin/pkg/scheduler/api:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/plugin/pkg/scheduler/api/validation/BUILD b/plugin/pkg/scheduler/api/validation/BUILD index 4831d56aa1e..3639204e785 100644 --- a/plugin/pkg/scheduler/api/validation/BUILD +++ b/plugin/pkg/scheduler/api/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//plugin/pkg/scheduler/api:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", @@ -22,7 +19,6 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//plugin/pkg/scheduler/api:go_default_library"], ) diff --git a/plugin/pkg/scheduler/core/BUILD b/plugin/pkg/scheduler/core/BUILD index f29751b4387..6b985508a5a 100644 --- a/plugin/pkg/scheduler/core/BUILD +++ b/plugin/pkg/scheduler/core/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "generic_scheduler_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//plugin/pkg/scheduler/algorithm:go_default_library", "//plugin/pkg/scheduler/algorithm/predicates:go_default_library", @@ -42,7 +39,6 @@ go_library( "extender.go", "generic_scheduler.go", ], - tags = ["automanaged"], deps = [ "//pkg/util/hash:go_default_library", "//plugin/pkg/scheduler/algorithm:go_default_library", diff --git a/plugin/pkg/scheduler/factory/BUILD b/plugin/pkg/scheduler/factory/BUILD index b225411c687..c1556c3c957 100644 --- a/plugin/pkg/scheduler/factory/BUILD +++ b/plugin/pkg/scheduler/factory/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "factory.go", "plugins.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/helper:go_default_library", "//pkg/api/v1/pod:go_default_library", @@ -56,7 +53,6 @@ go_test( "plugins_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testing:go_default_library", diff --git a/plugin/pkg/scheduler/metrics/BUILD b/plugin/pkg/scheduler/metrics/BUILD index afa45b34f36..b9badf163a2 100644 --- a/plugin/pkg/scheduler/metrics/BUILD +++ b/plugin/pkg/scheduler/metrics/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["metrics.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/prometheus/client_golang/prometheus:go_default_library"], ) diff --git a/plugin/pkg/scheduler/scheduler.go b/plugin/pkg/scheduler/scheduler.go index 3b70c6362fa..6bddae7e30c 100644 --- a/plugin/pkg/scheduler/scheduler.go +++ b/plugin/pkg/scheduler/scheduler.go @@ -17,7 +17,6 @@ limitations under the License. package scheduler import ( - "fmt" "time" "k8s.io/api/core/v1" @@ -194,12 +193,20 @@ func (sched *Scheduler) assume(assumed *v1.Pod, host string) error { assumed.Spec.NodeName = host if err := sched.config.SchedulerCache.AssumePod(assumed); err != nil { glog.Errorf("scheduler cache AssumePod failed: %v", err) - // TODO: This means that a given pod is already in cache (which means it - // is either assumed or already added). This is most probably result of a - // BUG in retrying logic. As a temporary workaround (which doesn't fully - // fix the problem, but should reduce its impact), we simply return here, - // as binding doesn't make sense anyway. - // This should be fixed properly though. + + // This is most probably result of a BUG in retrying logic. + // We report an error here so that pod scheduling can be retried. + // This relies on the fact that Error will check if the pod has been bound + // to a node and if so will not add it back to the unscheduled pods queue + // (otherwise this would cause an infinite loop). + sched.config.Error(assumed, err) + sched.config.Recorder.Eventf(assumed, v1.EventTypeWarning, "FailedScheduling", "AssumePod failed: %v", err) + sched.config.PodConditionUpdater.Update(assumed, &v1.PodCondition{ + Type: v1.PodScheduled, + Status: v1.ConditionFalse, + Reason: "SchedulerError", + Message: err.Error(), + }) return err } @@ -219,10 +226,13 @@ func (sched *Scheduler) bind(assumed *v1.Pod, b *v1.Binding) error { // If binding succeeded then PodScheduled condition will be updated in apiserver so that // it's atomic with setting host. err := sched.config.Binder.Bind(b) + if err := sched.config.SchedulerCache.FinishBinding(assumed); err != nil { + glog.Errorf("scheduler cache FinishBinding failed: %v", err) + } if err != nil { glog.V(1).Infof("Failed to bind pod: %v/%v", assumed.Namespace, assumed.Name) if err := sched.config.SchedulerCache.ForgetPod(assumed); err != nil { - return fmt.Errorf("scheduler cache ForgetPod failed: %v", err) + glog.Errorf("scheduler cache ForgetPod failed: %v", err) } sched.config.Error(assumed, err) sched.config.Recorder.Eventf(assumed, v1.EventTypeWarning, "FailedScheduling", "Binding rejected: %v", err) @@ -234,10 +244,6 @@ func (sched *Scheduler) bind(assumed *v1.Pod, b *v1.Binding) error { return err } - if err := sched.config.SchedulerCache.FinishBinding(assumed); err != nil { - return fmt.Errorf("scheduler cache FinishBinding failed: %v", err) - } - metrics.BindingLatency.Observe(metrics.SinceInMicroseconds(bindingStart)) sched.config.Recorder.Eventf(assumed, v1.EventTypeNormal, "Scheduled", "Successfully assigned %v to %v", assumed.Name, b.Target.Name) return nil diff --git a/plugin/pkg/scheduler/schedulercache/BUILD b/plugin/pkg/scheduler/schedulercache/BUILD index 8b9ba120d28..596bf7858a7 100644 --- a/plugin/pkg/scheduler/schedulercache/BUILD +++ b/plugin/pkg/scheduler/schedulercache/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "node_info.go", "util.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/helper:go_default_library", "//plugin/pkg/scheduler/algorithm/priorities/util:go_default_library", @@ -33,7 +30,6 @@ go_test( name = "go_default_test", srcs = ["cache_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/api/v1/helper:go_default_library", "//plugin/pkg/scheduler/algorithm/priorities/util:go_default_library", diff --git a/plugin/pkg/scheduler/testing/BUILD b/plugin/pkg/scheduler/testing/BUILD index d1542a0e2bc..a9397f2aa7d 100644 --- a/plugin/pkg/scheduler/testing/BUILD +++ b/plugin/pkg/scheduler/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_lister.go", "pods_to_cache.go", ], - tags = ["automanaged"], deps = [ "//plugin/pkg/scheduler/algorithm:go_default_library", "//plugin/pkg/scheduler/schedulercache:go_default_library", diff --git a/plugin/pkg/scheduler/util/BUILD b/plugin/pkg/scheduler/util/BUILD index 7bba7524005..e3381b02f70 100644 --- a/plugin/pkg/scheduler/util/BUILD +++ b/plugin/pkg/scheduler/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["backoff_utils_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/types:go_default_library"], ) @@ -23,7 +20,6 @@ go_library( "testutil.go", "utils.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", diff --git a/staging/BUILD b/staging/BUILD index f86f9b10acb..bbc3287ec0c 100644 --- a/staging/BUILD +++ b/staging/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "staging", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["godeps-json-updater.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/spf13/pflag:go_default_library"], ) @@ -50,6 +46,7 @@ filegroup( "//staging/src/k8s.io/api/imagepolicy/v1alpha1:all-srcs", "//staging/src/k8s.io/api/networking/v1:all-srcs", "//staging/src/k8s.io/api/policy/v1beta1:all-srcs", + "//staging/src/k8s.io/api/rbac/v1:all-srcs", "//staging/src/k8s.io/api/rbac/v1alpha1:all-srcs", "//staging/src/k8s.io/api/rbac/v1beta1:all-srcs", "//staging/src/k8s.io/api/scheduling/v1alpha1:all-srcs", @@ -117,7 +114,9 @@ filegroup( "//staging/src/k8s.io/apiserver/pkg/authentication/request/websocket:all-srcs", "//staging/src/k8s.io/apiserver/pkg/authentication/request/x509:all-srcs", "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:all-srcs", + "//staging/src/k8s.io/apiserver/pkg/authentication/token/cache:all-srcs", "//staging/src/k8s.io/apiserver/pkg/authentication/token/tokenfile:all-srcs", + "//staging/src/k8s.io/apiserver/pkg/authentication/token/union:all-srcs", "//staging/src/k8s.io/apiserver/pkg/authentication/user:all-srcs", "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:all-srcs", "//staging/src/k8s.io/apiserver/pkg/authorization/authorizerfactory:all-srcs", @@ -163,6 +162,7 @@ filegroup( "//staging/src/k8s.io/client-go/listers/imagepolicy/v1alpha1:all-srcs", "//staging/src/k8s.io/client-go/listers/networking/v1:all-srcs", "//staging/src/k8s.io/client-go/listers/policy/v1beta1:all-srcs", + "//staging/src/k8s.io/client-go/listers/rbac/v1:all-srcs", "//staging/src/k8s.io/client-go/listers/rbac/v1alpha1:all-srcs", "//staging/src/k8s.io/client-go/listers/rbac/v1beta1:all-srcs", "//staging/src/k8s.io/client-go/listers/scheduling/v1alpha1:all-srcs", diff --git a/staging/src/k8s.io/api/admission/v1alpha1/BUILD b/staging/src/k8s.io/api/admission/v1alpha1/BUILD index cf1b05c5ad2..389b56c3a9d 100644 --- a/staging/src/k8s.io/api/admission/v1alpha1/BUILD +++ b/staging/src/k8s.io/api/admission/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/ugorji/go/codec:go_default_library", @@ -44,3 +41,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/admissionregistration/v1alpha1/BUILD b/staging/src/k8s.io/api/admissionregistration/v1alpha1/BUILD index 9ca847dc73e..f77e6881be0 100644 --- a/staging/src/k8s.io/api/admissionregistration/v1alpha1/BUILD +++ b/staging/src/k8s.io/api/admissionregistration/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/ugorji/go/codec:go_default_library", @@ -42,3 +39,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/apps/v1beta1/BUILD b/staging/src/k8s.io/api/apps/v1beta1/BUILD index f79c4c357b9..694aa0c1130 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/BUILD +++ b/staging/src/k8s.io/api/apps/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", @@ -46,3 +43,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/apps/v1beta1/generated.pb.go b/staging/src/k8s.io/api/apps/v1beta1/generated.pb.go index 40d559a6717..bc0a74ab76a 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/generated.pb.go +++ b/staging/src/k8s.io/api/apps/v1beta1/generated.pb.go @@ -992,6 +992,11 @@ func (m *StatefulSetStatus) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.UpdateRevision))) i += copy(dAtA[i:], m.UpdateRevision) + if m.CollisionCount != nil { + dAtA[i] = 0x48 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(*m.CollisionCount)) + } return i, nil } @@ -1339,6 +1344,9 @@ func (m *StatefulSetStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.UpdateRevision) n += 1 + l + sovGenerated(uint64(l)) + if m.CollisionCount != nil { + n += 1 + sovGenerated(uint64(*m.CollisionCount)) + } return n } @@ -1623,6 +1631,7 @@ func (this *StatefulSetStatus) String() string { `UpdatedReplicas:` + fmt.Sprintf("%v", this.UpdatedReplicas) + `,`, `CurrentRevision:` + fmt.Sprintf("%v", this.CurrentRevision) + `,`, `UpdateRevision:` + fmt.Sprintf("%v", this.UpdateRevision) + `,`, + `CollisionCount:` + valueToStringGenerated(this.CollisionCount) + `,`, `}`, }, "") return s @@ -4574,6 +4583,26 @@ func (m *StatefulSetStatus) Unmarshal(dAtA []byte) error { } m.UpdateRevision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CollisionCount", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.CollisionCount = &v default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -4817,119 +4846,119 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 1816 bytes of a gzipped FileDescriptorProto + // 1820 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xcd, 0x6f, 0x1c, 0x49, - 0x15, 0x77, 0xcf, 0x87, 0x3d, 0x2e, 0xaf, 0xc7, 0x71, 0xd9, 0xd8, 0xb3, 0x5e, 0x18, 0x5b, 0xcd, - 0x6a, 0xd7, 0xd9, 0x5d, 0xf7, 0x6c, 0xbc, 0xcb, 0x6a, 0x37, 0x91, 0x56, 0x78, 0xc6, 0x61, 0xd7, - 0x91, 0x8d, 0x9d, 0x1a, 0x3b, 0x88, 0x00, 0x52, 0x6a, 0x7a, 0x2a, 0xe3, 0x8e, 0xfb, 0x4b, 0xdd, - 0xd5, 0x43, 0x46, 0x5c, 0xf8, 0x03, 0x90, 0xc2, 0x99, 0xbf, 0x82, 0x23, 0x82, 0x1b, 0x27, 0x5f, - 0x10, 0x11, 0x17, 0x72, 0xb2, 0xc8, 0xe4, 0xca, 0x95, 0x4b, 0x24, 0x24, 0x54, 0xd5, 0xd5, 0xdf, - 0xdd, 0xf6, 0x18, 0x09, 0x1f, 0xb8, 0x4d, 0xd7, 0x7b, 0xef, 0xf7, 0x5e, 0x55, 0xbd, 0x7a, 0xef, - 0xf7, 0x06, 0xfc, 0xf0, 0xec, 0x4b, 0x57, 0xd1, 0xac, 0xd6, 0x99, 0xd7, 0x23, 0x8e, 0x49, 0x28, - 0x71, 0x5b, 0x43, 0x62, 0xf6, 0x2d, 0xa7, 0x25, 0x04, 0xd8, 0xd6, 0x5a, 0xd8, 0xb6, 0xdd, 0xd6, - 0xf0, 0x4e, 0x8f, 0x50, 0x7c, 0xa7, 0x35, 0x20, 0x26, 0x71, 0x30, 0x25, 0x7d, 0xc5, 0x76, 0x2c, - 0x6a, 0xc1, 0x55, 0x5f, 0x51, 0xc1, 0xb6, 0xa6, 0x30, 0x45, 0x45, 0x28, 0xae, 0x6d, 0x0d, 0x34, - 0x7a, 0xea, 0xf5, 0x14, 0xd5, 0x32, 0x5a, 0x03, 0x6b, 0x60, 0xb5, 0xb8, 0x7e, 0xcf, 0x7b, 0xca, - 0xbf, 0xf8, 0x07, 0xff, 0xe5, 0xe3, 0xac, 0xc9, 0x31, 0x87, 0xaa, 0xe5, 0x90, 0xd6, 0x30, 0xe3, - 0x6b, 0xed, 0x76, 0x4c, 0xc7, 0xb6, 0x74, 0x4d, 0x1d, 0x15, 0x85, 0xb5, 0xf6, 0x79, 0xa4, 0x6a, - 0x60, 0xf5, 0x54, 0x33, 0x89, 0x33, 0x6a, 0xd9, 0x67, 0x03, 0xb6, 0xe0, 0xb6, 0x0c, 0x42, 0x71, - 0x9e, 0x83, 0x56, 0x91, 0x95, 0xe3, 0x99, 0x54, 0x33, 0x48, 0xc6, 0xe0, 0x8b, 0xab, 0x0c, 0x5c, - 0xf5, 0x94, 0x18, 0x38, 0x63, 0xf7, 0x59, 0x91, 0x9d, 0x47, 0x35, 0xbd, 0xa5, 0x99, 0xd4, 0xa5, - 0x4e, 0xda, 0x48, 0xfe, 0x97, 0x04, 0x60, 0xc7, 0x32, 0xa9, 0x63, 0xe9, 0x3a, 0x71, 0x10, 0x19, - 0x6a, 0xae, 0x66, 0x99, 0xf0, 0x09, 0xa8, 0xb1, 0xfd, 0xf4, 0x31, 0xc5, 0x0d, 0x69, 0x43, 0xda, - 0x9c, 0xdb, 0xfe, 0x54, 0x89, 0x2e, 0x25, 0x84, 0x57, 0xec, 0xb3, 0x01, 0x5b, 0x70, 0x15, 0xa6, - 0xad, 0x0c, 0xef, 0x28, 0x87, 0xbd, 0x67, 0x44, 0xa5, 0x07, 0x84, 0xe2, 0x36, 0x3c, 0xbf, 0x58, - 0x9f, 0x1a, 0x5f, 0xac, 0x83, 0x68, 0x0d, 0x85, 0xa8, 0xf0, 0x10, 0x54, 0x38, 0x7a, 0x89, 0xa3, - 0x6f, 0x15, 0xa2, 0x8b, 0x4d, 0x2b, 0x08, 0xff, 0xf2, 0xfe, 0x73, 0x4a, 0x4c, 0x16, 0x5e, 0xfb, - 0x1d, 0x01, 0x5d, 0xd9, 0xc5, 0x14, 0x23, 0x0e, 0x04, 0x3f, 0x01, 0x35, 0x47, 0x84, 0xdf, 0x28, - 0x6f, 0x48, 0x9b, 0xe5, 0xf6, 0x2d, 0xa1, 0x55, 0x0b, 0xb6, 0x85, 0x42, 0x0d, 0xf9, 0x5c, 0x02, - 0x2b, 0xd9, 0x7d, 0xef, 0x6b, 0x2e, 0x85, 0x3f, 0xcf, 0xec, 0x5d, 0x99, 0x6c, 0xef, 0xcc, 0x9a, - 0xef, 0x3c, 0x74, 0x1c, 0xac, 0xc4, 0xf6, 0x7d, 0x04, 0xaa, 0x1a, 0x25, 0x86, 0xdb, 0x28, 0x6d, - 0x94, 0x37, 0xe7, 0xb6, 0x3f, 0x56, 0x0a, 0x72, 0x5d, 0xc9, 0x46, 0xd7, 0x9e, 0x17, 0xb8, 0xd5, - 0x3d, 0x86, 0x80, 0x7c, 0x20, 0xf9, 0x37, 0x25, 0x00, 0x76, 0x89, 0xad, 0x5b, 0x23, 0x83, 0x98, - 0xf4, 0x06, 0xae, 0x6e, 0x0f, 0x54, 0x5c, 0x9b, 0xa8, 0xe2, 0xea, 0x3e, 0x2c, 0xdc, 0x41, 0x14, - 0x54, 0xd7, 0x26, 0x6a, 0x74, 0x69, 0xec, 0x0b, 0x71, 0x08, 0xf8, 0x10, 0x4c, 0xbb, 0x14, 0x53, - 0xcf, 0xe5, 0x57, 0x36, 0xb7, 0x7d, 0x7b, 0x12, 0x30, 0x6e, 0xd0, 0xae, 0x0b, 0xb8, 0x69, 0xff, - 0x1b, 0x09, 0x20, 0xf9, 0xef, 0x65, 0xb0, 0x14, 0x29, 0x77, 0x2c, 0xb3, 0xaf, 0x51, 0x96, 0xd2, - 0xf7, 0x40, 0x85, 0x8e, 0x6c, 0xc2, 0xcf, 0x64, 0xb6, 0xfd, 0x61, 0x10, 0xcc, 0xf1, 0xc8, 0x26, - 0x6f, 0x2f, 0xd6, 0x57, 0x73, 0x4c, 0x98, 0x08, 0x71, 0x23, 0xb8, 0x1f, 0xc6, 0x59, 0xe2, 0xe6, - 0x9f, 0x27, 0x9d, 0xbf, 0xbd, 0x58, 0xcf, 0xa9, 0x35, 0x4a, 0x88, 0x94, 0x0c, 0x11, 0x7e, 0x00, - 0xa6, 0x1d, 0x82, 0x5d, 0xcb, 0x6c, 0x54, 0x38, 0x5a, 0xb8, 0x15, 0xc4, 0x57, 0x91, 0x90, 0xc2, - 0xdb, 0x60, 0xc6, 0x20, 0xae, 0x8b, 0x07, 0xa4, 0x51, 0xe5, 0x8a, 0x0b, 0x42, 0x71, 0xe6, 0xc0, - 0x5f, 0x46, 0x81, 0x1c, 0x3e, 0x03, 0x75, 0x1d, 0xbb, 0xf4, 0xc4, 0xee, 0x63, 0x4a, 0x8e, 0x35, - 0x83, 0x34, 0xa6, 0xf9, 0x81, 0x7e, 0x34, 0xd9, 0xdd, 0x33, 0x8b, 0xf6, 0x8a, 0x40, 0xaf, 0xef, - 0x27, 0x90, 0x50, 0x0a, 0x19, 0x0e, 0x01, 0x64, 0x2b, 0xc7, 0x0e, 0x36, 0x5d, 0xff, 0xa0, 0x98, - 0xbf, 0x99, 0x6b, 0xfb, 0x5b, 0x13, 0xfe, 0xe0, 0x7e, 0x06, 0x0d, 0xe5, 0x78, 0x90, 0xff, 0x20, - 0x81, 0x7a, 0x74, 0x4d, 0x37, 0xf0, 0x56, 0xbf, 0x4d, 0xbe, 0xd5, 0xef, 0x4f, 0x90, 0x9c, 0x05, - 0x6f, 0xf4, 0x9f, 0x25, 0x00, 0x23, 0x25, 0x64, 0xe9, 0x7a, 0x0f, 0xab, 0x67, 0x70, 0x03, 0x54, - 0x4c, 0x6c, 0x04, 0x39, 0x19, 0x3e, 0x90, 0x1f, 0x63, 0x83, 0x20, 0x2e, 0x81, 0x2f, 0x24, 0x00, - 0x3d, 0x7e, 0xf4, 0xfd, 0x1d, 0xd3, 0xb4, 0x28, 0x66, 0xa7, 0x11, 0x04, 0xd4, 0x99, 0x20, 0xa0, - 0xc0, 0x97, 0x72, 0x92, 0x41, 0xb9, 0x6f, 0x52, 0x67, 0x14, 0xdd, 0x42, 0x56, 0x01, 0xe5, 0xb8, - 0x86, 0x3f, 0x03, 0xc0, 0x11, 0x98, 0xc7, 0x96, 0x78, 0xb6, 0xc5, 0x35, 0x20, 0x70, 0xdf, 0xb1, - 0xcc, 0xa7, 0xda, 0x20, 0x2a, 0x2c, 0x28, 0x84, 0x40, 0x31, 0xb8, 0xb5, 0xfb, 0x60, 0xb5, 0x20, - 0x4e, 0x78, 0x0b, 0x94, 0xcf, 0xc8, 0xc8, 0x3f, 0x2a, 0xc4, 0x7e, 0xc2, 0x65, 0x50, 0x1d, 0x62, - 0xdd, 0x23, 0xfe, 0x9b, 0x44, 0xfe, 0xc7, 0xdd, 0xd2, 0x97, 0x92, 0xfc, 0xfb, 0x6a, 0x3c, 0x53, - 0x58, 0xbd, 0x81, 0x9b, 0xac, 0x3d, 0xd8, 0xba, 0xa6, 0x62, 0x97, 0x63, 0x54, 0xdb, 0xef, 0xf8, - 0xad, 0xc1, 0x5f, 0x43, 0xa1, 0x14, 0xfe, 0x02, 0xd4, 0x5c, 0xa2, 0x13, 0x95, 0x5a, 0x8e, 0x28, - 0x71, 0x9f, 0x4d, 0x98, 0x53, 0xb8, 0x47, 0xf4, 0xae, 0x30, 0xf5, 0xe1, 0x83, 0x2f, 0x14, 0x42, - 0xc2, 0x87, 0xa0, 0x46, 0x89, 0x61, 0xeb, 0x98, 0x12, 0x71, 0x7a, 0x89, 0xbc, 0x62, 0xb5, 0x83, - 0x81, 0x1d, 0x59, 0xfd, 0x63, 0xa1, 0xc6, 0xab, 0x67, 0x98, 0xa7, 0xc1, 0x2a, 0x0a, 0x61, 0xe0, - 0x4f, 0x41, 0xcd, 0xa5, 0xac, 0xab, 0x0f, 0x46, 0xbc, 0xa2, 0x5c, 0xd6, 0x56, 0xe2, 0x75, 0xd4, - 0x37, 0x89, 0xa0, 0x83, 0x15, 0x14, 0xc2, 0xc1, 0x1d, 0xb0, 0x60, 0x68, 0x26, 0x22, 0xb8, 0x3f, - 0xea, 0x12, 0xd5, 0x32, 0xfb, 0x2e, 0x2f, 0x45, 0xd5, 0xf6, 0xaa, 0x30, 0x5a, 0x38, 0x48, 0x8a, - 0x51, 0x5a, 0x1f, 0xee, 0x83, 0xe5, 0xa0, 0xed, 0x7e, 0xab, 0xb9, 0xd4, 0x72, 0x46, 0xfb, 0x9a, - 0xa1, 0x51, 0x5e, 0xa0, 0xaa, 0xed, 0xc6, 0xf8, 0x62, 0x7d, 0x19, 0xe5, 0xc8, 0x51, 0xae, 0x15, - 0xab, 0x9d, 0x36, 0xf6, 0x5c, 0xd2, 0xe7, 0x05, 0xa7, 0x16, 0xd5, 0xce, 0x23, 0xbe, 0x8a, 0x84, - 0x14, 0xfe, 0x24, 0x91, 0xa6, 0xb5, 0xeb, 0xa5, 0x69, 0xbd, 0x38, 0x45, 0xe1, 0x09, 0x58, 0xb5, - 0x1d, 0x6b, 0xe0, 0x10, 0xd7, 0xdd, 0x25, 0xb8, 0xaf, 0x6b, 0x26, 0x09, 0x4e, 0x66, 0x96, 0xef, - 0xe8, 0xbd, 0xf1, 0xc5, 0xfa, 0xea, 0x51, 0xbe, 0x0a, 0x2a, 0xb2, 0x95, 0xff, 0x5c, 0x01, 0xb7, - 0xd2, 0x3d, 0x0e, 0x3e, 0x00, 0xd0, 0xea, 0xb9, 0xc4, 0x19, 0x92, 0xfe, 0x37, 0x3e, 0x71, 0x63, - 0xec, 0x46, 0xe2, 0xec, 0x26, 0x7c, 0xb7, 0x87, 0x19, 0x0d, 0x94, 0x63, 0xe5, 0xf3, 0x23, 0xf1, - 0x00, 0x4a, 0x3c, 0xd0, 0x18, 0x3f, 0xca, 0x3c, 0x82, 0x1d, 0xb0, 0x20, 0xde, 0x7e, 0x20, 0xe4, - 0xc9, 0x1a, 0xbb, 0xf7, 0x93, 0xa4, 0x18, 0xa5, 0xf5, 0xe1, 0x37, 0x60, 0x11, 0x0f, 0xb1, 0xa6, - 0xe3, 0x9e, 0x4e, 0x42, 0x90, 0x0a, 0x07, 0x79, 0x57, 0x80, 0x2c, 0xee, 0xa4, 0x15, 0x50, 0xd6, - 0x06, 0x1e, 0x80, 0x25, 0xcf, 0xcc, 0x42, 0xf9, 0x79, 0xf8, 0x9e, 0x80, 0x5a, 0x3a, 0xc9, 0xaa, - 0xa0, 0x3c, 0x3b, 0xf8, 0x04, 0x00, 0x35, 0x68, 0xcc, 0x6e, 0x63, 0x9a, 0x57, 0xd2, 0x4f, 0x26, - 0x78, 0x2f, 0x61, 0x37, 0x8f, 0xaa, 0x58, 0xb8, 0xe4, 0xa2, 0x18, 0x26, 0xbc, 0x07, 0xe6, 0x1d, - 0xf6, 0x02, 0xc2, 0x50, 0x67, 0x78, 0xa8, 0xdf, 0x11, 0x66, 0xf3, 0x28, 0x2e, 0x44, 0x49, 0x5d, - 0x78, 0x17, 0xd4, 0x55, 0x4b, 0xd7, 0x79, 0xe6, 0x77, 0x2c, 0xcf, 0xa4, 0x3c, 0x79, 0xcb, 0x6d, - 0xc8, 0x3a, 0x73, 0x27, 0x21, 0x41, 0x29, 0x4d, 0xf9, 0x4f, 0x52, 0xbc, 0xcd, 0x04, 0xcf, 0x19, - 0xde, 0x4d, 0x50, 0x9f, 0x0f, 0x52, 0xd4, 0x67, 0x25, 0x6b, 0x11, 0x63, 0x3e, 0x1a, 0x98, 0x67, - 0xc9, 0xaf, 0x99, 0x03, 0xff, 0xc2, 0x45, 0x49, 0xfc, 0xf4, 0xd2, 0xa7, 0x14, 0x6a, 0xc7, 0x1a, - 0xe3, 0x22, 0xdf, 0x79, 0x5c, 0x88, 0x92, 0xc8, 0xf2, 0xd7, 0xa0, 0x9e, 0x7c, 0x87, 0x09, 0x4e, - 0x2f, 0x5d, 0xc9, 0xe9, 0xdf, 0x48, 0x60, 0xb5, 0xc0, 0x3b, 0xd4, 0x41, 0xdd, 0xc0, 0xcf, 0x63, - 0x39, 0x72, 0x25, 0x37, 0x66, 0x53, 0x93, 0xe2, 0x4f, 0x4d, 0xca, 0x9e, 0x49, 0x0f, 0x9d, 0x2e, - 0x75, 0x34, 0x73, 0xe0, 0xdf, 0xc3, 0x41, 0x02, 0x0b, 0xa5, 0xb0, 0xe1, 0x63, 0x50, 0x33, 0xf0, - 0xf3, 0xae, 0xe7, 0x0c, 0xf2, 0xce, 0x6b, 0x32, 0x3f, 0xbc, 0x7f, 0x1c, 0x08, 0x14, 0x14, 0xe2, - 0xc9, 0x87, 0x60, 0x23, 0xb1, 0x49, 0x56, 0x2a, 0xc8, 0x53, 0x4f, 0xef, 0x92, 0xe8, 0xc2, 0x3f, - 0x06, 0xb3, 0x36, 0x76, 0xa8, 0x16, 0x96, 0x8b, 0x6a, 0x7b, 0x7e, 0x7c, 0xb1, 0x3e, 0x7b, 0x14, - 0x2c, 0xa2, 0x48, 0x2e, 0xff, 0x5b, 0x02, 0xd5, 0xae, 0x8a, 0x75, 0x72, 0x03, 0xa3, 0xc3, 0x6e, - 0x62, 0x74, 0x90, 0x0b, 0x93, 0x88, 0xc7, 0x53, 0x38, 0x35, 0xec, 0xa7, 0xa6, 0x86, 0xf7, 0xaf, - 0xc0, 0xb9, 0x7c, 0x60, 0xf8, 0x0a, 0xcc, 0x86, 0xee, 0x12, 0x55, 0x52, 0xba, 0xaa, 0x4a, 0xca, - 0xbf, 0x2b, 0x81, 0xb9, 0x98, 0x8b, 0xeb, 0x59, 0xb3, 0xe3, 0x8e, 0x11, 0x0d, 0x56, 0x86, 0xb6, - 0x27, 0xd9, 0x88, 0x12, 0x90, 0x0a, 0x9f, 0xbf, 0x45, 0xdd, 0x3b, 0xcb, 0x35, 0xbe, 0x06, 0x75, - 0x8a, 0x9d, 0x01, 0xa1, 0x81, 0x8c, 0x1f, 0xd8, 0x6c, 0xc4, 0xf4, 0x8f, 0x13, 0x52, 0x94, 0xd2, - 0x5e, 0xbb, 0x07, 0xe6, 0x13, 0xce, 0xae, 0x45, 0xc2, 0x5e, 0xb0, 0xc3, 0x89, 0x92, 0xf3, 0x06, - 0xb2, 0xeb, 0x41, 0x22, 0xbb, 0x36, 0x8b, 0x0f, 0x33, 0xf6, 0x64, 0x8a, 0x72, 0x0c, 0xa5, 0x72, - 0xec, 0xa3, 0x89, 0xd0, 0x2e, 0xcf, 0xb4, 0x3f, 0x4a, 0x60, 0x21, 0xa6, 0x7d, 0x03, 0x13, 0xcc, - 0x5e, 0x72, 0x82, 0x79, 0x7f, 0x92, 0x4d, 0x14, 0x8c, 0x30, 0x7f, 0xa9, 0x26, 0x82, 0xff, 0xbf, - 0x27, 0xd5, 0xbf, 0x02, 0xcb, 0x43, 0x4b, 0xf7, 0x0c, 0xd2, 0xd1, 0xb1, 0x66, 0x04, 0x0a, 0x8c, - 0xc1, 0x94, 0xd3, 0x7f, 0x54, 0x84, 0xf0, 0xc4, 0x71, 0x35, 0x97, 0x12, 0x93, 0x3e, 0x8a, 0x2c, - 0xdb, 0xdf, 0x15, 0x4e, 0x96, 0x1f, 0xe5, 0xc0, 0xa1, 0x5c, 0x27, 0xf0, 0x07, 0x60, 0x8e, 0x11, - 0x38, 0x4d, 0x25, 0x6c, 0x16, 0x14, 0xd3, 0xff, 0x92, 0x00, 0x9a, 0xeb, 0x46, 0x22, 0x14, 0xd7, - 0x83, 0xa7, 0x60, 0xc9, 0xb6, 0xfa, 0x07, 0xd8, 0xc4, 0x03, 0xc2, 0xda, 0xde, 0x11, 0xff, 0x43, - 0x93, 0x33, 0xed, 0xd9, 0xf6, 0x17, 0x01, 0x53, 0x3a, 0xca, 0xaa, 0xbc, 0x65, 0x94, 0x35, 0xbb, - 0xcc, 0x79, 0x40, 0x1e, 0x24, 0x74, 0x40, 0xdd, 0x13, 0xed, 0x47, 0x0c, 0x1e, 0xfe, 0xfc, 0xbf, - 0x3d, 0x49, 0x86, 0x9d, 0x24, 0x2c, 0xa3, 0x6a, 0x94, 0x5c, 0x47, 0x29, 0x0f, 0x85, 0x83, 0x44, - 0xed, 0xbf, 0x19, 0x24, 0xe4, 0xbf, 0x96, 0xc1, 0x62, 0xe6, 0xe9, 0xc2, 0x1f, 0x5d, 0xc2, 0xb8, - 0x57, 0xfe, 0x67, 0x6c, 0x3b, 0x43, 0x18, 0xcb, 0xd7, 0x20, 0x8c, 0x3b, 0x60, 0x41, 0xf5, 0x1c, - 0x87, 0xcd, 0xfa, 0x49, 0x96, 0x1d, 0x52, 0xf5, 0x4e, 0x52, 0x8c, 0xd2, 0xfa, 0x79, 0x6c, 0xbf, - 0x7a, 0x4d, 0xb6, 0x1f, 0x8f, 0x42, 0x30, 0x36, 0x3f, 0xed, 0xb2, 0x51, 0x08, 0xe2, 0x96, 0xd6, - 0x67, 0xdd, 0xca, 0x47, 0x0d, 0x11, 0x66, 0x92, 0xdd, 0xea, 0x24, 0x21, 0x45, 0x29, 0x6d, 0xf9, - 0x6f, 0x12, 0x78, 0xb7, 0x30, 0xcb, 0xe0, 0x4e, 0x82, 0x04, 0x6f, 0xa5, 0x48, 0xf0, 0xf7, 0x0a, - 0x0d, 0x63, 0x5c, 0xd8, 0xc9, 0xe7, 0xc2, 0x5f, 0x4d, 0xc6, 0x85, 0x73, 0x88, 0xda, 0xd5, 0xa4, - 0xb8, 0xbd, 0x75, 0xfe, 0xba, 0x39, 0xf5, 0xf2, 0x75, 0x73, 0xea, 0xd5, 0xeb, 0xe6, 0xd4, 0xaf, - 0xc7, 0x4d, 0xe9, 0x7c, 0xdc, 0x94, 0x5e, 0x8e, 0x9b, 0xd2, 0xab, 0x71, 0x53, 0xfa, 0xc7, 0xb8, - 0x29, 0xfd, 0xf6, 0x4d, 0x73, 0xea, 0xf1, 0x8c, 0xf0, 0xf8, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xa4, 0xc5, 0x7c, 0x3a, 0x7d, 0x19, 0x00, 0x00, + 0x15, 0x77, 0xcf, 0x87, 0x3d, 0x53, 0x5e, 0x8f, 0xe3, 0xb2, 0xb1, 0x67, 0xbd, 0x30, 0xb6, 0x86, + 0xd5, 0xae, 0xb3, 0xbb, 0xee, 0xd9, 0x78, 0x97, 0xd5, 0x26, 0x91, 0x22, 0x3c, 0xe3, 0x90, 0x38, + 0xb2, 0xb1, 0x53, 0x63, 0x07, 0x11, 0x40, 0x4a, 0x4d, 0x4f, 0x65, 0xdc, 0x71, 0x7f, 0xa9, 0xbb, + 0x7a, 0xc8, 0x88, 0x0b, 0x77, 0x90, 0xc2, 0x99, 0xbf, 0x82, 0x23, 0x82, 0x1b, 0x27, 0x5f, 0x90, + 0x22, 0x2e, 0xe4, 0x64, 0x91, 0xc9, 0x95, 0x2b, 0x97, 0x48, 0x48, 0xa8, 0xaa, 0xab, 0xbf, 0xbb, + 0xed, 0x31, 0x12, 0x3e, 0x70, 0x9b, 0xae, 0xf7, 0xde, 0xef, 0xbd, 0xaa, 0x7a, 0xf5, 0xde, 0xef, + 0x0d, 0xf8, 0xe1, 0xe9, 0xb7, 0x8e, 0xac, 0x9a, 0xad, 0x53, 0xb7, 0x47, 0x6c, 0x83, 0x50, 0xe2, + 0xb4, 0x86, 0xc4, 0xe8, 0x9b, 0x76, 0x4b, 0x08, 0xb0, 0xa5, 0xb6, 0xb0, 0x65, 0x39, 0xad, 0xe1, + 0xad, 0x1e, 0xa1, 0xf8, 0x56, 0x6b, 0x40, 0x0c, 0x62, 0x63, 0x4a, 0xfa, 0xb2, 0x65, 0x9b, 0xd4, + 0x84, 0x2b, 0x9e, 0xa2, 0x8c, 0x2d, 0x55, 0x66, 0x8a, 0xb2, 0x50, 0x5c, 0xdd, 0x1c, 0xa8, 0xf4, + 0xc4, 0xed, 0xc9, 0x8a, 0xa9, 0xb7, 0x06, 0xe6, 0xc0, 0x6c, 0x71, 0xfd, 0x9e, 0xfb, 0x9c, 0x7f, + 0xf1, 0x0f, 0xfe, 0xcb, 0xc3, 0x59, 0x6d, 0x46, 0x1c, 0x2a, 0xa6, 0x4d, 0x5a, 0xc3, 0x94, 0xaf, + 0xd5, 0x9b, 0x11, 0x1d, 0xcb, 0xd4, 0x54, 0x65, 0x94, 0x17, 0xd6, 0xea, 0xd7, 0xa1, 0xaa, 0x8e, + 0x95, 0x13, 0xd5, 0x20, 0xf6, 0xa8, 0x65, 0x9d, 0x0e, 0xd8, 0x82, 0xd3, 0xd2, 0x09, 0xc5, 0x59, + 0x0e, 0x5a, 0x79, 0x56, 0xb6, 0x6b, 0x50, 0x55, 0x27, 0x29, 0x83, 0x6f, 0x2e, 0x33, 0x70, 0x94, + 0x13, 0xa2, 0xe3, 0x94, 0xdd, 0x57, 0x79, 0x76, 0x2e, 0x55, 0xb5, 0x96, 0x6a, 0x50, 0x87, 0xda, + 0x49, 0xa3, 0xe6, 0xbf, 0x24, 0x00, 0x3b, 0xa6, 0x41, 0x6d, 0x53, 0xd3, 0x88, 0x8d, 0xc8, 0x50, + 0x75, 0x54, 0xd3, 0x80, 0xcf, 0x40, 0x85, 0xed, 0xa7, 0x8f, 0x29, 0xae, 0x4b, 0xeb, 0xd2, 0xc6, + 0xec, 0xd6, 0x97, 0x72, 0x78, 0x29, 0x01, 0xbc, 0x6c, 0x9d, 0x0e, 0xd8, 0x82, 0x23, 0x33, 0x6d, + 0x79, 0x78, 0x4b, 0x3e, 0xe8, 0xbd, 0x20, 0x0a, 0xdd, 0x27, 0x14, 0xb7, 0xe1, 0xd9, 0xf9, 0xda, + 0xd4, 0xf8, 0x7c, 0x0d, 0x84, 0x6b, 0x28, 0x40, 0x85, 0x07, 0xa0, 0xc4, 0xd1, 0x0b, 0x1c, 0x7d, + 0x33, 0x17, 0x5d, 0x6c, 0x5a, 0x46, 0xf8, 0x97, 0xf7, 0x5f, 0x52, 0x62, 0xb0, 0xf0, 0xda, 0x1f, + 0x08, 0xe8, 0xd2, 0x0e, 0xa6, 0x18, 0x71, 0x20, 0xf8, 0x05, 0xa8, 0xd8, 0x22, 0xfc, 0x7a, 0x71, + 0x5d, 0xda, 0x28, 0xb6, 0x6f, 0x08, 0xad, 0x8a, 0xbf, 0x2d, 0x14, 0x68, 0x34, 0xcf, 0x24, 0xb0, + 0x9c, 0xde, 0xf7, 0x9e, 0xea, 0x50, 0xf8, 0xf3, 0xd4, 0xde, 0xe5, 0xc9, 0xf6, 0xce, 0xac, 0xf9, + 0xce, 0x03, 0xc7, 0xfe, 0x4a, 0x64, 0xdf, 0x87, 0xa0, 0xac, 0x52, 0xa2, 0x3b, 0xf5, 0xc2, 0x7a, + 0x71, 0x63, 0x76, 0xeb, 0x73, 0x39, 0x27, 0xd7, 0xe5, 0x74, 0x74, 0xed, 0x39, 0x81, 0x5b, 0xde, + 0x65, 0x08, 0xc8, 0x03, 0x6a, 0xfe, 0xb6, 0x00, 0xc0, 0x0e, 0xb1, 0x34, 0x73, 0xa4, 0x13, 0x83, + 0x5e, 0xc3, 0xd5, 0xed, 0x82, 0x92, 0x63, 0x11, 0x45, 0x5c, 0xdd, 0xa7, 0xb9, 0x3b, 0x08, 0x83, + 0xea, 0x5a, 0x44, 0x09, 0x2f, 0x8d, 0x7d, 0x21, 0x0e, 0x01, 0x1f, 0x83, 0x69, 0x87, 0x62, 0xea, + 0x3a, 0xfc, 0xca, 0x66, 0xb7, 0x6e, 0x4e, 0x02, 0xc6, 0x0d, 0xda, 0x35, 0x01, 0x37, 0xed, 0x7d, + 0x23, 0x01, 0xd4, 0xfc, 0x7b, 0x11, 0x2c, 0x86, 0xca, 0x1d, 0xd3, 0xe8, 0xab, 0x94, 0xa5, 0xf4, + 0x5d, 0x50, 0xa2, 0x23, 0x8b, 0xf0, 0x33, 0xa9, 0xb6, 0x3f, 0xf5, 0x83, 0x39, 0x1a, 0x59, 0xe4, + 0xfd, 0xf9, 0xda, 0x4a, 0x86, 0x09, 0x13, 0x21, 0x6e, 0x04, 0xf7, 0x82, 0x38, 0x0b, 0xdc, 0xfc, + 0xeb, 0xb8, 0xf3, 0xf7, 0xe7, 0x6b, 0x19, 0xb5, 0x46, 0x0e, 0x90, 0xe2, 0x21, 0xc2, 0x4f, 0xc0, + 0xb4, 0x4d, 0xb0, 0x63, 0x1a, 0xf5, 0x12, 0x47, 0x0b, 0xb6, 0x82, 0xf8, 0x2a, 0x12, 0x52, 0x78, + 0x13, 0xcc, 0xe8, 0xc4, 0x71, 0xf0, 0x80, 0xd4, 0xcb, 0x5c, 0x71, 0x5e, 0x28, 0xce, 0xec, 0x7b, + 0xcb, 0xc8, 0x97, 0xc3, 0x17, 0xa0, 0xa6, 0x61, 0x87, 0x1e, 0x5b, 0x7d, 0x4c, 0xc9, 0x91, 0xaa, + 0x93, 0xfa, 0x34, 0x3f, 0xd0, 0xcf, 0x26, 0xbb, 0x7b, 0x66, 0xd1, 0x5e, 0x16, 0xe8, 0xb5, 0xbd, + 0x18, 0x12, 0x4a, 0x20, 0xc3, 0x21, 0x80, 0x6c, 0xe5, 0xc8, 0xc6, 0x86, 0xe3, 0x1d, 0x14, 0xf3, + 0x37, 0x73, 0x65, 0x7f, 0xab, 0xc2, 0x1f, 0xdc, 0x4b, 0xa1, 0xa1, 0x0c, 0x0f, 0xcd, 0x3f, 0x4a, + 0xa0, 0x16, 0x5e, 0xd3, 0x35, 0xbc, 0xd5, 0x87, 0xf1, 0xb7, 0xfa, 0xfd, 0x09, 0x92, 0x33, 0xe7, + 0x8d, 0xfe, 0xb3, 0x00, 0x60, 0xa8, 0x84, 0x4c, 0x4d, 0xeb, 0x61, 0xe5, 0x14, 0xae, 0x83, 0x92, + 0x81, 0x75, 0x3f, 0x27, 0x83, 0x07, 0xf2, 0x63, 0xac, 0x13, 0xc4, 0x25, 0xf0, 0x95, 0x04, 0xa0, + 0xcb, 0x8f, 0xbe, 0xbf, 0x6d, 0x18, 0x26, 0xc5, 0xec, 0x34, 0xfc, 0x80, 0x3a, 0x13, 0x04, 0xe4, + 0xfb, 0x92, 0x8f, 0x53, 0x28, 0xf7, 0x0d, 0x6a, 0x8f, 0xc2, 0x5b, 0x48, 0x2b, 0xa0, 0x0c, 0xd7, + 0xf0, 0x67, 0x00, 0xd8, 0x02, 0xf3, 0xc8, 0x14, 0xcf, 0x36, 0xbf, 0x06, 0xf8, 0xee, 0x3b, 0xa6, + 0xf1, 0x5c, 0x1d, 0x84, 0x85, 0x05, 0x05, 0x10, 0x28, 0x02, 0xb7, 0x7a, 0x1f, 0xac, 0xe4, 0xc4, + 0x09, 0x6f, 0x80, 0xe2, 0x29, 0x19, 0x79, 0x47, 0x85, 0xd8, 0x4f, 0xb8, 0x04, 0xca, 0x43, 0xac, + 0xb9, 0xc4, 0x7b, 0x93, 0xc8, 0xfb, 0xb8, 0x53, 0xf8, 0x56, 0x6a, 0xfe, 0xa1, 0x1c, 0xcd, 0x14, + 0x56, 0x6f, 0xe0, 0x06, 0x6b, 0x0f, 0x96, 0xa6, 0x2a, 0xd8, 0xe1, 0x18, 0xe5, 0xf6, 0x07, 0x5e, + 0x6b, 0xf0, 0xd6, 0x50, 0x20, 0x85, 0xbf, 0x00, 0x15, 0x87, 0x68, 0x44, 0xa1, 0xa6, 0x2d, 0x4a, + 0xdc, 0x57, 0x13, 0xe6, 0x14, 0xee, 0x11, 0xad, 0x2b, 0x4c, 0x3d, 0x78, 0xff, 0x0b, 0x05, 0x90, + 0xf0, 0x31, 0xa8, 0x50, 0xa2, 0x5b, 0x1a, 0xa6, 0x44, 0x9c, 0x5e, 0x2c, 0xaf, 0x58, 0xed, 0x60, + 0x60, 0x87, 0x66, 0xff, 0x48, 0xa8, 0xf1, 0xea, 0x19, 0xe4, 0xa9, 0xbf, 0x8a, 0x02, 0x18, 0xf8, + 0x53, 0x50, 0x71, 0x28, 0xeb, 0xea, 0x83, 0x11, 0xaf, 0x28, 0x17, 0xb5, 0x95, 0x68, 0x1d, 0xf5, + 0x4c, 0x42, 0x68, 0x7f, 0x05, 0x05, 0x70, 0x70, 0x1b, 0xcc, 0xeb, 0xaa, 0x81, 0x08, 0xee, 0x8f, + 0xba, 0x44, 0x31, 0x8d, 0xbe, 0xc3, 0x4b, 0x51, 0xb9, 0xbd, 0x22, 0x8c, 0xe6, 0xf7, 0xe3, 0x62, + 0x94, 0xd4, 0x87, 0x7b, 0x60, 0xc9, 0x6f, 0xbb, 0x0f, 0x55, 0x87, 0x9a, 0xf6, 0x68, 0x4f, 0xd5, + 0x55, 0xca, 0x0b, 0x54, 0xb9, 0x5d, 0x1f, 0x9f, 0xaf, 0x2d, 0xa1, 0x0c, 0x39, 0xca, 0xb4, 0x62, + 0xb5, 0xd3, 0xc2, 0xae, 0x43, 0xfa, 0xbc, 0xe0, 0x54, 0xc2, 0xda, 0x79, 0xc8, 0x57, 0x91, 0x90, + 0xc2, 0x9f, 0xc4, 0xd2, 0xb4, 0x72, 0xb5, 0x34, 0xad, 0xe5, 0xa7, 0x28, 0x3c, 0x06, 0x2b, 0x96, + 0x6d, 0x0e, 0x6c, 0xe2, 0x38, 0x3b, 0x04, 0xf7, 0x35, 0xd5, 0x20, 0xfe, 0xc9, 0x54, 0xf9, 0x8e, + 0x3e, 0x1a, 0x9f, 0xaf, 0xad, 0x1c, 0x66, 0xab, 0xa0, 0x3c, 0xdb, 0xe6, 0x5f, 0x4a, 0xe0, 0x46, + 0xb2, 0xc7, 0xc1, 0x47, 0x00, 0x9a, 0x3d, 0x87, 0xd8, 0x43, 0xd2, 0x7f, 0xe0, 0x11, 0x37, 0xc6, + 0x6e, 0x24, 0xce, 0x6e, 0x82, 0x77, 0x7b, 0x90, 0xd2, 0x40, 0x19, 0x56, 0x1e, 0x3f, 0x12, 0x0f, + 0xa0, 0xc0, 0x03, 0x8d, 0xf0, 0xa3, 0xd4, 0x23, 0xd8, 0x06, 0xf3, 0xe2, 0xed, 0xfb, 0x42, 0x9e, + 0xac, 0x91, 0x7b, 0x3f, 0x8e, 0x8b, 0x51, 0x52, 0x1f, 0x3e, 0x00, 0x0b, 0x78, 0x88, 0x55, 0x0d, + 0xf7, 0x34, 0x12, 0x80, 0x94, 0x38, 0xc8, 0x87, 0x02, 0x64, 0x61, 0x3b, 0xa9, 0x80, 0xd2, 0x36, + 0x70, 0x1f, 0x2c, 0xba, 0x46, 0x1a, 0xca, 0xcb, 0xc3, 0x8f, 0x04, 0xd4, 0xe2, 0x71, 0x5a, 0x05, + 0x65, 0xd9, 0xc1, 0x67, 0x00, 0x28, 0x7e, 0x63, 0x76, 0xea, 0xd3, 0xbc, 0x92, 0x7e, 0x31, 0xc1, + 0x7b, 0x09, 0xba, 0x79, 0x58, 0xc5, 0x82, 0x25, 0x07, 0x45, 0x30, 0xe1, 0x5d, 0x30, 0x67, 0xb3, + 0x17, 0x10, 0x84, 0x3a, 0xc3, 0x43, 0xfd, 0x8e, 0x30, 0x9b, 0x43, 0x51, 0x21, 0x8a, 0xeb, 0xc2, + 0x3b, 0xa0, 0xa6, 0x98, 0x9a, 0xc6, 0x33, 0xbf, 0x63, 0xba, 0x06, 0xe5, 0xc9, 0x5b, 0x6c, 0x43, + 0xd6, 0x99, 0x3b, 0x31, 0x09, 0x4a, 0x68, 0x36, 0xff, 0x2c, 0x45, 0xdb, 0x8c, 0xff, 0x9c, 0xe1, + 0x9d, 0x18, 0xf5, 0xf9, 0x24, 0x41, 0x7d, 0x96, 0xd3, 0x16, 0x11, 0xe6, 0xa3, 0x82, 0x39, 0x96, + 0xfc, 0xaa, 0x31, 0xf0, 0x2e, 0x5c, 0x94, 0xc4, 0x2f, 0x2f, 0x7c, 0x4a, 0x81, 0x76, 0xa4, 0x31, + 0x2e, 0xf0, 0x9d, 0x47, 0x85, 0x28, 0x8e, 0xdc, 0xbc, 0x07, 0x6a, 0xf1, 0x77, 0x18, 0xe3, 0xf4, + 0xd2, 0xa5, 0x9c, 0xfe, 0x9d, 0x04, 0x56, 0x72, 0xbc, 0x43, 0x0d, 0xd4, 0x74, 0xfc, 0x32, 0x92, + 0x23, 0x97, 0x72, 0x63, 0x36, 0x35, 0xc9, 0xde, 0xd4, 0x24, 0xef, 0x1a, 0xf4, 0xc0, 0xee, 0x52, + 0x5b, 0x35, 0x06, 0xde, 0x3d, 0xec, 0xc7, 0xb0, 0x50, 0x02, 0x1b, 0x3e, 0x05, 0x15, 0x1d, 0xbf, + 0xec, 0xba, 0xf6, 0x20, 0xeb, 0xbc, 0x26, 0xf3, 0xc3, 0xfb, 0xc7, 0xbe, 0x40, 0x41, 0x01, 0x5e, + 0xf3, 0x00, 0xac, 0xc7, 0x36, 0xc9, 0x4a, 0x05, 0x79, 0xee, 0x6a, 0x5d, 0x12, 0x5e, 0xf8, 0xe7, + 0xa0, 0x6a, 0x61, 0x9b, 0xaa, 0x41, 0xb9, 0x28, 0xb7, 0xe7, 0xc6, 0xe7, 0x6b, 0xd5, 0x43, 0x7f, + 0x11, 0x85, 0xf2, 0xe6, 0xbf, 0x25, 0x50, 0xee, 0x2a, 0x58, 0x23, 0xd7, 0x30, 0x3a, 0xec, 0xc4, + 0x46, 0x87, 0x66, 0x6e, 0x12, 0xf1, 0x78, 0x72, 0xa7, 0x86, 0xbd, 0xc4, 0xd4, 0xf0, 0xf1, 0x25, + 0x38, 0x17, 0x0f, 0x0c, 0xb7, 0x41, 0x35, 0x70, 0x17, 0xab, 0x92, 0xd2, 0x65, 0x55, 0xb2, 0xf9, + 0xfb, 0x02, 0x98, 0x8d, 0xb8, 0xb8, 0x9a, 0x35, 0x3b, 0xee, 0x08, 0xd1, 0x60, 0x65, 0x68, 0x6b, + 0x92, 0x8d, 0xc8, 0x3e, 0xa9, 0xf0, 0xf8, 0x5b, 0xd8, 0xbd, 0xd3, 0x5c, 0xe3, 0x1e, 0xa8, 0x51, + 0x6c, 0x0f, 0x08, 0xf5, 0x65, 0xfc, 0xc0, 0xaa, 0x21, 0xd3, 0x3f, 0x8a, 0x49, 0x51, 0x42, 0x7b, + 0xf5, 0x2e, 0x98, 0x8b, 0x39, 0xbb, 0x12, 0x09, 0x7b, 0xc5, 0x0e, 0x27, 0x4c, 0xce, 0x6b, 0xc8, + 0xae, 0x47, 0xb1, 0xec, 0xda, 0xc8, 0x3f, 0xcc, 0xc8, 0x93, 0xc9, 0xcb, 0x31, 0x94, 0xc8, 0xb1, + 0xcf, 0x26, 0x42, 0xbb, 0x38, 0xd3, 0xfe, 0x24, 0x81, 0xf9, 0x88, 0xf6, 0x35, 0x4c, 0x30, 0xbb, + 0xf1, 0x09, 0xe6, 0xe3, 0x49, 0x36, 0x91, 0x33, 0xc2, 0xfc, 0xb5, 0x1c, 0x0b, 0xfe, 0xff, 0x9e, + 0x54, 0xff, 0x0a, 0x2c, 0x0d, 0x4d, 0xcd, 0xd5, 0x49, 0x47, 0xc3, 0xaa, 0xee, 0x2b, 0x30, 0x06, + 0x53, 0x4c, 0xfe, 0x51, 0x11, 0xc0, 0x13, 0xdb, 0x51, 0x1d, 0x4a, 0x0c, 0xfa, 0x24, 0xb4, 0x6c, + 0x7f, 0x57, 0x38, 0x59, 0x7a, 0x92, 0x01, 0x87, 0x32, 0x9d, 0xc0, 0x1f, 0x80, 0x59, 0x46, 0xe0, + 0x54, 0x85, 0xb0, 0x59, 0x50, 0x4c, 0xff, 0x8b, 0x02, 0x68, 0xb6, 0x1b, 0x8a, 0x50, 0x54, 0x0f, + 0x9e, 0x80, 0x45, 0xcb, 0xec, 0xef, 0x63, 0x03, 0x0f, 0x08, 0x6b, 0x7b, 0x87, 0xfc, 0x0f, 0x4d, + 0xce, 0xb4, 0xab, 0xed, 0x6f, 0x7c, 0xa6, 0x74, 0x98, 0x56, 0x79, 0xcf, 0x28, 0x6b, 0x7a, 0x99, + 0xf3, 0x80, 0x2c, 0x48, 0x68, 0x83, 0x9a, 0x2b, 0xda, 0x8f, 0x18, 0x3c, 0xbc, 0xf9, 0x7f, 0x6b, + 0x92, 0x0c, 0x3b, 0x8e, 0x59, 0x86, 0xd5, 0x28, 0xbe, 0x8e, 0x12, 0x1e, 0x72, 0x07, 0x89, 0xca, + 0x7f, 0x33, 0x48, 0x34, 0x7f, 0x53, 0x02, 0x0b, 0xa9, 0xa7, 0x0b, 0x7f, 0x74, 0x01, 0xe3, 0x5e, + 0xfe, 0x9f, 0xb1, 0xed, 0x14, 0x61, 0x2c, 0x5e, 0x81, 0x30, 0x6e, 0x83, 0x79, 0xc5, 0xb5, 0x6d, + 0x36, 0xeb, 0xc7, 0x59, 0x76, 0x40, 0xd5, 0x3b, 0x71, 0x31, 0x4a, 0xea, 0x67, 0xb1, 0xfd, 0xf2, + 0x15, 0xd9, 0x7e, 0x34, 0x0a, 0xc1, 0xd8, 0xbc, 0xb4, 0x4b, 0x47, 0x21, 0x88, 0x5b, 0x52, 0x9f, + 0x75, 0x2b, 0x0f, 0x35, 0x40, 0x98, 0x89, 0x77, 0xab, 0xe3, 0x98, 0x14, 0x25, 0xb4, 0x33, 0x98, + 0x73, 0x75, 0x62, 0xe6, 0xfc, 0x37, 0x09, 0x7c, 0x98, 0x9b, 0xa1, 0x70, 0x3b, 0x46, 0xa0, 0x37, + 0x13, 0x04, 0xfa, 0x7b, 0xb9, 0x86, 0x11, 0x1e, 0x6d, 0x67, 0xf3, 0xe8, 0xdb, 0x93, 0xf1, 0xe8, + 0x0c, 0x92, 0x77, 0x39, 0xa1, 0x6e, 0x6f, 0x9e, 0xbd, 0x6d, 0x4c, 0xbd, 0x7e, 0xdb, 0x98, 0x7a, + 0xf3, 0xb6, 0x31, 0xf5, 0xeb, 0x71, 0x43, 0x3a, 0x1b, 0x37, 0xa4, 0xd7, 0xe3, 0x86, 0xf4, 0x66, + 0xdc, 0x90, 0xfe, 0x31, 0x6e, 0x48, 0xbf, 0x7b, 0xd7, 0x98, 0x7a, 0x3a, 0x23, 0x3c, 0xfe, 0x27, + 0x00, 0x00, 0xff, 0xff, 0x72, 0x04, 0xd9, 0xa7, 0xb9, 0x19, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/apps/v1beta1/generated.proto b/staging/src/k8s.io/api/apps/v1beta1/generated.proto index 476571e389a..79f49feac03 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/generated.proto +++ b/staging/src/k8s.io/api/apps/v1beta1/generated.proto @@ -109,6 +109,7 @@ message DeploymentList { repeated Deployment items = 2; } +// DEPRECATED. // DeploymentRollback stores the information required to rollback a deployment. message DeploymentRollback { // Required: This must match the Name of a deployment. @@ -157,6 +158,7 @@ message DeploymentSpec { // +optional optional bool paused = 7; + // DEPRECATED. // The config this deployment is rolling back to. Will be cleared after rollback is done. // +optional optional RollbackConfig rollbackTo = 8; @@ -224,6 +226,7 @@ message DeploymentStrategy { optional RollingUpdateDeployment rollingUpdate = 2; } +// DEPRECATED. message RollbackConfig { // The revision to rollback to. If set to 0, rollback to the last revision. // +optional @@ -426,6 +429,12 @@ message StatefulSetStatus { // updateRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence // [replicas-updatedReplicas,replicas) optional string updateRevision = 7; + + // collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller + // uses this field as a collision avoidance mechanism when it needs to create the name for the + // newest ControllerRevision. + // +optional + optional int64 collisionCount = 9; } // StatefulSetUpdateStrategy indicates the strategy that the StatefulSet diff --git a/staging/src/k8s.io/api/apps/v1beta1/types.generated.go b/staging/src/k8s.io/api/apps/v1beta1/types.generated.go index 52bd1fe32a0..faf2b8e711f 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/types.generated.go +++ b/staging/src/k8s.io/api/apps/v1beta1/types.generated.go @@ -2419,7 +2419,7 @@ func (x *StatefulSetStatus) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [7]bool + var yyq2 [8]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = x.ObservedGeneration != nil @@ -2428,9 +2428,10 @@ func (x *StatefulSetStatus) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[4] = x.UpdatedReplicas != 0 yyq2[5] = x.CurrentRevision != "" yyq2[6] = x.UpdateRevision != "" + yyq2[7] = x.CollisionCount != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(7) + r.EncodeArrayStart(8) } else { yynn2 = 1 for _, b := range yyq2 { @@ -2620,6 +2621,41 @@ func (x *StatefulSetStatus) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[7] { + if x.CollisionCount == nil { + r.EncodeNil() + } else { + yy27 := *x.CollisionCount + yym28 := z.EncBinary() + _ = yym28 + if false { + } else { + r.EncodeInt(int64(yy27)) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[7] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("collisionCount")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.CollisionCount == nil { + r.EncodeNil() + } else { + yy29 := *x.CollisionCount + yym30 := z.EncBinary() + _ = yym30 + if false { + } else { + r.EncodeInt(int64(yy29)) + } + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -2769,6 +2805,22 @@ func (x *StatefulSetStatus) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) *((*string)(yyv16)) = r.DecodeString() } } + case "collisionCount": + if r.TryDecodeAsNil() { + if x.CollisionCount != nil { + x.CollisionCount = nil + } + } else { + if x.CollisionCount == nil { + x.CollisionCount = new(int64) + } + yym19 := z.DecBinary() + _ = yym19 + if false { + } else { + *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) + } + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -2780,16 +2832,16 @@ func (x *StatefulSetStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj18 int - var yyb18 bool - var yyhl18 bool = l >= 0 - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + var yyj20 int + var yyb20 bool + var yyhl20 bool = l >= 0 + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2802,20 +2854,20 @@ func (x *StatefulSetStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder if x.ObservedGeneration == nil { x.ObservedGeneration = new(int64) } - yym20 := z.DecBinary() - _ = yym20 + yym22 := z.DecBinary() + _ = yym22 if false { } else { *((*int64)(x.ObservedGeneration)) = int64(r.DecodeInt(64)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2823,29 +2875,7 @@ func (x *StatefulSetStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder if r.TryDecodeAsNil() { x.Replicas = 0 } else { - yyv21 := &x.Replicas - yym22 := z.DecBinary() - _ = yym22 - if false { - } else { - *((*int32)(yyv21)) = int32(r.DecodeInt(32)) - } - } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l - } else { - yyb18 = r.CheckBreak() - } - if yyb18 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.ReadyReplicas = 0 - } else { - yyv23 := &x.ReadyReplicas + yyv23 := &x.Replicas yym24 := z.DecBinary() _ = yym24 if false { @@ -2853,21 +2883,21 @@ func (x *StatefulSetStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder *((*int32)(yyv23)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.CurrentReplicas = 0 + x.ReadyReplicas = 0 } else { - yyv25 := &x.CurrentReplicas + yyv25 := &x.ReadyReplicas yym26 := z.DecBinary() _ = yym26 if false { @@ -2875,21 +2905,21 @@ func (x *StatefulSetStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder *((*int32)(yyv25)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.UpdatedReplicas = 0 + x.CurrentReplicas = 0 } else { - yyv27 := &x.UpdatedReplicas + yyv27 := &x.CurrentReplicas yym28 := z.DecBinary() _ = yym28 if false { @@ -2897,13 +2927,35 @@ func (x *StatefulSetStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder *((*int32)(yyv27)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.UpdatedReplicas = 0 + } else { + yyv29 := &x.UpdatedReplicas + yym30 := z.DecBinary() + _ = yym30 + if false { + } else { + *((*int32)(yyv29)) = int32(r.DecodeInt(32)) + } + } + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l + } else { + yyb20 = r.CheckBreak() + } + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -2911,29 +2963,7 @@ func (x *StatefulSetStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder if r.TryDecodeAsNil() { x.CurrentRevision = "" } else { - yyv29 := &x.CurrentRevision - yym30 := z.DecBinary() - _ = yym30 - if false { - } else { - *((*string)(yyv29)) = r.DecodeString() - } - } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l - } else { - yyb18 = r.CheckBreak() - } - if yyb18 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.UpdateRevision = "" - } else { - yyv31 := &x.UpdateRevision + yyv31 := &x.CurrentRevision yym32 := z.DecBinary() _ = yym32 if false { @@ -2941,18 +2971,66 @@ func (x *StatefulSetStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder *((*string)(yyv31)) = r.DecodeString() } } - for { - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l + } else { + yyb20 = r.CheckBreak() + } + if yyb20 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.UpdateRevision = "" + } else { + yyv33 := &x.UpdateRevision + yym34 := z.DecBinary() + _ = yym34 + if false { } else { - yyb18 = r.CheckBreak() + *((*string)(yyv33)) = r.DecodeString() } - if yyb18 { + } + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l + } else { + yyb20 = r.CheckBreak() + } + if yyb20 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.CollisionCount != nil { + x.CollisionCount = nil + } + } else { + if x.CollisionCount == nil { + x.CollisionCount = new(int64) + } + yym36 := z.DecBinary() + _ = yym36 + if false { + } else { + *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) + } + } + for { + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l + } else { + yyb20 = r.CheckBreak() + } + if yyb20 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj18-1, "") + z.DecStructFieldNotFound(yyj20-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -7976,7 +8054,7 @@ func (x codecSelfer1234) decSliceStatefulSet(v *[]StatefulSet, d *codec1978.Deco yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 1008) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 1016) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/staging/src/k8s.io/api/apps/v1beta1/types.go b/staging/src/k8s.io/api/apps/v1beta1/types.go index dbdadaed93b..6ff3f8fdee1 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/types.go +++ b/staging/src/k8s.io/api/apps/v1beta1/types.go @@ -239,6 +239,12 @@ type StatefulSetStatus struct { // updateRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence // [replicas-updatedReplicas,replicas) UpdateRevision string `json:"updateRevision,omitempty" protobuf:"bytes,7,opt,name=updateRevision"` + + // collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller + // uses this field as a collision avoidance mechanism when it needs to create the name for the + // newest ControllerRevision. + // +optional + CollisionCount *int64 `json:"collisionCount,omitempty" protobuf:"varint,9,opt,name=collisionCount"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -305,6 +311,7 @@ type DeploymentSpec struct { // +optional Paused bool `json:"paused,omitempty" protobuf:"varint,7,opt,name=paused"` + // DEPRECATED. // The config this deployment is rolling back to. Will be cleared after rollback is done. // +optional RollbackTo *RollbackConfig `json:"rollbackTo,omitempty" protobuf:"bytes,8,opt,name=rollbackTo"` @@ -321,6 +328,7 @@ type DeploymentSpec struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// DEPRECATED. // DeploymentRollback stores the information required to rollback a deployment. type DeploymentRollback struct { metav1.TypeMeta `json:",inline"` @@ -333,6 +341,7 @@ type DeploymentRollback struct { RollbackTo RollbackConfig `json:"rollbackTo" protobuf:"bytes,3,opt,name=rollbackTo"` } +// DEPRECATED. type RollbackConfig struct { // The revision to rollback to. If set to 0, rollback to the last revision. // +optional diff --git a/staging/src/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go index 00d1a617fcc..741d9bf74d0 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go @@ -84,7 +84,7 @@ func (DeploymentList) SwaggerDoc() map[string]string { } var map_DeploymentRollback = map[string]string{ - "": "DeploymentRollback stores the information required to rollback a deployment.", + "": "DEPRECATED. DeploymentRollback stores the information required to rollback a deployment.", "name": "Required: This must match the Name of a deployment.", "updatedAnnotations": "The annotations to be updated to a deployment", "rollbackTo": "The config of this deployment rollback.", @@ -103,7 +103,7 @@ var map_DeploymentSpec = map[string]string{ "minReadySeconds": "Minimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)", "revisionHistoryLimit": "The number of old ReplicaSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 2.", "paused": "Indicates that the deployment is paused.", - "rollbackTo": "The config this deployment is rolling back to. Will be cleared after rollback is done.", + "rollbackTo": "DEPRECATED. The config this deployment is rolling back to. Will be cleared after rollback is done.", "progressDeadlineSeconds": "The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Once autoRollback is implemented, the deployment controller will automatically rollback failed deployments. Note that progress will not be estimated during the time a deployment is paused. Defaults to 600s.", } @@ -138,6 +138,7 @@ func (DeploymentStrategy) SwaggerDoc() map[string]string { } var map_RollbackConfig = map[string]string{ + "": "DEPRECATED.", "revision": "The revision to rollback to. If set to 0, rollback to the last revision.", } @@ -238,6 +239,7 @@ var map_StatefulSetStatus = map[string]string{ "updatedReplicas": "updatedReplicas is the number of Pods created by the StatefulSet controller from the StatefulSet version indicated by updateRevision.", "currentRevision": "currentRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence [0,currentReplicas).", "updateRevision": "updateRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas)", + "collisionCount": "collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.", } func (StatefulSetStatus) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go index 0531f834e73..4ee37fe9636 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go @@ -689,6 +689,15 @@ func (in *StatefulSetStatus) DeepCopyInto(out *StatefulSetStatus) { **out = **in } } + if in.CollisionCount != nil { + in, out := &in.CollisionCount, &out.CollisionCount + if *in == nil { + *out = nil + } else { + *out = new(int64) + **out = **in + } + } return } diff --git a/staging/src/k8s.io/api/apps/v1beta2/BUILD b/staging/src/k8s.io/api/apps/v1beta2/BUILD index c4f1dc1985f..dd256cbd310 100644 --- a/staging/src/k8s.io/api/apps/v1beta2/BUILD +++ b/staging/src/k8s.io/api/apps/v1beta2/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", @@ -42,3 +39,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/apps/v1beta2/generated.pb.go b/staging/src/k8s.io/api/apps/v1beta2/generated.pb.go index a6550b091a5..9597fb92213 100644 --- a/staging/src/k8s.io/api/apps/v1beta2/generated.pb.go +++ b/staging/src/k8s.io/api/apps/v1beta2/generated.pb.go @@ -33,7 +33,6 @@ limitations under the License. Deployment DeploymentCondition DeploymentList - DeploymentRollback DeploymentSpec DeploymentStatus DeploymentStrategy @@ -42,7 +41,6 @@ limitations under the License. ReplicaSetList ReplicaSetSpec ReplicaSetStatus - RollbackConfig RollingUpdateDaemonSet RollingUpdateDeployment RollingUpdateStatefulSetStrategy @@ -117,94 +115,86 @@ func (m *DeploymentList) Reset() { *m = DeploymentList{} } func (*DeploymentList) ProtoMessage() {} func (*DeploymentList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{7} } -func (m *DeploymentRollback) Reset() { *m = DeploymentRollback{} } -func (*DeploymentRollback) ProtoMessage() {} -func (*DeploymentRollback) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{8} } - func (m *DeploymentSpec) Reset() { *m = DeploymentSpec{} } func (*DeploymentSpec) ProtoMessage() {} -func (*DeploymentSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{9} } +func (*DeploymentSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{8} } func (m *DeploymentStatus) Reset() { *m = DeploymentStatus{} } func (*DeploymentStatus) ProtoMessage() {} -func (*DeploymentStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{10} } +func (*DeploymentStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{9} } func (m *DeploymentStrategy) Reset() { *m = DeploymentStrategy{} } func (*DeploymentStrategy) ProtoMessage() {} -func (*DeploymentStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } +func (*DeploymentStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{10} } func (m *ReplicaSet) Reset() { *m = ReplicaSet{} } func (*ReplicaSet) ProtoMessage() {} -func (*ReplicaSet) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} } +func (*ReplicaSet) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } func (m *ReplicaSetCondition) Reset() { *m = ReplicaSetCondition{} } func (*ReplicaSetCondition) ProtoMessage() {} -func (*ReplicaSetCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } +func (*ReplicaSetCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} } func (m *ReplicaSetList) Reset() { *m = ReplicaSetList{} } func (*ReplicaSetList) ProtoMessage() {} -func (*ReplicaSetList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } +func (*ReplicaSetList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } func (m *ReplicaSetSpec) Reset() { *m = ReplicaSetSpec{} } func (*ReplicaSetSpec) ProtoMessage() {} -func (*ReplicaSetSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } +func (*ReplicaSetSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } func (m *ReplicaSetStatus) Reset() { *m = ReplicaSetStatus{} } func (*ReplicaSetStatus) ProtoMessage() {} -func (*ReplicaSetStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } - -func (m *RollbackConfig) Reset() { *m = RollbackConfig{} } -func (*RollbackConfig) ProtoMessage() {} -func (*RollbackConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } +func (*ReplicaSetStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } func (m *RollingUpdateDaemonSet) Reset() { *m = RollingUpdateDaemonSet{} } func (*RollingUpdateDaemonSet) ProtoMessage() {} -func (*RollingUpdateDaemonSet) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} } +func (*RollingUpdateDaemonSet) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } func (m *RollingUpdateDeployment) Reset() { *m = RollingUpdateDeployment{} } func (*RollingUpdateDeployment) ProtoMessage() {} func (*RollingUpdateDeployment) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{19} + return fileDescriptorGenerated, []int{17} } func (m *RollingUpdateStatefulSetStrategy) Reset() { *m = RollingUpdateStatefulSetStrategy{} } func (*RollingUpdateStatefulSetStrategy) ProtoMessage() {} func (*RollingUpdateStatefulSetStrategy) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{20} + return fileDescriptorGenerated, []int{18} } func (m *Scale) Reset() { *m = Scale{} } func (*Scale) ProtoMessage() {} -func (*Scale) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } +func (*Scale) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } func (m *ScaleSpec) Reset() { *m = ScaleSpec{} } func (*ScaleSpec) ProtoMessage() {} -func (*ScaleSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } +func (*ScaleSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } func (m *ScaleStatus) Reset() { *m = ScaleStatus{} } func (*ScaleStatus) ProtoMessage() {} -func (*ScaleStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } +func (*ScaleStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } func (m *StatefulSet) Reset() { *m = StatefulSet{} } func (*StatefulSet) ProtoMessage() {} -func (*StatefulSet) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } +func (*StatefulSet) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } func (m *StatefulSetList) Reset() { *m = StatefulSetList{} } func (*StatefulSetList) ProtoMessage() {} -func (*StatefulSetList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } +func (*StatefulSetList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } func (m *StatefulSetSpec) Reset() { *m = StatefulSetSpec{} } func (*StatefulSetSpec) ProtoMessage() {} -func (*StatefulSetSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } +func (*StatefulSetSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } func (m *StatefulSetStatus) Reset() { *m = StatefulSetStatus{} } func (*StatefulSetStatus) ProtoMessage() {} -func (*StatefulSetStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } +func (*StatefulSetStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } func (m *StatefulSetUpdateStrategy) Reset() { *m = StatefulSetUpdateStrategy{} } func (*StatefulSetUpdateStrategy) ProtoMessage() {} func (*StatefulSetUpdateStrategy) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{28} + return fileDescriptorGenerated, []int{26} } func init() { @@ -216,7 +206,6 @@ func init() { proto.RegisterType((*Deployment)(nil), "k8s.io.api.apps.v1beta2.Deployment") proto.RegisterType((*DeploymentCondition)(nil), "k8s.io.api.apps.v1beta2.DeploymentCondition") proto.RegisterType((*DeploymentList)(nil), "k8s.io.api.apps.v1beta2.DeploymentList") - proto.RegisterType((*DeploymentRollback)(nil), "k8s.io.api.apps.v1beta2.DeploymentRollback") proto.RegisterType((*DeploymentSpec)(nil), "k8s.io.api.apps.v1beta2.DeploymentSpec") proto.RegisterType((*DeploymentStatus)(nil), "k8s.io.api.apps.v1beta2.DeploymentStatus") proto.RegisterType((*DeploymentStrategy)(nil), "k8s.io.api.apps.v1beta2.DeploymentStrategy") @@ -225,7 +214,6 @@ func init() { proto.RegisterType((*ReplicaSetList)(nil), "k8s.io.api.apps.v1beta2.ReplicaSetList") proto.RegisterType((*ReplicaSetSpec)(nil), "k8s.io.api.apps.v1beta2.ReplicaSetSpec") proto.RegisterType((*ReplicaSetStatus)(nil), "k8s.io.api.apps.v1beta2.ReplicaSetStatus") - proto.RegisterType((*RollbackConfig)(nil), "k8s.io.api.apps.v1beta2.RollbackConfig") proto.RegisterType((*RollingUpdateDaemonSet)(nil), "k8s.io.api.apps.v1beta2.RollingUpdateDaemonSet") proto.RegisterType((*RollingUpdateDeployment)(nil), "k8s.io.api.apps.v1beta2.RollingUpdateDeployment") proto.RegisterType((*RollingUpdateStatefulSetStrategy)(nil), "k8s.io.api.apps.v1beta2.RollingUpdateStatefulSetStrategy") @@ -582,58 +570,6 @@ func (m *DeploymentList) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func (m *DeploymentRollback) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *DeploymentRollback) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - if len(m.UpdatedAnnotations) > 0 { - keysForUpdatedAnnotations := make([]string, 0, len(m.UpdatedAnnotations)) - for k := range m.UpdatedAnnotations { - keysForUpdatedAnnotations = append(keysForUpdatedAnnotations, string(k)) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForUpdatedAnnotations) - for _, k := range keysForUpdatedAnnotations { - dAtA[i] = 0x12 - i++ - v := m.UpdatedAnnotations[string(k)] - mapSize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) - i = encodeVarintGenerated(dAtA, i, uint64(mapSize)) - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(k))) - i += copy(dAtA[i:], k) - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(v))) - i += copy(dAtA[i:], v) - } - } - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.RollbackTo.Size())) - n15, err := m.RollbackTo.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n15 - return i, nil -} - func (m *DeploymentSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -658,28 +594,28 @@ func (m *DeploymentSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) - n16, err := m.Selector.MarshalTo(dAtA[i:]) + n15, err := m.Selector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n16 + i += n15 } dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size())) - n17, err := m.Template.MarshalTo(dAtA[i:]) + n16, err := m.Template.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n16 + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Strategy.Size())) + n17, err := m.Strategy.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n17 - dAtA[i] = 0x22 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Strategy.Size())) - n18, err := m.Strategy.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n18 dAtA[i] = 0x28 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.MinReadySeconds)) @@ -696,16 +632,6 @@ func (m *DeploymentSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0 } i++ - if m.RollbackTo != nil { - dAtA[i] = 0x42 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.RollbackTo.Size())) - n19, err := m.RollbackTo.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n19 - } if m.ProgressDeadlineSeconds != nil { dAtA[i] = 0x48 i++ @@ -790,11 +716,11 @@ func (m *DeploymentStrategy) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.RollingUpdate.Size())) - n20, err := m.RollingUpdate.MarshalTo(dAtA[i:]) + n18, err := m.RollingUpdate.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n20 + i += n18 } return i, nil } @@ -817,27 +743,27 @@ func (m *ReplicaSet) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n21, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n19, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n19 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n20, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n20 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n21, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n21 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n22, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n22 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n23, err := m.Status.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n23 return i, nil } @@ -867,11 +793,11 @@ func (m *ReplicaSetCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n24, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n22, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n24 + i += n22 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -901,11 +827,11 @@ func (m *ReplicaSetList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n25, err := m.ListMeta.MarshalTo(dAtA[i:]) + n23, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n25 + i += n23 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -945,20 +871,20 @@ func (m *ReplicaSetSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) - n26, err := m.Selector.MarshalTo(dAtA[i:]) + n24, err := m.Selector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n26 + i += n24 } dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size())) - n27, err := m.Template.MarshalTo(dAtA[i:]) + n25, err := m.Template.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n27 + i += n25 dAtA[i] = 0x20 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.MinReadySeconds)) @@ -1010,27 +936,6 @@ func (m *ReplicaSetStatus) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func (m *RollbackConfig) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RollbackConfig) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0x8 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Revision)) - return i, nil -} - func (m *RollingUpdateDaemonSet) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1050,11 +955,11 @@ func (m *RollingUpdateDaemonSet) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.MaxUnavailable.Size())) - n28, err := m.MaxUnavailable.MarshalTo(dAtA[i:]) + n26, err := m.MaxUnavailable.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n28 + i += n26 } return i, nil } @@ -1078,21 +983,21 @@ func (m *RollingUpdateDeployment) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.MaxUnavailable.Size())) - n29, err := m.MaxUnavailable.MarshalTo(dAtA[i:]) + n27, err := m.MaxUnavailable.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n29 + i += n27 } if m.MaxSurge != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.MaxSurge.Size())) - n30, err := m.MaxSurge.MarshalTo(dAtA[i:]) + n28, err := m.MaxSurge.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n30 + i += n28 } return i, nil } @@ -1138,27 +1043,27 @@ func (m *Scale) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n31, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n29, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n29 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n30, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n30 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n31, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n31 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n32, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n32 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n33, err := m.Status.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n33 return i, nil } @@ -1248,27 +1153,27 @@ func (m *StatefulSet) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n34, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n32, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n32 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n33, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n33 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n34, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n34 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n35, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n35 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n36, err := m.Status.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n36 return i, nil } @@ -1290,11 +1195,11 @@ func (m *StatefulSetList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n37, err := m.ListMeta.MarshalTo(dAtA[i:]) + n35, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n37 + i += n35 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -1334,20 +1239,20 @@ func (m *StatefulSetSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) - n38, err := m.Selector.MarshalTo(dAtA[i:]) + n36, err := m.Selector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n38 + i += n36 } dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size())) - n39, err := m.Template.MarshalTo(dAtA[i:]) + n37, err := m.Template.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n39 + i += n37 if len(m.VolumeClaimTemplates) > 0 { for _, msg := range m.VolumeClaimTemplates { dAtA[i] = 0x22 @@ -1371,11 +1276,11 @@ func (m *StatefulSetSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.UpdateStrategy.Size())) - n40, err := m.UpdateStrategy.MarshalTo(dAtA[i:]) + n38, err := m.UpdateStrategy.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n40 + i += n38 if m.RevisionHistoryLimit != nil { dAtA[i] = 0x40 i++ @@ -1422,6 +1327,11 @@ func (m *StatefulSetStatus) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.UpdateRevision))) i += copy(dAtA[i:], m.UpdateRevision) + if m.CollisionCount != nil { + dAtA[i] = 0x48 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(*m.CollisionCount)) + } return i, nil } @@ -1448,11 +1358,11 @@ func (m *StatefulSetUpdateStrategy) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.RollingUpdate.Size())) - n41, err := m.RollingUpdate.MarshalTo(dAtA[i:]) + n39, err := m.RollingUpdate.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n41 + i += n39 } return i, nil } @@ -1602,24 +1512,6 @@ func (m *DeploymentList) Size() (n int) { return n } -func (m *DeploymentRollback) Size() (n int) { - var l int - _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - if len(m.UpdatedAnnotations) > 0 { - for k, v := range m.UpdatedAnnotations { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) - n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) - } - } - l = m.RollbackTo.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n -} - func (m *DeploymentSpec) Size() (n int) { var l int _ = l @@ -1639,10 +1531,6 @@ func (m *DeploymentSpec) Size() (n int) { n += 1 + sovGenerated(uint64(*m.RevisionHistoryLimit)) } n += 2 - if m.RollbackTo != nil { - l = m.RollbackTo.Size() - n += 1 + l + sovGenerated(uint64(l)) - } if m.ProgressDeadlineSeconds != nil { n += 1 + sovGenerated(uint64(*m.ProgressDeadlineSeconds)) } @@ -1757,13 +1645,6 @@ func (m *ReplicaSetStatus) Size() (n int) { return n } -func (m *RollbackConfig) Size() (n int) { - var l int - _ = l - n += 1 + sovGenerated(uint64(m.Revision)) - return n -} - func (m *RollingUpdateDaemonSet) Size() (n int) { var l int _ = l @@ -1901,6 +1782,9 @@ func (m *StatefulSetStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.UpdateRevision) n += 1 + l + sovGenerated(uint64(l)) + if m.CollisionCount != nil { + n += 1 + sovGenerated(uint64(*m.CollisionCount)) + } return n } @@ -2034,28 +1918,6 @@ func (this *DeploymentList) String() string { }, "") return s } -func (this *DeploymentRollback) String() string { - if this == nil { - return "nil" - } - keysForUpdatedAnnotations := make([]string, 0, len(this.UpdatedAnnotations)) - for k := range this.UpdatedAnnotations { - keysForUpdatedAnnotations = append(keysForUpdatedAnnotations, k) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForUpdatedAnnotations) - mapStringForUpdatedAnnotations := "map[string]string{" - for _, k := range keysForUpdatedAnnotations { - mapStringForUpdatedAnnotations += fmt.Sprintf("%v: %v,", k, this.UpdatedAnnotations[k]) - } - mapStringForUpdatedAnnotations += "}" - s := strings.Join([]string{`&DeploymentRollback{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `UpdatedAnnotations:` + mapStringForUpdatedAnnotations + `,`, - `RollbackTo:` + strings.Replace(strings.Replace(this.RollbackTo.String(), "RollbackConfig", "RollbackConfig", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} func (this *DeploymentSpec) String() string { if this == nil { return "nil" @@ -2068,7 +1930,6 @@ func (this *DeploymentSpec) String() string { `MinReadySeconds:` + fmt.Sprintf("%v", this.MinReadySeconds) + `,`, `RevisionHistoryLimit:` + valueToStringGenerated(this.RevisionHistoryLimit) + `,`, `Paused:` + fmt.Sprintf("%v", this.Paused) + `,`, - `RollbackTo:` + strings.Replace(fmt.Sprintf("%v", this.RollbackTo), "RollbackConfig", "RollbackConfig", 1) + `,`, `ProgressDeadlineSeconds:` + valueToStringGenerated(this.ProgressDeadlineSeconds) + `,`, `}`, }, "") @@ -2167,16 +2028,6 @@ func (this *ReplicaSetStatus) String() string { }, "") return s } -func (this *RollbackConfig) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&RollbackConfig{`, - `Revision:` + fmt.Sprintf("%v", this.Revision) + `,`, - `}`, - }, "") - return s -} func (this *RollingUpdateDaemonSet) String() string { if this == nil { return "nil" @@ -2304,6 +2155,7 @@ func (this *StatefulSetStatus) String() string { `UpdatedReplicas:` + fmt.Sprintf("%v", this.UpdatedReplicas) + `,`, `CurrentRevision:` + fmt.Sprintf("%v", this.CurrentRevision) + `,`, `UpdateRevision:` + fmt.Sprintf("%v", this.UpdateRevision) + `,`, + `CollisionCount:` + valueToStringGenerated(this.CollisionCount) + `,`, `}`, }, "") return s @@ -3590,231 +3442,6 @@ func (m *DeploymentList) Unmarshal(dAtA []byte) error { } return nil } -func (m *DeploymentRollback) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: DeploymentRollback: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DeploymentRollback: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UpdatedAnnotations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - var keykey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - keykey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey := string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - if m.UpdatedAnnotations == nil { - m.UpdatedAnnotations = make(map[string]string) - } - if iNdEx < postIndex { - var valuekey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - valuekey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - var stringLenmapvalue uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapvalue |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapvalue := int(stringLenmapvalue) - if intStringLenmapvalue < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue := string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - m.UpdatedAnnotations[mapkey] = mapvalue - } else { - var mapvalue string - m.UpdatedAnnotations[mapkey] = mapvalue - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RollbackTo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.RollbackTo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *DeploymentSpec) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -4016,39 +3643,6 @@ func (m *DeploymentSpec) Unmarshal(dAtA []byte) error { } } m.Paused = bool(v != 0) - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RollbackTo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.RollbackTo == nil { - m.RollbackTo = &RollbackConfig{} - } - if err := m.RollbackTo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex case 9: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field ProgressDeadlineSeconds", wireType) @@ -5192,75 +4786,6 @@ func (m *ReplicaSetStatus) Unmarshal(dAtA []byte) error { } return nil } -func (m *RollbackConfig) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RollbackConfig: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RollbackConfig: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) - } - m.Revision = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Revision |= (int64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *RollingUpdateDaemonSet) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -6658,6 +6183,26 @@ func (m *StatefulSetStatus) Unmarshal(dAtA []byte) error { } m.UpdateRevision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CollisionCount", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.CollisionCount = &v default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -6901,142 +6446,134 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 2178 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5a, 0x5b, 0x6f, 0x1b, 0xc7, - 0x15, 0xd6, 0xf2, 0x22, 0x91, 0xa3, 0x88, 0xb2, 0x47, 0xaa, 0xc4, 0xc8, 0x2d, 0x25, 0x30, 0x81, - 0x2d, 0xc7, 0xf1, 0xd2, 0x56, 0x2e, 0x48, 0x6c, 0x20, 0xad, 0x28, 0xa5, 0xb6, 0x03, 0x49, 0x56, - 0x86, 0x92, 0x8b, 0xa6, 0x2d, 0xe0, 0x21, 0x39, 0xa6, 0x36, 0xda, 0x1b, 0xf6, 0x42, 0x84, 0xe8, - 0x4b, 0x9f, 0x0a, 0x14, 0x28, 0x90, 0x3c, 0xf7, 0x4f, 0xb4, 0x4f, 0x45, 0xd1, 0xbe, 0x15, 0x45, - 0xe1, 0x97, 0x02, 0x41, 0xfb, 0xd0, 0x3c, 0x09, 0x35, 0xf3, 0xd8, 0xfe, 0x82, 0x00, 0x05, 0x8a, - 0x99, 0x9d, 0xbd, 0xcc, 0x5e, 0xa4, 0xa5, 0x6a, 0xab, 0x85, 0xdf, 0xc4, 0x39, 0xdf, 0xf9, 0xe6, - 0xec, 0xcc, 0x99, 0x73, 0xbe, 0x9d, 0x15, 0xf8, 0xde, 0xf1, 0x7b, 0xb6, 0xac, 0x18, 0xad, 0x63, - 0xb7, 0x4b, 0x2c, 0x9d, 0x38, 0xc4, 0x6e, 0x0d, 0x89, 0xde, 0x37, 0xac, 0x16, 0x37, 0x60, 0x53, - 0x69, 0x61, 0xd3, 0xb4, 0x5b, 0xc3, 0xdb, 0x5d, 0xe2, 0xe0, 0x8d, 0xd6, 0x80, 0xe8, 0xc4, 0xc2, - 0x0e, 0xe9, 0xcb, 0xa6, 0x65, 0x38, 0x06, 0x5c, 0xf6, 0x80, 0x32, 0x36, 0x15, 0x99, 0x02, 0x65, - 0x0e, 0x5c, 0xb9, 0x39, 0x50, 0x9c, 0x23, 0xb7, 0x2b, 0xf7, 0x0c, 0xad, 0x35, 0x30, 0x06, 0x46, - 0x8b, 0xe1, 0xbb, 0xee, 0x13, 0xf6, 0x8b, 0xfd, 0x60, 0x7f, 0x79, 0x3c, 0x2b, 0xcd, 0xc8, 0x84, - 0x3d, 0xc3, 0x22, 0xad, 0xe1, 0xed, 0xf8, 0x5c, 0x2b, 0xd7, 0x23, 0x18, 0xd3, 0x50, 0x95, 0xde, - 0x88, 0x87, 0x95, 0x84, 0xbe, 0x1d, 0x42, 0x35, 0xdc, 0x3b, 0x52, 0x74, 0x62, 0x8d, 0x5a, 0xe6, - 0xf1, 0x80, 0x0e, 0xd8, 0x2d, 0x8d, 0x38, 0x38, 0x6d, 0x82, 0x56, 0x96, 0x97, 0xe5, 0xea, 0x8e, - 0xa2, 0x91, 0x84, 0xc3, 0xbb, 0x67, 0x39, 0xd8, 0xbd, 0x23, 0xa2, 0xe1, 0x84, 0xdf, 0x5b, 0x59, - 0x7e, 0xae, 0xa3, 0xa8, 0x2d, 0x45, 0x77, 0x6c, 0xc7, 0x8a, 0x3b, 0x35, 0x7f, 0x51, 0x00, 0xd5, - 0x6d, 0x4c, 0x34, 0x43, 0xef, 0x10, 0x07, 0x3e, 0x06, 0x15, 0xfa, 0x18, 0x7d, 0xec, 0xe0, 0xba, - 0xb4, 0x26, 0xad, 0xcf, 0x6e, 0xdc, 0x92, 0xc3, 0xbd, 0x08, 0x58, 0x65, 0xf3, 0x78, 0x40, 0x07, - 0x6c, 0x99, 0xa2, 0xe5, 0xe1, 0x6d, 0xf9, 0x61, 0xf7, 0x53, 0xd2, 0x73, 0x76, 0x89, 0x83, 0xdb, - 0xf0, 0xe9, 0xc9, 0xea, 0xd4, 0xf8, 0x64, 0x15, 0x84, 0x63, 0x28, 0x60, 0x85, 0xf7, 0x41, 0xc9, - 0x36, 0x49, 0xaf, 0x5e, 0x60, 0xec, 0x57, 0xe5, 0x8c, 0x9d, 0x96, 0x83, 0x98, 0x3a, 0x26, 0xe9, - 0xb5, 0x5f, 0xe1, 0x9c, 0x25, 0xfa, 0x0b, 0x31, 0x06, 0xb8, 0x0f, 0xa6, 0x6d, 0x07, 0x3b, 0xae, - 0x5d, 0x2f, 0x32, 0xae, 0xf5, 0x1c, 0x5c, 0x0c, 0xdf, 0xae, 0x71, 0xb6, 0x69, 0xef, 0x37, 0xe2, - 0x3c, 0xcd, 0xdf, 0x4a, 0x60, 0x2e, 0xc0, 0xee, 0x28, 0xb6, 0x03, 0x7f, 0x9c, 0x58, 0x0f, 0x39, - 0xdf, 0x7a, 0x50, 0x6f, 0xb6, 0x1a, 0x97, 0xf8, 0x5c, 0x15, 0x7f, 0x24, 0xb2, 0x16, 0xf7, 0x40, - 0x59, 0x71, 0x88, 0x66, 0xd7, 0x0b, 0x6b, 0xc5, 0xf5, 0xd9, 0x8d, 0xe6, 0xd9, 0x0f, 0xd0, 0x9e, - 0xe3, 0x74, 0xe5, 0x07, 0xd4, 0x11, 0x79, 0xfe, 0xcd, 0x2f, 0x4a, 0x91, 0xc0, 0xe9, 0x12, 0xc1, - 0x9f, 0x80, 0x8a, 0x4d, 0x54, 0xd2, 0x73, 0x0c, 0x8b, 0x07, 0xfe, 0x56, 0xce, 0xc0, 0x71, 0x97, - 0xa8, 0x1d, 0xee, 0xda, 0x7e, 0x85, 0x46, 0xee, 0xff, 0x42, 0x01, 0x25, 0xfc, 0x18, 0x54, 0x1c, - 0xa2, 0x99, 0x2a, 0x76, 0x08, 0xdf, 0xc9, 0xd7, 0xa2, 0xc1, 0xd3, 0xb3, 0x46, 0xc9, 0xf6, 0x8d, - 0xfe, 0x01, 0x87, 0xb1, 0x6d, 0x0c, 0x16, 0xc3, 0x1f, 0x45, 0x01, 0x0d, 0x34, 0x41, 0xcd, 0x35, - 0xfb, 0x14, 0xe9, 0xd0, 0xfc, 0x1c, 0x8c, 0xf8, 0xb6, 0xde, 0x3a, 0x7b, 0x55, 0x0e, 0x05, 0xbf, - 0xf6, 0x12, 0x9f, 0xa5, 0x26, 0x8e, 0xa3, 0x18, 0x3f, 0xdc, 0x04, 0xf3, 0x9a, 0xa2, 0x23, 0x82, - 0xfb, 0xa3, 0x0e, 0xe9, 0x19, 0x7a, 0xdf, 0xae, 0x97, 0xd6, 0xa4, 0xf5, 0x72, 0x7b, 0x99, 0x13, - 0xcc, 0xef, 0x8a, 0x66, 0x14, 0xc7, 0xc3, 0x8f, 0x00, 0xf4, 0x1f, 0xe0, 0x9e, 0x77, 0xb0, 0x14, - 0x43, 0xaf, 0x97, 0xd7, 0xa4, 0xf5, 0x62, 0x7b, 0x85, 0xb3, 0xc0, 0x83, 0x04, 0x02, 0xa5, 0x78, - 0xc1, 0x1d, 0xb0, 0x68, 0x91, 0xa1, 0x62, 0x2b, 0x86, 0x7e, 0x5f, 0xb1, 0x1d, 0xc3, 0x1a, 0xed, - 0x28, 0x9a, 0xe2, 0xd4, 0xa7, 0x59, 0x4c, 0xf5, 0xf1, 0xc9, 0xea, 0x22, 0x4a, 0xb1, 0xa3, 0x54, - 0xaf, 0xe6, 0x6f, 0xca, 0x60, 0x3e, 0x96, 0xf7, 0xf0, 0x11, 0x58, 0xea, 0xb9, 0x96, 0x45, 0x74, - 0x67, 0xcf, 0xd5, 0xba, 0xc4, 0xea, 0xf4, 0x8e, 0x48, 0xdf, 0x55, 0x49, 0x9f, 0xa5, 0x48, 0xb9, - 0xdd, 0xe0, 0x11, 0x2f, 0x6d, 0xa5, 0xa2, 0x50, 0x86, 0x37, 0x5d, 0x05, 0x9d, 0x0d, 0xed, 0x2a, - 0xb6, 0x1d, 0x70, 0x16, 0x18, 0x67, 0xb0, 0x0a, 0x7b, 0x09, 0x04, 0x4a, 0xf1, 0xa2, 0x31, 0xf6, - 0x89, 0xad, 0x58, 0xa4, 0x1f, 0x8f, 0xb1, 0x28, 0xc6, 0xb8, 0x9d, 0x8a, 0x42, 0x19, 0xde, 0xf0, - 0x1d, 0x30, 0xeb, 0xcd, 0xc6, 0xf6, 0x8f, 0x6f, 0xf4, 0x02, 0x27, 0x9b, 0xdd, 0x0b, 0x4d, 0x28, - 0x8a, 0xa3, 0x8f, 0x66, 0x74, 0x6d, 0x62, 0x0d, 0x49, 0x3f, 0x7b, 0x83, 0x1f, 0x26, 0x10, 0x28, - 0xc5, 0x8b, 0x3e, 0x9a, 0x97, 0x81, 0x89, 0x47, 0x9b, 0x16, 0x1f, 0xed, 0x30, 0x15, 0x85, 0x32, - 0xbc, 0x69, 0x1e, 0x7b, 0x21, 0x6f, 0x0e, 0xb1, 0xa2, 0xe2, 0xae, 0x4a, 0xea, 0x33, 0x62, 0x1e, - 0xef, 0x89, 0x66, 0x14, 0xc7, 0xc3, 0x7b, 0xe0, 0xb2, 0x37, 0x74, 0xa8, 0xe3, 0x80, 0xa4, 0xc2, - 0x48, 0x5e, 0xe5, 0x24, 0x97, 0xf7, 0xe2, 0x00, 0x94, 0xf4, 0x81, 0x77, 0x40, 0xad, 0x67, 0xa8, - 0x2a, 0xcb, 0xc7, 0x2d, 0xc3, 0xd5, 0x9d, 0x7a, 0x95, 0xad, 0x15, 0xa4, 0xe7, 0x71, 0x4b, 0xb0, - 0xa0, 0x18, 0xb2, 0xf9, 0x27, 0x09, 0x2c, 0x67, 0x9c, 0x69, 0xf8, 0x5d, 0x50, 0x72, 0x46, 0x26, - 0x61, 0x89, 0x5a, 0x6d, 0xdf, 0xf0, 0xdb, 0xc1, 0xc1, 0xc8, 0x24, 0xdf, 0x9c, 0xac, 0x5e, 0xc9, - 0x70, 0xa3, 0x66, 0xc4, 0x1c, 0xe1, 0x11, 0x98, 0xb3, 0xe8, 0x74, 0xfa, 0xc0, 0x83, 0xf0, 0xb2, - 0xd5, 0xca, 0xac, 0x2e, 0x28, 0x8a, 0x0e, 0x0b, 0xf0, 0xe5, 0xf1, 0xc9, 0xea, 0x9c, 0x60, 0x43, - 0x22, 0x71, 0xf3, 0x97, 0x05, 0x00, 0xb6, 0x89, 0xa9, 0x1a, 0x23, 0x8d, 0xe8, 0x17, 0xd1, 0x52, - 0x1f, 0x08, 0x2d, 0xf5, 0x5a, 0x76, 0xbd, 0x0c, 0x82, 0xca, 0xec, 0xa9, 0x1f, 0xc7, 0x7a, 0xea, - 0xf5, 0x3c, 0x64, 0xa7, 0x37, 0xd5, 0xbf, 0x17, 0xc1, 0x42, 0x08, 0xde, 0x32, 0xf4, 0xbe, 0xc2, - 0x4e, 0xc3, 0x5d, 0x61, 0x47, 0xaf, 0xc5, 0x76, 0x74, 0x39, 0xc5, 0x25, 0xb2, 0x9b, 0x3b, 0x41, - 0x9c, 0x05, 0xe6, 0xfe, 0xb6, 0x38, 0xf9, 0x37, 0x27, 0xab, 0x29, 0xd2, 0x4f, 0x0e, 0x98, 0xc4, - 0x10, 0xe1, 0x55, 0x30, 0x6d, 0x11, 0x6c, 0x1b, 0x3a, 0x2b, 0x0b, 0xd5, 0xf0, 0x51, 0x10, 0x1b, - 0x45, 0xdc, 0x0a, 0xaf, 0x83, 0x19, 0x8d, 0xd8, 0x36, 0x1e, 0x10, 0x56, 0x01, 0xaa, 0xed, 0x79, - 0x0e, 0x9c, 0xd9, 0xf5, 0x86, 0x91, 0x6f, 0x87, 0x9f, 0x82, 0x9a, 0x8a, 0x6d, 0x9e, 0x8e, 0x07, - 0x8a, 0x46, 0xd8, 0x19, 0x9f, 0xdd, 0x78, 0x23, 0xdf, 0xde, 0x53, 0x8f, 0xb0, 0x8f, 0xed, 0x08, - 0x4c, 0x28, 0xc6, 0x0c, 0x87, 0x00, 0xd2, 0x91, 0x03, 0x0b, 0xeb, 0xb6, 0xb7, 0x50, 0x74, 0xbe, - 0x99, 0x89, 0xe7, 0x0b, 0xea, 0xd9, 0x4e, 0x82, 0x0d, 0xa5, 0xcc, 0xd0, 0xfc, 0x9d, 0x04, 0x6a, - 0xe1, 0x36, 0x5d, 0x80, 0x5e, 0xba, 0x2f, 0xea, 0xa5, 0xd7, 0x72, 0x24, 0x67, 0x86, 0x60, 0xfa, - 0x57, 0x01, 0xc0, 0x10, 0x44, 0x8f, 0x73, 0x17, 0xf7, 0x8e, 0xe1, 0x1a, 0x28, 0xe9, 0x58, 0xf3, - 0x73, 0x32, 0x38, 0x20, 0x7b, 0x58, 0x23, 0x88, 0x59, 0xe0, 0xe7, 0x12, 0x80, 0xbc, 0x0c, 0x6f, - 0xea, 0xba, 0xe1, 0xb0, 0xca, 0xee, 0x07, 0xb4, 0x95, 0x23, 0x20, 0x7f, 0x2e, 0xf9, 0x30, 0xc1, - 0xf2, 0xa1, 0xee, 0x58, 0xa3, 0x70, 0x17, 0x92, 0x00, 0x94, 0x32, 0x35, 0xfc, 0x11, 0x00, 0x16, - 0xe7, 0x3c, 0x30, 0xf8, 0xb1, 0xbd, 0x76, 0x6a, 0x55, 0xa3, 0xd0, 0x2d, 0x43, 0x7f, 0xa2, 0x0c, - 0xc2, 0xc2, 0x82, 0x02, 0x0a, 0x14, 0xa1, 0x5b, 0xf9, 0x10, 0x2c, 0x67, 0xc4, 0x09, 0x2f, 0x81, - 0xe2, 0x31, 0x19, 0x79, 0x4b, 0x85, 0xe8, 0x9f, 0x70, 0x11, 0x94, 0x87, 0x58, 0x75, 0xbd, 0xd2, - 0x5a, 0x45, 0xde, 0x8f, 0x3b, 0x85, 0xf7, 0x24, 0x2a, 0x46, 0x6a, 0x62, 0xf5, 0x81, 0xeb, 0xa0, - 0x62, 0x11, 0x53, 0x55, 0x7a, 0xd8, 0xe6, 0xea, 0x83, 0x69, 0x4d, 0xc4, 0xc7, 0x50, 0x60, 0x15, - 0xa4, 0x6c, 0xe1, 0xc5, 0x4a, 0xd9, 0xe2, 0xf3, 0x91, 0xb2, 0x3f, 0x04, 0x15, 0xdb, 0x17, 0xb1, - 0x25, 0x46, 0x79, 0x23, 0x57, 0x1d, 0xe5, 0xfa, 0x35, 0xa0, 0x0e, 0x94, 0x6b, 0x40, 0x97, 0xa6, - 0x59, 0xcb, 0x13, 0x6a, 0xd6, 0xe7, 0xaa, 0x33, 0x69, 0xed, 0x34, 0xb1, 0x6b, 0x93, 0x3e, 0x2b, - 0x38, 0x95, 0xb0, 0x76, 0xee, 0xb3, 0x51, 0xc4, 0xad, 0xf0, 0x07, 0x42, 0x9a, 0x56, 0x26, 0x4b, - 0xd3, 0x5a, 0x76, 0x8a, 0xc2, 0x43, 0xb0, 0x6c, 0x5a, 0xc6, 0xc0, 0x22, 0xb6, 0xbd, 0x4d, 0x70, - 0x5f, 0x55, 0x74, 0xe2, 0xaf, 0x4c, 0x95, 0x3d, 0xd1, 0x95, 0xf1, 0xc9, 0xea, 0xf2, 0x7e, 0x3a, - 0x04, 0x65, 0xf9, 0x36, 0xff, 0x58, 0x02, 0x97, 0xe2, 0x3d, 0x2e, 0x43, 0x0d, 0x4a, 0xe7, 0x52, - 0x83, 0x6f, 0x46, 0x0e, 0x80, 0x27, 0x95, 0x83, 0x7d, 0x4f, 0x39, 0x04, 0x9b, 0x60, 0x9e, 0x9f, - 0x7d, 0xdf, 0xc8, 0xf5, 0x70, 0xb0, 0xef, 0x87, 0xa2, 0x19, 0xc5, 0xf1, 0x54, 0xe3, 0x85, 0xd2, - 0xcd, 0x27, 0x29, 0x89, 0x1a, 0x6f, 0x33, 0x0e, 0x40, 0x49, 0x1f, 0xb8, 0x0b, 0x16, 0x5c, 0x3d, - 0x49, 0xe5, 0xe5, 0xe1, 0x15, 0x4e, 0xb5, 0x70, 0x98, 0x84, 0xa0, 0x34, 0x3f, 0xf8, 0x18, 0x80, - 0x9e, 0xdf, 0x98, 0xed, 0xfa, 0x34, 0xab, 0xa4, 0x6f, 0xe6, 0x38, 0x2f, 0x41, 0x37, 0x0f, 0xab, - 0x58, 0x30, 0x64, 0xa3, 0x08, 0x27, 0xbc, 0x0b, 0xe6, 0x2c, 0x26, 0xed, 0xfd, 0x50, 0x3d, 0x79, - 0xfc, 0x2d, 0xee, 0x36, 0x87, 0xa2, 0x46, 0x24, 0x62, 0x53, 0x14, 0x6d, 0x25, 0xb7, 0xa2, 0xfd, - 0x83, 0x14, 0x6d, 0x33, 0x81, 0x98, 0xbd, 0x23, 0x48, 0x9f, 0xab, 0x31, 0xe9, 0xb3, 0x94, 0xf4, - 0x88, 0x28, 0x1f, 0x25, 0x5d, 0xc7, 0xde, 0xca, 0xa9, 0x63, 0xc3, 0xc6, 0x98, 0x4f, 0xc8, 0xf2, - 0x65, 0xb8, 0x98, 0xbb, 0xa1, 0xbc, 0x42, 0x36, 0x0c, 0xea, 0x39, 0x08, 0xd9, 0x08, 0xd9, 0xe9, - 0x42, 0xf6, 0x9f, 0x05, 0xb0, 0x10, 0x82, 0x73, 0x0b, 0xd9, 0x14, 0x97, 0x17, 0x26, 0x64, 0xd3, - 0x95, 0x60, 0xf1, 0x45, 0x2b, 0xc1, 0x17, 0x20, 0xa0, 0x99, 0xb8, 0x0c, 0x97, 0xee, 0xff, 0x49, - 0x5c, 0x86, 0x51, 0x65, 0x88, 0xcb, 0x5f, 0x17, 0xa2, 0xa1, 0xbf, 0xf4, 0x6a, 0xe7, 0xbf, 0xbf, - 0x46, 0x6b, 0xfe, 0xb9, 0x08, 0x2e, 0xc5, 0xcf, 0xa1, 0xd0, 0x20, 0xa5, 0x33, 0x1b, 0xe4, 0x3e, - 0x58, 0x7c, 0xe2, 0xaa, 0xea, 0x88, 0x2d, 0x43, 0xa4, 0x4b, 0x7a, 0xad, 0xf5, 0xdb, 0xdc, 0x73, - 0xf1, 0xfb, 0x29, 0x18, 0x94, 0xea, 0x99, 0xd1, 0xec, 0x8b, 0xe7, 0x6a, 0xf6, 0x89, 0x0e, 0x54, - 0x9a, 0xa0, 0x03, 0xa5, 0x36, 0xee, 0xf2, 0x39, 0x1a, 0xf7, 0x64, 0x9d, 0x36, 0xa5, 0x70, 0x9d, - 0xd5, 0x69, 0x9b, 0x1f, 0x80, 0x9a, 0x28, 0xdd, 0xbc, 0x5d, 0xf4, 0x74, 0x23, 0x17, 0x4a, 0x91, - 0x5d, 0xf4, 0xc6, 0x51, 0x80, 0x68, 0xfe, 0x5c, 0x02, 0x4b, 0xe9, 0x17, 0x2f, 0x50, 0x05, 0x35, - 0x0d, 0x7f, 0x16, 0xbd, 0x9f, 0x3a, 0xab, 0x09, 0xb9, 0x8e, 0xa2, 0xca, 0xde, 0x67, 0x0f, 0xf9, - 0x81, 0xee, 0x3c, 0xb4, 0x3a, 0x8e, 0xa5, 0xe8, 0x03, 0xaf, 0x73, 0xef, 0x0a, 0x5c, 0x28, 0xc6, - 0xdd, 0xfc, 0x5a, 0x02, 0xcb, 0x19, 0x9d, 0xf3, 0x62, 0x23, 0x81, 0x9f, 0x80, 0x8a, 0x86, 0x3f, - 0xeb, 0xb8, 0xd6, 0x20, 0xad, 0xd7, 0xe7, 0x9b, 0x87, 0x55, 0x83, 0x5d, 0xce, 0x82, 0x02, 0xbe, - 0xe6, 0x43, 0xb0, 0x26, 0x3c, 0x24, 0x3d, 0x79, 0xe4, 0x89, 0xab, 0xb2, 0x43, 0xc8, 0xc5, 0xca, - 0x0d, 0x50, 0x35, 0xb1, 0xe5, 0x28, 0x81, 0xd4, 0x2d, 0xb7, 0xe7, 0xc6, 0x27, 0xab, 0xd5, 0x7d, - 0x7f, 0x10, 0x85, 0xf6, 0xe6, 0xbf, 0x25, 0x50, 0xee, 0xf4, 0xb0, 0x4a, 0x2e, 0x40, 0x2d, 0x6c, - 0x0b, 0x6a, 0x21, 0xfb, 0xe3, 0x09, 0x8b, 0x27, 0x53, 0x28, 0xec, 0xc4, 0x84, 0xc2, 0xeb, 0x67, - 0xf0, 0x9c, 0xae, 0x11, 0xde, 0x07, 0xd5, 0x60, 0xba, 0xc9, 0x0a, 0x58, 0xf3, 0x57, 0x05, 0x30, - 0x1b, 0x99, 0x62, 0xc2, 0xf2, 0xf7, 0x58, 0x68, 0x1b, 0xf4, 0x60, 0x6f, 0xe4, 0x79, 0x10, 0xd9, - 0x6f, 0x11, 0xde, 0xdd, 0x43, 0xf8, 0xe6, 0x99, 0xec, 0x1c, 0x1f, 0x80, 0x9a, 0x83, 0xad, 0x01, - 0x71, 0x7c, 0x1b, 0x5b, 0xb0, 0x6a, 0x78, 0x4b, 0x75, 0x20, 0x58, 0x51, 0x0c, 0xbd, 0x72, 0x17, - 0xcc, 0x09, 0x93, 0x4d, 0x74, 0x81, 0xf0, 0x39, 0x5d, 0x9c, 0x30, 0x39, 0x2f, 0x20, 0xbb, 0x3e, - 0x12, 0xb2, 0x2b, 0xfb, 0xdb, 0x62, 0xf4, 0xc8, 0x64, 0xe5, 0x18, 0x8a, 0xe5, 0xd8, 0x1b, 0xb9, - 0xd8, 0x4e, 0xcf, 0xb4, 0xdf, 0x4b, 0x60, 0x3e, 0x82, 0xbe, 0x00, 0x81, 0xf4, 0x40, 0x14, 0x48, - 0xaf, 0xe7, 0x79, 0x88, 0x0c, 0x85, 0xf4, 0x97, 0xb2, 0x10, 0xfc, 0x4b, 0x2f, 0x91, 0x7e, 0x0a, - 0x16, 0x87, 0x86, 0xea, 0x6a, 0x64, 0x4b, 0xc5, 0x8a, 0xe6, 0x03, 0xa8, 0x0a, 0x28, 0xc6, 0xdf, - 0x4d, 0x02, 0x7a, 0x62, 0xd9, 0x8a, 0xed, 0x10, 0xdd, 0x79, 0x14, 0x7a, 0x86, 0x3a, 0xe6, 0x51, - 0x0a, 0x1d, 0x4a, 0x9d, 0x04, 0xbe, 0x03, 0x66, 0xa9, 0x1e, 0x51, 0x7a, 0x64, 0x0f, 0x6b, 0xbe, - 0xf0, 0x0e, 0xbe, 0x7c, 0x75, 0x42, 0x13, 0x8a, 0xe2, 0xe0, 0x11, 0x58, 0x30, 0x8d, 0xfe, 0x2e, - 0xd6, 0xf1, 0x80, 0xd0, 0xb6, 0xb7, 0xcf, 0xfe, 0x37, 0x82, 0xdd, 0x12, 0x55, 0xdb, 0xef, 0xfa, - 0x6f, 0xf9, 0xfb, 0x49, 0x08, 0x7d, 0xe9, 0x49, 0x19, 0x66, 0x2f, 0x3d, 0x69, 0x94, 0xd0, 0x4a, - 0x7c, 0xf9, 0xf5, 0xee, 0xae, 0x37, 0xf2, 0x64, 0xd8, 0x39, 0xbf, 0xfd, 0x66, 0x5d, 0x82, 0x55, - 0xce, 0xf5, 0xb1, 0xf5, 0x6f, 0x45, 0x70, 0x39, 0x71, 0x74, 0xff, 0x87, 0xb7, 0x45, 0x09, 0xb9, - 0x59, 0x9c, 0x40, 0x6e, 0x6e, 0x82, 0x79, 0xfe, 0x9d, 0x37, 0xa6, 0x56, 0x03, 0x3d, 0xbf, 0x25, - 0x9a, 0x51, 0x1c, 0x9f, 0x76, 0x5b, 0x55, 0x9e, 0xf0, 0xb6, 0x2a, 0x1a, 0x05, 0x97, 0x8f, 0x5e, - 0xea, 0x25, 0xa3, 0xe0, 0x2a, 0x32, 0x8e, 0xa7, 0x1d, 0xcb, 0x63, 0x0d, 0x18, 0x66, 0xc4, 0x8e, - 0x75, 0x28, 0x58, 0x51, 0x0c, 0xdd, 0xfc, 0xab, 0x04, 0x5e, 0xcd, 0xcc, 0x34, 0xb8, 0x29, 0xbc, - 0xf6, 0xdf, 0x8c, 0xbd, 0xf6, 0x7f, 0x27, 0xd3, 0x31, 0xf2, 0xf2, 0x6f, 0xa5, 0xdf, 0xe5, 0xbc, - 0x9f, 0xef, 0x2e, 0x27, 0x45, 0xac, 0x9d, 0x7d, 0xa9, 0xd3, 0xbe, 0xf9, 0xf4, 0x59, 0x63, 0xea, - 0xcb, 0x67, 0x8d, 0xa9, 0xaf, 0x9e, 0x35, 0xa6, 0x7e, 0x36, 0x6e, 0x48, 0x4f, 0xc7, 0x0d, 0xe9, - 0xcb, 0x71, 0x43, 0xfa, 0x6a, 0xdc, 0x90, 0xfe, 0x31, 0x6e, 0x48, 0x5f, 0x7c, 0xdd, 0x98, 0xfa, - 0x64, 0x86, 0xcf, 0xf8, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8a, 0xc7, 0xc0, 0x83, 0xcc, 0x25, + // 2050 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x59, 0xcb, 0x6f, 0x1c, 0xb7, + 0x19, 0xf7, 0xec, 0x43, 0xda, 0xa5, 0x22, 0xc9, 0xa6, 0x54, 0x69, 0x23, 0xb7, 0x2b, 0x61, 0x13, + 0x38, 0x72, 0x1c, 0xcf, 0xda, 0xca, 0x03, 0x89, 0x0d, 0xb4, 0xd5, 0x4a, 0xad, 0xed, 0x40, 0x92, + 0x15, 0xae, 0x64, 0xa0, 0x41, 0x0b, 0x98, 0xbb, 0x4b, 0xaf, 0x26, 0x9a, 0x17, 0x66, 0x38, 0x8b, + 0x2c, 0x7a, 0xe9, 0xa9, 0x40, 0x81, 0x02, 0xc9, 0xb9, 0xff, 0x44, 0x7b, 0x2a, 0x8a, 0xf6, 0x56, + 0x14, 0x85, 0x2f, 0x05, 0x82, 0x5e, 0x92, 0x93, 0x50, 0x6f, 0x8e, 0xfd, 0x0f, 0x02, 0x14, 0x28, + 0xc8, 0xe1, 0x3c, 0x38, 0x0f, 0x6b, 0xa4, 0xd8, 0x6a, 0x91, 0xdb, 0x2e, 0xbf, 0xdf, 0xf7, 0xe3, + 0x47, 0xf2, 0x23, 0xbf, 0x1f, 0x39, 0xe0, 0xc7, 0xc7, 0xef, 0xbb, 0xaa, 0x66, 0xb5, 0x8f, 0xbd, + 0x1e, 0x71, 0x4c, 0x42, 0x89, 0xdb, 0x1e, 0x11, 0x73, 0x60, 0x39, 0x6d, 0x61, 0xc0, 0xb6, 0xd6, + 0xc6, 0xb6, 0xed, 0xb6, 0x47, 0xb7, 0x7b, 0x84, 0xe2, 0x8d, 0xf6, 0x90, 0x98, 0xc4, 0xc1, 0x94, + 0x0c, 0x54, 0xdb, 0xb1, 0xa8, 0x05, 0x97, 0x7d, 0xa0, 0x8a, 0x6d, 0x4d, 0x65, 0x40, 0x55, 0x00, + 0x57, 0x6e, 0x0e, 0x35, 0x7a, 0xe4, 0xf5, 0xd4, 0xbe, 0x65, 0xb4, 0x87, 0xd6, 0xd0, 0x6a, 0x73, + 0x7c, 0xcf, 0x7b, 0xc2, 0xff, 0xf1, 0x3f, 0xfc, 0x97, 0xcf, 0xb3, 0xd2, 0x8a, 0x75, 0xd8, 0xb7, + 0x1c, 0xd2, 0x1e, 0xdd, 0x4e, 0xf6, 0xb5, 0x72, 0x3d, 0x86, 0xb1, 0x2d, 0x5d, 0xeb, 0x8f, 0x45, + 0x58, 0x69, 0xe8, 0x3b, 0x11, 0xd4, 0xc0, 0xfd, 0x23, 0xcd, 0x24, 0xce, 0xb8, 0x6d, 0x1f, 0x0f, + 0x59, 0x83, 0xdb, 0x36, 0x08, 0xc5, 0x59, 0x1d, 0xb4, 0xf3, 0xbc, 0x1c, 0xcf, 0xa4, 0x9a, 0x41, + 0x52, 0x0e, 0xef, 0x9d, 0xe6, 0xe0, 0xf6, 0x8f, 0x88, 0x81, 0x53, 0x7e, 0x6f, 0xe7, 0xf9, 0x79, + 0x54, 0xd3, 0xdb, 0x9a, 0x49, 0x5d, 0xea, 0x24, 0x9d, 0x5a, 0xbf, 0x29, 0x81, 0xfa, 0x36, 0x26, + 0x86, 0x65, 0x76, 0x09, 0x85, 0x8f, 0x41, 0x8d, 0x0d, 0x63, 0x80, 0x29, 0x6e, 0x28, 0x6b, 0xca, + 0xfa, 0xcc, 0xc6, 0x2d, 0x35, 0x5a, 0x8b, 0x90, 0x55, 0xb5, 0x8f, 0x87, 0xac, 0xc1, 0x55, 0x19, + 0x5a, 0x1d, 0xdd, 0x56, 0x1f, 0xf6, 0x3e, 0x21, 0x7d, 0xba, 0x4b, 0x28, 0xee, 0xc0, 0xa7, 0x27, + 0xab, 0x97, 0x26, 0x27, 0xab, 0x20, 0x6a, 0x43, 0x21, 0x2b, 0xbc, 0x0f, 0x2a, 0xae, 0x4d, 0xfa, + 0x8d, 0x12, 0x67, 0xbf, 0xa6, 0xe6, 0xac, 0xb4, 0x1a, 0xc6, 0xd4, 0xb5, 0x49, 0xbf, 0xf3, 0x8a, + 0xe0, 0xac, 0xb0, 0x7f, 0x88, 0x33, 0xc0, 0x7d, 0x30, 0xe5, 0x52, 0x4c, 0x3d, 0xb7, 0x51, 0xe6, + 0x5c, 0xeb, 0x05, 0xb8, 0x38, 0xbe, 0x33, 0x27, 0xd8, 0xa6, 0xfc, 0xff, 0x48, 0xf0, 0xb4, 0xfe, + 0xa8, 0x80, 0xd9, 0x10, 0xbb, 0xa3, 0xb9, 0x14, 0xfe, 0x3c, 0x35, 0x1f, 0x6a, 0xb1, 0xf9, 0x60, + 0xde, 0x7c, 0x36, 0x2e, 0x8b, 0xbe, 0x6a, 0x41, 0x4b, 0x6c, 0x2e, 0xee, 0x81, 0xaa, 0x46, 0x89, + 0xe1, 0x36, 0x4a, 0x6b, 0xe5, 0xf5, 0x99, 0x8d, 0xd6, 0xe9, 0x03, 0xe8, 0xcc, 0x0a, 0xba, 0xea, + 0x03, 0xe6, 0x88, 0x7c, 0xff, 0xd6, 0xe7, 0x95, 0x58, 0xe0, 0x6c, 0x8a, 0xe0, 0x2f, 0x40, 0xcd, + 0x25, 0x3a, 0xe9, 0x53, 0xcb, 0x11, 0x81, 0xbf, 0x5d, 0x30, 0x70, 0xdc, 0x23, 0x7a, 0x57, 0xb8, + 0x76, 0x5e, 0x61, 0x91, 0x07, 0xff, 0x50, 0x48, 0x09, 0x3f, 0x02, 0x35, 0x4a, 0x0c, 0x5b, 0xc7, + 0x94, 0x88, 0x95, 0x7c, 0x2d, 0x1e, 0x3c, 0xdb, 0x6b, 0x8c, 0x6c, 0xdf, 0x1a, 0x1c, 0x08, 0x18, + 0x5f, 0xc6, 0x70, 0x32, 0x82, 0x56, 0x14, 0xd2, 0x40, 0x1b, 0xcc, 0x79, 0xf6, 0x80, 0x21, 0x29, + 0xcb, 0xcf, 0xe1, 0x58, 0x2c, 0xeb, 0xad, 0xd3, 0x67, 0xe5, 0x50, 0xf2, 0xeb, 0x2c, 0x89, 0x5e, + 0xe6, 0xe4, 0x76, 0x94, 0xe0, 0x87, 0x9b, 0x60, 0xde, 0xd0, 0x4c, 0x44, 0xf0, 0x60, 0xdc, 0x25, + 0x7d, 0xcb, 0x1c, 0xb8, 0x8d, 0xca, 0x9a, 0xb2, 0x5e, 0xed, 0x2c, 0x0b, 0x82, 0xf9, 0x5d, 0xd9, + 0x8c, 0x92, 0x78, 0xf8, 0x21, 0x80, 0xc1, 0x00, 0xee, 0xf9, 0x1b, 0x4b, 0xb3, 0xcc, 0x46, 0x75, + 0x4d, 0x59, 0x2f, 0x77, 0x56, 0x04, 0x0b, 0x3c, 0x48, 0x21, 0x50, 0x86, 0x17, 0xdc, 0x01, 0x8b, + 0x0e, 0x19, 0x69, 0xae, 0x66, 0x99, 0xf7, 0x35, 0x97, 0x5a, 0xce, 0x78, 0x47, 0x33, 0x34, 0xda, + 0x98, 0xe2, 0x31, 0x35, 0x26, 0x27, 0xab, 0x8b, 0x28, 0xc3, 0x8e, 0x32, 0xbd, 0x5a, 0x7f, 0xa8, + 0x82, 0xf9, 0x44, 0xde, 0xc3, 0x47, 0x60, 0xa9, 0xef, 0x39, 0x0e, 0x31, 0xe9, 0x9e, 0x67, 0xf4, + 0x88, 0xd3, 0xed, 0x1f, 0x91, 0x81, 0xa7, 0x93, 0x01, 0x4f, 0x91, 0x6a, 0xa7, 0x29, 0x22, 0x5e, + 0xda, 0xca, 0x44, 0xa1, 0x1c, 0x6f, 0x36, 0x0b, 0x26, 0x6f, 0xda, 0xd5, 0x5c, 0x37, 0xe4, 0x2c, + 0x71, 0xce, 0x70, 0x16, 0xf6, 0x52, 0x08, 0x94, 0xe1, 0xc5, 0x62, 0x1c, 0x10, 0x57, 0x73, 0xc8, + 0x20, 0x19, 0x63, 0x59, 0x8e, 0x71, 0x3b, 0x13, 0x85, 0x72, 0xbc, 0xe1, 0xbb, 0x60, 0xc6, 0xef, + 0x8d, 0xaf, 0x9f, 0x58, 0xe8, 0x05, 0x41, 0x36, 0xb3, 0x17, 0x99, 0x50, 0x1c, 0xc7, 0x86, 0x66, + 0xf5, 0x5c, 0xe2, 0x8c, 0xc8, 0x20, 0x7f, 0x81, 0x1f, 0xa6, 0x10, 0x28, 0xc3, 0x8b, 0x0d, 0xcd, + 0xcf, 0xc0, 0xd4, 0xd0, 0xa6, 0xe4, 0xa1, 0x1d, 0x66, 0xa2, 0x50, 0x8e, 0x37, 0xcb, 0x63, 0x3f, + 0xe4, 0xcd, 0x11, 0xd6, 0x74, 0xdc, 0xd3, 0x49, 0x63, 0x5a, 0xce, 0xe3, 0x3d, 0xd9, 0x8c, 0x92, + 0x78, 0x78, 0x0f, 0x5c, 0xf1, 0x9b, 0x0e, 0x4d, 0x1c, 0x92, 0xd4, 0x38, 0xc9, 0xab, 0x82, 0xe4, + 0xca, 0x5e, 0x12, 0x80, 0xd2, 0x3e, 0xf0, 0x0e, 0x98, 0xeb, 0x5b, 0xba, 0xce, 0xf3, 0x71, 0xcb, + 0xf2, 0x4c, 0xda, 0xa8, 0xf3, 0xb9, 0x82, 0x6c, 0x3f, 0x6e, 0x49, 0x16, 0x94, 0x40, 0xb6, 0xfe, + 0xa6, 0x80, 0xe5, 0x9c, 0x3d, 0x0d, 0x7f, 0x04, 0x2a, 0x74, 0x6c, 0x13, 0x9e, 0xa8, 0xf5, 0xce, + 0x8d, 0xa0, 0x1c, 0x1c, 0x8c, 0x6d, 0xf2, 0xcd, 0xc9, 0xea, 0xd5, 0x1c, 0x37, 0x66, 0x46, 0xdc, + 0x11, 0x1e, 0x81, 0x59, 0x87, 0x75, 0x67, 0x0e, 0x7d, 0x88, 0x38, 0xb6, 0xda, 0xb9, 0xa7, 0x0b, + 0x8a, 0xa3, 0xa3, 0x03, 0xf8, 0xca, 0xe4, 0x64, 0x75, 0x56, 0xb2, 0x21, 0x99, 0xb8, 0xf5, 0xdb, + 0x12, 0x00, 0xdb, 0xc4, 0xd6, 0xad, 0xb1, 0x41, 0xcc, 0x8b, 0x28, 0xa9, 0x0f, 0xa4, 0x92, 0xfa, + 0x46, 0xfe, 0x79, 0x19, 0x06, 0x95, 0x5b, 0x53, 0x3f, 0x4a, 0xd4, 0xd4, 0xeb, 0x45, 0xc8, 0x9e, + 0x5f, 0x54, 0xbf, 0x2c, 0x83, 0x85, 0x08, 0xbc, 0x65, 0x99, 0x03, 0x8d, 0xef, 0x86, 0xbb, 0xd2, + 0x8a, 0xbe, 0x91, 0x58, 0xd1, 0xe5, 0x0c, 0x97, 0xd8, 0x6a, 0xee, 0x84, 0x71, 0x96, 0xb8, 0xfb, + 0x3b, 0x72, 0xe7, 0xdf, 0x9c, 0xac, 0x66, 0x48, 0x3f, 0x35, 0x64, 0x92, 0x43, 0x84, 0xd7, 0xc0, + 0x94, 0x43, 0xb0, 0x6b, 0x99, 0xfc, 0x58, 0xa8, 0x47, 0x43, 0x41, 0xbc, 0x15, 0x09, 0x2b, 0xbc, + 0x0e, 0xa6, 0x0d, 0xe2, 0xba, 0x78, 0x48, 0xf8, 0x09, 0x50, 0xef, 0xcc, 0x0b, 0xe0, 0xf4, 0xae, + 0xdf, 0x8c, 0x02, 0x3b, 0xfc, 0x04, 0xcc, 0xe9, 0xd8, 0x15, 0xe9, 0x78, 0xa0, 0x19, 0x84, 0xef, + 0xf1, 0x99, 0x8d, 0x37, 0x8b, 0xad, 0x3d, 0xf3, 0x88, 0xea, 0xd8, 0x8e, 0xc4, 0x84, 0x12, 0xcc, + 0x70, 0x04, 0x20, 0x6b, 0x39, 0x70, 0xb0, 0xe9, 0xfa, 0x13, 0xc5, 0xfa, 0x9b, 0x3e, 0x73, 0x7f, + 0xe1, 0x79, 0xb6, 0x93, 0x62, 0x43, 0x19, 0x3d, 0xb4, 0xfe, 0xa4, 0x80, 0xb9, 0x68, 0x99, 0x2e, + 0x40, 0x2f, 0xdd, 0x97, 0xf5, 0xd2, 0x6b, 0x05, 0x92, 0x33, 0x47, 0x30, 0x7d, 0x59, 0x89, 0x87, + 0xce, 0x15, 0xd3, 0x3a, 0xa8, 0x39, 0xc4, 0xd6, 0xb5, 0x3e, 0x76, 0x45, 0x39, 0xe4, 0xe2, 0x07, + 0x89, 0x36, 0x14, 0x5a, 0x25, 0x6d, 0x55, 0x7a, 0xb9, 0xda, 0xaa, 0xfc, 0x62, 0xb4, 0xd5, 0xcf, + 0x40, 0xcd, 0x0d, 0x54, 0x55, 0x85, 0x53, 0xde, 0x28, 0xb4, 0xb1, 0x85, 0xa0, 0x0a, 0xa9, 0x43, + 0x29, 0x15, 0xd2, 0x65, 0x89, 0xa8, 0xea, 0x19, 0x45, 0xd4, 0x0b, 0x15, 0x3e, 0x6c, 0x33, 0xdb, + 0xd8, 0x73, 0xc9, 0x80, 0xef, 0x80, 0x5a, 0xb4, 0x99, 0xf7, 0x79, 0x2b, 0x12, 0x56, 0x78, 0x08, + 0x96, 0x6d, 0xc7, 0x1a, 0x3a, 0xc4, 0x75, 0xb7, 0x09, 0x1e, 0xe8, 0x9a, 0x49, 0x82, 0x01, 0xd4, + 0x79, 0xc7, 0x57, 0x27, 0x27, 0xab, 0xcb, 0xfb, 0xd9, 0x10, 0x94, 0xe7, 0xdb, 0xfa, 0x6b, 0x05, + 0x5c, 0x4e, 0x9e, 0x8d, 0x39, 0x2a, 0x42, 0x39, 0x97, 0x8a, 0x78, 0x2b, 0x96, 0xa7, 0xbe, 0xc4, + 0x0a, 0x97, 0x27, 0x23, 0x57, 0x37, 0xc1, 0xbc, 0x50, 0x0d, 0x81, 0x51, 0xe8, 0xa8, 0x70, 0x79, + 0x0e, 0x65, 0x33, 0x4a, 0xe2, 0x99, 0x36, 0x88, 0x4a, 0x7e, 0x40, 0x52, 0x91, 0xb5, 0xc1, 0x66, + 0x12, 0x80, 0xd2, 0x3e, 0x70, 0x17, 0x2c, 0x78, 0x66, 0x9a, 0xca, 0x4f, 0x97, 0xab, 0x82, 0x6a, + 0xe1, 0x30, 0x0d, 0x41, 0x59, 0x7e, 0xf0, 0x31, 0x00, 0xfd, 0xe0, 0x40, 0x77, 0x1b, 0x53, 0xfc, + 0x48, 0x78, 0xab, 0x40, 0x5a, 0x87, 0x55, 0x20, 0x2a, 0xab, 0x61, 0x93, 0x8b, 0x62, 0x9c, 0xf0, + 0x2e, 0x98, 0x75, 0xb8, 0x24, 0x0c, 0x42, 0xf5, 0x65, 0xd5, 0xf7, 0x84, 0xdb, 0x2c, 0x8a, 0x1b, + 0x91, 0x8c, 0xcd, 0x50, 0x42, 0xb5, 0xc2, 0x4a, 0xe8, 0x2f, 0x0a, 0x80, 0xe9, 0x7d, 0x08, 0xef, + 0x48, 0x25, 0xf3, 0x5a, 0xa2, 0x64, 0x2e, 0xa5, 0x3d, 0x62, 0x15, 0x53, 0xcb, 0xd6, 0x3f, 0xb7, + 0x0a, 0xea, 0x9f, 0xe8, 0x40, 0x2d, 0x26, 0x80, 0xc4, 0x34, 0x5c, 0xcc, 0x9b, 0x42, 0x51, 0x01, + 0x14, 0x05, 0xf5, 0x02, 0x04, 0x50, 0x8c, 0xec, 0xf9, 0x02, 0xe8, 0xdf, 0x25, 0xb0, 0x10, 0x81, + 0x0b, 0x0b, 0xa0, 0x0c, 0x97, 0x97, 0x26, 0x80, 0xb2, 0x15, 0x44, 0xf9, 0x65, 0x2b, 0x88, 0x97, + 0x20, 0xbc, 0xb8, 0x28, 0x89, 0xa6, 0xee, 0xff, 0x49, 0x94, 0x44, 0x51, 0xe5, 0x88, 0x92, 0xdf, + 0x97, 0xe2, 0xa1, 0x7f, 0xe7, 0x45, 0xc9, 0xb7, 0x7f, 0x7e, 0x69, 0xfd, 0xbd, 0x0c, 0x2e, 0x27, + 0xf7, 0xa1, 0x54, 0x20, 0x95, 0x53, 0x0b, 0xe4, 0x3e, 0x58, 0x7c, 0xe2, 0xe9, 0xfa, 0x98, 0x4f, + 0x43, 0xac, 0x4a, 0xfa, 0xa5, 0xf5, 0xfb, 0xc2, 0x73, 0xf1, 0xa7, 0x19, 0x18, 0x94, 0xe9, 0x99, + 0x53, 0xec, 0xcb, 0xe7, 0x2a, 0xf6, 0xa9, 0x0a, 0x54, 0x39, 0x43, 0x05, 0xca, 0x2c, 0xdc, 0xd5, + 0x73, 0x14, 0xee, 0xb3, 0x55, 0xda, 0x8c, 0x83, 0xeb, 0xb4, 0x4a, 0xdb, 0xfa, 0xb5, 0x02, 0x96, + 0xb2, 0x2f, 0xdc, 0x50, 0x07, 0x73, 0x06, 0xfe, 0x34, 0xfe, 0x2e, 0x71, 0x5a, 0x11, 0xf1, 0xa8, + 0xa6, 0xab, 0xfe, 0x73, 0xb7, 0xfa, 0xc0, 0xa4, 0x0f, 0x9d, 0x2e, 0x75, 0x34, 0x73, 0xe8, 0x57, + 0xde, 0x5d, 0x89, 0x0b, 0x25, 0xb8, 0x5b, 0x5f, 0x2b, 0x60, 0x39, 0xa7, 0xf2, 0x5d, 0x6c, 0x24, + 0xf0, 0x63, 0x50, 0x33, 0xf0, 0xa7, 0x5d, 0xcf, 0x19, 0x66, 0xd5, 0xea, 0x62, 0xfd, 0xf0, 0xdd, + 0xbc, 0x2b, 0x58, 0x50, 0xc8, 0xd7, 0x7a, 0x08, 0xd6, 0xa4, 0x41, 0xb2, 0x9d, 0x43, 0x9e, 0x78, + 0x3a, 0xdf, 0x44, 0x42, 0x6c, 0xdc, 0x00, 0x75, 0x1b, 0x3b, 0x54, 0x0b, 0xa5, 0x6a, 0xb5, 0x33, + 0x3b, 0x39, 0x59, 0xad, 0xef, 0x07, 0x8d, 0x28, 0xb2, 0xb7, 0xfe, 0xa3, 0x80, 0x6a, 0xb7, 0x8f, + 0x75, 0x72, 0x01, 0xd5, 0x7e, 0x5b, 0xaa, 0xf6, 0xf9, 0x8f, 0xe6, 0x3c, 0x9e, 0xdc, 0x42, 0xbf, + 0x93, 0x28, 0xf4, 0xaf, 0x9f, 0xc2, 0xf3, 0xfc, 0x1a, 0xff, 0x01, 0xa8, 0x87, 0xdd, 0x9d, 0xed, + 0x00, 0x6a, 0xfd, 0xae, 0x04, 0x66, 0x62, 0x5d, 0x9c, 0xf1, 0xf8, 0x7a, 0x2c, 0x1d, 0xfb, 0x6c, + 0x63, 0x6e, 0x14, 0x19, 0x88, 0x1a, 0x1c, 0xf1, 0x3f, 0x31, 0xa9, 0x13, 0xbf, 0xe0, 0xa5, 0x4f, + 0xfe, 0x1f, 0x82, 0x39, 0x8a, 0x9d, 0x21, 0xa1, 0x81, 0x8d, 0x4f, 0x58, 0x3d, 0x7a, 0x9d, 0x38, + 0x90, 0xac, 0x28, 0x81, 0x5e, 0xb9, 0x0b, 0x66, 0xa5, 0xce, 0xe0, 0x65, 0x50, 0x3e, 0x26, 0x63, + 0x5f, 0xf6, 0x20, 0xf6, 0x13, 0x2e, 0x82, 0xea, 0x08, 0xeb, 0x9e, 0x9f, 0xe7, 0x75, 0xe4, 0xff, + 0xb9, 0x53, 0x7a, 0x5f, 0x69, 0x7d, 0xc6, 0x26, 0x27, 0x4a, 0xce, 0x0b, 0xc8, 0xae, 0x0f, 0xa5, + 0xec, 0xca, 0xff, 0xa6, 0x14, 0xdf, 0x32, 0x79, 0x39, 0x86, 0x12, 0x39, 0xf6, 0x66, 0x21, 0xb6, + 0xe7, 0x67, 0xda, 0x9f, 0x15, 0x30, 0x1f, 0x43, 0x5f, 0x80, 0xc0, 0x79, 0x20, 0x0b, 0x9c, 0xd7, + 0x8b, 0x0c, 0x22, 0x47, 0xe1, 0xfc, 0xa3, 0x2a, 0x05, 0xff, 0x9d, 0x97, 0x38, 0xbf, 0x04, 0x8b, + 0x23, 0x4b, 0xf7, 0x0c, 0xb2, 0xa5, 0x63, 0xcd, 0x08, 0x00, 0xac, 0x8a, 0x97, 0x93, 0x77, 0x8b, + 0x90, 0x9e, 0x38, 0xae, 0xe6, 0x52, 0x62, 0xd2, 0x47, 0x91, 0x67, 0xa4, 0x43, 0x1e, 0x65, 0xd0, + 0xa1, 0xcc, 0x4e, 0xe0, 0xbb, 0x60, 0x86, 0xe9, 0x09, 0xad, 0x4f, 0xf6, 0xb0, 0x11, 0x08, 0xe7, + 0xf0, 0x8b, 0x47, 0x37, 0x32, 0xa1, 0x38, 0x0e, 0x1e, 0x81, 0x05, 0xdb, 0x1a, 0xec, 0x62, 0x13, + 0x0f, 0x09, 0x2b, 0x7b, 0xfb, 0xfc, 0x9b, 0x38, 0x7f, 0x8c, 0xa9, 0x77, 0xde, 0x0b, 0x6e, 0xe9, + 0xfb, 0x69, 0x08, 0xbb, 0xb4, 0x64, 0x34, 0xf3, 0x4b, 0x4b, 0x16, 0x25, 0x74, 0x52, 0x5f, 0xfc, + 0xfc, 0x37, 0xcb, 0x8d, 0x22, 0x19, 0x76, 0xce, 0x6f, 0x7e, 0x79, 0x6f, 0x4d, 0xb5, 0x73, 0x7d, + 0x64, 0xfb, 0xac, 0x02, 0xae, 0xa4, 0xb6, 0xee, 0xff, 0xf0, 0xb5, 0x27, 0x25, 0x17, 0xcb, 0x67, + 0x90, 0x8b, 0x9b, 0x60, 0x5e, 0x7c, 0xdf, 0x4b, 0xa8, 0xcd, 0x50, 0x8f, 0x6f, 0xc9, 0x66, 0x94, + 0xc4, 0x67, 0xbd, 0x36, 0x55, 0xcf, 0xf8, 0xda, 0x14, 0x8f, 0xc2, 0x9f, 0x71, 0x91, 0x7a, 0xe9, + 0x28, 0x7c, 0x33, 0x4a, 0xe2, 0x59, 0xc5, 0xf2, 0x59, 0x43, 0x86, 0x69, 0xb9, 0x62, 0x1d, 0x4a, + 0x56, 0x94, 0x40, 0x7f, 0xab, 0x6f, 0x58, 0xff, 0x54, 0xc0, 0xab, 0xb9, 0x59, 0x0a, 0x37, 0xa5, + 0x2b, 0xff, 0xcd, 0xc4, 0x95, 0xff, 0x07, 0xb9, 0x8e, 0xb1, 0x8b, 0xbf, 0x93, 0xfd, 0x8e, 0xf3, + 0x41, 0xb1, 0x77, 0x9c, 0x0c, 0xa1, 0x77, 0xfa, 0x83, 0x4e, 0xe7, 0xe6, 0xd3, 0x67, 0xcd, 0x4b, + 0x5f, 0x3c, 0x6b, 0x5e, 0xfa, 0xea, 0x59, 0xf3, 0xd2, 0xaf, 0x26, 0x4d, 0xe5, 0xe9, 0xa4, 0xa9, + 0x7c, 0x31, 0x69, 0x2a, 0x5f, 0x4d, 0x9a, 0xca, 0xbf, 0x26, 0x4d, 0xe5, 0xf3, 0xaf, 0x9b, 0x97, + 0x3e, 0x9e, 0x16, 0x3d, 0xfe, 0x37, 0x00, 0x00, 0xff, 0xff, 0x13, 0xf6, 0xf1, 0xb6, 0x00, 0x24, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/apps/v1beta2/generated.proto b/staging/src/k8s.io/api/apps/v1beta2/generated.proto index 1bc58370a3a..2a083f19b75 100644 --- a/staging/src/k8s.io/api/apps/v1beta2/generated.proto +++ b/staging/src/k8s.io/api/apps/v1beta2/generated.proto @@ -157,8 +157,7 @@ message DaemonSetStatus { // WIP: This is not ready to be used and we plan to make breaking changes to it. message DaemonSetUpdateStrategy { - // Type of daemon set update. Can be "RollingUpdate" or "OnDelete". - // Default is OnDelete. + // Type of daemon set update. Can be "RollingUpdate" or "OnDelete". Default is RollingUpdate. // +optional optional string type = 1; @@ -220,20 +219,6 @@ message DeploymentList { repeated Deployment items = 2; } -// WIP: This is not ready to be used and we plan to make breaking changes to it. -// DeploymentRollback stores the information required to rollback a deployment. -message DeploymentRollback { - // Required: This must match the Name of a deployment. - optional string name = 1; - - // The annotations to be updated to a deployment - // +optional - map updatedAnnotations = 2; - - // The config of this deployment rollback. - optional RollbackConfig rollbackTo = 3; -} - // WIP: This is not ready to be used and we plan to make breaking changes to it. // DeploymentSpec is the specification of the desired behavior of the Deployment. message DeploymentSpec { @@ -270,10 +255,6 @@ message DeploymentSpec { // +optional optional bool paused = 7; - // The config this deployment is rolling back to. Will be cleared after rollback is done. - // +optional - optional RollbackConfig rollbackTo = 8; - // The maximum time in seconds for a deployment to make progress before it // is considered to be failed. The deployment controller will continue to // process failed deployments and a condition with a ProgressDeadlineExceeded @@ -457,13 +438,6 @@ message ReplicaSetStatus { repeated ReplicaSetCondition conditions = 6; } -// WIP: This is not ready to be used and we plan to make breaking changes to it. -message RollbackConfig { - // The revision to rollback to. If set to 0, rollback to the last revision. - // +optional - optional int64 revision = 1; -} - // WIP: This is not ready to be used and we plan to make breaking changes to it. // Spec to control the desired behavior of daemon set rolling update. message RollingUpdateDaemonSet { @@ -521,6 +495,8 @@ message RollingUpdateDeployment { message RollingUpdateStatefulSetStrategy { // Partition indicates the ordinal at which the StatefulSet should be // partitioned. + // Default value is 0. + // +optional optional int32 partition = 1; } @@ -690,6 +666,12 @@ message StatefulSetStatus { // updateRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence // [replicas-updatedReplicas,replicas) optional string updateRevision = 7; + + // collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller + // uses this field as a collision avoidance mechanism when it needs to create the name for the + // newest ControllerRevision. + // +optional + optional int64 collisionCount = 9; } // WIP: This is not ready to be used and we plan to make breaking changes to it. @@ -698,9 +680,12 @@ message StatefulSetStatus { // necessary to perform the update for the indicated strategy. message StatefulSetUpdateStrategy { // Type indicates the type of the StatefulSetUpdateStrategy. + // Default is RollingUpdate. + // +optional optional string type = 1; // RollingUpdate is used to communicate parameters when Type is RollingUpdateStatefulSetStrategyType. + // +optional optional RollingUpdateStatefulSetStrategy rollingUpdate = 2; } diff --git a/staging/src/k8s.io/api/apps/v1beta2/register.go b/staging/src/k8s.io/api/apps/v1beta2/register.go index 6643bea625f..d5f7816ffe7 100644 --- a/staging/src/k8s.io/api/apps/v1beta2/register.go +++ b/staging/src/k8s.io/api/apps/v1beta2/register.go @@ -46,7 +46,6 @@ func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, &Deployment{}, &DeploymentList{}, - &DeploymentRollback{}, &Scale{}, &StatefulSet{}, &StatefulSetList{}, diff --git a/staging/src/k8s.io/api/apps/v1beta2/types.go b/staging/src/k8s.io/api/apps/v1beta2/types.go index 84244b46408..b5c01c53b10 100644 --- a/staging/src/k8s.io/api/apps/v1beta2/types.go +++ b/staging/src/k8s.io/api/apps/v1beta2/types.go @@ -25,6 +25,7 @@ import ( const ( ControllerRevisionHashLabelKey = "controller-revision-hash" StatefulSetRevisionLabel = ControllerRevisionHashLabelKey + DeprecatedRollbackTo = "deprecated.deployment.rollback.to" ) // WIP: This is not ready to be used and we plan to make breaking changes to it. @@ -122,8 +123,11 @@ const ( // necessary to perform the update for the indicated strategy. type StatefulSetUpdateStrategy struct { // Type indicates the type of the StatefulSetUpdateStrategy. + // Default is RollingUpdate. + // +optional Type StatefulSetUpdateStrategyType `json:"type,omitempty" protobuf:"bytes,1,opt,name=type,casttype=StatefulSetStrategyType"` // RollingUpdate is used to communicate parameters when Type is RollingUpdateStatefulSetStrategyType. + // +optional RollingUpdate *RollingUpdateStatefulSetStrategy `json:"rollingUpdate,omitempty" protobuf:"bytes,2,opt,name=rollingUpdate"` } @@ -151,6 +155,8 @@ const ( type RollingUpdateStatefulSetStrategy struct { // Partition indicates the ordinal at which the StatefulSet should be // partitioned. + // Default value is 0. + // +optional Partition *int32 `json:"partition,omitempty" protobuf:"varint,1,opt,name=partition"` } @@ -246,6 +252,12 @@ type StatefulSetStatus struct { // updateRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence // [replicas-updatedReplicas,replicas) UpdateRevision string `json:"updateRevision,omitempty" protobuf:"bytes,7,opt,name=updateRevision"` + + // collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller + // uses this field as a collision avoidance mechanism when it needs to create the name for the + // newest ControllerRevision. + // +optional + CollisionCount *int64 `json:"collisionCount,omitempty" protobuf:"varint,9,opt,name=collisionCount"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -315,10 +327,6 @@ type DeploymentSpec struct { // +optional Paused bool `json:"paused,omitempty" protobuf:"varint,7,opt,name=paused"` - // The config this deployment is rolling back to. Will be cleared after rollback is done. - // +optional - RollbackTo *RollbackConfig `json:"rollbackTo,omitempty" protobuf:"bytes,8,opt,name=rollbackTo"` - // The maximum time in seconds for a deployment to make progress before it // is considered to be failed. The deployment controller will continue to // process failed deployments and a condition with a ProgressDeadlineExceeded @@ -329,28 +337,6 @@ type DeploymentSpec struct { ProgressDeadlineSeconds *int32 `json:"progressDeadlineSeconds,omitempty" protobuf:"varint,9,opt,name=progressDeadlineSeconds"` } -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// WIP: This is not ready to be used and we plan to make breaking changes to it. -// DeploymentRollback stores the information required to rollback a deployment. -type DeploymentRollback struct { - metav1.TypeMeta `json:",inline"` - // Required: This must match the Name of a deployment. - Name string `json:"name" protobuf:"bytes,1,opt,name=name"` - // The annotations to be updated to a deployment - // +optional - UpdatedAnnotations map[string]string `json:"updatedAnnotations,omitempty" protobuf:"bytes,2,rep,name=updatedAnnotations"` - // The config of this deployment rollback. - RollbackTo RollbackConfig `json:"rollbackTo" protobuf:"bytes,3,opt,name=rollbackTo"` -} - -// WIP: This is not ready to be used and we plan to make breaking changes to it. -type RollbackConfig struct { - // The revision to rollback to. If set to 0, rollback to the last revision. - // +optional - Revision int64 `json:"revision,omitempty" protobuf:"varint,1,opt,name=revision"` -} - const ( // DefaultDeploymentUniqueLabelKey is the default key of the selector that is added // to existing RCs (and label key that is added to its pods) to prevent the existing RCs @@ -504,8 +490,7 @@ type DeploymentList struct { // WIP: This is not ready to be used and we plan to make breaking changes to it. type DaemonSetUpdateStrategy struct { - // Type of daemon set update. Can be "RollingUpdate" or "OnDelete". - // Default is OnDelete. + // Type of daemon set update. Can be "RollingUpdate" or "OnDelete". Default is RollingUpdate. // +optional Type DaemonSetUpdateStrategyType `json:"type,omitempty" protobuf:"bytes,1,opt,name=type"` diff --git a/staging/src/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go b/staging/src/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go index c6f97f6c719..a6888bf9981 100644 --- a/staging/src/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go @@ -81,7 +81,7 @@ func (DaemonSetStatus) SwaggerDoc() map[string]string { var map_DaemonSetUpdateStrategy = map[string]string{ "": "WIP: This is not ready to be used and we plan to make breaking changes to it.", - "type": "Type of daemon set update. Can be \"RollingUpdate\" or \"OnDelete\". Default is OnDelete.", + "type": "Type of daemon set update. Can be \"RollingUpdate\" or \"OnDelete\". Default is RollingUpdate.", "rollingUpdate": "Rolling update config params. Present only if type = \"RollingUpdate\".", } @@ -124,17 +124,6 @@ func (DeploymentList) SwaggerDoc() map[string]string { return map_DeploymentList } -var map_DeploymentRollback = map[string]string{ - "": "WIP: This is not ready to be used and we plan to make breaking changes to it. DeploymentRollback stores the information required to rollback a deployment.", - "name": "Required: This must match the Name of a deployment.", - "updatedAnnotations": "The annotations to be updated to a deployment", - "rollbackTo": "The config of this deployment rollback.", -} - -func (DeploymentRollback) SwaggerDoc() map[string]string { - return map_DeploymentRollback -} - var map_DeploymentSpec = map[string]string{ "": "WIP: This is not ready to be used and we plan to make breaking changes to it. DeploymentSpec is the specification of the desired behavior of the Deployment.", "replicas": "Number of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1.", @@ -144,7 +133,6 @@ var map_DeploymentSpec = map[string]string{ "minReadySeconds": "Minimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)", "revisionHistoryLimit": "The number of old ReplicaSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 10.", "paused": "Indicates that the deployment is paused.", - "rollbackTo": "The config this deployment is rolling back to. Will be cleared after rollback is done.", "progressDeadlineSeconds": "The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Once autoRollback is implemented, the deployment controller will automatically rollback failed deployments. Note that progress will not be estimated during the time a deployment is paused. Defaults to 600s.", } @@ -238,15 +226,6 @@ func (ReplicaSetStatus) SwaggerDoc() map[string]string { return map_ReplicaSetStatus } -var map_RollbackConfig = map[string]string{ - "": "WIP: This is not ready to be used and we plan to make breaking changes to it.", - "revision": "The revision to rollback to. If set to 0, rollback to the last revision.", -} - -func (RollbackConfig) SwaggerDoc() map[string]string { - return map_RollbackConfig -} - var map_RollingUpdateDaemonSet = map[string]string{ "": "WIP: This is not ready to be used and we plan to make breaking changes to it. Spec to control the desired behavior of daemon set rolling update.", "maxUnavailable": "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding up. This cannot be 0. Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", @@ -268,7 +247,7 @@ func (RollingUpdateDeployment) SwaggerDoc() map[string]string { var map_RollingUpdateStatefulSetStrategy = map[string]string{ "": "WIP: This is not ready to be used and we plan to make breaking changes to it. RollingUpdateStatefulSetStrategy is used to communicate parameter for RollingUpdateStatefulSetStrategyType.", - "partition": "Partition indicates the ordinal at which the StatefulSet should be partitioned.", + "partition": "Partition indicates the ordinal at which the StatefulSet should be partitioned. Default value is 0.", } func (RollingUpdateStatefulSetStrategy) SwaggerDoc() map[string]string { @@ -349,6 +328,7 @@ var map_StatefulSetStatus = map[string]string{ "updatedReplicas": "updatedReplicas is the number of Pods created by the StatefulSet controller from the StatefulSet version indicated by updateRevision.", "currentRevision": "currentRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence [0,currentReplicas).", "updateRevision": "updateRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas)", + "collisionCount": "collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.", } func (StatefulSetStatus) SwaggerDoc() map[string]string { @@ -357,7 +337,7 @@ func (StatefulSetStatus) SwaggerDoc() map[string]string { var map_StatefulSetUpdateStrategy = map[string]string{ "": "WIP: This is not ready to be used and we plan to make breaking changes to it. StatefulSetUpdateStrategy indicates the strategy that the StatefulSet controller will use to perform updates. It includes any additional parameters necessary to perform the update for the indicated strategy.", - "type": "Type indicates the type of the StatefulSetUpdateStrategy.", + "type": "Type indicates the type of the StatefulSetUpdateStrategy. Default is RollingUpdate.", "rollingUpdate": "RollingUpdate is used to communicate parameters when Type is RollingUpdateStatefulSetStrategyType.", } diff --git a/staging/src/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go b/staging/src/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go index bc2b9cd8167..7d6cc4b080e 100644 --- a/staging/src/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go @@ -71,10 +71,6 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*DeploymentList).DeepCopyInto(out.(*DeploymentList)) return nil }, InType: reflect.TypeOf(&DeploymentList{})}, - conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { - in.(*DeploymentRollback).DeepCopyInto(out.(*DeploymentRollback)) - return nil - }, InType: reflect.TypeOf(&DeploymentRollback{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*DeploymentSpec).DeepCopyInto(out.(*DeploymentSpec)) return nil @@ -107,10 +103,6 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*ReplicaSetStatus).DeepCopyInto(out.(*ReplicaSetStatus)) return nil }, InType: reflect.TypeOf(&ReplicaSetStatus{})}, - conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { - in.(*RollbackConfig).DeepCopyInto(out.(*RollbackConfig)) - return nil - }, InType: reflect.TypeOf(&RollbackConfig{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*RollingUpdateDaemonSet).DeepCopyInto(out.(*RollingUpdateDaemonSet)) return nil @@ -388,40 +380,6 @@ func (in *DeploymentList) DeepCopyObject() runtime.Object { } } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *DeploymentRollback) DeepCopyInto(out *DeploymentRollback) { - *out = *in - out.TypeMeta = in.TypeMeta - if in.UpdatedAnnotations != nil { - in, out := &in.UpdatedAnnotations, &out.UpdatedAnnotations - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - out.RollbackTo = in.RollbackTo - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeploymentRollback. -func (in *DeploymentRollback) DeepCopy() *DeploymentRollback { - if in == nil { - return nil - } - out := new(DeploymentRollback) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *DeploymentRollback) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } else { - return nil - } -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DeploymentSpec) DeepCopyInto(out *DeploymentSpec) { *out = *in @@ -454,15 +412,6 @@ func (in *DeploymentSpec) DeepCopyInto(out *DeploymentSpec) { **out = **in } } - if in.RollbackTo != nil { - in, out := &in.RollbackTo, &out.RollbackTo - if *in == nil { - *out = nil - } else { - *out = new(RollbackConfig) - **out = **in - } - } if in.ProgressDeadlineSeconds != nil { in, out := &in.ProgressDeadlineSeconds, &out.ProgressDeadlineSeconds if *in == nil { @@ -680,22 +629,6 @@ func (in *ReplicaSetStatus) DeepCopy() *ReplicaSetStatus { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RollbackConfig) DeepCopyInto(out *RollbackConfig) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RollbackConfig. -func (in *RollbackConfig) DeepCopy() *RollbackConfig { - if in == nil { - return nil - } - out := new(RollbackConfig) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *RollingUpdateDaemonSet) DeepCopyInto(out *RollingUpdateDaemonSet) { *out = *in @@ -854,7 +787,7 @@ func (in *StatefulSet) DeepCopyInto(out *StatefulSet) { out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status + in.Status.DeepCopyInto(&out.Status) return } @@ -966,6 +899,15 @@ func (in *StatefulSetSpec) DeepCopy() *StatefulSetSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *StatefulSetStatus) DeepCopyInto(out *StatefulSetStatus) { *out = *in + if in.CollisionCount != nil { + in, out := &in.CollisionCount, &out.CollisionCount + if *in == nil { + *out = nil + } else { + *out = new(int64) + **out = **in + } + } return } diff --git a/staging/src/k8s.io/api/authentication/v1/BUILD b/staging/src/k8s.io/api/authentication/v1/BUILD index 33f73ac3c72..2c4953766bb 100644 --- a/staging/src/k8s.io/api/authentication/v1/BUILD +++ b/staging/src/k8s.io/api/authentication/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", @@ -43,3 +40,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/authentication/v1beta1/BUILD b/staging/src/k8s.io/api/authentication/v1beta1/BUILD index 33f73ac3c72..2c4953766bb 100644 --- a/staging/src/k8s.io/api/authentication/v1beta1/BUILD +++ b/staging/src/k8s.io/api/authentication/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", @@ -43,3 +40,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/authorization/v1/BUILD b/staging/src/k8s.io/api/authorization/v1/BUILD index 33f73ac3c72..2c4953766bb 100644 --- a/staging/src/k8s.io/api/authorization/v1/BUILD +++ b/staging/src/k8s.io/api/authorization/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", @@ -43,3 +40,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/authorization/v1beta1/BUILD b/staging/src/k8s.io/api/authorization/v1beta1/BUILD index 33f73ac3c72..2c4953766bb 100644 --- a/staging/src/k8s.io/api/authorization/v1beta1/BUILD +++ b/staging/src/k8s.io/api/authorization/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", @@ -43,3 +40,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/autoscaling/v1/BUILD b/staging/src/k8s.io/api/autoscaling/v1/BUILD index 6f674112ecf..4c374757b77 100644 --- a/staging/src/k8s.io/api/autoscaling/v1/BUILD +++ b/staging/src/k8s.io/api/autoscaling/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/ugorji/go/codec:go_default_library", @@ -44,3 +41,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/autoscaling/v2alpha1/BUILD b/staging/src/k8s.io/api/autoscaling/v2alpha1/BUILD index 6f674112ecf..4c374757b77 100644 --- a/staging/src/k8s.io/api/autoscaling/v2alpha1/BUILD +++ b/staging/src/k8s.io/api/autoscaling/v2alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/ugorji/go/codec:go_default_library", @@ -44,3 +41,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/batch/v1/BUILD b/staging/src/k8s.io/api/batch/v1/BUILD index 5976417ae95..1fba57b82bb 100644 --- a/staging/src/k8s.io/api/batch/v1/BUILD +++ b/staging/src/k8s.io/api/batch/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/ugorji/go/codec:go_default_library", @@ -45,3 +42,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/batch/v2alpha1/BUILD b/staging/src/k8s.io/api/batch/v2alpha1/BUILD index 83db55c3095..f70ebf0d2f3 100644 --- a/staging/src/k8s.io/api/batch/v2alpha1/BUILD +++ b/staging/src/k8s.io/api/batch/v2alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/ugorji/go/codec:go_default_library", @@ -46,3 +43,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/batch/v2alpha1/register.go b/staging/src/k8s.io/api/batch/v2alpha1/register.go index b1c512f3ae5..4b02c0f481c 100644 --- a/staging/src/k8s.io/api/batch/v2alpha1/register.go +++ b/staging/src/k8s.io/api/batch/v2alpha1/register.go @@ -48,8 +48,6 @@ func addKnownTypes(scheme *runtime.Scheme) error { &CronJob{}, &CronJobList{}, ) - scheme.AddKnownTypeWithName(SchemeGroupVersion.WithKind("ScheduledJob"), &CronJob{}) - scheme.AddKnownTypeWithName(SchemeGroupVersion.WithKind("ScheduledJobList"), &CronJobList{}) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil } diff --git a/staging/src/k8s.io/api/certificates/v1beta1/BUILD b/staging/src/k8s.io/api/certificates/v1beta1/BUILD index 33f73ac3c72..2c4953766bb 100644 --- a/staging/src/k8s.io/api/certificates/v1beta1/BUILD +++ b/staging/src/k8s.io/api/certificates/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", @@ -43,3 +40,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/core/v1/BUILD b/staging/src/k8s.io/api/core/v1/BUILD index 856b6cda075..5c4e6331c5d 100644 --- a/staging/src/k8s.io/api/core/v1/BUILD +++ b/staging/src/k8s.io/api/core/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "toleration_test.go", ], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -35,7 +32,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", @@ -62,3 +58,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/core/v1/annotation_key_constants.go b/staging/src/k8s.io/api/core/v1/annotation_key_constants.go index 6af9c6c2b1a..6c5deb65fd3 100644 --- a/staging/src/k8s.io/api/core/v1/annotation_key_constants.go +++ b/staging/src/k8s.io/api/core/v1/annotation_key_constants.go @@ -89,20 +89,4 @@ const ( // // Not all cloud providers support this annotation, though AWS & GCE do. AnnotationLoadBalancerSourceRangesKey = "service.beta.kubernetes.io/load-balancer-source-ranges" - - // AnnotationValueExternalTrafficLocal Value of annotation to specify local endpoints behavior. - AnnotationValueExternalTrafficLocal = "OnlyLocal" - // AnnotationValueExternalTrafficGlobal Value of annotation to specify global (legacy) behavior. - AnnotationValueExternalTrafficGlobal = "Global" - - // TODO: The beta annotations have been deprecated, remove them when we release k8s 1.8. - - // BetaAnnotationHealthCheckNodePort Annotation specifying the healthcheck nodePort for the service. - // If not specified, annotation is created by the service api backend with the allocated nodePort. - // Will use user-specified nodePort value if specified by the client. - BetaAnnotationHealthCheckNodePort = "service.beta.kubernetes.io/healthcheck-nodeport" - - // BetaAnnotationExternalTraffic An annotation that denotes if this Service desires to route - // external traffic to local endpoints only. This preserves Source IP and avoids a second hop. - BetaAnnotationExternalTraffic = "service.beta.kubernetes.io/external-traffic" ) diff --git a/staging/src/k8s.io/api/core/v1/generated.pb.go b/staging/src/k8s.io/api/core/v1/generated.pb.go index acbc4c2ccd4..e127916a402 100644 --- a/staging/src/k8s.io/api/core/v1/generated.pb.go +++ b/staging/src/k8s.io/api/core/v1/generated.pb.go @@ -103,6 +103,7 @@ limitations under the License. NodeAddress NodeAffinity NodeCondition + NodeConfigSource NodeDaemonEndpoints NodeList NodeProxyOptions @@ -547,406 +548,410 @@ func (m *NodeCondition) Reset() { *m = NodeCondition{} } func (*NodeCondition) ProtoMessage() {} func (*NodeCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{77} } +func (m *NodeConfigSource) Reset() { *m = NodeConfigSource{} } +func (*NodeConfigSource) ProtoMessage() {} +func (*NodeConfigSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{78} } + func (m *NodeDaemonEndpoints) Reset() { *m = NodeDaemonEndpoints{} } func (*NodeDaemonEndpoints) ProtoMessage() {} -func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{78} } +func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{79} } func (m *NodeList) Reset() { *m = NodeList{} } func (*NodeList) ProtoMessage() {} -func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{79} } +func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{80} } func (m *NodeProxyOptions) Reset() { *m = NodeProxyOptions{} } func (*NodeProxyOptions) ProtoMessage() {} -func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{80} } +func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{81} } func (m *NodeResources) Reset() { *m = NodeResources{} } func (*NodeResources) ProtoMessage() {} -func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{81} } +func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{82} } func (m *NodeSelector) Reset() { *m = NodeSelector{} } func (*NodeSelector) ProtoMessage() {} -func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{82} } +func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{83} } func (m *NodeSelectorRequirement) Reset() { *m = NodeSelectorRequirement{} } func (*NodeSelectorRequirement) ProtoMessage() {} func (*NodeSelectorRequirement) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{83} + return fileDescriptorGenerated, []int{84} } func (m *NodeSelectorTerm) Reset() { *m = NodeSelectorTerm{} } func (*NodeSelectorTerm) ProtoMessage() {} -func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{84} } +func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{85} } func (m *NodeSpec) Reset() { *m = NodeSpec{} } func (*NodeSpec) ProtoMessage() {} -func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{85} } +func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{86} } func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} -func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{86} } +func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{87} } func (m *NodeSystemInfo) Reset() { *m = NodeSystemInfo{} } func (*NodeSystemInfo) ProtoMessage() {} -func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{87} } +func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{88} } func (m *ObjectFieldSelector) Reset() { *m = ObjectFieldSelector{} } func (*ObjectFieldSelector) ProtoMessage() {} -func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{88} } +func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{89} } func (m *ObjectMeta) Reset() { *m = ObjectMeta{} } func (*ObjectMeta) ProtoMessage() {} -func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{89} } +func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{90} } func (m *ObjectReference) Reset() { *m = ObjectReference{} } func (*ObjectReference) ProtoMessage() {} -func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{90} } +func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{91} } func (m *PersistentVolume) Reset() { *m = PersistentVolume{} } func (*PersistentVolume) ProtoMessage() {} -func (*PersistentVolume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{91} } +func (*PersistentVolume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{92} } func (m *PersistentVolumeClaim) Reset() { *m = PersistentVolumeClaim{} } func (*PersistentVolumeClaim) ProtoMessage() {} -func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{92} } +func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{93} } func (m *PersistentVolumeClaimList) Reset() { *m = PersistentVolumeClaimList{} } func (*PersistentVolumeClaimList) ProtoMessage() {} func (*PersistentVolumeClaimList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{93} + return fileDescriptorGenerated, []int{94} } func (m *PersistentVolumeClaimSpec) Reset() { *m = PersistentVolumeClaimSpec{} } func (*PersistentVolumeClaimSpec) ProtoMessage() {} func (*PersistentVolumeClaimSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{94} + return fileDescriptorGenerated, []int{95} } func (m *PersistentVolumeClaimStatus) Reset() { *m = PersistentVolumeClaimStatus{} } func (*PersistentVolumeClaimStatus) ProtoMessage() {} func (*PersistentVolumeClaimStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{95} + return fileDescriptorGenerated, []int{96} } func (m *PersistentVolumeClaimVolumeSource) Reset() { *m = PersistentVolumeClaimVolumeSource{} } func (*PersistentVolumeClaimVolumeSource) ProtoMessage() {} func (*PersistentVolumeClaimVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{96} + return fileDescriptorGenerated, []int{97} } func (m *PersistentVolumeList) Reset() { *m = PersistentVolumeList{} } func (*PersistentVolumeList) ProtoMessage() {} -func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{97} } +func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{98} } func (m *PersistentVolumeSource) Reset() { *m = PersistentVolumeSource{} } func (*PersistentVolumeSource) ProtoMessage() {} -func (*PersistentVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{98} } +func (*PersistentVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{99} } func (m *PersistentVolumeSpec) Reset() { *m = PersistentVolumeSpec{} } func (*PersistentVolumeSpec) ProtoMessage() {} -func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{99} } +func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{100} } func (m *PersistentVolumeStatus) Reset() { *m = PersistentVolumeStatus{} } func (*PersistentVolumeStatus) ProtoMessage() {} func (*PersistentVolumeStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{100} + return fileDescriptorGenerated, []int{101} } func (m *PhotonPersistentDiskVolumeSource) Reset() { *m = PhotonPersistentDiskVolumeSource{} } func (*PhotonPersistentDiskVolumeSource) ProtoMessage() {} func (*PhotonPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{101} + return fileDescriptorGenerated, []int{102} } func (m *Pod) Reset() { *m = Pod{} } func (*Pod) ProtoMessage() {} -func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{102} } +func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{103} } func (m *PodAffinity) Reset() { *m = PodAffinity{} } func (*PodAffinity) ProtoMessage() {} -func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{103} } +func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{104} } func (m *PodAffinityTerm) Reset() { *m = PodAffinityTerm{} } func (*PodAffinityTerm) ProtoMessage() {} -func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{104} } +func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{105} } func (m *PodAntiAffinity) Reset() { *m = PodAntiAffinity{} } func (*PodAntiAffinity) ProtoMessage() {} -func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{105} } +func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{106} } func (m *PodAttachOptions) Reset() { *m = PodAttachOptions{} } func (*PodAttachOptions) ProtoMessage() {} -func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{106} } +func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{107} } func (m *PodCondition) Reset() { *m = PodCondition{} } func (*PodCondition) ProtoMessage() {} -func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{107} } +func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{108} } func (m *PodExecOptions) Reset() { *m = PodExecOptions{} } func (*PodExecOptions) ProtoMessage() {} -func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{108} } +func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{109} } func (m *PodList) Reset() { *m = PodList{} } func (*PodList) ProtoMessage() {} -func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{109} } +func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{110} } func (m *PodLogOptions) Reset() { *m = PodLogOptions{} } func (*PodLogOptions) ProtoMessage() {} -func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{110} } +func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{111} } func (m *PodPortForwardOptions) Reset() { *m = PodPortForwardOptions{} } func (*PodPortForwardOptions) ProtoMessage() {} -func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{111} } +func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} } func (m *PodProxyOptions) Reset() { *m = PodProxyOptions{} } func (*PodProxyOptions) ProtoMessage() {} -func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} } +func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} } func (m *PodSecurityContext) Reset() { *m = PodSecurityContext{} } func (*PodSecurityContext) ProtoMessage() {} -func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} } +func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} } func (m *PodSignature) Reset() { *m = PodSignature{} } func (*PodSignature) ProtoMessage() {} -func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} } +func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} } func (m *PodSpec) Reset() { *m = PodSpec{} } func (*PodSpec) ProtoMessage() {} -func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} } +func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} } func (m *PodStatus) Reset() { *m = PodStatus{} } func (*PodStatus) ProtoMessage() {} -func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} } +func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} } func (m *PodStatusResult) Reset() { *m = PodStatusResult{} } func (*PodStatusResult) ProtoMessage() {} -func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} } +func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} } func (m *PodTemplate) Reset() { *m = PodTemplate{} } func (*PodTemplate) ProtoMessage() {} -func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} } +func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{119} } func (m *PodTemplateList) Reset() { *m = PodTemplateList{} } func (*PodTemplateList) ProtoMessage() {} -func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{119} } +func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} } func (m *PodTemplateSpec) Reset() { *m = PodTemplateSpec{} } func (*PodTemplateSpec) ProtoMessage() {} -func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} } +func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{121} } func (m *PortworxVolumeSource) Reset() { *m = PortworxVolumeSource{} } func (*PortworxVolumeSource) ProtoMessage() {} -func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{121} } +func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} } func (m *Preconditions) Reset() { *m = Preconditions{} } func (*Preconditions) ProtoMessage() {} -func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} } +func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} } func (m *PreferAvoidPodsEntry) Reset() { *m = PreferAvoidPodsEntry{} } func (*PreferAvoidPodsEntry) ProtoMessage() {} -func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} } +func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} } func (m *PreferredSchedulingTerm) Reset() { *m = PreferredSchedulingTerm{} } func (*PreferredSchedulingTerm) ProtoMessage() {} func (*PreferredSchedulingTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{124} + return fileDescriptorGenerated, []int{125} } func (m *Probe) Reset() { *m = Probe{} } func (*Probe) ProtoMessage() {} -func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{125} } +func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} } func (m *ProjectedVolumeSource) Reset() { *m = ProjectedVolumeSource{} } func (*ProjectedVolumeSource) ProtoMessage() {} -func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} } +func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} } func (m *QuobyteVolumeSource) Reset() { *m = QuobyteVolumeSource{} } func (*QuobyteVolumeSource) ProtoMessage() {} -func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} } +func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} } func (m *RBDVolumeSource) Reset() { *m = RBDVolumeSource{} } func (*RBDVolumeSource) ProtoMessage() {} -func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} } +func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} } func (m *RangeAllocation) Reset() { *m = RangeAllocation{} } func (*RangeAllocation) ProtoMessage() {} -func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} } +func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} } func (m *ReplicationController) Reset() { *m = ReplicationController{} } func (*ReplicationController) ProtoMessage() {} -func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} } +func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} } func (m *ReplicationControllerCondition) Reset() { *m = ReplicationControllerCondition{} } func (*ReplicationControllerCondition) ProtoMessage() {} func (*ReplicationControllerCondition) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{131} + return fileDescriptorGenerated, []int{132} } func (m *ReplicationControllerList) Reset() { *m = ReplicationControllerList{} } func (*ReplicationControllerList) ProtoMessage() {} func (*ReplicationControllerList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{132} + return fileDescriptorGenerated, []int{133} } func (m *ReplicationControllerSpec) Reset() { *m = ReplicationControllerSpec{} } func (*ReplicationControllerSpec) ProtoMessage() {} func (*ReplicationControllerSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{133} + return fileDescriptorGenerated, []int{134} } func (m *ReplicationControllerStatus) Reset() { *m = ReplicationControllerStatus{} } func (*ReplicationControllerStatus) ProtoMessage() {} func (*ReplicationControllerStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{134} + return fileDescriptorGenerated, []int{135} } func (m *ResourceFieldSelector) Reset() { *m = ResourceFieldSelector{} } func (*ResourceFieldSelector) ProtoMessage() {} -func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{135} } +func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{136} } func (m *ResourceQuota) Reset() { *m = ResourceQuota{} } func (*ResourceQuota) ProtoMessage() {} -func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{136} } +func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{137} } func (m *ResourceQuotaList) Reset() { *m = ResourceQuotaList{} } func (*ResourceQuotaList) ProtoMessage() {} -func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{137} } +func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{138} } func (m *ResourceQuotaSpec) Reset() { *m = ResourceQuotaSpec{} } func (*ResourceQuotaSpec) ProtoMessage() {} -func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{138} } +func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} } func (m *ResourceQuotaStatus) Reset() { *m = ResourceQuotaStatus{} } func (*ResourceQuotaStatus) ProtoMessage() {} -func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} } +func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } func (m *ResourceRequirements) Reset() { *m = ResourceRequirements{} } func (*ResourceRequirements) ProtoMessage() {} -func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } +func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } func (m *SELinuxOptions) Reset() { *m = SELinuxOptions{} } func (*SELinuxOptions) ProtoMessage() {} -func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } +func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } func (m *ScaleIOVolumeSource) Reset() { *m = ScaleIOVolumeSource{} } func (*ScaleIOVolumeSource) ProtoMessage() {} -func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } +func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } func (m *Secret) Reset() { *m = Secret{} } func (*Secret) ProtoMessage() {} -func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } +func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } func (m *SecretEnvSource) Reset() { *m = SecretEnvSource{} } func (*SecretEnvSource) ProtoMessage() {} -func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } +func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } func (m *SecretKeySelector) Reset() { *m = SecretKeySelector{} } func (*SecretKeySelector) ProtoMessage() {} -func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } +func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } func (m *SecretList) Reset() { *m = SecretList{} } func (*SecretList) ProtoMessage() {} -func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } +func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } func (m *SecretProjection) Reset() { *m = SecretProjection{} } func (*SecretProjection) ProtoMessage() {} -func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } +func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } func (m *SecretVolumeSource) Reset() { *m = SecretVolumeSource{} } func (*SecretVolumeSource) ProtoMessage() {} -func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } +func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } func (m *SecurityContext) Reset() { *m = SecurityContext{} } func (*SecurityContext) ProtoMessage() {} -func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } +func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } func (m *SerializedReference) Reset() { *m = SerializedReference{} } func (*SerializedReference) ProtoMessage() {} -func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } +func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} -func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } +func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (*ServiceAccount) ProtoMessage() {} -func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } +func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } func (m *ServiceAccountList) Reset() { *m = ServiceAccountList{} } func (*ServiceAccountList) ProtoMessage() {} -func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } +func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } func (m *ServiceList) Reset() { *m = ServiceList{} } func (*ServiceList) ProtoMessage() {} -func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } +func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } func (m *ServicePort) Reset() { *m = ServicePort{} } func (*ServicePort) ProtoMessage() {} -func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } +func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } func (m *ServiceProxyOptions) Reset() { *m = ServiceProxyOptions{} } func (*ServiceProxyOptions) ProtoMessage() {} -func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } +func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } func (m *ServiceSpec) Reset() { *m = ServiceSpec{} } func (*ServiceSpec) ProtoMessage() {} -func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } +func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } func (m *ServiceStatus) Reset() { *m = ServiceStatus{} } func (*ServiceStatus) ProtoMessage() {} -func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } +func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } func (m *StorageOSPersistentVolumeSource) Reset() { *m = StorageOSPersistentVolumeSource{} } func (*StorageOSPersistentVolumeSource) ProtoMessage() {} func (*StorageOSPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{159} + return fileDescriptorGenerated, []int{160} } func (m *StorageOSVolumeSource) Reset() { *m = StorageOSVolumeSource{} } func (*StorageOSVolumeSource) ProtoMessage() {} -func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } +func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } func (m *Sysctl) Reset() { *m = Sysctl{} } func (*Sysctl) ProtoMessage() {} -func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } +func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } func (m *TCPSocketAction) Reset() { *m = TCPSocketAction{} } func (*TCPSocketAction) ProtoMessage() {} -func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } +func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } func (m *Taint) Reset() { *m = Taint{} } func (*Taint) ProtoMessage() {} -func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } +func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} -func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } +func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} } func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} -func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} } +func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} } func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} -func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} } +func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} -func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } +func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} } func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} -func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} } +func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} } func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{169} + return fileDescriptorGenerated, []int{170} } func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{170} + return fileDescriptorGenerated, []int{171} } func init() { @@ -1028,6 +1033,7 @@ func init() { proto.RegisterType((*NodeAddress)(nil), "k8s.io.api.core.v1.NodeAddress") proto.RegisterType((*NodeAffinity)(nil), "k8s.io.api.core.v1.NodeAffinity") proto.RegisterType((*NodeCondition)(nil), "k8s.io.api.core.v1.NodeCondition") + proto.RegisterType((*NodeConfigSource)(nil), "k8s.io.api.core.v1.NodeConfigSource") proto.RegisterType((*NodeDaemonEndpoints)(nil), "k8s.io.api.core.v1.NodeDaemonEndpoints") proto.RegisterType((*NodeList)(nil), "k8s.io.api.core.v1.NodeList") proto.RegisterType((*NodeProxyOptions)(nil), "k8s.io.api.core.v1.NodeProxyOptions") @@ -3156,6 +3162,21 @@ func (m *FCVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0 } i++ + if len(m.WWIDs) > 0 { + for _, s := range m.WWIDs { + dAtA[i] = 0x2a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } return i, nil } @@ -4485,6 +4506,34 @@ func (m *NodeCondition) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *NodeConfigSource) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NodeConfigSource) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ConfigMapRef != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMapRef.Size())) + n75, err := m.ConfigMapRef.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n75 + } + return i, nil +} + func (m *NodeDaemonEndpoints) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -4503,11 +4552,11 @@ func (m *NodeDaemonEndpoints) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.KubeletEndpoint.Size())) - n75, err := m.KubeletEndpoint.MarshalTo(dAtA[i:]) + n76, err := m.KubeletEndpoint.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n75 + i += n76 return i, nil } @@ -4529,11 +4578,11 @@ func (m *NodeList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n76, err := m.ListMeta.MarshalTo(dAtA[i:]) + n77, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n76 + i += n77 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -4610,11 +4659,11 @@ func (m *NodeResources) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n77, err := (&v).MarshalTo(dAtA[i:]) + n78, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n77 + i += n78 } } return i, nil @@ -4768,6 +4817,16 @@ func (m *NodeSpec) MarshalTo(dAtA []byte) (int, error) { i += n } } + if m.ConfigSource != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigSource.Size())) + n79, err := m.ConfigSource.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n79 + } return i, nil } @@ -4810,11 +4869,11 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n78, err := (&v).MarshalTo(dAtA[i:]) + n80, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n78 + i += n80 } } if len(m.Allocatable) > 0 { @@ -4841,11 +4900,11 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n79, err := (&v).MarshalTo(dAtA[i:]) + n81, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n79 + i += n81 } } dAtA[i] = 0x1a @@ -4879,19 +4938,19 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DaemonEndpoints.Size())) - n80, err := m.DaemonEndpoints.MarshalTo(dAtA[i:]) + n82, err := m.DaemonEndpoints.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n80 + i += n82 dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NodeInfo.Size())) - n81, err := m.NodeInfo.MarshalTo(dAtA[i:]) + n83, err := m.NodeInfo.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n81 + i += n83 if len(m.Images) > 0 { for _, msg := range m.Images { dAtA[i] = 0x42 @@ -5063,20 +5122,20 @@ func (m *ObjectMeta) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x42 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CreationTimestamp.Size())) - n82, err := m.CreationTimestamp.MarshalTo(dAtA[i:]) + n84, err := m.CreationTimestamp.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n82 + i += n84 if m.DeletionTimestamp != nil { dAtA[i] = 0x4a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DeletionTimestamp.Size())) - n83, err := m.DeletionTimestamp.MarshalTo(dAtA[i:]) + n85, err := m.DeletionTimestamp.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n83 + i += n85 } if m.DeletionGracePeriodSeconds != nil { dAtA[i] = 0x50 @@ -5164,11 +5223,11 @@ func (m *ObjectMeta) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Initializers.Size())) - n84, err := m.Initializers.MarshalTo(dAtA[i:]) + n86, err := m.Initializers.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n84 + i += n86 } return i, nil } @@ -5237,27 +5296,27 @@ func (m *PersistentVolume) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n85, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n85 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n86, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n86 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n87, err := m.Status.MarshalTo(dAtA[i:]) + n87, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n87 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n88, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n88 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n89, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n89 return i, nil } @@ -5279,27 +5338,27 @@ func (m *PersistentVolumeClaim) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n88, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n88 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n89, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n89 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n90, err := m.Status.MarshalTo(dAtA[i:]) + n90, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n90 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n91, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n91 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n92, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n92 return i, nil } @@ -5321,11 +5380,11 @@ func (m *PersistentVolumeClaimList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n91, err := m.ListMeta.MarshalTo(dAtA[i:]) + n93, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n91 + i += n93 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -5374,11 +5433,11 @@ func (m *PersistentVolumeClaimSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Resources.Size())) - n92, err := m.Resources.MarshalTo(dAtA[i:]) + n94, err := m.Resources.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n92 + i += n94 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.VolumeName))) @@ -5387,11 +5446,11 @@ func (m *PersistentVolumeClaimSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) - n93, err := m.Selector.MarshalTo(dAtA[i:]) + n95, err := m.Selector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n93 + i += n95 } if m.StorageClassName != nil { dAtA[i] = 0x2a @@ -5460,11 +5519,11 @@ func (m *PersistentVolumeClaimStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n94, err := (&v).MarshalTo(dAtA[i:]) + n96, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n94 + i += n96 } } return i, nil @@ -5518,11 +5577,11 @@ func (m *PersistentVolumeList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n95, err := m.ListMeta.MarshalTo(dAtA[i:]) + n97, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n95 + i += n97 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -5557,163 +5616,163 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) - n96, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n96 - } - if m.AWSElasticBlockStore != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) - n97, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n97 - } - if m.HostPath != nil { - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size())) - n98, err := m.HostPath.MarshalTo(dAtA[i:]) + n98, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n98 } - if m.Glusterfs != nil { - dAtA[i] = 0x22 + if m.AWSElasticBlockStore != nil { + dAtA[i] = 0x12 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) - n99, err := m.Glusterfs.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) + n99, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n99 } - if m.NFS != nil { - dAtA[i] = 0x2a + if m.HostPath != nil { + dAtA[i] = 0x1a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) - n100, err := m.NFS.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size())) + n100, err := m.HostPath.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n100 } - if m.RBD != nil { - dAtA[i] = 0x32 + if m.Glusterfs != nil { + dAtA[i] = 0x22 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) - n101, err := m.RBD.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) + n101, err := m.Glusterfs.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n101 } - if m.ISCSI != nil { - dAtA[i] = 0x3a + if m.NFS != nil { + dAtA[i] = 0x2a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) - n102, err := m.ISCSI.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) + n102, err := m.NFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n102 } - if m.Cinder != nil { - dAtA[i] = 0x42 + if m.RBD != nil { + dAtA[i] = 0x32 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) - n103, err := m.Cinder.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) + n103, err := m.RBD.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n103 } - if m.CephFS != nil { - dAtA[i] = 0x4a + if m.ISCSI != nil { + dAtA[i] = 0x3a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) - n104, err := m.CephFS.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) + n104, err := m.ISCSI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n104 } - if m.FC != nil { - dAtA[i] = 0x52 + if m.Cinder != nil { + dAtA[i] = 0x42 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size())) - n105, err := m.FC.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) + n105, err := m.Cinder.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n105 } - if m.Flocker != nil { - dAtA[i] = 0x5a + if m.CephFS != nil { + dAtA[i] = 0x4a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) - n106, err := m.Flocker.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) + n106, err := m.CephFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n106 } - if m.FlexVolume != nil { - dAtA[i] = 0x62 + if m.FC != nil { + dAtA[i] = 0x52 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) - n107, err := m.FlexVolume.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size())) + n107, err := m.FC.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n107 } - if m.AzureFile != nil { - dAtA[i] = 0x6a + if m.Flocker != nil { + dAtA[i] = 0x5a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size())) - n108, err := m.AzureFile.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) + n108, err := m.Flocker.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n108 } - if m.VsphereVolume != nil { - dAtA[i] = 0x72 + if m.FlexVolume != nil { + dAtA[i] = 0x62 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size())) - n109, err := m.VsphereVolume.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) + n109, err := m.FlexVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n109 } - if m.Quobyte != nil { - dAtA[i] = 0x7a + if m.AzureFile != nil { + dAtA[i] = 0x6a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size())) - n110, err := m.Quobyte.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size())) + n110, err := m.AzureFile.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n110 } + if m.VsphereVolume != nil { + dAtA[i] = 0x72 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size())) + n111, err := m.VsphereVolume.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n111 + } + if m.Quobyte != nil { + dAtA[i] = 0x7a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size())) + n112, err := m.Quobyte.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n112 + } if m.AzureDisk != nil { dAtA[i] = 0x82 i++ dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size())) - n111, err := m.AzureDisk.MarshalTo(dAtA[i:]) + n113, err := m.AzureDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n111 + i += n113 } if m.PhotonPersistentDisk != nil { dAtA[i] = 0x8a @@ -5721,11 +5780,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PhotonPersistentDisk.Size())) - n112, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) + n114, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n112 + i += n114 } if m.PortworxVolume != nil { dAtA[i] = 0x92 @@ -5733,11 +5792,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PortworxVolume.Size())) - n113, err := m.PortworxVolume.MarshalTo(dAtA[i:]) + n115, err := m.PortworxVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n113 + i += n115 } if m.ScaleIO != nil { dAtA[i] = 0x9a @@ -5745,11 +5804,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleIO.Size())) - n114, err := m.ScaleIO.MarshalTo(dAtA[i:]) + n116, err := m.ScaleIO.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n114 + i += n116 } if m.Local != nil { dAtA[i] = 0xa2 @@ -5757,11 +5816,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Local.Size())) - n115, err := m.Local.MarshalTo(dAtA[i:]) + n117, err := m.Local.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n115 + i += n117 } if m.StorageOS != nil { dAtA[i] = 0xaa @@ -5769,11 +5828,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StorageOS.Size())) - n116, err := m.StorageOS.MarshalTo(dAtA[i:]) + n118, err := m.StorageOS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n116 + i += n118 } return i, nil } @@ -5817,21 +5876,21 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n117, err := (&v).MarshalTo(dAtA[i:]) + n119, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n117 + i += n119 } } dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeSource.Size())) - n118, err := m.PersistentVolumeSource.MarshalTo(dAtA[i:]) + n120, err := m.PersistentVolumeSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n118 + i += n120 if len(m.AccessModes) > 0 { for _, s := range m.AccessModes { dAtA[i] = 0x1a @@ -5851,11 +5910,11 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ClaimRef.Size())) - n119, err := m.ClaimRef.MarshalTo(dAtA[i:]) + n121, err := m.ClaimRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n119 + i += n121 } dAtA[i] = 0x2a i++ @@ -5942,27 +6001,27 @@ func (m *Pod) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n120, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n120 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n121, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n121 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n122, err := m.Status.MarshalTo(dAtA[i:]) + n122, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n122 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n123, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n123 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n124, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n124 return i, nil } @@ -6027,11 +6086,11 @@ func (m *PodAffinityTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LabelSelector.Size())) - n123, err := m.LabelSelector.MarshalTo(dAtA[i:]) + n125, err := m.LabelSelector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n123 + i += n125 } if len(m.Namespaces) > 0 { for _, s := range m.Namespaces { @@ -6177,19 +6236,19 @@ func (m *PodCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastProbeTime.Size())) - n124, err := m.LastProbeTime.MarshalTo(dAtA[i:]) + n126, err := m.LastProbeTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n124 + i += n126 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n125, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n127, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n125 + i += n127 dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -6288,11 +6347,11 @@ func (m *PodList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n126, err := m.ListMeta.MarshalTo(dAtA[i:]) + n128, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n126 + i += n128 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -6352,11 +6411,11 @@ func (m *PodLogOptions) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SinceTime.Size())) - n127, err := m.SinceTime.MarshalTo(dAtA[i:]) + n129, err := m.SinceTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n127 + i += n129 } dAtA[i] = 0x30 i++ @@ -6445,11 +6504,11 @@ func (m *PodSecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size())) - n128, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) + n130, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n128 + i += n130 } if m.RunAsUser != nil { dAtA[i] = 0x10 @@ -6500,11 +6559,11 @@ func (m *PodSignature) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodController.Size())) - n129, err := m.PodController.MarshalTo(dAtA[i:]) + n131, err := m.PodController.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n129 + i += n131 } return i, nil } @@ -6628,11 +6687,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecurityContext.Size())) - n130, err := m.SecurityContext.MarshalTo(dAtA[i:]) + n132, err := m.SecurityContext.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n130 + i += n132 } if len(m.ImagePullSecrets) > 0 { for _, msg := range m.ImagePullSecrets { @@ -6664,11 +6723,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Affinity.Size())) - n131, err := m.Affinity.MarshalTo(dAtA[i:]) + n133, err := m.Affinity.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n131 + i += n133 } dAtA[i] = 0x9a i++ @@ -6797,11 +6856,11 @@ func (m *PodStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartTime.Size())) - n132, err := m.StartTime.MarshalTo(dAtA[i:]) + n134, err := m.StartTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n132 + i += n134 } if len(m.ContainerStatuses) > 0 { for _, msg := range m.ContainerStatuses { @@ -6852,19 +6911,19 @@ func (m *PodStatusResult) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n133, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n135, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n133 + i += n135 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n134, err := m.Status.MarshalTo(dAtA[i:]) + n136, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n134 + i += n136 return i, nil } @@ -6886,19 +6945,19 @@ func (m *PodTemplate) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n135, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n137, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n135 + i += n137 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size())) - n136, err := m.Template.MarshalTo(dAtA[i:]) + n138, err := m.Template.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n136 + i += n138 return i, nil } @@ -6920,11 +6979,11 @@ func (m *PodTemplateList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n137, err := m.ListMeta.MarshalTo(dAtA[i:]) + n139, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n137 + i += n139 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -6958,19 +7017,19 @@ func (m *PodTemplateSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n138, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n140, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n138 + i += n140 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n139, err := m.Spec.MarshalTo(dAtA[i:]) + n141, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n139 + i += n141 return i, nil } @@ -7050,19 +7109,19 @@ func (m *PreferAvoidPodsEntry) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodSignature.Size())) - n140, err := m.PodSignature.MarshalTo(dAtA[i:]) + n142, err := m.PodSignature.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n140 + i += n142 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.EvictionTime.Size())) - n141, err := m.EvictionTime.MarshalTo(dAtA[i:]) + n143, err := m.EvictionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n141 + i += n143 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -7095,11 +7154,11 @@ func (m *PreferredSchedulingTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Preference.Size())) - n142, err := m.Preference.MarshalTo(dAtA[i:]) + n144, err := m.Preference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n142 + i += n144 return i, nil } @@ -7121,11 +7180,11 @@ func (m *Probe) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Handler.Size())) - n143, err := m.Handler.MarshalTo(dAtA[i:]) + n145, err := m.Handler.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n143 + i += n145 dAtA[i] = 0x10 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.InitialDelaySeconds)) @@ -7275,11 +7334,11 @@ func (m *RBDVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n144, err := m.SecretRef.MarshalTo(dAtA[i:]) + n146, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n144 + i += n146 } dAtA[i] = 0x40 i++ @@ -7310,11 +7369,11 @@ func (m *RangeAllocation) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n145, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n147, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n145 + i += n147 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Range))) @@ -7346,27 +7405,27 @@ func (m *ReplicationController) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n146, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n146 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n147, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n147 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n148, err := m.Status.MarshalTo(dAtA[i:]) + n148, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n148 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n149, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n149 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n150, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n150 return i, nil } @@ -7396,11 +7455,11 @@ func (m *ReplicationControllerCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n149, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n151, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n149 + i += n151 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -7430,11 +7489,11 @@ func (m *ReplicationControllerList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n150, err := m.ListMeta.MarshalTo(dAtA[i:]) + n152, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n150 + i += n152 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -7496,11 +7555,11 @@ func (m *ReplicationControllerSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size())) - n151, err := m.Template.MarshalTo(dAtA[i:]) + n153, err := m.Template.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n151 + i += n153 } dAtA[i] = 0x20 i++ @@ -7579,11 +7638,11 @@ func (m *ResourceFieldSelector) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Divisor.Size())) - n152, err := m.Divisor.MarshalTo(dAtA[i:]) + n154, err := m.Divisor.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n152 + i += n154 return i, nil } @@ -7605,27 +7664,27 @@ func (m *ResourceQuota) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n153, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n153 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n154, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n154 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n155, err := m.Status.MarshalTo(dAtA[i:]) + n155, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n155 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n156, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n156 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n157, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n157 return i, nil } @@ -7647,11 +7706,11 @@ func (m *ResourceQuotaList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n156, err := m.ListMeta.MarshalTo(dAtA[i:]) + n158, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n156 + i += n158 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -7706,11 +7765,11 @@ func (m *ResourceQuotaSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n157, err := (&v).MarshalTo(dAtA[i:]) + n159, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n157 + i += n159 } } if len(m.Scopes) > 0 { @@ -7770,11 +7829,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n158, err := (&v).MarshalTo(dAtA[i:]) + n160, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n158 + i += n160 } } if len(m.Used) > 0 { @@ -7801,11 +7860,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n159, err := (&v).MarshalTo(dAtA[i:]) + n161, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n159 + i += n161 } } return i, nil @@ -7850,11 +7909,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n160, err := (&v).MarshalTo(dAtA[i:]) + n162, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n160 + i += n162 } } if len(m.Requests) > 0 { @@ -7881,11 +7940,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n161, err := (&v).MarshalTo(dAtA[i:]) + n163, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n161 + i += n163 } } return i, nil @@ -7952,11 +8011,11 @@ func (m *ScaleIOVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n162, err := m.SecretRef.MarshalTo(dAtA[i:]) + n164, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n162 + i += n164 } dAtA[i] = 0x20 i++ @@ -8015,11 +8074,11 @@ func (m *Secret) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n163, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n165, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n163 + i += n165 if len(m.Data) > 0 { keysForData := make([]string, 0, len(m.Data)) for k := range m.Data { @@ -8095,11 +8154,11 @@ func (m *SecretEnvSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n164, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n166, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n164 + i += n166 if m.Optional != nil { dAtA[i] = 0x10 i++ @@ -8131,11 +8190,11 @@ func (m *SecretKeySelector) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n165, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n167, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n165 + i += n167 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) @@ -8171,11 +8230,11 @@ func (m *SecretList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n166, err := m.ListMeta.MarshalTo(dAtA[i:]) + n168, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n166 + i += n168 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8209,11 +8268,11 @@ func (m *SecretProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n167, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n169, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n167 + i += n169 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8307,11 +8366,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Capabilities.Size())) - n168, err := m.Capabilities.MarshalTo(dAtA[i:]) + n170, err := m.Capabilities.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n168 + i += n170 } if m.Privileged != nil { dAtA[i] = 0x10 @@ -8327,11 +8386,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size())) - n169, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) + n171, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n169 + i += n171 } if m.RunAsUser != nil { dAtA[i] = 0x20 @@ -8389,11 +8448,11 @@ func (m *SerializedReference) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Reference.Size())) - n170, err := m.Reference.MarshalTo(dAtA[i:]) + n172, err := m.Reference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n170 + i += n172 return i, nil } @@ -8415,27 +8474,27 @@ func (m *Service) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n171, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n171 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n172, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n172 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n173, err := m.Status.MarshalTo(dAtA[i:]) + n173, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n173 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n174, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n174 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n175, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n175 return i, nil } @@ -8457,11 +8516,11 @@ func (m *ServiceAccount) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n174, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n176, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n174 + i += n176 if len(m.Secrets) > 0 { for _, msg := range m.Secrets { dAtA[i] = 0x12 @@ -8517,11 +8576,11 @@ func (m *ServiceAccountList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n175, err := m.ListMeta.MarshalTo(dAtA[i:]) + n177, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n175 + i += n177 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8555,11 +8614,11 @@ func (m *ServiceList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n176, err := m.ListMeta.MarshalTo(dAtA[i:]) + n178, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n176 + i += n178 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8604,11 +8663,11 @@ func (m *ServicePort) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetPort.Size())) - n177, err := m.TargetPort.MarshalTo(dAtA[i:]) + n179, err := m.TargetPort.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n177 + i += n179 dAtA[i] = 0x28 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NodePort)) @@ -8743,6 +8802,14 @@ func (m *ServiceSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x60 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.HealthCheckNodePort)) + dAtA[i] = 0x68 + i++ + if m.PublishNotReadyAddresses { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ return i, nil } @@ -8764,11 +8831,11 @@ func (m *ServiceStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LoadBalancer.Size())) - n178, err := m.LoadBalancer.MarshalTo(dAtA[i:]) + n180, err := m.LoadBalancer.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n178 + i += n180 return i, nil } @@ -8811,11 +8878,11 @@ func (m *StorageOSPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n179, err := m.SecretRef.MarshalTo(dAtA[i:]) + n181, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n179 + i += n181 } return i, nil } @@ -8859,11 +8926,11 @@ func (m *StorageOSVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n180, err := m.SecretRef.MarshalTo(dAtA[i:]) + n182, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n180 + i += n182 } return i, nil } @@ -8912,11 +8979,11 @@ func (m *TCPSocketAction) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Port.Size())) - n181, err := m.Port.MarshalTo(dAtA[i:]) + n183, err := m.Port.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n181 + i += n183 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Host))) @@ -8954,11 +9021,11 @@ func (m *Taint) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TimeAdded.Size())) - n182, err := m.TimeAdded.MarshalTo(dAtA[i:]) + n184, err := m.TimeAdded.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n182 + i += n184 return i, nil } @@ -9023,11 +9090,11 @@ func (m *Volume) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VolumeSource.Size())) - n183, err := m.VolumeSource.MarshalTo(dAtA[i:]) + n185, err := m.VolumeSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n183 + i += n185 return i, nil } @@ -9088,31 +9155,31 @@ func (m *VolumeProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n184, err := m.Secret.MarshalTo(dAtA[i:]) + n186, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n184 + i += n186 } if m.DownwardAPI != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n185, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n187, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n185 + i += n187 } if m.ConfigMap != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n186, err := m.ConfigMap.MarshalTo(dAtA[i:]) + n188, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n186 + i += n188 } return i, nil } @@ -9136,163 +9203,163 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size())) - n187, err := m.HostPath.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n187 - } - if m.EmptyDir != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.EmptyDir.Size())) - n188, err := m.EmptyDir.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n188 - } - if m.GCEPersistentDisk != nil { - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) - n189, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) + n189, err := m.HostPath.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n189 } - if m.AWSElasticBlockStore != nil { - dAtA[i] = 0x22 + if m.EmptyDir != nil { + dAtA[i] = 0x12 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) - n190, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.EmptyDir.Size())) + n190, err := m.EmptyDir.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n190 } - if m.GitRepo != nil { - dAtA[i] = 0x2a + if m.GCEPersistentDisk != nil { + dAtA[i] = 0x1a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.GitRepo.Size())) - n191, err := m.GitRepo.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) + n191, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n191 } - if m.Secret != nil { - dAtA[i] = 0x32 + if m.AWSElasticBlockStore != nil { + dAtA[i] = 0x22 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n192, err := m.Secret.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) + n192, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n192 } - if m.NFS != nil { - dAtA[i] = 0x3a + if m.GitRepo != nil { + dAtA[i] = 0x2a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) - n193, err := m.NFS.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.GitRepo.Size())) + n193, err := m.GitRepo.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n193 } - if m.ISCSI != nil { - dAtA[i] = 0x42 + if m.Secret != nil { + dAtA[i] = 0x32 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) - n194, err := m.ISCSI.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) + n194, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n194 } - if m.Glusterfs != nil { - dAtA[i] = 0x4a + if m.NFS != nil { + dAtA[i] = 0x3a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) - n195, err := m.Glusterfs.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) + n195, err := m.NFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n195 } - if m.PersistentVolumeClaim != nil { - dAtA[i] = 0x52 + if m.ISCSI != nil { + dAtA[i] = 0x42 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeClaim.Size())) - n196, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) + n196, err := m.ISCSI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n196 } - if m.RBD != nil { - dAtA[i] = 0x5a + if m.Glusterfs != nil { + dAtA[i] = 0x4a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) - n197, err := m.RBD.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) + n197, err := m.Glusterfs.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n197 } - if m.FlexVolume != nil { - dAtA[i] = 0x62 + if m.PersistentVolumeClaim != nil { + dAtA[i] = 0x52 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) - n198, err := m.FlexVolume.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeClaim.Size())) + n198, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n198 } - if m.Cinder != nil { - dAtA[i] = 0x6a + if m.RBD != nil { + dAtA[i] = 0x5a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) - n199, err := m.Cinder.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) + n199, err := m.RBD.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n199 } - if m.CephFS != nil { - dAtA[i] = 0x72 + if m.FlexVolume != nil { + dAtA[i] = 0x62 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) - n200, err := m.CephFS.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) + n200, err := m.FlexVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n200 } - if m.Flocker != nil { - dAtA[i] = 0x7a + if m.Cinder != nil { + dAtA[i] = 0x6a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) - n201, err := m.Flocker.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) + n201, err := m.Cinder.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n201 } + if m.CephFS != nil { + dAtA[i] = 0x72 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) + n202, err := m.CephFS.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n202 + } + if m.Flocker != nil { + dAtA[i] = 0x7a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) + n203, err := m.Flocker.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n203 + } if m.DownwardAPI != nil { dAtA[i] = 0x82 i++ dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n202, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n204, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n202 + i += n204 } if m.FC != nil { dAtA[i] = 0x8a @@ -9300,11 +9367,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size())) - n203, err := m.FC.MarshalTo(dAtA[i:]) + n205, err := m.FC.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n203 + i += n205 } if m.AzureFile != nil { dAtA[i] = 0x92 @@ -9312,11 +9379,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size())) - n204, err := m.AzureFile.MarshalTo(dAtA[i:]) + n206, err := m.AzureFile.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n204 + i += n206 } if m.ConfigMap != nil { dAtA[i] = 0x9a @@ -9324,11 +9391,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n205, err := m.ConfigMap.MarshalTo(dAtA[i:]) + n207, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n205 + i += n207 } if m.VsphereVolume != nil { dAtA[i] = 0xa2 @@ -9336,11 +9403,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size())) - n206, err := m.VsphereVolume.MarshalTo(dAtA[i:]) + n208, err := m.VsphereVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n206 + i += n208 } if m.Quobyte != nil { dAtA[i] = 0xaa @@ -9348,11 +9415,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size())) - n207, err := m.Quobyte.MarshalTo(dAtA[i:]) + n209, err := m.Quobyte.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n207 + i += n209 } if m.AzureDisk != nil { dAtA[i] = 0xb2 @@ -9360,11 +9427,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size())) - n208, err := m.AzureDisk.MarshalTo(dAtA[i:]) + n210, err := m.AzureDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n208 + i += n210 } if m.PhotonPersistentDisk != nil { dAtA[i] = 0xba @@ -9372,11 +9439,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PhotonPersistentDisk.Size())) - n209, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) + n211, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n209 + i += n211 } if m.PortworxVolume != nil { dAtA[i] = 0xc2 @@ -9384,11 +9451,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PortworxVolume.Size())) - n210, err := m.PortworxVolume.MarshalTo(dAtA[i:]) + n212, err := m.PortworxVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n210 + i += n212 } if m.ScaleIO != nil { dAtA[i] = 0xca @@ -9396,11 +9463,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleIO.Size())) - n211, err := m.ScaleIO.MarshalTo(dAtA[i:]) + n213, err := m.ScaleIO.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n211 + i += n213 } if m.Projected != nil { dAtA[i] = 0xd2 @@ -9408,11 +9475,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Projected.Size())) - n212, err := m.Projected.MarshalTo(dAtA[i:]) + n214, err := m.Projected.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n212 + i += n214 } if m.StorageOS != nil { dAtA[i] = 0xda @@ -9420,11 +9487,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StorageOS.Size())) - n213, err := m.StorageOS.MarshalTo(dAtA[i:]) + n215, err := m.StorageOS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n213 + i += n215 } return i, nil } @@ -9484,11 +9551,11 @@ func (m *WeightedPodAffinityTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodAffinityTerm.Size())) - n214, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) + n216, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n214 + i += n216 return i, nil } @@ -10268,6 +10335,12 @@ func (m *FCVolumeSource) Size() (n int) { l = len(m.FSType) n += 1 + l + sovGenerated(uint64(l)) n += 2 + if len(m.WWIDs) > 0 { + for _, s := range m.WWIDs { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -10735,6 +10808,16 @@ func (m *NodeCondition) Size() (n int) { return n } +func (m *NodeConfigSource) Size() (n int) { + var l int + _ = l + if m.ConfigMapRef != nil { + l = m.ConfigMapRef.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *NodeDaemonEndpoints) Size() (n int) { var l int _ = l @@ -10836,6 +10919,10 @@ func (m *NodeSpec) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if m.ConfigSource != nil { + l = m.ConfigSource.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -12273,6 +12360,7 @@ func (m *ServiceSpec) Size() (n int) { l = len(m.ExternalTrafficPolicy) n += 1 + l + sovGenerated(uint64(l)) n += 1 + sovGenerated(uint64(m.HealthCheckNodePort)) + n += 2 return n } @@ -13140,6 +13228,7 @@ func (this *FCVolumeSource) String() string { `Lun:` + valueToStringGenerated(this.Lun) + `,`, `FSType:` + fmt.Sprintf("%v", this.FSType) + `,`, `ReadOnly:` + fmt.Sprintf("%v", this.ReadOnly) + `,`, + `WWIDs:` + fmt.Sprintf("%v", this.WWIDs) + `,`, `}`, }, "") return s @@ -13584,6 +13673,16 @@ func (this *NodeCondition) String() string { }, "") return s } +func (this *NodeConfigSource) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&NodeConfigSource{`, + `ConfigMapRef:` + strings.Replace(fmt.Sprintf("%v", this.ConfigMapRef), "ObjectReference", "ObjectReference", 1) + `,`, + `}`, + }, "") + return s +} func (this *NodeDaemonEndpoints) String() string { if this == nil { return "nil" @@ -13677,6 +13776,7 @@ func (this *NodeSpec) String() string { `ProviderID:` + fmt.Sprintf("%v", this.ProviderID) + `,`, `Unschedulable:` + fmt.Sprintf("%v", this.Unschedulable) + `,`, `Taints:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Taints), "Taint", "Taint", 1), `&`, ``, 1) + `,`, + `ConfigSource:` + strings.Replace(fmt.Sprintf("%v", this.ConfigSource), "NodeConfigSource", "NodeConfigSource", 1) + `,`, `}`, }, "") return s @@ -14806,6 +14906,7 @@ func (this *ServiceSpec) String() string { `ExternalName:` + fmt.Sprintf("%v", this.ExternalName) + `,`, `ExternalTrafficPolicy:` + fmt.Sprintf("%v", this.ExternalTrafficPolicy) + `,`, `HealthCheckNodePort:` + fmt.Sprintf("%v", this.HealthCheckNodePort) + `,`, + `PublishNotReadyAddresses:` + fmt.Sprintf("%v", this.PublishNotReadyAddresses) + `,`, `}`, }, "") return s @@ -21887,6 +21988,35 @@ func (m *FCVolumeSource) Unmarshal(dAtA []byte) error { } } m.ReadOnly = bool(v != 0) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WWIDs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.WWIDs = append(m.WWIDs, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -26664,6 +26794,89 @@ func (m *NodeCondition) Unmarshal(dAtA []byte) error { } return nil } +func (m *NodeConfigSource) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: NodeConfigSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NodeConfigSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigMapRef", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ConfigMapRef == nil { + m.ConfigMapRef = &ObjectReference{} + } + if err := m.ConfigMapRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *NodeDaemonEndpoints) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -27571,6 +27784,39 @@ func (m *NodeSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigSource", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ConfigSource == nil { + m.ConfigSource = &NodeConfigSource{} + } + if err := m.ConfigSource.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -41713,6 +41959,26 @@ func (m *ServiceSpec) Unmarshal(dAtA []byte) error { break } } + case 13: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PublishNotReadyAddresses", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.PublishNotReadyAddresses = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -44495,720 +44761,726 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 11428 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x5b, 0x70, 0x24, 0xd7, - 0x75, 0x98, 0x7a, 0x06, 0xaf, 0x39, 0x78, 0xdf, 0x7d, 0x70, 0x16, 0x24, 0x17, 0xcb, 0xa6, 0x44, - 0x2e, 0x5f, 0x80, 0xb8, 0x24, 0x25, 0x4a, 0xa4, 0x28, 0x01, 0x18, 0x60, 0x17, 0xdc, 0xc5, 0xee, - 0xf0, 0x0e, 0x76, 0x69, 0x51, 0x34, 0xad, 0xde, 0xe9, 0x0b, 0xa0, 0x89, 0x46, 0xf7, 0xb0, 0xbb, - 0x07, 0xbb, 0x60, 0x59, 0x55, 0x89, 0x22, 0x2b, 0x0f, 0xf9, 0xc3, 0x95, 0x72, 0x25, 0x8e, 0xa5, - 0x38, 0x55, 0x79, 0x94, 0xad, 0x28, 0x49, 0xd9, 0x91, 0xe3, 0x87, 0xe4, 0x54, 0x12, 0xe7, 0x51, - 0xd2, 0x8f, 0x63, 0x7f, 0xa4, 0xa4, 0xaa, 0x54, 0x60, 0x0b, 0xaa, 0x4a, 0x2a, 0x1f, 0x49, 0xe5, - 0xf5, 0x13, 0xc4, 0x89, 0x52, 0xf7, 0xd9, 0xf7, 0xf6, 0x74, 0xcf, 0x0c, 0x96, 0x58, 0x90, 0x52, - 0xf9, 0x6f, 0xe6, 0x9c, 0x73, 0xcf, 0xbd, 0x7d, 0x1f, 0xe7, 0x9e, 0x73, 0xee, 0xb9, 0xe7, 0xc2, - 0x4b, 0xdb, 0x2f, 0xc6, 0x73, 0x5e, 0x38, 0xbf, 0xdd, 0xbe, 0x4d, 0xa2, 0x80, 0x24, 0x24, 0x9e, - 0xdf, 0x25, 0x81, 0x1b, 0x46, 0xf3, 0x02, 0xe1, 0xb4, 0xbc, 0xf9, 0x66, 0x18, 0x91, 0xf9, 0xdd, - 0x67, 0xe7, 0x37, 0x49, 0x40, 0x22, 0x27, 0x21, 0xee, 0x5c, 0x2b, 0x0a, 0x93, 0x10, 0x21, 0x4e, - 0x33, 0xe7, 0xb4, 0xbc, 0x39, 0x4a, 0x33, 0xb7, 0xfb, 0xec, 0xcc, 0x33, 0x9b, 0x5e, 0xb2, 0xd5, - 0xbe, 0x3d, 0xd7, 0x0c, 0x77, 0xe6, 0x37, 0xc3, 0xcd, 0x70, 0x9e, 0x91, 0xde, 0x6e, 0x6f, 0xb0, - 0x7f, 0xec, 0x0f, 0xfb, 0xc5, 0x59, 0xcc, 0x3c, 0x9f, 0x56, 0xb3, 0xe3, 0x34, 0xb7, 0xbc, 0x80, - 0x44, 0x7b, 0xf3, 0xad, 0xed, 0x4d, 0x56, 0x6f, 0x44, 0xe2, 0xb0, 0x1d, 0x35, 0x49, 0xb6, 0xe2, - 0xae, 0xa5, 0xe2, 0xf9, 0x1d, 0x92, 0x38, 0x39, 0xcd, 0x9d, 0x99, 0x2f, 0x2a, 0x15, 0xb5, 0x83, - 0xc4, 0xdb, 0xe9, 0xac, 0xe6, 0x63, 0xbd, 0x0a, 0xc4, 0xcd, 0x2d, 0xb2, 0xe3, 0x74, 0x94, 0x7b, - 0xae, 0xa8, 0x5c, 0x3b, 0xf1, 0xfc, 0x79, 0x2f, 0x48, 0xe2, 0x24, 0xca, 0x16, 0xb2, 0xbf, 0x67, - 0xc1, 0x85, 0x85, 0xd7, 0x1b, 0xcb, 0xbe, 0x13, 0x27, 0x5e, 0x73, 0xd1, 0x0f, 0x9b, 0xdb, 0x8d, - 0x24, 0x8c, 0xc8, 0xad, 0xd0, 0x6f, 0xef, 0x90, 0x06, 0xeb, 0x08, 0xf4, 0x34, 0x8c, 0xec, 0xb2, - 0xff, 0xab, 0xb5, 0xaa, 0x75, 0xc1, 0xba, 0x58, 0x59, 0x9c, 0xfa, 0xce, 0xfe, 0xec, 0x87, 0x0e, - 0xf6, 0x67, 0x47, 0x6e, 0x09, 0x38, 0x56, 0x14, 0xe8, 0x31, 0x18, 0xda, 0x88, 0xd7, 0xf7, 0x5a, - 0xa4, 0x5a, 0x62, 0xb4, 0x13, 0x82, 0x76, 0x68, 0xa5, 0x41, 0xa1, 0x58, 0x60, 0xd1, 0x3c, 0x54, - 0x5a, 0x4e, 0x94, 0x78, 0x89, 0x17, 0x06, 0xd5, 0xf2, 0x05, 0xeb, 0xe2, 0xe0, 0xe2, 0xb4, 0x20, - 0xad, 0xd4, 0x25, 0x02, 0xa7, 0x34, 0xb4, 0x19, 0x11, 0x71, 0xdc, 0x1b, 0x81, 0xbf, 0x57, 0x1d, - 0xb8, 0x60, 0x5d, 0x1c, 0x49, 0x9b, 0x81, 0x05, 0x1c, 0x2b, 0x0a, 0xfb, 0x97, 0x4b, 0x30, 0xb2, - 0xb0, 0xb1, 0xe1, 0x05, 0x5e, 0xb2, 0x87, 0x6e, 0xc1, 0x58, 0x10, 0xba, 0x44, 0xfe, 0x67, 0x5f, - 0x31, 0x7a, 0xe9, 0xc2, 0x5c, 0xe7, 0x54, 0x9a, 0xbb, 0xae, 0xd1, 0x2d, 0x4e, 0x1d, 0xec, 0xcf, - 0x8e, 0xe9, 0x10, 0x6c, 0xf0, 0x41, 0x18, 0x46, 0x5b, 0xa1, 0xab, 0xd8, 0x96, 0x18, 0xdb, 0xd9, - 0x3c, 0xb6, 0xf5, 0x94, 0x6c, 0x71, 0xf2, 0x60, 0x7f, 0x76, 0x54, 0x03, 0x60, 0x9d, 0x09, 0xba, - 0x0d, 0x93, 0xf4, 0x6f, 0x90, 0x78, 0x8a, 0x6f, 0x99, 0xf1, 0x7d, 0xb4, 0x88, 0xaf, 0x46, 0xba, - 0x78, 0xea, 0x60, 0x7f, 0x76, 0x32, 0x03, 0xc4, 0x59, 0x86, 0xf6, 0xbb, 0x30, 0xb1, 0x90, 0x24, - 0x4e, 0x73, 0x8b, 0xb8, 0x7c, 0x04, 0xd1, 0xf3, 0x30, 0x10, 0x38, 0x3b, 0x44, 0x8c, 0xef, 0x05, - 0xd1, 0xb1, 0x03, 0xd7, 0x9d, 0x1d, 0x72, 0xb8, 0x3f, 0x3b, 0x75, 0x33, 0xf0, 0xde, 0x69, 0x8b, - 0x59, 0x41, 0x61, 0x98, 0x51, 0xa3, 0x4b, 0x00, 0x2e, 0xd9, 0xf5, 0x9a, 0xa4, 0xee, 0x24, 0x5b, - 0x62, 0xbc, 0x91, 0x28, 0x0b, 0x35, 0x85, 0xc1, 0x1a, 0x95, 0x7d, 0x17, 0x2a, 0x0b, 0xbb, 0xa1, - 0xe7, 0xd6, 0x43, 0x37, 0x46, 0xdb, 0x30, 0xd9, 0x8a, 0xc8, 0x06, 0x89, 0x14, 0xa8, 0x6a, 0x5d, - 0x28, 0x5f, 0x1c, 0xbd, 0x74, 0x31, 0xf7, 0x63, 0x4d, 0xd2, 0xe5, 0x20, 0x89, 0xf6, 0x16, 0x1f, - 0x10, 0xf5, 0x4d, 0x66, 0xb0, 0x38, 0xcb, 0xd9, 0xfe, 0x57, 0x25, 0x38, 0xb3, 0xf0, 0x6e, 0x3b, - 0x22, 0x35, 0x2f, 0xde, 0xce, 0xce, 0x70, 0xd7, 0x8b, 0xb7, 0xaf, 0xa7, 0x3d, 0xa0, 0xa6, 0x56, - 0x4d, 0xc0, 0xb1, 0xa2, 0x40, 0xcf, 0xc0, 0x30, 0xfd, 0x7d, 0x13, 0xaf, 0x8a, 0x4f, 0x3e, 0x25, - 0x88, 0x47, 0x6b, 0x4e, 0xe2, 0xd4, 0x38, 0x0a, 0x4b, 0x1a, 0xb4, 0x06, 0xa3, 0x4d, 0xb6, 0x20, - 0x37, 0xd7, 0x42, 0x97, 0xb0, 0xc1, 0xac, 0x2c, 0x3e, 0x45, 0xc9, 0x97, 0x52, 0xf0, 0xe1, 0xfe, - 0x6c, 0x95, 0xb7, 0x4d, 0xb0, 0xd0, 0x70, 0x58, 0x2f, 0x8f, 0x6c, 0xb5, 0xbe, 0x06, 0x18, 0x27, - 0xc8, 0x59, 0x5b, 0x17, 0xb5, 0xa5, 0x32, 0xc8, 0x96, 0xca, 0x58, 0xfe, 0x32, 0x41, 0xcf, 0xc2, - 0xc0, 0xb6, 0x17, 0xb8, 0xd5, 0x21, 0xc6, 0xeb, 0x61, 0x3a, 0xe6, 0x57, 0xbd, 0xc0, 0x3d, 0xdc, - 0x9f, 0x9d, 0x36, 0x9a, 0x43, 0x81, 0x98, 0x91, 0xda, 0x7f, 0xdf, 0x12, 0xdd, 0xb8, 0xe2, 0xf9, - 0xa6, 0xa0, 0xb8, 0x04, 0x10, 0x93, 0x66, 0x44, 0x12, 0xad, 0x23, 0xd5, 0x74, 0x68, 0x28, 0x0c, - 0xd6, 0xa8, 0xa8, 0x18, 0x88, 0xb7, 0x9c, 0x88, 0xcd, 0x2a, 0xd1, 0x9d, 0x4a, 0x0c, 0x34, 0x24, - 0x02, 0xa7, 0x34, 0x86, 0x18, 0x28, 0xf7, 0x14, 0x03, 0xbf, 0x63, 0xc1, 0xf0, 0xa2, 0x17, 0xb8, - 0x5e, 0xb0, 0x89, 0x3e, 0x0f, 0x23, 0x54, 0x4a, 0xbb, 0x4e, 0xe2, 0x08, 0x09, 0xf0, 0x51, 0x6d, - 0x96, 0x29, 0xa1, 0x39, 0xd7, 0xda, 0xde, 0xa4, 0x80, 0x78, 0x8e, 0x52, 0xd3, 0x79, 0x77, 0xe3, - 0xf6, 0xdb, 0xa4, 0x99, 0xac, 0x91, 0xc4, 0x49, 0x3f, 0x27, 0x85, 0x61, 0xc5, 0x15, 0x5d, 0x85, - 0xa1, 0xc4, 0x89, 0x36, 0x49, 0x22, 0x44, 0x41, 0xee, 0x92, 0xe5, 0x25, 0x31, 0x9d, 0x9b, 0x24, - 0x68, 0x92, 0x54, 0x40, 0xae, 0xb3, 0xa2, 0x58, 0xb0, 0xb0, 0x9b, 0x30, 0xb6, 0xe4, 0xb4, 0x9c, - 0xdb, 0x9e, 0xef, 0x25, 0x1e, 0x89, 0xd1, 0xe3, 0x50, 0x76, 0x5c, 0x97, 0xad, 0x8f, 0xca, 0xe2, - 0x99, 0x83, 0xfd, 0xd9, 0xf2, 0x82, 0x4b, 0x07, 0x0a, 0x14, 0xd5, 0x1e, 0xa6, 0x14, 0xe8, 0x49, - 0x18, 0x70, 0xa3, 0xb0, 0x55, 0x2d, 0x31, 0xca, 0xb3, 0x74, 0x4c, 0x6b, 0x51, 0xd8, 0xca, 0x90, - 0x32, 0x1a, 0xfb, 0xdb, 0x25, 0x40, 0x4b, 0xa4, 0xb5, 0xb5, 0xd2, 0x30, 0x46, 0xf2, 0x22, 0x8c, - 0xec, 0x84, 0x81, 0x97, 0x84, 0x51, 0x2c, 0x2a, 0x64, 0x13, 0x68, 0x4d, 0xc0, 0xb0, 0xc2, 0xa2, - 0x0b, 0x30, 0xd0, 0x4a, 0x17, 0xff, 0x98, 0x14, 0x1c, 0x6c, 0xd9, 0x33, 0x0c, 0xa5, 0x68, 0xc7, - 0x24, 0x12, 0x13, 0x5f, 0x51, 0xdc, 0x8c, 0x49, 0x84, 0x19, 0x26, 0x9d, 0x37, 0x74, 0x46, 0x89, - 0x69, 0x9d, 0x99, 0x37, 0x14, 0x83, 0x35, 0x2a, 0x74, 0x13, 0x2a, 0xfc, 0x1f, 0x26, 0x1b, 0x6c, - 0x8e, 0x17, 0xc8, 0x8c, 0x6b, 0x61, 0xd3, 0xf1, 0xb3, 0x5d, 0x3e, 0xce, 0x66, 0x97, 0x2c, 0x8e, - 0x53, 0x4e, 0xc6, 0xec, 0x1a, 0xea, 0x39, 0xbb, 0x7e, 0xc9, 0x02, 0xb4, 0xe4, 0x05, 0x2e, 0x89, - 0x4e, 0x60, 0xc3, 0x3c, 0xda, 0xc4, 0xff, 0xf7, 0xb4, 0x69, 0xe1, 0x4e, 0x2b, 0x0c, 0x48, 0x90, - 0x2c, 0x85, 0x81, 0xcb, 0x37, 0xd1, 0x4f, 0xc2, 0x40, 0x42, 0xab, 0xe2, 0xcd, 0x7a, 0x4c, 0x0e, - 0x06, 0xad, 0xe0, 0x70, 0x7f, 0xf6, 0x6c, 0x67, 0x09, 0xd6, 0x04, 0x56, 0x06, 0x7d, 0x02, 0x86, - 0xe2, 0xc4, 0x49, 0xda, 0xb1, 0x68, 0xe8, 0x23, 0xb2, 0xa1, 0x0d, 0x06, 0x3d, 0xdc, 0x9f, 0x9d, - 0x54, 0xc5, 0x38, 0x08, 0x8b, 0x02, 0xe8, 0x09, 0x18, 0xde, 0x21, 0x71, 0xec, 0x6c, 0x4a, 0xf9, - 0x37, 0x29, 0xca, 0x0e, 0xaf, 0x71, 0x30, 0x96, 0x78, 0xf4, 0x28, 0x0c, 0x92, 0x28, 0x0a, 0x23, - 0x31, 0x0f, 0xc6, 0x05, 0xe1, 0xe0, 0x32, 0x05, 0x62, 0x8e, 0xb3, 0xff, 0xad, 0x05, 0x93, 0xaa, - 0xad, 0xbc, 0xae, 0x13, 0x58, 0xde, 0x6f, 0x00, 0x34, 0xe5, 0x07, 0xc6, 0x6c, 0x79, 0x8d, 0x5e, - 0x7a, 0x2c, 0x6f, 0xd2, 0x75, 0x76, 0x63, 0xca, 0x59, 0x81, 0x62, 0xac, 0x71, 0xb3, 0xff, 0xa9, - 0x05, 0xa7, 0x32, 0x5f, 0x74, 0xcd, 0x8b, 0x13, 0xf4, 0x66, 0xc7, 0x57, 0xcd, 0xf5, 0xf7, 0x55, - 0xb4, 0x34, 0xfb, 0x26, 0x35, 0x4b, 0x24, 0x44, 0xfb, 0xa2, 0x2b, 0x30, 0xe8, 0x25, 0x64, 0x47, - 0x7e, 0xcc, 0xa3, 0x5d, 0x3f, 0x86, 0xb7, 0x2a, 0x1d, 0x91, 0x55, 0x5a, 0x12, 0x73, 0x06, 0xf6, - 0x7f, 0xb7, 0xa0, 0xb2, 0x14, 0x06, 0x1b, 0xde, 0xe6, 0x9a, 0xd3, 0x3a, 0x81, 0xb1, 0x58, 0x85, - 0x01, 0xc6, 0x9d, 0x37, 0xfc, 0xf1, 0xfc, 0x86, 0x8b, 0xe6, 0xcc, 0xd1, 0x5d, 0x8c, 0x6b, 0x0b, - 0x4a, 0xfc, 0x50, 0x10, 0x66, 0x2c, 0x66, 0x3e, 0x0e, 0x15, 0x45, 0x80, 0xa6, 0xa0, 0xbc, 0x4d, - 0xb8, 0x86, 0x58, 0xc1, 0xf4, 0x27, 0x3a, 0x0d, 0x83, 0xbb, 0x8e, 0xdf, 0x16, 0xcb, 0x13, 0xf3, - 0x3f, 0x9f, 0x2c, 0xbd, 0x68, 0xd9, 0xdf, 0x62, 0x6b, 0x4c, 0x54, 0xb2, 0x1c, 0xec, 0x8a, 0xe5, - 0xff, 0x2e, 0x9c, 0xf6, 0x73, 0xa4, 0x8e, 0xe8, 0x88, 0xfe, 0xa5, 0xd4, 0x43, 0xa2, 0xad, 0xa7, - 0xf3, 0xb0, 0x38, 0xb7, 0x0e, 0x2a, 0xb8, 0xc3, 0x16, 0x9d, 0x51, 0x8e, 0xcf, 0xda, 0x2b, 0x76, - 0xfe, 0x1b, 0x02, 0x86, 0x15, 0x96, 0x0a, 0x88, 0xd3, 0xaa, 0xf1, 0x57, 0xc9, 0x5e, 0x83, 0xf8, - 0xa4, 0x99, 0x84, 0xd1, 0xfb, 0xda, 0xfc, 0x87, 0x79, 0xef, 0x73, 0xf9, 0x32, 0x2a, 0x18, 0x94, - 0xaf, 0x92, 0x3d, 0x3e, 0x14, 0xfa, 0xd7, 0x95, 0xbb, 0x7e, 0xdd, 0x6f, 0x58, 0x30, 0xae, 0xbe, - 0xee, 0x04, 0x16, 0xd2, 0xa2, 0xb9, 0x90, 0x1e, 0xee, 0x3a, 0x1f, 0x0b, 0x96, 0xd0, 0x8f, 0x98, - 0x08, 0x10, 0x34, 0xf5, 0x28, 0xa4, 0x5d, 0x43, 0x65, 0xf6, 0xfb, 0x39, 0x20, 0xfd, 0x7c, 0xd7, - 0x55, 0xb2, 0xb7, 0x1e, 0xd2, 0x0d, 0x3f, 0xff, 0xbb, 0x8c, 0x51, 0x1b, 0xe8, 0x3a, 0x6a, 0xbf, - 0x59, 0x82, 0x33, 0xaa, 0x07, 0x8c, 0x2d, 0xf5, 0xc7, 0xbd, 0x0f, 0x9e, 0x85, 0x51, 0x97, 0x6c, - 0x38, 0x6d, 0x3f, 0x51, 0x46, 0xc0, 0x20, 0x37, 0x04, 0x6b, 0x29, 0x18, 0xeb, 0x34, 0x47, 0xe8, - 0xb6, 0x7f, 0x0d, 0x4c, 0xf6, 0x26, 0x0e, 0x9d, 0xc1, 0x54, 0xdf, 0xd2, 0x4c, 0xb9, 0x31, 0xdd, - 0x94, 0x13, 0x66, 0xdb, 0xa3, 0x30, 0xe8, 0xed, 0xd0, 0xbd, 0xb8, 0x64, 0x6e, 0xb1, 0xab, 0x14, - 0x88, 0x39, 0x0e, 0x7d, 0x04, 0x86, 0x9b, 0xe1, 0xce, 0x8e, 0x13, 0xb8, 0xd5, 0x32, 0xd3, 0x00, - 0x47, 0xe9, 0x76, 0xbd, 0xc4, 0x41, 0x58, 0xe2, 0xd0, 0x43, 0x30, 0xe0, 0x44, 0x9b, 0x71, 0x75, - 0x80, 0xd1, 0x8c, 0xd0, 0x9a, 0x16, 0xa2, 0xcd, 0x18, 0x33, 0x28, 0xd5, 0xec, 0xee, 0x84, 0xd1, - 0xb6, 0x17, 0x6c, 0xd6, 0xbc, 0x88, 0xa9, 0x69, 0x9a, 0x66, 0xf7, 0xba, 0xc2, 0x60, 0x8d, 0x0a, - 0xad, 0xc0, 0x60, 0x2b, 0x8c, 0x92, 0xb8, 0x3a, 0xc4, 0xba, 0xfb, 0x91, 0x82, 0xa5, 0xc4, 0xbf, - 0xb6, 0x1e, 0x46, 0x49, 0xfa, 0x01, 0xf4, 0x5f, 0x8c, 0x79, 0x71, 0xf4, 0x09, 0x28, 0x93, 0x60, - 0xb7, 0x3a, 0xcc, 0xb8, 0xcc, 0xe4, 0x71, 0x59, 0x0e, 0x76, 0x6f, 0x39, 0x51, 0x2a, 0x67, 0x96, - 0x83, 0x5d, 0x4c, 0xcb, 0xa0, 0xcf, 0x42, 0x45, 0xba, 0x81, 0xe2, 0xea, 0x48, 0xf1, 0x14, 0xc3, - 0x82, 0x08, 0x93, 0x77, 0xda, 0x5e, 0x44, 0x76, 0x48, 0x90, 0xc4, 0xa9, 0xf9, 0x22, 0xb1, 0x31, - 0x4e, 0xb9, 0xa1, 0xcf, 0xc2, 0x18, 0xd7, 0xfc, 0xd6, 0xc2, 0x76, 0x90, 0xc4, 0xd5, 0x0a, 0x6b, - 0x5e, 0xae, 0xcf, 0xe0, 0x56, 0x4a, 0xb7, 0x78, 0x5a, 0x30, 0x1d, 0xd3, 0x80, 0x31, 0x36, 0x58, - 0x21, 0x0c, 0xe3, 0xbe, 0xb7, 0x4b, 0x02, 0x12, 0xc7, 0xf5, 0x28, 0xbc, 0x4d, 0xaa, 0xc0, 0x5a, - 0x7e, 0x2e, 0xdf, 0x94, 0x0e, 0x6f, 0x93, 0xc5, 0xe9, 0x83, 0xfd, 0xd9, 0xf1, 0x6b, 0x7a, 0x19, - 0x6c, 0xb2, 0x40, 0x37, 0x61, 0x82, 0xaa, 0x94, 0x5e, 0xca, 0x74, 0xb4, 0x17, 0x53, 0x74, 0xb0, - 0x3f, 0x3b, 0x81, 0x8d, 0x42, 0x38, 0xc3, 0x04, 0xbd, 0x0a, 0x15, 0xdf, 0xdb, 0x20, 0xcd, 0xbd, - 0xa6, 0x4f, 0xaa, 0x63, 0x8c, 0x63, 0xee, 0xb2, 0xba, 0x26, 0x89, 0xb8, 0xca, 0xae, 0xfe, 0xe2, - 0xb4, 0x38, 0xba, 0x05, 0x67, 0x13, 0x12, 0xed, 0x78, 0x81, 0x43, 0x97, 0x83, 0xd0, 0x27, 0x99, - 0x43, 0x62, 0x9c, 0xcd, 0xb7, 0xf3, 0xa2, 0xeb, 0xce, 0xae, 0xe7, 0x52, 0xe1, 0x82, 0xd2, 0xe8, - 0x06, 0x4c, 0xb2, 0x95, 0x50, 0x6f, 0xfb, 0x7e, 0x3d, 0xf4, 0xbd, 0xe6, 0x5e, 0x75, 0x82, 0x31, - 0xfc, 0x88, 0xf4, 0x38, 0xac, 0x9a, 0x68, 0x6a, 0x60, 0xa5, 0xff, 0x70, 0xb6, 0x34, 0xba, 0x0d, - 0x93, 0x31, 0x69, 0xb6, 0x23, 0x2f, 0xd9, 0xa3, 0xf3, 0x97, 0xdc, 0x4d, 0xaa, 0x93, 0xc5, 0x66, - 0x62, 0xc3, 0x24, 0xe5, 0x9e, 0x9d, 0x0c, 0x10, 0x67, 0x19, 0xd2, 0xa5, 0x1d, 0x27, 0xae, 0x17, - 0x54, 0xa7, 0x98, 0xc4, 0x50, 0x2b, 0xa3, 0x41, 0x81, 0x98, 0xe3, 0x98, 0xcd, 0x4d, 0x7f, 0xdc, - 0xa0, 0x12, 0x74, 0x9a, 0x11, 0xa6, 0x36, 0xb7, 0x44, 0xe0, 0x94, 0x86, 0x6e, 0xcb, 0x49, 0xb2, - 0x57, 0x45, 0x8c, 0x54, 0x2d, 0x97, 0xf5, 0xf5, 0xcf, 0x62, 0x0a, 0x47, 0xd7, 0x60, 0x98, 0x04, - 0xbb, 0x2b, 0x51, 0xb8, 0x53, 0x3d, 0x55, 0xbc, 0x66, 0x97, 0x39, 0x09, 0x17, 0xe8, 0xa9, 0x01, - 0x20, 0xc0, 0x58, 0xb2, 0x40, 0x77, 0xa1, 0x9a, 0x33, 0x22, 0x7c, 0x00, 0x4e, 0xb3, 0x01, 0x78, - 0x59, 0x94, 0xad, 0xae, 0x17, 0xd0, 0x1d, 0x76, 0xc1, 0xe1, 0x42, 0xee, 0xf6, 0x6d, 0x98, 0x50, - 0x82, 0x85, 0x8d, 0x2d, 0x9a, 0x85, 0x41, 0x2a, 0x31, 0xa5, 0x11, 0x5c, 0xa1, 0x5d, 0x49, 0x05, - 0x69, 0x8c, 0x39, 0x9c, 0x75, 0xa5, 0xf7, 0x2e, 0x59, 0xdc, 0x4b, 0x08, 0x37, 0x8b, 0xca, 0x5a, - 0x57, 0x4a, 0x04, 0x4e, 0x69, 0xec, 0xff, 0xc7, 0x15, 0x93, 0x54, 0x7a, 0xf5, 0x21, 0xaf, 0x9f, - 0x86, 0x91, 0xad, 0x30, 0x4e, 0x28, 0x35, 0xab, 0x63, 0x30, 0x55, 0x45, 0xae, 0x08, 0x38, 0x56, - 0x14, 0xe8, 0x25, 0x18, 0x6f, 0xea, 0x15, 0x88, 0xcd, 0xe6, 0x8c, 0x28, 0x62, 0xd6, 0x8e, 0x4d, - 0x5a, 0xf4, 0x22, 0x8c, 0x30, 0xcf, 0x70, 0x33, 0xf4, 0x85, 0x01, 0x26, 0x77, 0xcc, 0x91, 0xba, - 0x80, 0x1f, 0x6a, 0xbf, 0xb1, 0xa2, 0xa6, 0x66, 0x2c, 0x6d, 0xc2, 0x6a, 0x5d, 0x88, 0x79, 0x65, - 0xc6, 0x5e, 0x61, 0x50, 0x2c, 0xb0, 0xf6, 0x5f, 0x2d, 0x69, 0xbd, 0x4c, 0x4d, 0x0a, 0x82, 0xea, - 0x30, 0x7c, 0xc7, 0xf1, 0x12, 0x2f, 0xd8, 0x14, 0xfb, 0xf9, 0x13, 0x5d, 0x65, 0x3e, 0x2b, 0xf4, - 0x3a, 0x2f, 0xc0, 0x77, 0x25, 0xf1, 0x07, 0x4b, 0x36, 0x94, 0x63, 0xd4, 0x0e, 0x02, 0xca, 0xb1, - 0xd4, 0x2f, 0x47, 0xcc, 0x0b, 0x70, 0x8e, 0xe2, 0x0f, 0x96, 0x6c, 0xd0, 0x9b, 0x00, 0x72, 0xde, - 0x10, 0x57, 0x78, 0x64, 0x9f, 0xee, 0xcd, 0x74, 0x5d, 0x95, 0x59, 0x9c, 0xa0, 0x7b, 0x5e, 0xfa, - 0x1f, 0x6b, 0xfc, 0xec, 0x84, 0xe9, 0x3d, 0x9d, 0x8d, 0x41, 0x9f, 0xa3, 0x4b, 0xd5, 0x89, 0x12, - 0xe2, 0x2e, 0x24, 0xa2, 0x73, 0x9e, 0xec, 0x4f, 0x6d, 0x5d, 0xf7, 0x76, 0x88, 0xbe, 0xac, 0x05, - 0x13, 0x9c, 0xf2, 0xb3, 0x7f, 0xbb, 0x0c, 0xd5, 0xa2, 0xe6, 0xd2, 0x49, 0x47, 0xee, 0x7a, 0xc9, - 0x12, 0x55, 0x57, 0x2c, 0x73, 0xd2, 0x2d, 0x0b, 0x38, 0x56, 0x14, 0x74, 0xf4, 0x63, 0x6f, 0x53, - 0x5a, 0x1d, 0x83, 0xe9, 0xe8, 0x37, 0x18, 0x14, 0x0b, 0x2c, 0xa5, 0x8b, 0x88, 0x13, 0x0b, 0x97, - 0xbf, 0x36, 0x4b, 0x30, 0x83, 0x62, 0x81, 0xd5, 0x1d, 0x06, 0x03, 0x3d, 0x1c, 0x06, 0x46, 0x17, - 0x0d, 0x1e, 0x6f, 0x17, 0xa1, 0xb7, 0x00, 0x36, 0xbc, 0xc0, 0x8b, 0xb7, 0x18, 0xf7, 0xa1, 0x23, - 0x73, 0x57, 0xca, 0xce, 0x8a, 0xe2, 0x82, 0x35, 0x8e, 0xe8, 0x05, 0x18, 0x55, 0x0b, 0x70, 0xb5, - 0x56, 0x1d, 0x36, 0xfd, 0xc9, 0xa9, 0x34, 0xaa, 0x61, 0x9d, 0xce, 0x7e, 0x3b, 0x3b, 0x5f, 0xc4, - 0x0a, 0xd0, 0xfa, 0xd7, 0xea, 0xb7, 0x7f, 0x4b, 0xdd, 0xfb, 0xd7, 0xfe, 0xfd, 0x32, 0x4c, 0x1a, - 0x95, 0xb5, 0xe3, 0x3e, 0x64, 0xd6, 0x65, 0xba, 0x11, 0x39, 0x09, 0x11, 0xeb, 0xcf, 0xee, 0xbd, - 0x54, 0xf4, 0xcd, 0x8a, 0xae, 0x00, 0x5e, 0x1e, 0xbd, 0x05, 0x15, 0xdf, 0x89, 0x99, 0xf3, 0x81, - 0x88, 0x75, 0xd7, 0x0f, 0xb3, 0x54, 0xd1, 0x77, 0xe2, 0x44, 0xdb, 0x0b, 0x38, 0xef, 0x94, 0x25, - 0xdd, 0x31, 0xa9, 0x72, 0x22, 0xcf, 0x94, 0x54, 0x23, 0xa8, 0x06, 0xb3, 0x87, 0x39, 0x0e, 0xbd, - 0x08, 0x63, 0x11, 0x61, 0xb3, 0x62, 0x89, 0xea, 0x5a, 0x6c, 0x9a, 0x0d, 0xa6, 0x4a, 0x19, 0xd6, - 0x70, 0xd8, 0xa0, 0x4c, 0x75, 0xed, 0xa1, 0x2e, 0xba, 0xf6, 0x13, 0x30, 0xcc, 0x7e, 0xa8, 0x19, - 0xa0, 0x46, 0x63, 0x95, 0x83, 0xb1, 0xc4, 0x67, 0x27, 0xcc, 0x48, 0x9f, 0x13, 0xe6, 0x49, 0x98, - 0xa8, 0x39, 0x64, 0x27, 0x0c, 0x96, 0x03, 0xb7, 0x15, 0x7a, 0x41, 0x82, 0xaa, 0x30, 0xc0, 0x76, - 0x07, 0xbe, 0xb6, 0x07, 0x28, 0x07, 0x3c, 0x40, 0x35, 0x67, 0xfb, 0x8f, 0x4a, 0x30, 0x5e, 0x23, - 0x3e, 0x49, 0x08, 0xb7, 0x35, 0x62, 0xb4, 0x02, 0x68, 0x33, 0x72, 0x9a, 0xa4, 0x4e, 0x22, 0x2f, - 0x74, 0x1b, 0xa4, 0x19, 0x06, 0xec, 0xa4, 0x86, 0x6e, 0x77, 0x67, 0x0f, 0xf6, 0x67, 0xd1, 0xe5, - 0x0e, 0x2c, 0xce, 0x29, 0x81, 0xde, 0x80, 0xf1, 0x56, 0x44, 0x0c, 0x1f, 0x9a, 0x55, 0xa4, 0x2e, - 0xd4, 0x75, 0x42, 0xae, 0xa9, 0x1a, 0x20, 0x6c, 0xb2, 0x42, 0x9f, 0x81, 0xa9, 0x30, 0x6a, 0x6d, - 0x39, 0x41, 0x8d, 0xb4, 0x48, 0xe0, 0x52, 0x55, 0x5c, 0xf8, 0x08, 0x4e, 0x1f, 0xec, 0xcf, 0x4e, - 0xdd, 0xc8, 0xe0, 0x70, 0x07, 0x35, 0x7a, 0x03, 0xa6, 0x5b, 0x51, 0xd8, 0x72, 0x36, 0xd9, 0x44, - 0x11, 0x1a, 0x07, 0x97, 0x3e, 0x4f, 0x1f, 0xec, 0xcf, 0x4e, 0xd7, 0xb3, 0xc8, 0xc3, 0xfd, 0xd9, - 0x53, 0xac, 0xa3, 0x28, 0x24, 0x45, 0xe2, 0x4e, 0x36, 0xf6, 0x26, 0x9c, 0xa9, 0x85, 0x77, 0x82, - 0x3b, 0x4e, 0xe4, 0x2e, 0xd4, 0x57, 0x35, 0xe3, 0xfe, 0xba, 0x34, 0x2e, 0xf9, 0xb9, 0x57, 0xee, - 0x3e, 0xa5, 0x95, 0xe4, 0xea, 0xff, 0x8a, 0xe7, 0x93, 0x02, 0x27, 0xc2, 0x5f, 0x2f, 0x19, 0x35, - 0xa5, 0xf4, 0xca, 0x53, 0x6f, 0x15, 0x7a, 0xea, 0x5f, 0x83, 0x91, 0x0d, 0x8f, 0xf8, 0x2e, 0x26, - 0x1b, 0x62, 0x64, 0x1e, 0x2f, 0x3e, 0xc0, 0x58, 0xa1, 0x94, 0xd2, 0x69, 0xc4, 0x4d, 0xd3, 0x15, - 0x51, 0x18, 0x2b, 0x36, 0x68, 0x1b, 0xa6, 0xa4, 0xed, 0x23, 0xb1, 0x62, 0x11, 0x3f, 0xd1, 0xcd, - 0xa0, 0x32, 0x99, 0xb3, 0x01, 0xc4, 0x19, 0x36, 0xb8, 0x83, 0x31, 0xb5, 0x45, 0x77, 0xe8, 0x76, - 0x35, 0xc0, 0xa6, 0x34, 0xb3, 0x45, 0x99, 0x59, 0xcd, 0xa0, 0xf6, 0xd7, 0x2c, 0x78, 0xa0, 0xa3, - 0x67, 0x84, 0x7b, 0xe1, 0x98, 0x47, 0x21, 0x6b, 0xee, 0x97, 0x7a, 0x9b, 0xfb, 0xf6, 0xaf, 0x5b, - 0x70, 0x7a, 0x79, 0xa7, 0x95, 0xec, 0xd5, 0x3c, 0xf3, 0x34, 0xe1, 0xe3, 0x30, 0xb4, 0x43, 0x5c, - 0xaf, 0xbd, 0x23, 0x46, 0x6e, 0x56, 0x8a, 0xf4, 0x35, 0x06, 0x3d, 0xdc, 0x9f, 0x1d, 0x6f, 0x24, - 0x61, 0xe4, 0x6c, 0x12, 0x0e, 0xc0, 0x82, 0x1c, 0xfd, 0x0c, 0xd7, 0x4d, 0xaf, 0x79, 0x3b, 0x9e, - 0x3c, 0x90, 0xea, 0xea, 0xf2, 0x9a, 0x93, 0x1d, 0x3a, 0xf7, 0x5a, 0xdb, 0x09, 0x12, 0x2f, 0xd9, - 0x33, 0x75, 0x59, 0xc6, 0x08, 0xa7, 0x3c, 0xed, 0xef, 0x59, 0x30, 0x29, 0xe5, 0xc9, 0x82, 0xeb, - 0x46, 0x24, 0x8e, 0xd1, 0x0c, 0x94, 0xbc, 0x96, 0x68, 0x29, 0x88, 0xd2, 0xa5, 0xd5, 0x3a, 0x2e, - 0x79, 0x2d, 0x54, 0x87, 0x0a, 0x3f, 0xdb, 0x4a, 0x27, 0x58, 0x5f, 0x27, 0x64, 0xcc, 0xf6, 0x5b, - 0x97, 0x25, 0x71, 0xca, 0x44, 0x6a, 0xc6, 0x6c, 0x2f, 0x2a, 0x9b, 0x27, 0x2d, 0x57, 0x04, 0x1c, - 0x2b, 0x0a, 0x74, 0x11, 0x46, 0x82, 0xd0, 0xe5, 0x47, 0x8d, 0x7c, 0x5d, 0xb3, 0x69, 0x7b, 0x5d, - 0xc0, 0xb0, 0xc2, 0xda, 0x3f, 0x6f, 0xc1, 0x98, 0xfc, 0xb2, 0x3e, 0x95, 0x74, 0xba, 0xbc, 0x52, - 0x05, 0x3d, 0x5d, 0x5e, 0x54, 0xc9, 0x66, 0x18, 0x43, 0xb7, 0x2e, 0x1f, 0x45, 0xb7, 0xb6, 0xbf, - 0x5a, 0x82, 0x09, 0xd9, 0x9c, 0x46, 0xfb, 0x76, 0x4c, 0x12, 0xb4, 0x0e, 0x15, 0x87, 0x77, 0x39, - 0x91, 0xb3, 0xf6, 0xd1, 0x7c, 0xab, 0xcb, 0x18, 0x9f, 0x74, 0x44, 0x17, 0x64, 0x69, 0x9c, 0x32, - 0x42, 0x3e, 0x4c, 0x07, 0x61, 0xc2, 0xb6, 0x3e, 0x85, 0xef, 0x76, 0x36, 0x90, 0xe5, 0x7e, 0x4e, - 0x70, 0x9f, 0xbe, 0x9e, 0xe5, 0x82, 0x3b, 0x19, 0xa3, 0x65, 0xe9, 0xe9, 0x29, 0xb3, 0x1a, 0x2e, - 0x74, 0xab, 0xa1, 0xd8, 0xd1, 0x63, 0xff, 0x9e, 0x05, 0x15, 0x49, 0x76, 0x12, 0xc7, 0x40, 0x6b, - 0x30, 0x1c, 0xb3, 0x41, 0x90, 0x5d, 0x63, 0x77, 0x6b, 0x38, 0x1f, 0xaf, 0x74, 0x47, 0xe7, 0xff, - 0x63, 0x2c, 0x79, 0x30, 0x57, 0xb5, 0x6a, 0xfe, 0x07, 0xc4, 0x55, 0xad, 0xda, 0x53, 0xb0, 0xcb, - 0xfc, 0x27, 0xd6, 0x66, 0xcd, 0x9e, 0xa7, 0x8a, 0x67, 0x2b, 0x22, 0x1b, 0xde, 0xdd, 0xac, 0xe2, - 0x59, 0x67, 0x50, 0x2c, 0xb0, 0xe8, 0x4d, 0x18, 0x6b, 0x4a, 0x0f, 0x6f, 0x2a, 0x06, 0x1e, 0xeb, - 0xea, 0x2f, 0x57, 0x47, 0x2b, 0x3c, 0x20, 0x67, 0x49, 0x2b, 0x8f, 0x0d, 0x6e, 0x54, 0xc2, 0xa4, - 0xa7, 0xc2, 0xe5, 0xae, 0xce, 0x95, 0x88, 0x24, 0x29, 0xdf, 0xc2, 0x03, 0x61, 0xfb, 0x57, 0x2c, - 0x18, 0xe2, 0x7e, 0xc2, 0xfe, 0x1c, 0xab, 0xda, 0x51, 0x51, 0xda, 0x77, 0xb7, 0x28, 0x50, 0x9c, - 0x1c, 0xa1, 0x35, 0xa8, 0xb0, 0x1f, 0xcc, 0x5f, 0x52, 0x2e, 0x8e, 0x44, 0xe2, 0xb5, 0xea, 0x0d, - 0xbc, 0x25, 0x8b, 0xe1, 0x94, 0x83, 0xfd, 0x8b, 0x65, 0x2a, 0xaa, 0x52, 0x52, 0x63, 0x17, 0xb7, - 0xee, 0xdf, 0x2e, 0x5e, 0xba, 0x5f, 0xbb, 0xf8, 0x26, 0x4c, 0x36, 0xb5, 0x73, 0xa9, 0x74, 0x24, - 0x2f, 0x76, 0x9d, 0x24, 0xda, 0x11, 0x16, 0xf7, 0x95, 0x2d, 0x99, 0x4c, 0x70, 0x96, 0x2b, 0xfa, - 0x1c, 0x8c, 0xf1, 0x71, 0x16, 0xb5, 0x0c, 0xb0, 0x5a, 0x3e, 0x52, 0x3c, 0x5f, 0xf4, 0x2a, 0xd8, - 0x4c, 0x6c, 0x68, 0xc5, 0xb1, 0xc1, 0xcc, 0xfe, 0xf2, 0x20, 0x0c, 0x2e, 0xef, 0x92, 0x20, 0x39, - 0x01, 0x81, 0xd4, 0x84, 0x09, 0x2f, 0xd8, 0x0d, 0xfd, 0x5d, 0xe2, 0x72, 0xfc, 0x51, 0x36, 0xd7, - 0xb3, 0x82, 0xf5, 0xc4, 0xaa, 0xc1, 0x02, 0x67, 0x58, 0xde, 0x0f, 0xcb, 0xfd, 0x32, 0x0c, 0xf1, - 0xb1, 0x17, 0x66, 0x7b, 0xae, 0x17, 0x9c, 0x75, 0xa2, 0x58, 0x05, 0xa9, 0x57, 0x81, 0xbb, 0xdd, - 0x45, 0x71, 0xf4, 0x36, 0x4c, 0x6c, 0x78, 0x51, 0x9c, 0x50, 0x93, 0x3b, 0x4e, 0x9c, 0x9d, 0xd6, - 0x3d, 0x58, 0xea, 0xaa, 0x1f, 0x56, 0x0c, 0x4e, 0x38, 0xc3, 0x19, 0x6d, 0xc2, 0x38, 0x35, 0x1e, - 0xd3, 0xaa, 0x86, 0x8f, 0x5c, 0x95, 0x72, 0xc5, 0x5d, 0xd3, 0x19, 0x61, 0x93, 0x2f, 0x15, 0x26, - 0x4d, 0x66, 0x6c, 0x8e, 0x30, 0x8d, 0x42, 0x09, 0x13, 0x6e, 0x65, 0x72, 0x1c, 0x95, 0x49, 0x2c, - 0x9e, 0xa3, 0x62, 0xca, 0xa4, 0x34, 0x6a, 0xc3, 0xfe, 0x3a, 0xdd, 0x1d, 0x69, 0x1f, 0x9e, 0xc0, - 0xd6, 0xf2, 0x8a, 0xb9, 0xb5, 0x9c, 0x2b, 0x1c, 0xcf, 0x82, 0x6d, 0xe5, 0xf3, 0x30, 0xaa, 0x0d, - 0x37, 0x9a, 0x87, 0x4a, 0x53, 0x06, 0x1f, 0x08, 0xa9, 0xab, 0xd4, 0x17, 0x15, 0x95, 0x80, 0x53, - 0x1a, 0xda, 0x1b, 0x54, 0xd9, 0xcb, 0x06, 0x23, 0x51, 0x55, 0x10, 0x33, 0x8c, 0xfd, 0x1c, 0xc0, - 0xf2, 0x5d, 0xd2, 0x5c, 0xe0, 0xc6, 0x97, 0x76, 0xc6, 0x65, 0x15, 0x9f, 0x71, 0xd1, 0x1d, 0x7a, - 0x62, 0x65, 0xc9, 0x50, 0xca, 0xe7, 0x00, 0xb8, 0x16, 0xfa, 0xfa, 0xeb, 0xd7, 0xa5, 0x77, 0x98, - 0x3b, 0xf8, 0x14, 0x14, 0x6b, 0x14, 0xe8, 0x1c, 0x94, 0xfd, 0x76, 0x20, 0x94, 0xc3, 0xe1, 0x83, - 0xfd, 0xd9, 0xf2, 0xb5, 0x76, 0x80, 0x29, 0x4c, 0x8b, 0xff, 0x29, 0xf7, 0x1d, 0xff, 0xd3, 0x3b, - 0xfe, 0xf5, 0xcf, 0x97, 0x61, 0x6a, 0xc5, 0x27, 0x77, 0x8d, 0x56, 0x3f, 0x06, 0x43, 0x6e, 0xe4, - 0xed, 0x92, 0x28, 0xbb, 0x49, 0xd7, 0x18, 0x14, 0x0b, 0x6c, 0xdf, 0x21, 0x49, 0x37, 0x3b, 0xb7, - 0xdb, 0xe3, 0x0e, 0xc2, 0xea, 0xf9, 0xa5, 0xe8, 0x4d, 0x18, 0xe6, 0x27, 0xa1, 0x71, 0x75, 0x90, - 0x4d, 0xbb, 0x67, 0xf3, 0x9a, 0x90, 0xed, 0x8b, 0x39, 0xe1, 0xdb, 0xe0, 0x61, 0x21, 0x4a, 0x46, - 0x09, 0x28, 0x96, 0x2c, 0x67, 0x3e, 0x09, 0x63, 0x3a, 0xe5, 0x91, 0xe2, 0x43, 0xfe, 0x82, 0x05, - 0xa7, 0x56, 0xfc, 0xb0, 0xb9, 0x9d, 0x89, 0x0f, 0x7b, 0x01, 0x46, 0xe9, 0x72, 0x89, 0x8d, 0x40, - 0x49, 0x23, 0x88, 0x54, 0xa0, 0xb0, 0x4e, 0xa7, 0x15, 0xbb, 0x79, 0x73, 0xb5, 0x96, 0x17, 0x7b, - 0x2a, 0x50, 0x58, 0xa7, 0xb3, 0xff, 0xc0, 0x82, 0x87, 0x2f, 0x2f, 0x2d, 0xd7, 0x49, 0x14, 0x7b, - 0x71, 0x42, 0x82, 0xa4, 0x23, 0xfc, 0x95, 0xea, 0x6e, 0xae, 0xd6, 0x94, 0x54, 0x77, 0xab, 0xb1, - 0x56, 0x08, 0xec, 0x07, 0x25, 0xb4, 0xfb, 0xd7, 0x2c, 0x38, 0x75, 0xd9, 0x4b, 0x30, 0x69, 0x85, - 0xd9, 0xf0, 0xd3, 0x88, 0xb4, 0xc2, 0xd8, 0x4b, 0xc2, 0x68, 0x2f, 0x1b, 0x7e, 0x8a, 0x15, 0x06, - 0x6b, 0x54, 0xbc, 0xe6, 0x5d, 0x2f, 0xa6, 0x2d, 0x2d, 0x99, 0x06, 0x24, 0x16, 0x70, 0xac, 0x28, - 0xe8, 0x87, 0xb9, 0x5e, 0xc4, 0x14, 0x80, 0x3d, 0xb1, 0x5a, 0xd5, 0x87, 0xd5, 0x24, 0x02, 0xa7, - 0x34, 0xf6, 0xd7, 0x2c, 0x38, 0x73, 0xd9, 0x6f, 0xc7, 0x09, 0x89, 0x36, 0x62, 0xa3, 0xb1, 0xcf, - 0x41, 0x85, 0x48, 0x25, 0x5b, 0xb4, 0x55, 0x6d, 0x0b, 0x4a, 0xfb, 0xe6, 0xb1, 0xaf, 0x8a, 0xae, - 0x8f, 0x60, 0xcb, 0xa3, 0x05, 0x09, 0x7e, 0xb3, 0x04, 0xe3, 0x57, 0xd6, 0xd7, 0xeb, 0x97, 0x49, - 0x22, 0x24, 0x62, 0x6f, 0x27, 0x11, 0xd6, 0xec, 0xdc, 0x6e, 0xaa, 0x4c, 0x3b, 0xf1, 0xfc, 0x39, - 0x7e, 0xed, 0x60, 0x6e, 0x35, 0x48, 0x6e, 0x44, 0x8d, 0x24, 0xf2, 0x82, 0xcd, 0x5c, 0xcb, 0x58, - 0xca, 0xed, 0x72, 0x91, 0xdc, 0x46, 0xcf, 0xc1, 0x10, 0xbb, 0xf7, 0x20, 0x95, 0x8a, 0x07, 0x95, - 0x26, 0xc0, 0xa0, 0x87, 0xfb, 0xb3, 0x95, 0x9b, 0x78, 0x95, 0xff, 0xc1, 0x82, 0x14, 0xdd, 0x84, - 0xd1, 0xad, 0x24, 0x69, 0x5d, 0x21, 0x8e, 0x4b, 0x22, 0x29, 0x1d, 0xce, 0xe7, 0x49, 0x07, 0xda, - 0x09, 0x9c, 0x2c, 0x5d, 0x50, 0x29, 0x2c, 0xc6, 0x3a, 0x1f, 0xbb, 0x01, 0x90, 0xe2, 0x8e, 0xc9, - 0x2a, 0xb0, 0x7f, 0x68, 0xc1, 0xf0, 0x15, 0x27, 0x70, 0x7d, 0x12, 0xa1, 0x97, 0x61, 0x80, 0xdc, - 0x25, 0x4d, 0xb1, 0x41, 0xe7, 0x36, 0x38, 0xdd, 0xc4, 0xb8, 0x9f, 0x8b, 0xfe, 0xc7, 0xac, 0x14, - 0xba, 0x02, 0xc3, 0xb4, 0xb5, 0x97, 0x55, 0x14, 0xf2, 0x23, 0x45, 0x5f, 0xac, 0x86, 0x9d, 0xef, - 0x7b, 0x02, 0x84, 0x65, 0x71, 0xe6, 0xaf, 0x69, 0xb6, 0x1a, 0x54, 0x80, 0x25, 0xdd, 0xac, 0xa9, - 0xf5, 0xa5, 0x3a, 0x27, 0x12, 0xdc, 0xb8, 0xbf, 0x46, 0x02, 0x71, 0xca, 0xc4, 0x5e, 0x87, 0x0a, - 0x1d, 0xd4, 0x05, 0xdf, 0x73, 0xba, 0xbb, 0x8a, 0x9e, 0x82, 0x8a, 0x74, 0xdb, 0xc4, 0x22, 0x90, - 0x99, 0x71, 0x95, 0x5e, 0x9d, 0x18, 0xa7, 0x78, 0xfb, 0x45, 0x38, 0xcd, 0xce, 0x41, 0x9d, 0x64, - 0xcb, 0x58, 0x63, 0x3d, 0x27, 0xb3, 0xfd, 0x8d, 0x01, 0x98, 0x5e, 0x6d, 0x2c, 0x35, 0x4c, 0x6f, - 0xe0, 0x8b, 0x30, 0xc6, 0xb7, 0x6e, 0x3a, 0x45, 0x1d, 0x5f, 0x94, 0x57, 0xde, 0xfe, 0x75, 0x0d, - 0x87, 0x0d, 0x4a, 0xf4, 0x30, 0x94, 0xbd, 0x77, 0x82, 0x6c, 0xfc, 0xda, 0xea, 0x6b, 0xd7, 0x31, - 0x85, 0x53, 0x34, 0xd5, 0x02, 0xb8, 0x48, 0x54, 0x68, 0xa5, 0x09, 0xbc, 0x02, 0x13, 0x5e, 0xdc, - 0x8c, 0xbd, 0xd5, 0x80, 0xca, 0x0b, 0xa7, 0x29, 0x27, 0x7b, 0xaa, 0xa2, 0xd3, 0xa6, 0x2a, 0x2c, - 0xce, 0x50, 0x6b, 0xf2, 0x79, 0xb0, 0x6f, 0x4d, 0xa2, 0x67, 0x90, 0x33, 0x55, 0x92, 0x5a, 0xec, - 0xeb, 0x62, 0x16, 0x4b, 0x23, 0x94, 0x24, 0xfe, 0xc1, 0x31, 0x96, 0x38, 0x74, 0x19, 0xa6, 0x9b, - 0x5b, 0x4e, 0x6b, 0xa1, 0x9d, 0x6c, 0xd5, 0xbc, 0xb8, 0x19, 0xee, 0x92, 0x68, 0x8f, 0xa9, 0xae, - 0x23, 0xa9, 0x57, 0x48, 0x21, 0x96, 0xae, 0x2c, 0xd4, 0x29, 0x25, 0xee, 0x2c, 0x63, 0x2a, 0x15, - 0x70, 0x6c, 0x4a, 0xc5, 0x02, 0x4c, 0xca, 0xba, 0x1a, 0x24, 0x66, 0x02, 0x7f, 0x94, 0xb5, 0x4e, - 0x5d, 0x20, 0x11, 0x60, 0xd5, 0xb6, 0x2c, 0xbd, 0xfd, 0x36, 0x54, 0x54, 0x9c, 0x97, 0x0c, 0x55, - 0xb4, 0x0a, 0x42, 0x15, 0x7b, 0x8b, 0x6a, 0xe9, 0xad, 0x2e, 0xe7, 0x7a, 0xab, 0xff, 0x86, 0x05, - 0x69, 0xb8, 0x0b, 0xba, 0x02, 0x95, 0x56, 0xc8, 0x4e, 0xac, 0x22, 0x79, 0x0c, 0xfc, 0x60, 0xee, - 0xaa, 0xe6, 0x12, 0x84, 0x77, 0x43, 0x5d, 0x96, 0xc0, 0x69, 0x61, 0xb4, 0x08, 0xc3, 0xad, 0x88, - 0x34, 0x12, 0x76, 0x3f, 0xa0, 0x27, 0x1f, 0x3e, 0xd4, 0x9c, 0x1e, 0xcb, 0x82, 0xf6, 0x6f, 0x5a, - 0x00, 0xdc, 0x19, 0xec, 0x04, 0x9b, 0xe4, 0x04, 0x0c, 0xdc, 0x1a, 0x0c, 0xc4, 0x2d, 0xd2, 0xec, - 0x76, 0x96, 0x98, 0xb6, 0xa7, 0xd1, 0x22, 0xcd, 0xb4, 0xc3, 0xe9, 0x3f, 0xcc, 0x4a, 0xdb, 0x3f, - 0x07, 0x30, 0x91, 0x92, 0x51, 0xc3, 0x03, 0x3d, 0x63, 0x84, 0xc3, 0x9f, 0xcb, 0x84, 0xc3, 0x57, - 0x18, 0xb5, 0x16, 0x01, 0xff, 0x36, 0x94, 0x77, 0x9c, 0xbb, 0xc2, 0xba, 0x79, 0xaa, 0x7b, 0x33, - 0x28, 0xff, 0xb9, 0x35, 0xe7, 0x2e, 0x57, 0x30, 0x9f, 0x92, 0x13, 0x64, 0xcd, 0xb9, 0x7b, 0xc8, - 0x4f, 0x0c, 0x99, 0xac, 0xa1, 0x46, 0xd4, 0x17, 0xff, 0x38, 0xfd, 0xcf, 0xb6, 0x0d, 0x5a, 0x09, - 0xab, 0xcb, 0x0b, 0x84, 0x6b, 0xb4, 0xaf, 0xba, 0xbc, 0x20, 0x5b, 0x97, 0x17, 0xf4, 0x51, 0x97, - 0x17, 0xa0, 0x77, 0x61, 0x58, 0x1c, 0x45, 0xb0, 0x38, 0xbe, 0xd1, 0x4b, 0xf3, 0x7d, 0xd4, 0x27, - 0x4e, 0x32, 0x78, 0x9d, 0xf3, 0x52, 0x81, 0x16, 0xd0, 0x9e, 0xf5, 0xca, 0x0a, 0xd1, 0x5f, 0xb3, - 0x60, 0x42, 0xfc, 0xc6, 0xe4, 0x9d, 0x36, 0x89, 0x13, 0xb1, 0x51, 0x7f, 0xac, 0xff, 0x36, 0x88, - 0x82, 0xbc, 0x29, 0x1f, 0x93, 0xd2, 0xd2, 0x44, 0xf6, 0x6c, 0x51, 0xa6, 0x15, 0xe8, 0x1f, 0x59, - 0x70, 0x7a, 0xc7, 0xb9, 0xcb, 0x6b, 0xe4, 0x30, 0xec, 0x24, 0x5e, 0x28, 0xe2, 0x12, 0x5f, 0xee, - 0x6f, 0xf8, 0x3b, 0x8a, 0xf3, 0x46, 0xca, 0x10, 0xa6, 0xd3, 0x79, 0x24, 0x3d, 0x9b, 0x9a, 0xdb, - 0xae, 0x99, 0x0d, 0x18, 0x91, 0xf3, 0x2d, 0xc7, 0x4c, 0xa9, 0xe9, 0x5a, 0xc8, 0x91, 0x4f, 0x82, - 0x34, 0xb3, 0x86, 0xd5, 0x23, 0xe6, 0xda, 0x7d, 0xad, 0xe7, 0x6d, 0x18, 0xd3, 0xe7, 0xd8, 0x7d, - 0xad, 0xeb, 0x1d, 0x38, 0x95, 0x33, 0x97, 0xee, 0x6b, 0x95, 0x77, 0xe0, 0x5c, 0xe1, 0xfc, 0xb8, - 0x9f, 0x15, 0xdb, 0xdf, 0xb4, 0x74, 0x39, 0x78, 0x02, 0x6e, 0xa1, 0x25, 0xd3, 0x2d, 0x74, 0xbe, - 0xfb, 0xca, 0x29, 0xf0, 0x0d, 0xbd, 0xa9, 0x37, 0x9a, 0x4a, 0x75, 0xf4, 0x2a, 0x0c, 0xf9, 0x14, - 0x22, 0xcf, 0xbf, 0xec, 0xde, 0x2b, 0x32, 0x55, 0x89, 0x18, 0x3c, 0xc6, 0x82, 0x83, 0xfd, 0x3b, - 0x16, 0x0c, 0x9c, 0x40, 0x4f, 0x60, 0xb3, 0x27, 0x9e, 0x29, 0x64, 0x2d, 0x2e, 0x7b, 0xcf, 0x61, - 0xe7, 0xce, 0xf2, 0xdd, 0x84, 0x04, 0x31, 0xd3, 0xab, 0x73, 0x3b, 0xe6, 0xff, 0x96, 0x60, 0x94, - 0x56, 0x25, 0x83, 0x35, 0x5e, 0x82, 0x71, 0xdf, 0xb9, 0x4d, 0x7c, 0xe9, 0xaa, 0xce, 0x5a, 0x97, - 0xd7, 0x74, 0x24, 0x36, 0x69, 0x69, 0xe1, 0x0d, 0xdd, 0x6b, 0x2f, 0xf4, 0x17, 0x55, 0xd8, 0x70, - 0xe9, 0x63, 0x93, 0x96, 0x1a, 0x3a, 0x77, 0x9c, 0xa4, 0xb9, 0x25, 0x2c, 0x4f, 0xd5, 0xdc, 0xd7, - 0x29, 0x10, 0x73, 0x1c, 0xd5, 0xc3, 0xe4, 0xec, 0xbc, 0x45, 0x22, 0xa6, 0x87, 0x71, 0x2d, 0x57, - 0xe9, 0x61, 0xd8, 0x44, 0xe3, 0x2c, 0x3d, 0xfa, 0x24, 0x4c, 0xd0, 0xce, 0x09, 0xdb, 0x89, 0x0c, - 0x45, 0x19, 0x64, 0xa1, 0x28, 0x2c, 0xf2, 0x78, 0xdd, 0xc0, 0xe0, 0x0c, 0x25, 0xaa, 0xc3, 0x69, - 0x2f, 0x68, 0xfa, 0x6d, 0x97, 0xdc, 0x0c, 0xbc, 0xc0, 0x4b, 0x3c, 0xc7, 0xf7, 0xde, 0x25, 0xae, - 0xd0, 0x83, 0x55, 0xd4, 0xd0, 0x6a, 0x0e, 0x0d, 0xce, 0x2d, 0x69, 0xff, 0x0c, 0x9c, 0xba, 0x16, - 0x3a, 0xee, 0xa2, 0xe3, 0x3b, 0x41, 0x93, 0x44, 0xab, 0xc1, 0x66, 0xcf, 0x83, 0x70, 0xfd, 0xd8, - 0xba, 0xd4, 0xeb, 0xd8, 0xda, 0xde, 0x02, 0xa4, 0x57, 0x20, 0x42, 0xb0, 0x30, 0x0c, 0x7b, 0xbc, - 0x2a, 0x31, 0xfd, 0x1f, 0xcf, 0x57, 0x92, 0x3b, 0x5a, 0xa6, 0x05, 0x17, 0x71, 0x00, 0x96, 0x8c, - 0xa8, 0x21, 0x95, 0xa7, 0x55, 0xf7, 0xb6, 0x71, 0xed, 0x17, 0x60, 0x9a, 0x95, 0x3c, 0xa2, 0xfd, - 0xf5, 0x97, 0x2d, 0x98, 0xbc, 0x9e, 0xb9, 0x7b, 0xfa, 0x18, 0x0c, 0xc5, 0x24, 0xca, 0x71, 0x52, - 0x36, 0x18, 0x14, 0x0b, 0xec, 0xb1, 0x3b, 0x43, 0x7e, 0x64, 0x41, 0x85, 0xc5, 0xf6, 0xb6, 0xa8, - 0x2d, 0x75, 0xff, 0x95, 0xda, 0x25, 0x43, 0xa9, 0xcd, 0x35, 0xd2, 0x55, 0x73, 0x8a, 0x74, 0x5a, - 0x74, 0x55, 0xdd, 0xc9, 0xec, 0x62, 0x9f, 0xa7, 0x6c, 0xf8, 0x0d, 0xbe, 0x09, 0xf3, 0xe2, 0xa6, - 0xbc, 0xa5, 0xc9, 0x4e, 0xa2, 0x15, 0xed, 0x07, 0xe4, 0x24, 0x5a, 0xb5, 0xa7, 0x40, 0xfa, 0xd5, - 0xb5, 0x26, 0xb3, 0x5d, 0xe1, 0xd3, 0x2c, 0x62, 0x93, 0xad, 0x4d, 0x75, 0x79, 0x79, 0x56, 0x44, - 0x60, 0x0a, 0xe8, 0x21, 0x13, 0x64, 0xe2, 0x1f, 0xbf, 0x91, 0x9e, 0x16, 0xb1, 0xaf, 0xc0, 0x64, - 0xa6, 0xc3, 0xd0, 0x0b, 0x30, 0xd8, 0xda, 0x72, 0x62, 0x92, 0x89, 0xc0, 0x19, 0xac, 0x53, 0xe0, - 0xe1, 0xfe, 0xec, 0x84, 0x2a, 0xc0, 0x20, 0x98, 0x53, 0xdb, 0xff, 0xcd, 0x82, 0x81, 0xeb, 0xa1, - 0x7b, 0x12, 0x93, 0xe9, 0x15, 0x63, 0x32, 0x3d, 0x54, 0x94, 0xd9, 0xa2, 0x70, 0x1e, 0xad, 0x64, - 0xe6, 0xd1, 0xf9, 0x42, 0x0e, 0xdd, 0xa7, 0xd0, 0x0e, 0x8c, 0xb2, 0x7c, 0x19, 0x22, 0x1a, 0xe8, - 0x39, 0xc3, 0xbe, 0x9a, 0xcd, 0xd8, 0x57, 0x93, 0x1a, 0xa9, 0x66, 0x65, 0x3d, 0x01, 0xc3, 0x22, - 0x22, 0x25, 0x1b, 0x9b, 0x2a, 0x68, 0xb1, 0xc4, 0xdb, 0xbf, 0x52, 0x06, 0x23, 0x3f, 0x07, 0xfa, - 0x3d, 0x0b, 0xe6, 0x22, 0x7e, 0x1b, 0xc7, 0xad, 0xb5, 0x23, 0x2f, 0xd8, 0x6c, 0x34, 0xb7, 0x88, - 0xdb, 0xf6, 0xbd, 0x60, 0x73, 0x75, 0x33, 0x08, 0x15, 0x78, 0xf9, 0x2e, 0x69, 0xb6, 0x99, 0x83, - 0xba, 0x47, 0x32, 0x10, 0x75, 0xe2, 0x7b, 0xe9, 0x60, 0x7f, 0x76, 0x0e, 0x1f, 0x89, 0x37, 0x3e, - 0x62, 0x5b, 0xd0, 0x1f, 0x58, 0x30, 0xcf, 0xd3, 0x56, 0xf4, 0xdf, 0xfe, 0x2e, 0xd6, 0x68, 0x5d, - 0xb2, 0x4a, 0x99, 0xac, 0x93, 0x68, 0x67, 0xf1, 0xe3, 0xa2, 0x43, 0xe7, 0xeb, 0x47, 0xab, 0x0b, - 0x1f, 0xb5, 0x71, 0xf6, 0xbf, 0x28, 0xc3, 0x38, 0xed, 0xc5, 0xf4, 0x06, 0xfa, 0x0b, 0xc6, 0x94, - 0x78, 0x24, 0x33, 0x25, 0xa6, 0x0d, 0xe2, 0xe3, 0xb9, 0x7c, 0x1e, 0xc3, 0xb4, 0xef, 0xc4, 0xc9, - 0x15, 0xe2, 0x44, 0xc9, 0x6d, 0xe2, 0xb0, 0x23, 0x56, 0x31, 0xcd, 0x8f, 0x72, 0x6a, 0xab, 0xbc, - 0x58, 0xd7, 0xb2, 0xcc, 0x70, 0x27, 0x7f, 0xb4, 0x0b, 0x88, 0x1d, 0xe7, 0x46, 0x4e, 0x10, 0xf3, - 0x6f, 0xf1, 0x84, 0xf3, 0xfa, 0x68, 0xb5, 0xce, 0x88, 0x5a, 0xd1, 0xb5, 0x0e, 0x6e, 0x38, 0xa7, - 0x06, 0xed, 0x98, 0x7e, 0xb0, 0xdf, 0x63, 0xfa, 0xa1, 0x1e, 0x01, 0xe0, 0x3f, 0x0b, 0xa7, 0xe8, - 0xa8, 0x98, 0xf1, 0xc3, 0x31, 0x22, 0x30, 0xb9, 0xdd, 0xbe, 0x4d, 0x7c, 0x92, 0x48, 0x98, 0x58, - 0x4a, 0xb9, 0x7a, 0xb8, 0x59, 0x3a, 0x55, 0xf6, 0xae, 0x9a, 0x2c, 0x70, 0x96, 0xa7, 0xfd, 0xab, - 0x16, 0xb0, 0x08, 0xbd, 0x13, 0xd8, 0x8f, 0x3e, 0x65, 0xee, 0x47, 0xd5, 0x22, 0x91, 0x50, 0xb0, - 0x15, 0x3d, 0x0f, 0x53, 0x14, 0x5b, 0x8f, 0xc2, 0xbb, 0x7b, 0x52, 0x19, 0xef, 0xad, 0x02, 0xfd, - 0x1f, 0x8b, 0xaf, 0x10, 0x75, 0x5b, 0x10, 0x7d, 0x01, 0x46, 0x9a, 0x4e, 0xcb, 0x69, 0xf2, 0x4c, - 0x45, 0x85, 0xee, 0x18, 0xa3, 0xd0, 0xdc, 0x92, 0x28, 0xc1, 0xdd, 0x0b, 0x1f, 0x95, 0x5f, 0x29, - 0xc1, 0x3d, 0x5d, 0x0a, 0xaa, 0xca, 0x99, 0x6d, 0x18, 0x37, 0x98, 0xdd, 0x57, 0x5b, 0xf4, 0x0b, - 0x5c, 0x7e, 0x2b, 0x13, 0x62, 0x07, 0xa6, 0x03, 0xed, 0x3f, 0x95, 0x56, 0x52, 0xbf, 0xfd, 0x70, - 0x2f, 0x09, 0xcd, 0x44, 0x9b, 0x16, 0x81, 0x98, 0x61, 0x83, 0x3b, 0x39, 0xdb, 0x7f, 0xdb, 0x82, - 0x07, 0x74, 0x42, 0xed, 0x22, 0x67, 0x2f, 0x07, 0x6f, 0x0d, 0x46, 0xc2, 0x16, 0x89, 0x9c, 0xd4, - 0x48, 0xba, 0x28, 0x3b, 0xfd, 0x86, 0x80, 0x1f, 0xee, 0xcf, 0x9e, 0xd6, 0xb9, 0x4b, 0x38, 0x56, - 0x25, 0x91, 0x0d, 0x43, 0xac, 0x33, 0x62, 0x71, 0xc9, 0x96, 0x65, 0xf3, 0x61, 0x07, 0x43, 0x31, - 0x16, 0x18, 0xfb, 0xe7, 0x2c, 0x3e, 0xb1, 0xf4, 0xa6, 0xa3, 0x77, 0x60, 0x6a, 0x87, 0xda, 0x53, - 0xcb, 0x77, 0x5b, 0x11, 0x77, 0x4f, 0xcb, 0x7e, 0x7a, 0xaa, 0x57, 0x3f, 0x69, 0x1f, 0xb9, 0x58, - 0x15, 0x6d, 0x9e, 0x5a, 0xcb, 0x30, 0xc3, 0x1d, 0xec, 0xed, 0xbf, 0x59, 0xe2, 0x2b, 0x91, 0xa9, - 0x59, 0x4f, 0xc0, 0x70, 0x2b, 0x74, 0x97, 0x56, 0x6b, 0x58, 0xf4, 0x90, 0x92, 0x1f, 0x75, 0x0e, - 0xc6, 0x12, 0x8f, 0x2e, 0x01, 0x90, 0xbb, 0x09, 0x89, 0x02, 0xc7, 0x57, 0xc7, 0xd6, 0x4a, 0x9b, - 0x59, 0x56, 0x18, 0xac, 0x51, 0xd1, 0x32, 0xad, 0x28, 0xdc, 0xf5, 0x5c, 0x76, 0xcb, 0xa1, 0x6c, - 0x96, 0xa9, 0x2b, 0x0c, 0xd6, 0xa8, 0xa8, 0xed, 0xda, 0x0e, 0x62, 0xbe, 0x23, 0x39, 0xb7, 0x45, - 0x26, 0x99, 0x91, 0xd4, 0x76, 0xbd, 0xa9, 0x23, 0xb1, 0x49, 0x8b, 0x16, 0x60, 0x28, 0x71, 0xd8, - 0x61, 0xec, 0x60, 0x71, 0xec, 0xca, 0x3a, 0xa5, 0xd0, 0x13, 0xf6, 0xd0, 0x02, 0x58, 0x14, 0xb4, - 0xbf, 0x54, 0x01, 0x48, 0x55, 0x24, 0xf4, 0x6e, 0xc7, 0x32, 0x7e, 0xba, 0xbb, 0x52, 0x75, 0x7c, - 0x6b, 0x18, 0x7d, 0xd9, 0x82, 0x51, 0xc7, 0xf7, 0xc3, 0xa6, 0x93, 0xb0, 0x9e, 0x28, 0x75, 0x17, - 0x23, 0xa2, 0xfe, 0x85, 0xb4, 0x04, 0x6f, 0xc2, 0x73, 0xf2, 0x2c, 0x54, 0xc3, 0xf4, 0x6c, 0x85, - 0x5e, 0x31, 0xfa, 0xa8, 0xd4, 0x9c, 0xf9, 0x10, 0xce, 0x64, 0x35, 0xe7, 0x0a, 0x93, 0x98, 0x9a, - 0xd2, 0x8c, 0x6e, 0x1a, 0x49, 0x56, 0x06, 0x8a, 0xef, 0x93, 0x1a, 0x9a, 0x42, 0xaf, 0xfc, 0x2a, - 0xa8, 0xae, 0xc7, 0x4b, 0x0f, 0x16, 0x5f, 0xba, 0xd6, 0x54, 0xd2, 0x1e, 0xb1, 0xd2, 0x6f, 0xc3, - 0xa4, 0x6b, 0x6e, 0x89, 0x22, 0xea, 0xec, 0xf1, 0x22, 0xbe, 0x99, 0x1d, 0x34, 0xdd, 0x04, 0x33, - 0x08, 0x9c, 0x65, 0x8c, 0xea, 0x3c, 0x72, 0x7d, 0x35, 0xd8, 0x08, 0x45, 0xbc, 0x99, 0x5d, 0x38, - 0x96, 0x7b, 0x71, 0x42, 0x76, 0x28, 0x65, 0xba, 0xd7, 0x5d, 0x17, 0x65, 0xb1, 0xe2, 0x82, 0x5e, - 0x85, 0x21, 0x76, 0xa5, 0x28, 0xae, 0x8e, 0x14, 0x3b, 0xcf, 0xcc, 0xdb, 0xb0, 0xe9, 0xc4, 0x67, - 0x7f, 0x63, 0x2c, 0x38, 0xa0, 0x2b, 0xf2, 0x4e, 0x7b, 0xbc, 0x1a, 0xdc, 0x8c, 0x09, 0xbb, 0xd3, - 0x5e, 0x59, 0xfc, 0x70, 0x7a, 0x5d, 0x9d, 0xc3, 0x73, 0x13, 0xc9, 0x19, 0x25, 0xa9, 0x4e, 0x21, - 0xfe, 0xcb, 0xfc, 0x74, 0x55, 0x28, 0x6e, 0x9e, 0x99, 0xc3, 0x2e, 0xed, 0xce, 0x5b, 0x26, 0x0b, - 0x9c, 0xe5, 0x79, 0xa2, 0x5b, 0xdc, 0x4c, 0x00, 0x53, 0xd9, 0x85, 0x75, 0x5f, 0xb7, 0xd4, 0x1f, - 0x0e, 0xc0, 0x84, 0x39, 0x11, 0xd0, 0x3c, 0x54, 0x04, 0x13, 0x95, 0x91, 0x4a, 0xcd, 0xed, 0x35, - 0x89, 0xc0, 0x29, 0x0d, 0xcb, 0xc8, 0xc5, 0x8a, 0x6b, 0x91, 0x46, 0x69, 0x46, 0x2e, 0x85, 0xc1, - 0x1a, 0x15, 0xd5, 0x3c, 0x6f, 0x87, 0x61, 0xa2, 0xc4, 0xb5, 0x9a, 0x2d, 0x8b, 0x0c, 0x8a, 0x05, - 0x96, 0x8a, 0xe9, 0x6d, 0x12, 0x05, 0xc4, 0x37, 0xdd, 0x7f, 0x4a, 0x4c, 0x5f, 0xd5, 0x91, 0xd8, - 0xa4, 0xa5, 0xdb, 0x4e, 0x18, 0xb3, 0xe9, 0x27, 0xf4, 0xdb, 0x34, 0x72, 0xab, 0xc1, 0xaf, 0xd4, - 0x49, 0x3c, 0xfa, 0x2c, 0x3c, 0xa0, 0x6e, 0xc0, 0x61, 0xee, 0x4e, 0x95, 0x35, 0x0e, 0x19, 0xe6, - 0xe8, 0x03, 0x4b, 0xf9, 0x64, 0xb8, 0xa8, 0x3c, 0x7a, 0x05, 0x26, 0x84, 0x9a, 0x2a, 0x39, 0x0e, - 0x9b, 0x07, 0xf5, 0x57, 0x0d, 0x2c, 0xce, 0x50, 0xa3, 0x1a, 0x4c, 0x51, 0x08, 0xd3, 0x14, 0x25, - 0x07, 0x7e, 0x93, 0x4f, 0xed, 0xc7, 0x57, 0x33, 0x78, 0xdc, 0x51, 0x02, 0x2d, 0xc0, 0x24, 0xd7, - 0x23, 0xa8, 0x21, 0xc6, 0xc6, 0x41, 0x84, 0x81, 0xaa, 0x85, 0x70, 0xc3, 0x44, 0xe3, 0x2c, 0x3d, - 0x7a, 0x11, 0xc6, 0x9c, 0xa8, 0xb9, 0xe5, 0x25, 0xa4, 0x99, 0xb4, 0x23, 0x9e, 0x31, 0x42, 0x8b, - 0x74, 0x58, 0xd0, 0x70, 0xd8, 0xa0, 0xb4, 0xdf, 0x85, 0x53, 0x39, 0x11, 0xe4, 0x74, 0xe2, 0x38, - 0x2d, 0x4f, 0x7e, 0x53, 0x26, 0x06, 0x6b, 0xa1, 0xbe, 0x2a, 0xbf, 0x46, 0xa3, 0xa2, 0xb3, 0x93, - 0xf9, 0x91, 0xb5, 0x24, 0x92, 0x6a, 0x76, 0xae, 0x48, 0x04, 0x4e, 0x69, 0xec, 0xef, 0x02, 0x68, - 0x5e, 0x90, 0x3e, 0x22, 0x70, 0x5e, 0x84, 0x31, 0x99, 0xf9, 0x54, 0xcb, 0x33, 0xa8, 0x3e, 0xf3, - 0xb2, 0x86, 0xc3, 0x06, 0x25, 0x6d, 0x5b, 0x20, 0x7d, 0x3b, 0xd9, 0x88, 0x2f, 0xe5, 0xf4, 0xc1, - 0x29, 0x0d, 0x7a, 0x1a, 0x46, 0x62, 0xe2, 0x6f, 0x5c, 0xf3, 0x82, 0x6d, 0x31, 0xb1, 0x95, 0x14, - 0x6e, 0x08, 0x38, 0x56, 0x14, 0x68, 0x11, 0xca, 0x6d, 0xcf, 0x15, 0x53, 0x59, 0x6e, 0xf8, 0xe5, - 0x9b, 0xab, 0xb5, 0xc3, 0xfd, 0xd9, 0x47, 0x8a, 0x12, 0xba, 0x52, 0x7b, 0x38, 0x9e, 0xa3, 0xcb, - 0x8f, 0x16, 0xce, 0x73, 0xa8, 0x0f, 0x1d, 0xd1, 0xa1, 0x7e, 0x09, 0x40, 0x7c, 0xb5, 0x9c, 0xcb, - 0xe5, 0x74, 0xd4, 0x2e, 0x2b, 0x0c, 0xd6, 0xa8, 0xa8, 0x55, 0xdd, 0x8c, 0x88, 0x23, 0x0d, 0x4f, - 0x1e, 0x0b, 0x3d, 0x72, 0xef, 0x56, 0xf5, 0x52, 0x96, 0x19, 0xee, 0xe4, 0x8f, 0x42, 0x98, 0x76, - 0xc5, 0x85, 0xcb, 0xb4, 0xd2, 0xca, 0xd1, 0x03, 0xb0, 0x59, 0x30, 0x4a, 0x96, 0x11, 0xee, 0xe4, - 0x8d, 0xde, 0x82, 0x19, 0x09, 0xec, 0xbc, 0xe3, 0xca, 0x96, 0x4b, 0x79, 0xf1, 0xfc, 0xc1, 0xfe, - 0xec, 0x4c, 0xad, 0x90, 0x0a, 0x77, 0xe1, 0x80, 0x30, 0x0c, 0xb1, 0x03, 0x98, 0xb8, 0x3a, 0xca, - 0xf6, 0xb9, 0x27, 0x8b, 0x43, 0xf6, 0xe9, 0x5c, 0x9f, 0x63, 0x87, 0x37, 0x22, 0x68, 0x35, 0x3d, - 0xcb, 0x62, 0x40, 0x2c, 0x38, 0xa1, 0x0d, 0x18, 0x75, 0x82, 0x20, 0x4c, 0x1c, 0xae, 0x42, 0x8d, - 0x15, 0xeb, 0x7e, 0x1a, 0xe3, 0x85, 0xb4, 0x04, 0xe7, 0xae, 0xe2, 0xe0, 0x34, 0x0c, 0xd6, 0x19, - 0xa3, 0x3b, 0x30, 0x19, 0xde, 0xa1, 0xc2, 0x51, 0x9e, 0x13, 0xc4, 0xd5, 0x71, 0x56, 0xd7, 0xf3, - 0x7d, 0x3a, 0x37, 0x8d, 0xc2, 0x9a, 0xd4, 0x32, 0x99, 0xe2, 0x6c, 0x2d, 0x68, 0xce, 0x70, 0xf1, - 0x4e, 0xa4, 0xc1, 0xd7, 0xa9, 0x8b, 0x57, 0xf7, 0xe8, 0xb2, 0x3b, 0xd3, 0x3c, 0x08, 0x93, 0xad, - 0xfe, 0xc9, 0xcc, 0x9d, 0xe9, 0x14, 0x85, 0x75, 0x3a, 0xb4, 0x05, 0x63, 0xe9, 0x39, 0x4f, 0x14, - 0xb3, 0x94, 0x2a, 0xa3, 0x97, 0x2e, 0xf5, 0xf7, 0x71, 0xab, 0x5a, 0x49, 0x7e, 0x59, 0x44, 0x87, - 0x60, 0x83, 0xf3, 0xcc, 0x27, 0x60, 0x54, 0x1b, 0xd8, 0xa3, 0xc4, 0x18, 0xcf, 0xbc, 0x02, 0x53, - 0xd9, 0xa1, 0x3b, 0x52, 0x8c, 0xf2, 0xff, 0x28, 0xc1, 0x64, 0xce, 0x71, 0x0f, 0x4b, 0x0a, 0x9b, - 0x11, 0xa8, 0x69, 0x0e, 0x58, 0x53, 0x2c, 0x96, 0xfa, 0x10, 0x8b, 0x52, 0x46, 0x97, 0x0b, 0x65, - 0xb4, 0x10, 0x85, 0x03, 0xef, 0x45, 0x14, 0x9a, 0xbb, 0xcf, 0x60, 0x5f, 0xbb, 0xcf, 0x31, 0x88, - 0x4f, 0x63, 0x03, 0x1b, 0xee, 0x63, 0x03, 0xfb, 0xc5, 0x12, 0x4c, 0xa5, 0xf1, 0xd8, 0x22, 0x05, - 0xf3, 0xfd, 0x3f, 0x24, 0x78, 0xd5, 0x38, 0x24, 0xc8, 0x4f, 0xb1, 0x9c, 0x69, 0x55, 0xe1, 0x81, - 0x01, 0xce, 0x1c, 0x18, 0x3c, 0xd9, 0x17, 0xb7, 0xee, 0x87, 0x07, 0x7f, 0xa7, 0x04, 0x67, 0xb2, - 0x45, 0x96, 0x7c, 0xc7, 0xdb, 0x39, 0x81, 0xbe, 0xb9, 0x61, 0xf4, 0xcd, 0x33, 0xfd, 0x7c, 0x0d, - 0x6b, 0x5a, 0x61, 0x07, 0xbd, 0x9e, 0xe9, 0xa0, 0xf9, 0xfe, 0x59, 0x76, 0xef, 0xa5, 0xef, 0x5a, - 0x70, 0x2e, 0xb7, 0xdc, 0x09, 0x78, 0x48, 0xaf, 0x9b, 0x1e, 0xd2, 0x27, 0xfa, 0xfe, 0xa6, 0x02, - 0x97, 0xe9, 0xd7, 0xca, 0x05, 0xdf, 0xc2, 0x7c, 0x4c, 0x37, 0x60, 0xd4, 0x69, 0x36, 0x49, 0x1c, - 0xaf, 0x85, 0xae, 0xca, 0xc1, 0xf4, 0x0c, 0xdb, 0x93, 0x52, 0xf0, 0xe1, 0xfe, 0xec, 0x4c, 0x96, - 0x45, 0x8a, 0xc6, 0x3a, 0x07, 0x33, 0xaf, 0x5b, 0xe9, 0x58, 0xf3, 0xba, 0x5d, 0x02, 0xd8, 0x55, - 0x56, 0x6d, 0xd6, 0x61, 0xa5, 0xd9, 0xbb, 0x1a, 0x15, 0xfa, 0x69, 0xa6, 0x2b, 0xf2, 0x38, 0x0b, - 0x7e, 0x32, 0xf0, 0x5c, 0x9f, 0x63, 0xa5, 0xc7, 0x6c, 0xf0, 0x5b, 0x9b, 0xca, 0xb9, 0xa7, 0x58, - 0xa2, 0xcf, 0xc0, 0x54, 0xcc, 0x13, 0x03, 0x2c, 0xf9, 0x4e, 0xcc, 0x2e, 0x13, 0x08, 0x99, 0xc8, - 0xae, 0x62, 0x36, 0x32, 0x38, 0xdc, 0x41, 0x6d, 0xff, 0x83, 0x32, 0x3c, 0xd8, 0x65, 0x8a, 0xa2, - 0x05, 0xf3, 0x5c, 0xf4, 0xa9, 0xac, 0x77, 0x67, 0x26, 0xb7, 0xb0, 0xe1, 0xee, 0xc9, 0x8c, 0x71, - 0xe9, 0x3d, 0x8f, 0xf1, 0x57, 0x2c, 0xcd, 0xef, 0xc6, 0xa3, 0x27, 0x3f, 0x75, 0xc4, 0xa5, 0xf7, - 0xe3, 0xea, 0x4c, 0xff, 0xa2, 0x05, 0x8f, 0xe4, 0x7e, 0x96, 0x11, 0x5f, 0x31, 0x0f, 0x95, 0x26, - 0x05, 0x6a, 0x17, 0x7e, 0xd2, 0x5b, 0x75, 0x12, 0x81, 0x53, 0x1a, 0x23, 0x8c, 0xa2, 0xd4, 0x33, - 0x8c, 0xe2, 0x9f, 0x59, 0x70, 0x3a, 0xdb, 0x88, 0x13, 0x90, 0x4c, 0xab, 0xa6, 0x64, 0xfa, 0x70, - 0x3f, 0x43, 0x5e, 0x20, 0x94, 0xfe, 0xdd, 0x04, 0x9c, 0xed, 0xd8, 0xb9, 0x78, 0xdf, 0xed, 0xc2, - 0xf4, 0x26, 0x53, 0xe1, 0xb5, 0xab, 0x54, 0xe2, 0x63, 0x72, 0x6f, 0x9d, 0x75, 0xbd, 0x77, 0xc5, - 0xcd, 0x90, 0x0e, 0x12, 0xdc, 0x59, 0x05, 0xfa, 0xa2, 0x05, 0xa7, 0x9d, 0x3b, 0x71, 0xc7, 0x3b, - 0x1d, 0x62, 0xce, 0x3c, 0x9f, 0xeb, 0x1d, 0xeb, 0xf1, 0xae, 0xc7, 0x62, 0xf5, 0x60, 0x7f, 0xf6, - 0x74, 0x1e, 0x15, 0xce, 0xad, 0x0b, 0x61, 0x91, 0x86, 0x8e, 0x6a, 0x39, 0x5d, 0x2e, 0xfb, 0xe5, - 0x5d, 0xc5, 0xe0, 0x32, 0x4a, 0x62, 0xb0, 0xe2, 0x83, 0x6e, 0x41, 0x65, 0x53, 0xde, 0x8f, 0x12, - 0x32, 0x30, 0x77, 0x53, 0xc9, 0xbd, 0x44, 0xc5, 0xc3, 0xdc, 0x15, 0x0a, 0xa7, 0xac, 0xd0, 0x2b, - 0x50, 0x0e, 0x36, 0x62, 0x71, 0xaf, 0x38, 0x3f, 0x28, 0xc6, 0x0c, 0x3b, 0xe2, 0x97, 0x32, 0xaf, - 0xaf, 0x34, 0x30, 0x2d, 0x48, 0xcb, 0x47, 0xb7, 0x5d, 0xe1, 0xd0, 0xcd, 0x2d, 0x8f, 0x17, 0x6b, - 0x9d, 0xe5, 0xf1, 0x62, 0x0d, 0xd3, 0x82, 0x68, 0x05, 0x06, 0xd9, 0xe5, 0x0c, 0xe1, 0xad, 0xcd, - 0xbd, 0x54, 0xde, 0x71, 0xf1, 0x84, 0xe7, 0x17, 0x64, 0x60, 0xcc, 0x8b, 0xa3, 0x57, 0x61, 0xa8, - 0xc9, 0x12, 0xcc, 0x0b, 0xd3, 0x3a, 0x3f, 0x51, 0x42, 0x47, 0x0a, 0x7a, 0x7e, 0x8e, 0xc4, 0xe1, - 0x58, 0x70, 0x60, 0xbc, 0x48, 0x6b, 0x6b, 0x23, 0x16, 0x16, 0x73, 0x3e, 0xaf, 0x8e, 0xc7, 0x00, - 0x04, 0x2f, 0x06, 0xc7, 0x82, 0x03, 0xfa, 0x24, 0x94, 0x36, 0x9a, 0xe2, 0x76, 0x46, 0xae, 0x6f, - 0xd6, 0xbc, 0x2f, 0xbb, 0x38, 0x74, 0xb0, 0x3f, 0x5b, 0x5a, 0x59, 0xc2, 0xa5, 0x8d, 0x26, 0xba, - 0x0e, 0xc3, 0x1b, 0xfc, 0x56, 0xa4, 0x48, 0x26, 0xfa, 0x78, 0xfe, 0x85, 0xcd, 0x8e, 0x8b, 0x93, - 0xfc, 0x3a, 0x82, 0x40, 0x60, 0xc9, 0x04, 0xad, 0x03, 0x6c, 0xa8, 0xdb, 0x9d, 0x22, 0x9b, 0xe8, - 0x87, 0xfb, 0xb9, 0x03, 0x2a, 0x8c, 0x46, 0x05, 0xc5, 0x1a, 0x1f, 0x3a, 0x33, 0x1d, 0xf9, 0xca, - 0x05, 0xcb, 0x24, 0x5a, 0x30, 0x33, 0x73, 0x9f, 0xc2, 0xe0, 0x33, 0x53, 0xa1, 0x70, 0xca, 0x0a, - 0x6d, 0xc3, 0xf8, 0x6e, 0xdc, 0xda, 0x22, 0x72, 0x31, 0xb2, 0xa4, 0xa2, 0xa6, 0x59, 0x99, 0x66, - 0x80, 0x15, 0x84, 0x5e, 0x94, 0xb4, 0x1d, 0xbf, 0x43, 0x7e, 0xb0, 0xa4, 0x58, 0xb7, 0x74, 0x66, - 0xd8, 0xe4, 0x4d, 0xbb, 0xfa, 0x9d, 0x76, 0x78, 0x7b, 0x2f, 0x21, 0x22, 0xd5, 0x68, 0x6e, 0x57, - 0xbf, 0xc6, 0x49, 0x3a, 0xbb, 0x5a, 0x20, 0xb0, 0x64, 0xa2, 0x3a, 0x85, 0xc9, 0xbd, 0xa9, 0x1e, - 0x9d, 0xd2, 0xd1, 0xde, 0xb4, 0x53, 0x98, 0x9c, 0x4b, 0x59, 0x31, 0xf9, 0xd6, 0xda, 0x0a, 0x93, - 0x30, 0xc8, 0xc8, 0xd6, 0xe9, 0x62, 0xf9, 0x56, 0xcf, 0xa1, 0xef, 0x94, 0x6f, 0x79, 0x54, 0x38, - 0xb7, 0x2e, 0xe4, 0xc2, 0x44, 0x2b, 0x8c, 0x92, 0x3b, 0x61, 0x24, 0xe7, 0x12, 0xea, 0x62, 0x28, - 0x19, 0x94, 0xa2, 0x46, 0x16, 0x80, 0x6a, 0x62, 0x70, 0x86, 0x27, 0x1d, 0x92, 0xb8, 0xe9, 0xf8, - 0x64, 0xf5, 0x46, 0xf5, 0x54, 0xf1, 0x90, 0x34, 0x38, 0x49, 0xe7, 0x90, 0x08, 0x04, 0x96, 0x4c, - 0xa8, 0xa4, 0x61, 0x59, 0xab, 0x59, 0x6e, 0xd4, 0x02, 0x49, 0xd3, 0x11, 0x9a, 0xc9, 0x25, 0x0d, - 0x03, 0x63, 0x5e, 0x1c, 0x7d, 0x1e, 0x2a, 0x42, 0xff, 0x0b, 0xe3, 0xea, 0x99, 0x0e, 0x6d, 0x34, - 0x6d, 0x19, 0x27, 0xba, 0xd1, 0xc8, 0xdf, 0x22, 0xc5, 0x0d, 0x2c, 0x49, 0x84, 0x53, 0xa6, 0xf6, - 0x97, 0x86, 0x3a, 0x35, 0x03, 0xa6, 0xe7, 0x7f, 0xc9, 0xea, 0x38, 0x2a, 0xfd, 0x58, 0xbf, 0xc6, - 0xe9, 0x31, 0x1e, 0x9a, 0x7e, 0xd1, 0x82, 0xb3, 0xad, 0xdc, 0x8f, 0x12, 0xdb, 0x6c, 0x7f, 0x36, - 0x2e, 0xef, 0x06, 0x95, 0x75, 0x38, 0x1f, 0x8f, 0x0b, 0x6a, 0xca, 0xea, 0xc3, 0xe5, 0xf7, 0xac, - 0x0f, 0xaf, 0xc1, 0x08, 0x53, 0xe5, 0xd2, 0x0c, 0x27, 0x7d, 0xa5, 0x05, 0x61, 0x1b, 0xf6, 0x92, - 0x28, 0x88, 0x15, 0x0b, 0xf4, 0xf3, 0x16, 0x3c, 0x9c, 0x6d, 0x3a, 0x26, 0x0c, 0x2d, 0x32, 0xe6, - 0x71, 0x13, 0x63, 0x45, 0x7c, 0xff, 0xc3, 0xf5, 0x6e, 0xc4, 0x87, 0xbd, 0x08, 0x70, 0xf7, 0xca, - 0x50, 0x2d, 0xc7, 0xc6, 0x19, 0x32, 0x4f, 0x52, 0x7a, 0xdb, 0x39, 0x27, 0xab, 0xa5, 0x7f, 0xdd, - 0xca, 0x51, 0x2f, 0xb9, 0x3d, 0xf5, 0xb2, 0x69, 0x4f, 0x3d, 0x96, 0xb5, 0xa7, 0x3a, 0xbc, 0x23, - 0x86, 0x29, 0xd5, 0x7f, 0x4e, 0xcf, 0x7e, 0x93, 0xb9, 0xd8, 0x3e, 0x5c, 0xe8, 0x25, 0x66, 0x59, - 0x88, 0x93, 0xab, 0xce, 0x15, 0xd3, 0x10, 0x27, 0x77, 0xb5, 0x86, 0x19, 0xa6, 0xdf, 0xbc, 0x01, - 0xf6, 0x7f, 0xb1, 0xa0, 0x5c, 0x0f, 0xdd, 0x13, 0xf0, 0xf6, 0x7c, 0xca, 0xf0, 0xf6, 0x3c, 0x58, - 0xf0, 0xb2, 0x5a, 0xa1, 0x6f, 0x67, 0x39, 0xe3, 0xdb, 0x79, 0xb8, 0x88, 0x41, 0x77, 0x4f, 0xce, - 0xdf, 0x2d, 0x83, 0xfe, 0x0e, 0x1c, 0xfa, 0x97, 0xf7, 0x12, 0xbc, 0x5a, 0xee, 0xf6, 0x34, 0x9c, - 0xe0, 0xcc, 0x22, 0xa3, 0xe4, 0xbd, 0xb8, 0x1f, 0xb3, 0x18, 0xd6, 0xd7, 0x89, 0xb7, 0xb9, 0x95, - 0x10, 0x37, 0xfb, 0x39, 0x27, 0x17, 0xc3, 0xfa, 0x1f, 0x2d, 0x98, 0xcc, 0xd4, 0x8e, 0xfc, 0xbc, - 0x4b, 0x36, 0xf7, 0xe8, 0xbf, 0x99, 0xee, 0x79, 0x2b, 0x67, 0x0e, 0x40, 0xb9, 0xd2, 0xa5, 0x8f, - 0x84, 0xe9, 0xae, 0xca, 0xd7, 0x1e, 0x63, 0x8d, 0x02, 0xbd, 0x00, 0xa3, 0x49, 0xd8, 0x0a, 0xfd, - 0x70, 0x73, 0xef, 0x2a, 0x91, 0x99, 0x2a, 0xd4, 0x81, 0xc7, 0x7a, 0x8a, 0xc2, 0x3a, 0x9d, 0xfd, - 0x6b, 0x65, 0xc8, 0xbe, 0x1d, 0xf8, 0x67, 0x73, 0xf2, 0x83, 0x39, 0x27, 0xbf, 0x67, 0xc1, 0x14, - 0xad, 0x9d, 0x45, 0xb4, 0xc8, 0x60, 0x53, 0x95, 0xfc, 0xdf, 0xea, 0x92, 0xfc, 0xff, 0x31, 0x2a, - 0xbb, 0xdc, 0xb0, 0x9d, 0x08, 0x5f, 0x8e, 0x26, 0x9c, 0x28, 0x14, 0x0b, 0xac, 0xa0, 0x23, 0x51, - 0x24, 0xae, 0xce, 0xe8, 0x74, 0x24, 0x8a, 0xb0, 0xc0, 0xca, 0xb7, 0x01, 0x06, 0x0a, 0xde, 0x06, - 0x60, 0x39, 0x9c, 0x44, 0x14, 0x85, 0x50, 0x0d, 0xb4, 0x1c, 0x4e, 0x32, 0xbc, 0x22, 0xa5, 0xb1, - 0xbf, 0x59, 0x86, 0xb1, 0x7a, 0xe8, 0xa6, 0x01, 0xe3, 0xcf, 0x1b, 0x01, 0xe3, 0x17, 0x32, 0x01, - 0xe3, 0x53, 0x3a, 0xed, 0xf1, 0xc4, 0x8b, 0x8b, 0x0c, 0x5f, 0xec, 0xa5, 0x8a, 0x7b, 0x8c, 0x15, - 0x37, 0x32, 0x7c, 0x29, 0x46, 0xd8, 0xe4, 0xfb, 0x93, 0x14, 0x23, 0xfe, 0xa7, 0x16, 0x4c, 0xd4, - 0x43, 0x97, 0x4e, 0xd0, 0x9f, 0xa4, 0xd9, 0xa8, 0x67, 0x08, 0x1b, 0xea, 0x92, 0x21, 0xec, 0xef, - 0x59, 0x30, 0x5c, 0x0f, 0xdd, 0x13, 0xf0, 0x73, 0xbe, 0x6c, 0xfa, 0x39, 0x1f, 0x28, 0x90, 0xb2, - 0x05, 0xae, 0xcd, 0xdf, 0x2a, 0xc3, 0x38, 0x6d, 0x67, 0xb8, 0x29, 0x47, 0xc9, 0xe8, 0x11, 0xab, - 0x8f, 0x1e, 0xa1, 0xca, 0x5c, 0xe8, 0xfb, 0xe1, 0x9d, 0xec, 0x88, 0xad, 0x30, 0x28, 0x16, 0x58, - 0xf4, 0x34, 0x8c, 0xb4, 0x22, 0xb2, 0xeb, 0x85, 0xed, 0x38, 0x7b, 0xf9, 0xae, 0x2e, 0xe0, 0x58, - 0x51, 0xa0, 0xe7, 0x61, 0x2c, 0xf6, 0x82, 0x26, 0x91, 0x91, 0x15, 0x03, 0x2c, 0xb2, 0x82, 0x27, - 0x59, 0xd4, 0xe0, 0xd8, 0xa0, 0x42, 0xaf, 0x43, 0x85, 0xfd, 0x67, 0xeb, 0xe6, 0xe8, 0xa9, 0xff, - 0xb9, 0xa9, 0x2a, 0x19, 0xe0, 0x94, 0x17, 0xba, 0x04, 0x90, 0xc8, 0x18, 0x90, 0x58, 0xdc, 0x0d, - 0x55, 0x1a, 0xa5, 0x8a, 0x0e, 0x89, 0xb1, 0x46, 0x85, 0x9e, 0x82, 0x4a, 0xe2, 0x78, 0xfe, 0x35, - 0x2f, 0x20, 0xb1, 0x88, 0xa1, 0x11, 0x89, 0x8b, 0x05, 0x10, 0xa7, 0x78, 0xba, 0xa3, 0xb3, 0x9b, - 0xc7, 0xfc, 0xe1, 0x90, 0x11, 0x46, 0xcd, 0x76, 0xf4, 0x6b, 0x0a, 0x8a, 0x35, 0x0a, 0xfb, 0x45, - 0x38, 0x53, 0x0f, 0xdd, 0x7a, 0x18, 0x25, 0x2b, 0x61, 0x74, 0xc7, 0x89, 0x5c, 0x39, 0x7e, 0xb3, - 0x32, 0x87, 0x2e, 0xdd, 0x75, 0x07, 0xb9, 0x5d, 0x6f, 0x64, 0xc7, 0x7d, 0x8e, 0xed, 0xe9, 0x47, - 0xbc, 0x94, 0xf0, 0x6f, 0x4a, 0x80, 0xea, 0x2c, 0x4a, 0xc5, 0x78, 0x5d, 0xe6, 0x2d, 0x98, 0x88, - 0xc9, 0x35, 0x2f, 0x68, 0xdf, 0x15, 0xac, 0xba, 0xdd, 0xf8, 0x68, 0x2c, 0xeb, 0x94, 0xdc, 0x37, - 0x62, 0xc2, 0x70, 0x86, 0x1b, 0xed, 0xc2, 0xa8, 0x1d, 0x2c, 0xc4, 0x37, 0x63, 0x12, 0x89, 0xd7, - 0x54, 0x58, 0x17, 0x62, 0x09, 0xc4, 0x29, 0x9e, 0x4e, 0x19, 0xf6, 0xe7, 0x7a, 0x18, 0xe0, 0x30, - 0x4c, 0xe4, 0x24, 0x63, 0xf9, 0xf8, 0x35, 0x38, 0x36, 0xa8, 0xd0, 0x0a, 0xa0, 0xb8, 0xdd, 0x6a, - 0xf9, 0xec, 0x50, 0xcf, 0xf1, 0x2f, 0x47, 0x61, 0xbb, 0xc5, 0xc3, 0x8c, 0x45, 0x2a, 0xfb, 0x46, - 0x07, 0x16, 0xe7, 0x94, 0xa0, 0x82, 0x61, 0x23, 0x66, 0xbf, 0xc5, 0xe5, 0x63, 0xee, 0x9b, 0x6c, - 0x30, 0x10, 0x96, 0x38, 0xfb, 0x0b, 0x6c, 0x33, 0x63, 0x8f, 0x60, 0x24, 0xed, 0x88, 0xa0, 0x1d, - 0x18, 0x6f, 0xb1, 0x0d, 0x2b, 0x89, 0x42, 0xdf, 0x27, 0x52, 0x6f, 0xbc, 0xb7, 0x88, 0x19, 0x9e, - 0x14, 0x5f, 0x67, 0x87, 0x4d, 0xee, 0xf6, 0x97, 0x26, 0x99, 0x5c, 0x6a, 0x70, 0xa3, 0x65, 0x58, - 0xc4, 0xc1, 0x0a, 0x0d, 0x6d, 0xa6, 0xf8, 0xd1, 0xa9, 0x54, 0xd2, 0x8b, 0x58, 0x5a, 0x2c, 0xcb, - 0xa2, 0xd7, 0x58, 0x7c, 0x36, 0x17, 0x06, 0xbd, 0x9e, 0xbb, 0xe3, 0x54, 0x46, 0x6c, 0xb6, 0x28, - 0x88, 0x35, 0x26, 0xe8, 0x1a, 0x8c, 0x8b, 0x37, 0x13, 0x84, 0x0b, 0xa1, 0x6c, 0x98, 0xbf, 0xe3, - 0x58, 0x47, 0x1e, 0x66, 0x01, 0xd8, 0x2c, 0x8c, 0x36, 0xe1, 0x61, 0xed, 0x85, 0x9f, 0x9c, 0xa8, - 0x2d, 0x2e, 0x5b, 0x1e, 0x39, 0xd8, 0x9f, 0x7d, 0x78, 0xbd, 0x1b, 0x21, 0xee, 0xce, 0x07, 0xdd, - 0x80, 0x33, 0x4e, 0x33, 0xf1, 0x76, 0x49, 0x8d, 0x38, 0xae, 0xef, 0x05, 0xc4, 0xbc, 0x8d, 0x7e, - 0xee, 0x60, 0x7f, 0xf6, 0xcc, 0x42, 0x1e, 0x01, 0xce, 0x2f, 0x87, 0x5e, 0x86, 0x8a, 0x1b, 0xc4, - 0xa2, 0x0f, 0x86, 0x8c, 0xc7, 0xab, 0x2a, 0xb5, 0xeb, 0x0d, 0xf5, 0xfd, 0xe9, 0x1f, 0x9c, 0x16, - 0x40, 0x9b, 0xfc, 0x91, 0x73, 0x65, 0x91, 0x0c, 0x77, 0xa4, 0x18, 0xc8, 0xda, 0xb6, 0xc6, 0xad, - 0x10, 0xee, 0x3f, 0x53, 0x31, 0x91, 0xc6, 0x85, 0x11, 0x83, 0x31, 0x7a, 0x15, 0x50, 0x4c, 0xa2, - 0x5d, 0xaf, 0x49, 0x16, 0x9a, 0x2c, 0x0b, 0x29, 0xf3, 0xba, 0x8c, 0x18, 0x01, 0xfe, 0xa8, 0xd1, - 0x41, 0x81, 0x73, 0x4a, 0xa1, 0x2b, 0x54, 0xa2, 0xe8, 0x50, 0x11, 0xc2, 0x2a, 0xd5, 0xbc, 0x6a, - 0x8d, 0xb4, 0x22, 0xd2, 0x74, 0x12, 0xe2, 0x9a, 0x1c, 0x71, 0xa6, 0x1c, 0xdd, 0x6f, 0x54, 0x72, - 0x77, 0x30, 0x03, 0x2f, 0x3b, 0x13, 0xbc, 0x53, 0x0b, 0x69, 0x2b, 0x8c, 0x93, 0xeb, 0x24, 0xb9, - 0x13, 0x46, 0xdb, 0x22, 0x13, 0x54, 0x9a, 0xfa, 0x2d, 0x45, 0x61, 0x9d, 0x8e, 0x6a, 0x44, 0xec, - 0xe8, 0x6a, 0xb5, 0xc6, 0xce, 0x19, 0x46, 0xd2, 0x75, 0x72, 0x85, 0x83, 0xb1, 0xc4, 0x4b, 0xd2, - 0xd5, 0xfa, 0x12, 0x3b, 0x3d, 0xc8, 0x90, 0xae, 0xd6, 0x97, 0xb0, 0xc4, 0x23, 0xd2, 0xf9, 0x30, - 0xd8, 0x44, 0xf1, 0x09, 0x4d, 0xa7, 0x5c, 0xee, 0xf3, 0x6d, 0xb0, 0x00, 0xa6, 0xd4, 0x93, 0x64, - 0x3c, 0x45, 0x56, 0x5c, 0x9d, 0x2c, 0x7e, 0x6d, 0x3d, 0x37, 0xbf, 0x96, 0xf2, 0xaa, 0xad, 0x66, - 0x38, 0xe1, 0x0e, 0xde, 0x46, 0x96, 0x83, 0xa9, 0x9e, 0xc9, 0xf9, 0xe7, 0xa1, 0x12, 0xb7, 0x6f, - 0xbb, 0xe1, 0x8e, 0xe3, 0x05, 0xcc, 0xed, 0xaf, 0x3f, 0x04, 0x2e, 0x11, 0x38, 0xa5, 0x41, 0x2b, - 0x30, 0xe2, 0xc8, 0x17, 0xf2, 0x51, 0xf1, 0xb5, 0x67, 0xf5, 0x34, 0x3e, 0xf3, 0x68, 0xaa, 0x37, - 0xf1, 0x55, 0x59, 0xf4, 0x12, 0x8c, 0x8b, 0x8b, 0x40, 0x22, 0x3e, 0xf0, 0x94, 0x19, 0x8f, 0xde, - 0xd0, 0x91, 0xd8, 0xa4, 0x45, 0x3f, 0x0d, 0x13, 0x94, 0x4b, 0x2a, 0xd8, 0xaa, 0xa7, 0xfb, 0x91, - 0x88, 0x5a, 0xd2, 0x65, 0xbd, 0x30, 0xce, 0x30, 0x43, 0x2e, 0x3c, 0xe4, 0xb4, 0x93, 0x70, 0x87, - 0xce, 0x70, 0x73, 0xfe, 0xaf, 0x87, 0xdb, 0x24, 0x60, 0x7e, 0xfa, 0x91, 0xc5, 0x0b, 0x07, 0xfb, - 0xb3, 0x0f, 0x2d, 0x74, 0xa1, 0xc3, 0x5d, 0xb9, 0xa0, 0x9b, 0x30, 0x9a, 0x84, 0xbe, 0x08, 0xec, - 0x8d, 0xab, 0x67, 0x8b, 0xb3, 0xb4, 0xac, 0x2b, 0x32, 0xdd, 0x9d, 0xa0, 0x8a, 0x62, 0x9d, 0x0f, - 0x5a, 0xe7, 0x6b, 0x8c, 0x25, 0xfb, 0x23, 0x71, 0xf5, 0x81, 0xe2, 0x8e, 0x51, 0x39, 0x01, 0xcd, - 0x25, 0x28, 0x4a, 0x62, 0x9d, 0x0d, 0xba, 0x0c, 0xd3, 0xad, 0xc8, 0x0b, 0xd9, 0xc4, 0x56, 0x2e, - 0xdf, 0xaa, 0x91, 0xbf, 0x6b, 0xba, 0x9e, 0x25, 0xc0, 0x9d, 0x65, 0xd0, 0x45, 0xaa, 0xa0, 0x72, - 0x60, 0xf5, 0x1c, 0x7f, 0xb4, 0x81, 0x2b, 0xa7, 0x1c, 0x86, 0x15, 0x76, 0xe6, 0xd3, 0x30, 0xdd, - 0x21, 0x29, 0x8f, 0x14, 0x64, 0xf9, 0xeb, 0x83, 0x50, 0x51, 0xee, 0x40, 0x34, 0x6f, 0x7a, 0x79, - 0xcf, 0x65, 0xbd, 0xbc, 0x23, 0x54, 0x5f, 0xd3, 0x1d, 0xbb, 0xeb, 0x39, 0xef, 0x4e, 0x5f, 0x28, - 0x10, 0x0d, 0xfd, 0xdf, 0x88, 0x3a, 0xc2, 0x9b, 0xdc, 0xa9, 0xc1, 0x38, 0xd0, 0xd5, 0x60, 0xec, - 0xf3, 0x0d, 0x38, 0x6a, 0x1a, 0xb6, 0x42, 0x77, 0xb5, 0x9e, 0x7d, 0x14, 0xa9, 0x4e, 0x81, 0x98, - 0xe3, 0x98, 0x72, 0x4f, 0xb7, 0x75, 0xa6, 0xdc, 0x0f, 0xdf, 0xa3, 0x72, 0x2f, 0x19, 0xe0, 0x94, - 0x17, 0xf2, 0x61, 0xba, 0x69, 0xbe, 0x67, 0xa5, 0x6e, 0x41, 0x3d, 0xda, 0xf3, 0x65, 0xa9, 0xb6, - 0xf6, 0xc8, 0xc5, 0x52, 0x96, 0x0b, 0xee, 0x64, 0x8c, 0x5e, 0x82, 0x91, 0x77, 0xc2, 0x98, 0x4d, - 0x3b, 0xb1, 0xb7, 0xc9, 0x7b, 0x27, 0x23, 0xaf, 0xdd, 0x68, 0x30, 0xf8, 0xe1, 0xfe, 0xec, 0x68, - 0x3d, 0x74, 0xe5, 0x5f, 0xac, 0x0a, 0xa0, 0xbb, 0x70, 0xc6, 0x90, 0x08, 0xaa, 0xb9, 0xd0, 0x7f, - 0x73, 0x1f, 0x16, 0xd5, 0x9d, 0x59, 0xcd, 0xe3, 0x84, 0xf3, 0x2b, 0xb0, 0xbf, 0xc5, 0x9d, 0x9e, - 0xc2, 0x35, 0x42, 0xe2, 0xb6, 0x7f, 0x12, 0x99, 0xec, 0x97, 0x0d, 0xaf, 0xcd, 0x3d, 0x3b, 0xd6, - 0x7f, 0xdf, 0x62, 0x8e, 0xf5, 0x75, 0xb2, 0xd3, 0xf2, 0x9d, 0xe4, 0x24, 0x42, 0x6b, 0x5f, 0x83, - 0x91, 0x44, 0xd4, 0xd6, 0x2d, 0xf9, 0xbe, 0xd6, 0x28, 0x76, 0xb8, 0xa0, 0x36, 0x44, 0x09, 0xc5, - 0x8a, 0x8d, 0xfd, 0x4f, 0xf8, 0x08, 0x48, 0xcc, 0x09, 0xf8, 0x16, 0x6a, 0xa6, 0x6f, 0x61, 0xb6, - 0xc7, 0x17, 0x14, 0xf8, 0x18, 0xfe, 0xb1, 0xd9, 0x6e, 0x66, 0x7b, 0x7c, 0xd0, 0x4f, 0x74, 0xec, - 0x5f, 0xb6, 0xe0, 0x74, 0xde, 0x91, 0x3e, 0x55, 0x62, 0xb8, 0xe5, 0xa3, 0x4e, 0xb8, 0x54, 0x0f, - 0xde, 0x12, 0x70, 0xac, 0x28, 0xfa, 0xce, 0x90, 0x7d, 0xb4, 0xcc, 0x44, 0x37, 0xc0, 0x7c, 0xfa, - 0x0c, 0xbd, 0xc2, 0x63, 0xe5, 0x2d, 0xf5, 0x36, 0xd9, 0xd1, 0xe2, 0xe4, 0xed, 0x6f, 0x94, 0xe0, - 0x34, 0x77, 0x51, 0x2f, 0xec, 0x86, 0x9e, 0x5b, 0x0f, 0x5d, 0x71, 0x73, 0xe0, 0x0d, 0x18, 0x6b, - 0x69, 0xe6, 0x6a, 0xb7, 0xdc, 0x28, 0xba, 0x59, 0x9b, 0x9a, 0x0d, 0x3a, 0x14, 0x1b, 0xbc, 0x90, - 0x0b, 0x63, 0x64, 0xd7, 0x6b, 0x2a, 0x3f, 0x67, 0xe9, 0xc8, 0x22, 0x5d, 0xd5, 0xb2, 0xac, 0xf1, - 0xc1, 0x06, 0xd7, 0xfb, 0xf0, 0x4c, 0x85, 0xfd, 0x55, 0x0b, 0x1e, 0x28, 0xc8, 0xa4, 0x42, 0xab, - 0xbb, 0xc3, 0x0e, 0x03, 0xc4, 0x3b, 0x7a, 0xaa, 0x3a, 0x7e, 0x44, 0x80, 0x05, 0x16, 0xfd, 0x14, - 0x00, 0x77, 0xf1, 0xb3, 0x57, 0xcb, 0x4b, 0xc5, 0x31, 0x4a, 0x1d, 0x09, 0x0d, 0xb4, 0x5b, 0xef, - 0xea, 0x9d, 0x72, 0x8d, 0x97, 0xfd, 0xab, 0x65, 0x18, 0xe4, 0x8f, 0x2a, 0xaf, 0xc0, 0xf0, 0x16, - 0xcf, 0xdb, 0xda, 0x4f, 0x8a, 0xd8, 0xd4, 0x1c, 0xe1, 0x00, 0x2c, 0x0b, 0xa3, 0x35, 0x38, 0x25, - 0x6e, 0xa7, 0xd4, 0x88, 0xef, 0xec, 0x49, 0xab, 0x96, 0xbf, 0x5d, 0x20, 0x13, 0x6f, 0x9f, 0x5a, - 0xed, 0x24, 0xc1, 0x79, 0xe5, 0xd0, 0x2b, 0x1d, 0xd9, 0xda, 0x78, 0xc6, 0x5b, 0xa5, 0x03, 0xf7, - 0xc8, 0xd8, 0xf6, 0x12, 0x8c, 0xb7, 0x3a, 0xec, 0x77, 0xed, 0x3d, 0x5b, 0xd3, 0x66, 0x37, 0x69, - 0x59, 0x7c, 0x40, 0x9b, 0x45, 0x43, 0xac, 0x6f, 0x45, 0x24, 0xde, 0x0a, 0x7d, 0x57, 0x3c, 0xde, - 0x98, 0xc6, 0x07, 0x64, 0xf0, 0xb8, 0xa3, 0x04, 0xe5, 0xb2, 0xe1, 0x78, 0x7e, 0x3b, 0x22, 0x29, - 0x97, 0x21, 0x93, 0xcb, 0x4a, 0x06, 0x8f, 0x3b, 0x4a, 0xd0, 0x79, 0x74, 0x46, 0xbc, 0xfc, 0x27, - 0xef, 0x2c, 0xab, 0xa0, 0x8f, 0x61, 0x19, 0x95, 0xde, 0x25, 0xd7, 0x85, 0x38, 0xf2, 0x57, 0x6f, - 0x07, 0x6a, 0x6f, 0x4a, 0x89, 0x78, 0x74, 0xc9, 0xe5, 0x5e, 0xde, 0x9f, 0xfb, 0x13, 0x0b, 0x4e, - 0xe5, 0x04, 0x82, 0x71, 0x51, 0xb5, 0xe9, 0xc5, 0x89, 0xca, 0xa9, 0xaf, 0x89, 0x2a, 0x0e, 0xc7, - 0x8a, 0x82, 0xae, 0x07, 0x2e, 0x0c, 0xb3, 0x02, 0x50, 0x04, 0x6f, 0x08, 0xec, 0xd1, 0x04, 0x20, - 0xba, 0x00, 0x03, 0xed, 0x98, 0x44, 0xf2, 0xd1, 0x36, 0x29, 0xbf, 0x99, 0x47, 0x90, 0x61, 0xa8, - 0x46, 0xb9, 0xa9, 0x9c, 0x71, 0x9a, 0x46, 0xc9, 0xdd, 0x71, 0x1c, 0x67, 0x7f, 0xa5, 0x0c, 0x93, - 0x99, 0xb0, 0x4d, 0xda, 0x90, 0x9d, 0x30, 0xf0, 0x92, 0x50, 0x25, 0x0b, 0xe3, 0x6f, 0x4c, 0x91, - 0xd6, 0xd6, 0x9a, 0x80, 0x63, 0x45, 0x81, 0x1e, 0x33, 0x5f, 0xce, 0x4f, 0xdb, 0xbc, 0x58, 0x33, - 0x1e, 0xf4, 0xec, 0xf7, 0x4d, 0x8f, 0x47, 0x61, 0xa0, 0x15, 0xaa, 0xa7, 0x96, 0xd5, 0x78, 0xe2, - 0xc5, 0x5a, 0x3d, 0x0c, 0x7d, 0xcc, 0x90, 0xe8, 0x23, 0xe2, 0xeb, 0x33, 0xe7, 0x15, 0xd8, 0x71, - 0xc3, 0x58, 0xeb, 0x82, 0x27, 0x60, 0x78, 0x9b, 0xec, 0x45, 0x5e, 0xb0, 0x99, 0x3d, 0xad, 0xb9, - 0xca, 0xc1, 0x58, 0xe2, 0xcd, 0x14, 0xdb, 0xc3, 0xf7, 0xe5, 0xdd, 0x8e, 0x91, 0x9e, 0xbb, 0xda, - 0x6f, 0x59, 0x30, 0xc9, 0x12, 0x73, 0x8a, 0xdb, 0xf1, 0x5e, 0x18, 0x9c, 0x80, 0x9e, 0xf0, 0x28, - 0x0c, 0x46, 0xb4, 0xd2, 0x6c, 0x32, 0x7e, 0xd6, 0x12, 0xcc, 0x71, 0xe8, 0x21, 0x18, 0x60, 0x4d, - 0xa0, 0x83, 0x37, 0xc6, 0x53, 0x73, 0xd7, 0x9c, 0xc4, 0xc1, 0x0c, 0xca, 0xae, 0x29, 0x61, 0xd2, - 0xf2, 0x3d, 0xde, 0xe8, 0xd4, 0xdd, 0xfa, 0xc1, 0xb8, 0xa6, 0x94, 0xdb, 0xb4, 0xf7, 0x76, 0x4d, - 0x29, 0x9f, 0x65, 0x77, 0x1d, 0xfc, 0xbf, 0x96, 0xe0, 0x7c, 0x6e, 0xb9, 0xf4, 0x64, 0x77, 0xc5, - 0x38, 0xd9, 0xbd, 0x94, 0x39, 0xd9, 0xb5, 0xbb, 0x97, 0x3e, 0x9e, 0xb3, 0xde, 0xfc, 0x23, 0xd8, - 0xf2, 0x09, 0x1e, 0xc1, 0x0e, 0xf4, 0xab, 0xa6, 0x0c, 0xf6, 0x50, 0x53, 0xbe, 0x6b, 0xc1, 0xb9, - 0xdc, 0x2e, 0xfb, 0x80, 0xdc, 0x0b, 0xcb, 0x6d, 0x5b, 0x81, 0x0d, 0xf1, 0xa3, 0x52, 0xc1, 0xb7, - 0x30, 0x6b, 0xe2, 0x22, 0x95, 0x33, 0x0c, 0x19, 0x0b, 0xb5, 0x6b, 0x8c, 0xcb, 0x18, 0x0e, 0xc3, - 0x0a, 0x8b, 0x3c, 0xed, 0x86, 0x15, 0x6f, 0xda, 0x4b, 0x47, 0x5a, 0x32, 0x73, 0xa6, 0x77, 0x5c, - 0xbf, 0xca, 0x9f, 0xbd, 0x6d, 0xb5, 0xa6, 0x59, 0x80, 0xe5, 0xfe, 0x2d, 0xc0, 0xb1, 0x7c, 0xeb, - 0x0f, 0x2d, 0xc0, 0xe4, 0x8e, 0x17, 0xb0, 0x07, 0x33, 0x4d, 0xbd, 0x47, 0x5d, 0x4b, 0x5d, 0x33, - 0xd1, 0x38, 0x4b, 0x3f, 0xf3, 0x12, 0x8c, 0xdf, 0xbb, 0xcb, 0xea, 0x7b, 0x65, 0x78, 0xb0, 0xcb, - 0xb2, 0xe7, 0xb2, 0xde, 0x18, 0x03, 0x4d, 0xd6, 0x77, 0x8c, 0x43, 0x1d, 0x4e, 0x6f, 0xb4, 0x7d, - 0x7f, 0x8f, 0x45, 0x39, 0x11, 0x57, 0x52, 0x08, 0xc5, 0x44, 0x65, 0xdd, 0x5d, 0xc9, 0xa1, 0xc1, - 0xb9, 0x25, 0xd1, 0xab, 0x80, 0xc2, 0xdb, 0x2c, 0x13, 0xac, 0x9b, 0x26, 0x28, 0x60, 0x1d, 0x5f, - 0x4e, 0x17, 0xe3, 0x8d, 0x0e, 0x0a, 0x9c, 0x53, 0x8a, 0x6a, 0x98, 0xec, 0x99, 0x6f, 0xd5, 0xac, - 0x8c, 0x86, 0x89, 0x75, 0x24, 0x36, 0x69, 0xd1, 0x65, 0x98, 0x76, 0x76, 0x1d, 0x8f, 0x27, 0x95, - 0x92, 0x0c, 0xb8, 0x8a, 0xa9, 0x1c, 0x45, 0x0b, 0x59, 0x02, 0xdc, 0x59, 0x06, 0x6d, 0x18, 0x5e, - 0x3e, 0x9e, 0x64, 0xfe, 0x52, 0xdf, 0xb3, 0xb5, 0x6f, 0xbf, 0x9f, 0xfd, 0x1f, 0x2c, 0xba, 0x7d, - 0xe5, 0xbc, 0xd0, 0x48, 0xfb, 0x41, 0xf9, 0xaf, 0xb4, 0xdb, 0x61, 0xaa, 0x1f, 0x96, 0x74, 0x24, - 0x36, 0x69, 0xf9, 0x84, 0x88, 0xd3, 0x70, 0x69, 0x43, 0x4f, 0x14, 0xd7, 0x29, 0x15, 0x05, 0xfa, - 0x2c, 0x0c, 0xbb, 0xde, 0xae, 0x17, 0x87, 0x91, 0x58, 0x2c, 0x47, 0x7d, 0x99, 0x58, 0xc9, 0xc1, - 0x1a, 0x67, 0x83, 0x25, 0x3f, 0xfb, 0x2b, 0x25, 0x18, 0x97, 0x35, 0xbe, 0xd6, 0x0e, 0x13, 0xe7, - 0x04, 0xb6, 0xe5, 0xcb, 0xc6, 0xb6, 0xfc, 0x91, 0x6e, 0x77, 0x4a, 0x59, 0x93, 0x0a, 0xb7, 0xe3, - 0x1b, 0x99, 0xed, 0xf8, 0xf1, 0xde, 0xac, 0xba, 0x6f, 0xc3, 0xbf, 0x6b, 0xc1, 0xb4, 0x41, 0x7f, - 0x02, 0xbb, 0xc1, 0x8a, 0xb9, 0x1b, 0x3c, 0xd2, 0xf3, 0x1b, 0x0a, 0x76, 0x81, 0xaf, 0x97, 0x32, - 0x6d, 0x67, 0xd2, 0xff, 0x1d, 0x18, 0xd8, 0x72, 0x22, 0xb7, 0x5b, 0x6a, 0xc4, 0x8e, 0x42, 0x73, - 0x57, 0x9c, 0xc8, 0xe5, 0x32, 0xfc, 0x69, 0xf5, 0xba, 0x94, 0x13, 0xb9, 0x3d, 0x6f, 0x07, 0xb0, - 0xaa, 0xd0, 0x8b, 0x30, 0x14, 0x37, 0xc3, 0x96, 0x8a, 0xbd, 0xbc, 0xc0, 0x5f, 0x9e, 0xa2, 0x90, - 0xc3, 0xfd, 0x59, 0x64, 0x56, 0x47, 0xc1, 0x58, 0xd0, 0xcf, 0x6c, 0x42, 0x45, 0x55, 0x7d, 0x5f, - 0xa3, 0xca, 0xff, 0xa8, 0x0c, 0xa7, 0x72, 0xe6, 0x05, 0x8a, 0x8d, 0xde, 0x7a, 0xb6, 0xcf, 0xe9, - 0xf4, 0x1e, 0xfb, 0x2b, 0x66, 0x16, 0x8b, 0x2b, 0xc6, 0xbf, 0xef, 0x4a, 0x6f, 0xc6, 0x24, 0x5b, - 0x29, 0x05, 0xf5, 0xae, 0x94, 0x56, 0x76, 0x62, 0x5d, 0x4d, 0x2b, 0x52, 0x2d, 0xbd, 0xaf, 0x63, - 0xfa, 0x3f, 0xcb, 0x70, 0x3a, 0xef, 0x2a, 0x3a, 0xfa, 0xd9, 0xcc, 0xcb, 0x07, 0xcf, 0xf7, 0x7b, - 0x89, 0x9d, 0x3f, 0x87, 0x20, 0x32, 0xbc, 0xcc, 0x99, 0x6f, 0x21, 0xf4, 0xec, 0x66, 0x51, 0x27, - 0xbb, 0xae, 0x13, 0xf1, 0x17, 0x2b, 0xe4, 0x12, 0xff, 0x58, 0xdf, 0x0d, 0x10, 0x4f, 0x5d, 0xc4, - 0x99, 0xeb, 0x3a, 0x12, 0xdc, 0xfb, 0xba, 0x8e, 0xac, 0x79, 0xc6, 0x83, 0x51, 0xed, 0x6b, 0xee, - 0xeb, 0x88, 0x6f, 0xd3, 0x1d, 0x45, 0x6b, 0xf7, 0x7d, 0x1d, 0xf5, 0xaf, 0x5a, 0x90, 0x89, 0x93, - 0x52, 0xfe, 0x0f, 0xab, 0xd0, 0xff, 0x71, 0x01, 0x06, 0xa2, 0xd0, 0x27, 0xd9, 0x64, 0xf8, 0x38, - 0xf4, 0x09, 0x66, 0x18, 0xf5, 0x52, 0x6c, 0xb9, 0xe8, 0xa5, 0x58, 0x6a, 0x1a, 0xfb, 0x64, 0x97, - 0x48, 0x6f, 0x84, 0x92, 0xc9, 0xd7, 0x28, 0x10, 0x73, 0x9c, 0xfd, 0x1b, 0x03, 0x70, 0x2a, 0xe7, - 0x72, 0x1a, 0x35, 0x54, 0x36, 0x9d, 0x84, 0xdc, 0x71, 0xf6, 0xb2, 0xf9, 0x40, 0x2f, 0x73, 0x30, - 0x96, 0x78, 0x16, 0xcb, 0xc9, 0xd3, 0x95, 0x65, 0x7c, 0x44, 0x22, 0x4b, 0x99, 0xc0, 0xde, 0xaf, - 0xd7, 0x45, 0x2f, 0x01, 0xc4, 0xb1, 0xbf, 0x1c, 0x50, 0xe5, 0xcb, 0x15, 0x91, 0xa2, 0x69, 0x6e, - 0xbb, 0xc6, 0x35, 0x81, 0xc1, 0x1a, 0x15, 0xaa, 0xc1, 0x54, 0x2b, 0x0a, 0x13, 0xee, 0x77, 0xab, - 0xf1, 0x18, 0x85, 0x41, 0xf3, 0x9a, 0x51, 0x3d, 0x83, 0xc7, 0x1d, 0x25, 0xd0, 0x0b, 0x30, 0x2a, - 0xae, 0x1e, 0xd5, 0xc3, 0xd0, 0x17, 0x5e, 0x1a, 0x75, 0xe2, 0xdd, 0x48, 0x51, 0x58, 0xa7, 0xd3, - 0x8a, 0x31, 0x67, 0xde, 0x70, 0x6e, 0x31, 0xee, 0xd0, 0xd3, 0xe8, 0x32, 0x19, 0x29, 0x46, 0xfa, - 0xca, 0x48, 0x91, 0xfa, 0xad, 0x2a, 0x7d, 0x9f, 0x5f, 0x40, 0x4f, 0x4f, 0xcf, 0xb7, 0xca, 0x30, - 0xc4, 0x87, 0xe2, 0x04, 0x54, 0xb1, 0x15, 0xe1, 0xbb, 0xe9, 0x92, 0x07, 0x80, 0xb7, 0x65, 0xae, - 0xe6, 0x24, 0x0e, 0x17, 0x43, 0x6a, 0x35, 0xa4, 0x5e, 0x1e, 0x34, 0x67, 0xac, 0x97, 0x99, 0x8c, - 0x73, 0x02, 0x38, 0x0f, 0x6d, 0xf5, 0xbc, 0x05, 0x10, 0xb3, 0x17, 0x2e, 0x29, 0x0f, 0x91, 0xb7, - 0xf4, 0xc9, 0x2e, 0xb5, 0x37, 0x14, 0x31, 0x6f, 0x43, 0x3a, 0x05, 0x15, 0x02, 0x6b, 0x1c, 0x67, - 0x3e, 0x0e, 0x15, 0x45, 0xdc, 0xcb, 0x92, 0x1b, 0xd3, 0x85, 0xd7, 0xa7, 0x60, 0x32, 0x53, 0xd7, - 0x91, 0x0c, 0xc1, 0xdf, 0xb6, 0x60, 0x32, 0xf3, 0x5c, 0x3e, 0x7a, 0x17, 0x4e, 0xfb, 0x39, 0x8b, - 0x4e, 0x8c, 0x68, 0xff, 0x8b, 0x54, 0x19, 0x7e, 0x79, 0x58, 0x9c, 0x5b, 0x07, 0x35, 0xfe, 0xf9, - 0xdb, 0xbc, 0x8e, 0x2f, 0x22, 0x90, 0xc7, 0x78, 0xce, 0x65, 0x0e, 0xc3, 0x0a, 0x6b, 0x7f, 0xdf, - 0x82, 0xe9, 0x8e, 0x87, 0xdb, 0xdf, 0xd7, 0xb6, 0x8b, 0x94, 0xd2, 0xa5, 0x82, 0x94, 0xd2, 0xfa, - 0xa7, 0x95, 0xbb, 0x7e, 0xda, 0x37, 0x2c, 0x10, 0x33, 0xf0, 0x04, 0xd4, 0xf9, 0x4f, 0x9b, 0xea, - 0xfc, 0x4c, 0xf1, 0xa4, 0x2e, 0xd0, 0xe3, 0xff, 0xd4, 0x82, 0x29, 0x4e, 0x90, 0x1e, 0x5e, 0xbc, - 0xaf, 0xe3, 0xd0, 0xcf, 0xc3, 0x23, 0xea, 0xa5, 0xc7, 0xfc, 0x8f, 0x32, 0x06, 0x6b, 0xa0, 0xeb, - 0x60, 0xfd, 0x67, 0x0b, 0x10, 0xff, 0xfc, 0xec, 0x73, 0xc5, 0x7c, 0x53, 0xd2, 0x4c, 0xed, 0x54, - 0x08, 0x28, 0x0c, 0xd6, 0xa8, 0x8e, 0xa5, 0xe1, 0x99, 0xb3, 0xa1, 0x72, 0xef, 0xb3, 0xa1, 0x23, - 0x7c, 0xeb, 0x5f, 0x19, 0x80, 0x6c, 0x20, 0x22, 0xba, 0x05, 0x63, 0x4d, 0xa7, 0xe5, 0xdc, 0xf6, - 0x7c, 0x2f, 0xf1, 0x48, 0xdc, 0xed, 0x50, 0x79, 0x49, 0xa3, 0x13, 0x07, 0x31, 0x1a, 0x04, 0x1b, - 0x7c, 0xd0, 0x1c, 0x40, 0x2b, 0xf2, 0x76, 0x3d, 0x9f, 0x6c, 0x32, 0x5b, 0x83, 0xdd, 0x46, 0xe0, - 0x27, 0xa5, 0x12, 0x8a, 0x35, 0x8a, 0x9c, 0xe8, 0xf5, 0xf2, 0xfd, 0x8b, 0x5e, 0x1f, 0x38, 0x62, - 0xf4, 0xfa, 0x60, 0x5f, 0xd1, 0xeb, 0x18, 0xce, 0xca, 0x5d, 0x95, 0xfe, 0x5f, 0xf1, 0x7c, 0x22, - 0x54, 0x29, 0x7e, 0x47, 0x61, 0xe6, 0x60, 0x7f, 0xf6, 0x2c, 0xce, 0xa5, 0xc0, 0x05, 0x25, 0xd1, - 0x4f, 0x41, 0xd5, 0xf1, 0xfd, 0xf0, 0x8e, 0xea, 0xb5, 0xe5, 0xb8, 0xe9, 0xf8, 0x69, 0x2a, 0xd0, - 0x91, 0xc5, 0x87, 0x0e, 0xf6, 0x67, 0xab, 0x0b, 0x05, 0x34, 0xb8, 0xb0, 0xb4, 0xbd, 0x0d, 0xa7, - 0x1a, 0x24, 0x92, 0xaf, 0x67, 0xa9, 0xd5, 0xb7, 0x0e, 0x95, 0x28, 0xb3, 0xdc, 0xfb, 0xba, 0x92, - 0xae, 0x25, 0xe0, 0x92, 0xcb, 0x3b, 0x65, 0x64, 0xff, 0x6f, 0x0b, 0x86, 0x45, 0x70, 0xe3, 0x09, - 0x68, 0x19, 0x0b, 0x86, 0xc3, 0x67, 0x36, 0x5f, 0x24, 0xb2, 0xc6, 0x14, 0xba, 0x7a, 0x56, 0x33, - 0xae, 0x9e, 0x47, 0xba, 0x31, 0xe9, 0xee, 0xe4, 0xf9, 0xa5, 0x32, 0x4c, 0x98, 0x81, 0x9d, 0x27, - 0xd0, 0x05, 0xd7, 0x61, 0x38, 0x16, 0x51, 0xc4, 0xa5, 0xe2, 0x68, 0xb4, 0xec, 0x20, 0xa6, 0x67, - 0xd6, 0x22, 0x6e, 0x58, 0x32, 0xc9, 0x0d, 0x4f, 0x2e, 0xdf, 0xc7, 0xf0, 0xe4, 0x5e, 0xb1, 0xb5, - 0x03, 0xc7, 0x11, 0x5b, 0x6b, 0x7f, 0x9b, 0x09, 0x7f, 0x1d, 0x7e, 0x02, 0x3b, 0xf6, 0x65, 0x73, - 0x9b, 0xb0, 0xbb, 0xcc, 0x2c, 0xd1, 0xa8, 0x82, 0x9d, 0xfb, 0x1f, 0x5a, 0x30, 0x2a, 0x08, 0x4f, - 0xa0, 0xd9, 0x9f, 0x31, 0x9b, 0xfd, 0x60, 0x97, 0x66, 0x17, 0xb4, 0xf7, 0x6f, 0x95, 0x54, 0x7b, - 0xeb, 0xe2, 0x61, 0xf9, 0x9e, 0xa9, 0xa1, 0x47, 0xa8, 0x9d, 0x16, 0x36, 0x43, 0x5f, 0xe8, 0x65, - 0x0f, 0xa5, 0xd7, 0xd4, 0x38, 0xfc, 0x50, 0xfb, 0x8d, 0x15, 0x35, 0xbb, 0x45, 0x15, 0x46, 0x89, - 0xd8, 0x40, 0xf3, 0x9e, 0xb5, 0x77, 0x01, 0xd2, 0xd7, 0xc1, 0xc5, 0xbd, 0xce, 0xa3, 0x3f, 0x98, - 0x9f, 0xde, 0x3b, 0x53, 0xbc, 0xb0, 0xc6, 0x57, 0x5e, 0x7c, 0x60, 0x75, 0x0c, 0x9a, 0x27, 0x31, - 0xd7, 0x05, 0x1c, 0x2b, 0x0a, 0xfb, 0xe3, 0x4c, 0x26, 0xb3, 0x0e, 0x3a, 0xda, 0x95, 0xb0, 0xff, - 0x35, 0xa4, 0xba, 0x96, 0xb9, 0x61, 0x6b, 0xfa, 0xc5, 0xb3, 0xee, 0x22, 0x90, 0x56, 0xac, 0x07, - 0xf9, 0xa6, 0xb7, 0xd3, 0xd0, 0xe7, 0x3a, 0x0e, 0xe8, 0x9e, 0xe9, 0x21, 0x4b, 0x8f, 0x70, 0x24, - 0xc7, 0x32, 0xdd, 0xb1, 0x8c, 0x60, 0xab, 0xf5, 0x6c, 0xf2, 0xee, 0x25, 0x89, 0xc0, 0x29, 0x0d, - 0x9a, 0x17, 0x36, 0x1f, 0x77, 0x80, 0x3c, 0x98, 0xb1, 0xf9, 0xe4, 0xe7, 0x6b, 0x46, 0xdf, 0xb3, - 0x30, 0xaa, 0x1e, 0x2d, 0xa9, 0xf3, 0x77, 0x25, 0x2a, 0x5c, 0x97, 0x5a, 0x4e, 0xc1, 0x58, 0xa7, - 0x41, 0xeb, 0x30, 0x19, 0xf3, 0x17, 0x55, 0xe4, 0x5d, 0x04, 0x61, 0xd1, 0x3f, 0x99, 0x79, 0x87, - 0x5c, 0xa2, 0x0f, 0x19, 0x88, 0x2f, 0x56, 0x79, 0x7b, 0x21, 0xcb, 0x02, 0xbd, 0x02, 0x13, 0xbe, - 0xfe, 0xd4, 0x63, 0x5d, 0x18, 0xfc, 0x2a, 0xc8, 0xca, 0x78, 0x08, 0xb2, 0x8e, 0x33, 0xd4, 0x54, - 0x09, 0xd0, 0x21, 0x22, 0x49, 0x8d, 0x13, 0x6c, 0x92, 0x58, 0x3c, 0xe7, 0xc0, 0x94, 0x80, 0x6b, - 0x05, 0x34, 0xb8, 0xb0, 0x34, 0x7a, 0x11, 0xc6, 0xe4, 0xe7, 0x6b, 0x77, 0x73, 0xd2, 0x50, 0x3e, - 0x0d, 0x87, 0x0d, 0x4a, 0x74, 0x07, 0xce, 0xc8, 0xff, 0xeb, 0x91, 0xb3, 0xb1, 0xe1, 0x35, 0xc5, - 0xd5, 0xa8, 0x51, 0xc6, 0x62, 0x41, 0xc6, 0x35, 0x2f, 0xe7, 0x11, 0x1d, 0xee, 0xcf, 0x5e, 0x10, - 0xbd, 0x96, 0x8b, 0x67, 0x83, 0x98, 0xcf, 0x1f, 0xad, 0xc1, 0xa9, 0x2d, 0xe2, 0xf8, 0xc9, 0xd6, - 0xd2, 0x16, 0x69, 0x6e, 0xcb, 0x45, 0xc4, 0x6e, 0xfc, 0x68, 0x01, 0x70, 0x57, 0x3a, 0x49, 0x70, - 0x5e, 0xb9, 0xf7, 0x76, 0x0e, 0xfb, 0x0e, 0x2d, 0xac, 0xe9, 0x00, 0xe8, 0xf3, 0x30, 0xa6, 0xf7, - 0xb5, 0x10, 0xc3, 0x8f, 0xf5, 0x7a, 0xfc, 0x53, 0x68, 0x10, 0xaa, 0xdf, 0x75, 0x1c, 0x36, 0x38, - 0xda, 0xff, 0xbc, 0x04, 0xb3, 0x3d, 0xb2, 0x3c, 0x65, 0x9c, 0x4b, 0x56, 0x5f, 0xce, 0xa5, 0x05, - 0xf9, 0xb8, 0xc7, 0xf5, 0x4c, 0xea, 0xe8, 0xcc, 0xc3, 0x1d, 0x69, 0x02, 0xe9, 0x2c, 0x7d, 0xdf, - 0x71, 0x55, 0xba, 0x7f, 0x6a, 0xa0, 0x67, 0x78, 0x59, 0x5d, 0x77, 0x34, 0x0e, 0xf6, 0xaf, 0x90, - 0x16, 0xfa, 0x18, 0xed, 0x6f, 0x97, 0xe0, 0x8c, 0xea, 0xc2, 0x9f, 0xdc, 0x8e, 0xbb, 0xd9, 0xd9, - 0x71, 0xc7, 0xe0, 0xa1, 0xb5, 0x6f, 0xc0, 0x50, 0x63, 0x2f, 0x6e, 0x26, 0x7e, 0x1f, 0xfb, 0xf7, - 0xa3, 0xc6, 0xca, 0x49, 0x77, 0x19, 0xf6, 0x86, 0x96, 0x58, 0x48, 0xf6, 0x5f, 0xb4, 0x60, 0x72, - 0x7d, 0xa9, 0xde, 0x08, 0x9b, 0xdb, 0x24, 0x59, 0xe0, 0xfe, 0x07, 0x2c, 0xb6, 0x6f, 0xeb, 0x1e, - 0xb7, 0xe5, 0xbc, 0x0d, 0xff, 0x02, 0x0c, 0x6c, 0x85, 0x71, 0x92, 0xf5, 0xc2, 0x5f, 0x09, 0xe3, - 0x04, 0x33, 0x8c, 0xfd, 0xc7, 0x16, 0x0c, 0xb2, 0x67, 0xa3, 0x7a, 0x3d, 0x2f, 0xd6, 0xcf, 0x77, - 0xa1, 0x17, 0x60, 0x88, 0x6c, 0x6c, 0x90, 0x66, 0x22, 0x46, 0x55, 0x5e, 0xf5, 0x18, 0x5a, 0x66, - 0x50, 0xba, 0x67, 0xb1, 0xca, 0xf8, 0x5f, 0x2c, 0x88, 0xd1, 0xe7, 0xa0, 0x92, 0x78, 0x3b, 0x64, - 0xc1, 0x75, 0x85, 0x03, 0xfc, 0x68, 0xb1, 0x4e, 0x6a, 0x0f, 0x5d, 0x97, 0x4c, 0x70, 0xca, 0xcf, - 0xfe, 0x85, 0x12, 0x40, 0x7a, 0x25, 0xac, 0xd7, 0x67, 0x2e, 0x76, 0xbc, 0xa2, 0xf6, 0x58, 0xce, - 0x2b, 0x6a, 0x28, 0x65, 0x98, 0xf3, 0x86, 0x9a, 0xea, 0xaa, 0x72, 0x5f, 0x5d, 0x35, 0x70, 0x94, - 0xae, 0x5a, 0x82, 0xe9, 0xf4, 0x4a, 0x9b, 0x79, 0xbf, 0x97, 0x65, 0x6f, 0x5d, 0xcf, 0x22, 0x71, - 0x27, 0xbd, 0xfd, 0x65, 0x0b, 0x44, 0xfc, 0x6b, 0x1f, 0x13, 0xfa, 0x0d, 0xf9, 0x98, 0x92, 0x91, - 0x7a, 0xee, 0x42, 0x71, 0x40, 0xb0, 0x48, 0x38, 0xa7, 0x24, 0xbb, 0x91, 0x66, 0xce, 0xe0, 0x65, - 0xff, 0xae, 0x05, 0xa3, 0x1c, 0xbd, 0xc6, 0x8c, 0xc4, 0xde, 0xad, 0x39, 0x52, 0xee, 0x5f, 0xf6, - 0xce, 0x10, 0x65, 0xac, 0x52, 0xc4, 0xea, 0xef, 0x0c, 0x49, 0x04, 0x4e, 0x69, 0xd0, 0x13, 0x30, - 0x1c, 0xb7, 0x6f, 0x33, 0xf2, 0x4c, 0x08, 0x6c, 0x83, 0x83, 0xb1, 0xc4, 0xd3, 0x79, 0x35, 0x95, - 0x8d, 0x80, 0x46, 0x57, 0x60, 0x88, 0x8b, 0x0d, 0xb1, 0x8c, 0xbb, 0xb8, 0xfb, 0xb5, 0xb8, 0x69, - 0xe0, 0xaf, 0x49, 0x33, 0x71, 0x23, 0xca, 0xa3, 0x37, 0x61, 0xd4, 0x0d, 0xef, 0x04, 0x77, 0x9c, - 0xc8, 0x5d, 0xa8, 0xaf, 0x8a, 0x5e, 0xcf, 0x8d, 0x63, 0xab, 0xa5, 0x64, 0x7a, 0x2c, 0x36, 0x73, - 0xa0, 0xa5, 0x28, 0xac, 0xb3, 0x43, 0xeb, 0x2c, 0xcb, 0xc6, 0x86, 0xb7, 0xb9, 0xe6, 0xb4, 0xba, - 0x45, 0x76, 0x2c, 0x49, 0x22, 0x8d, 0xf3, 0xb8, 0x48, 0xc5, 0xc1, 0x11, 0x38, 0x65, 0x64, 0x7f, - 0xf1, 0x14, 0x18, 0xa3, 0x6d, 0x64, 0xe8, 0xb5, 0x8e, 0x29, 0x43, 0x2f, 0x86, 0x11, 0xb2, 0xd3, - 0x4a, 0xf6, 0x6a, 0x5e, 0xd4, 0x2d, 0x65, 0xfa, 0xb2, 0xa0, 0xe9, 0xe4, 0x29, 0x31, 0x58, 0xf1, - 0xc9, 0x4f, 0xa3, 0x5c, 0x7e, 0x1f, 0xd3, 0x28, 0x0f, 0x9c, 0x60, 0x1a, 0xe5, 0xeb, 0x30, 0xbc, - 0xe9, 0x25, 0x98, 0xb4, 0x42, 0xb1, 0x65, 0xe6, 0xce, 0x84, 0xcb, 0x9c, 0xa4, 0x33, 0x01, 0xa8, - 0x40, 0x60, 0xc9, 0x04, 0xbd, 0xaa, 0xd6, 0xc0, 0x50, 0xb1, 0x2a, 0xd8, 0xe9, 0x7f, 0xce, 0x5d, - 0x05, 0x22, 0x6d, 0xf2, 0xf0, 0xbd, 0xa6, 0x4d, 0x56, 0x69, 0x8f, 0x47, 0xde, 0x5b, 0xda, 0x63, - 0x23, 0x2d, 0x74, 0xe5, 0xf8, 0xd2, 0x42, 0x7f, 0xd9, 0x82, 0x33, 0xad, 0xbc, 0x0c, 0xe9, 0x22, - 0x95, 0xf1, 0x0b, 0x7d, 0x67, 0x8a, 0x37, 0x2a, 0x64, 0xa9, 0x1e, 0x72, 0xc9, 0x70, 0x7e, 0x75, - 0x32, 0xbf, 0xf4, 0xe8, 0xbd, 0xe6, 0x97, 0xbe, 0x3f, 0x39, 0x8f, 0xd3, 0x6c, 0xd3, 0xe3, 0xc7, - 0x98, 0x6d, 0x7a, 0xe2, 0x3d, 0x67, 0x9b, 0xd6, 0x32, 0x46, 0x4f, 0x1e, 0x47, 0xc6, 0xe8, 0xb7, - 0x4c, 0x61, 0xcf, 0x13, 0x19, 0x3f, 0xd5, 0x43, 0xd8, 0x1b, 0x7c, 0xbb, 0x8b, 0x7b, 0x9e, 0x1d, - 0x7b, 0xfa, 0x9e, 0xb2, 0x63, 0x1b, 0x79, 0xa7, 0xd1, 0xf1, 0xe5, 0x9d, 0xbe, 0xa5, 0x6f, 0x41, - 0xa7, 0x8a, 0xf9, 0xaa, 0x9d, 0xa6, 0x93, 0x6f, 0xde, 0x26, 0xd4, 0x99, 0xcf, 0xfa, 0xf4, 0xc9, - 0xe4, 0xb3, 0x3e, 0x73, 0xec, 0xf9, 0xac, 0xcf, 0x9e, 0x40, 0x3e, 0xeb, 0x07, 0xde, 0xd7, 0x7c, - 0xd6, 0xd5, 0xfb, 0x9b, 0xcf, 0xfa, 0xdc, 0x71, 0xe4, 0xb3, 0xbe, 0x05, 0x95, 0x96, 0xbc, 0x24, - 0x57, 0x9d, 0x29, 0x1e, 0x92, 0xdc, 0x9b, 0x74, 0x7c, 0x48, 0x14, 0x0a, 0xa7, 0xac, 0x28, 0xdf, - 0x34, 0xbf, 0xf5, 0x83, 0xc5, 0x7c, 0x73, 0xcd, 0xf6, 0x2e, 0x59, 0xad, 0xff, 0x52, 0x09, 0xce, - 0x77, 0x9f, 0xd7, 0xa9, 0xcd, 0x5f, 0x4f, 0x5d, 0xac, 0x19, 0x9b, 0x9f, 0x29, 0x5d, 0x1a, 0x55, - 0xdf, 0x37, 0x89, 0x2f, 0xc3, 0xb4, 0x8a, 0x15, 0xf2, 0xbd, 0xe6, 0x9e, 0xf6, 0xfc, 0x8c, 0x0a, - 0x3f, 0x6f, 0x64, 0x09, 0x70, 0x67, 0x19, 0xb4, 0x00, 0x93, 0x06, 0x70, 0xb5, 0x26, 0x54, 0x72, - 0xe5, 0x64, 0x68, 0x98, 0x68, 0x9c, 0xa5, 0xb7, 0xbf, 0x6e, 0xc1, 0x03, 0x05, 0xa9, 0x31, 0xfb, - 0xbe, 0x28, 0xbb, 0x01, 0x93, 0x2d, 0xb3, 0x68, 0x8f, 0xfb, 0xf4, 0x46, 0x02, 0x4e, 0xd5, 0xd6, - 0x0c, 0x02, 0x67, 0x99, 0x2e, 0x5e, 0xfc, 0xce, 0x0f, 0xce, 0x7f, 0xe8, 0x0f, 0x7f, 0x70, 0xfe, - 0x43, 0xdf, 0xff, 0xc1, 0xf9, 0x0f, 0xfd, 0xb9, 0x83, 0xf3, 0xd6, 0x77, 0x0e, 0xce, 0x5b, 0x7f, - 0x78, 0x70, 0xde, 0xfa, 0xfe, 0xc1, 0x79, 0xeb, 0x4f, 0x0e, 0xce, 0x5b, 0xbf, 0xf0, 0xc3, 0xf3, - 0x1f, 0x7a, 0xa3, 0xb4, 0xfb, 0xec, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xc9, 0x6a, 0xe4, 0x7c, - 0xae, 0xc8, 0x00, 0x00, + // 11523 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x59, 0x90, 0x24, 0xc7, + 0x75, 0x18, 0xab, 0x7b, 0xae, 0x7e, 0x73, 0xe7, 0x1e, 0xe8, 0x1d, 0x00, 0xdb, 0x8b, 0x02, 0x09, + 0x2c, 0xae, 0x19, 0x61, 0x01, 0x90, 0x10, 0x01, 0x82, 0x9c, 0x99, 0x9e, 0xd9, 0x1d, 0xec, 0xd5, + 0xc8, 0x9e, 0x5d, 0x08, 0x20, 0x04, 0xb1, 0xb6, 0x2b, 0x67, 0xa6, 0x30, 0x35, 0x55, 0x8d, 0xaa, + 0xea, 0xd9, 0x1d, 0x84, 0x18, 0x61, 0xd3, 0x14, 0x7d, 0x50, 0x1f, 0x0a, 0x87, 0xc2, 0x96, 0x45, + 0x86, 0x1c, 0xe1, 0x23, 0x24, 0x9a, 0xb6, 0x43, 0x32, 0x65, 0x1d, 0xa4, 0x1c, 0xb6, 0xe5, 0x23, + 0xc8, 0x1f, 0x59, 0x52, 0x84, 0x83, 0x8c, 0x70, 0x78, 0x24, 0x0e, 0x23, 0xec, 0xf0, 0x87, 0x1d, + 0x3e, 0xbe, 0xb4, 0x96, 0x4d, 0x47, 0x9e, 0x95, 0x59, 0x5d, 0xd5, 0xdd, 0xb3, 0x98, 0x1d, 0x80, + 0x0c, 0xff, 0x75, 0xbf, 0xf7, 0xf2, 0x65, 0x56, 0x1e, 0x2f, 0xdf, 0x7b, 0xf9, 0xf2, 0x25, 0xbc, + 0xb4, 0xfd, 0x62, 0x3c, 0xef, 0x85, 0x0b, 0xdb, 0x9d, 0x5b, 0x24, 0x0a, 0x48, 0x42, 0xe2, 0x85, + 0x5d, 0x12, 0xb8, 0x61, 0xb4, 0x20, 0x10, 0x4e, 0xdb, 0x5b, 0x68, 0x85, 0x11, 0x59, 0xd8, 0x7d, + 0x76, 0x61, 0x93, 0x04, 0x24, 0x72, 0x12, 0xe2, 0xce, 0xb7, 0xa3, 0x30, 0x09, 0x11, 0xe2, 0x34, + 0xf3, 0x4e, 0xdb, 0x9b, 0xa7, 0x34, 0xf3, 0xbb, 0xcf, 0xce, 0x3d, 0xb3, 0xe9, 0x25, 0x5b, 0x9d, + 0x5b, 0xf3, 0xad, 0x70, 0x67, 0x61, 0x33, 0xdc, 0x0c, 0x17, 0x18, 0xe9, 0xad, 0xce, 0x06, 0xfb, + 0xc7, 0xfe, 0xb0, 0x5f, 0x9c, 0xc5, 0xdc, 0xf3, 0x69, 0x35, 0x3b, 0x4e, 0x6b, 0xcb, 0x0b, 0x48, + 0xb4, 0xb7, 0xd0, 0xde, 0xde, 0x64, 0xf5, 0x46, 0x24, 0x0e, 0x3b, 0x51, 0x8b, 0x64, 0x2b, 0xee, + 0x59, 0x2a, 0x5e, 0xd8, 0x21, 0x89, 0x93, 0xd3, 0xdc, 0xb9, 0x85, 0xa2, 0x52, 0x51, 0x27, 0x48, + 0xbc, 0x9d, 0xee, 0x6a, 0x3e, 0xde, 0xaf, 0x40, 0xdc, 0xda, 0x22, 0x3b, 0x4e, 0x57, 0xb9, 0xe7, + 0x8a, 0xca, 0x75, 0x12, 0xcf, 0x5f, 0xf0, 0x82, 0x24, 0x4e, 0xa2, 0x6c, 0x21, 0xfb, 0xbb, 0x16, + 0x9c, 0x5b, 0x7c, 0xbd, 0xb9, 0xe2, 0x3b, 0x71, 0xe2, 0xb5, 0x96, 0xfc, 0xb0, 0xb5, 0xdd, 0x4c, + 0xc2, 0x88, 0xdc, 0x0c, 0xfd, 0xce, 0x0e, 0x69, 0xb2, 0x8e, 0x40, 0x4f, 0xc3, 0xd8, 0x2e, 0xfb, + 0xbf, 0x56, 0xaf, 0x5a, 0xe7, 0xac, 0xf3, 0x95, 0xa5, 0x99, 0x6f, 0xef, 0xd7, 0x3e, 0x72, 0xb0, + 0x5f, 0x1b, 0xbb, 0x29, 0xe0, 0x58, 0x51, 0xa0, 0xc7, 0x60, 0x64, 0x23, 0x5e, 0xdf, 0x6b, 0x93, + 0x6a, 0x89, 0xd1, 0x4e, 0x09, 0xda, 0x91, 0xd5, 0x26, 0x85, 0x62, 0x81, 0x45, 0x0b, 0x50, 0x69, + 0x3b, 0x51, 0xe2, 0x25, 0x5e, 0x18, 0x54, 0xcb, 0xe7, 0xac, 0xf3, 0xc3, 0x4b, 0xb3, 0x82, 0xb4, + 0xd2, 0x90, 0x08, 0x9c, 0xd2, 0xd0, 0x66, 0x44, 0xc4, 0x71, 0xaf, 0x07, 0xfe, 0x5e, 0x75, 0xe8, + 0x9c, 0x75, 0x7e, 0x2c, 0x6d, 0x06, 0x16, 0x70, 0xac, 0x28, 0xec, 0x5f, 0x2e, 0xc1, 0xd8, 0xe2, + 0xc6, 0x86, 0x17, 0x78, 0xc9, 0x1e, 0xba, 0x09, 0x13, 0x41, 0xe8, 0x12, 0xf9, 0x9f, 0x7d, 0xc5, + 0xf8, 0x85, 0x73, 0xf3, 0xdd, 0x53, 0x69, 0xfe, 0x9a, 0x46, 0xb7, 0x34, 0x73, 0xb0, 0x5f, 0x9b, + 0xd0, 0x21, 0xd8, 0xe0, 0x83, 0x30, 0x8c, 0xb7, 0x43, 0x57, 0xb1, 0x2d, 0x31, 0xb6, 0xb5, 0x3c, + 0xb6, 0x8d, 0x94, 0x6c, 0x69, 0xfa, 0x60, 0xbf, 0x36, 0xae, 0x01, 0xb0, 0xce, 0x04, 0xdd, 0x82, + 0x69, 0xfa, 0x37, 0x48, 0x3c, 0xc5, 0xb7, 0xcc, 0xf8, 0x3e, 0x5a, 0xc4, 0x57, 0x23, 0x5d, 0x3a, + 0x71, 0xb0, 0x5f, 0x9b, 0xce, 0x00, 0x71, 0x96, 0xa1, 0xfd, 0x1e, 0x4c, 0x2d, 0x26, 0x89, 0xd3, + 0xda, 0x22, 0x2e, 0x1f, 0x41, 0xf4, 0x3c, 0x0c, 0x05, 0xce, 0x0e, 0x11, 0xe3, 0x7b, 0x4e, 0x74, + 0xec, 0xd0, 0x35, 0x67, 0x87, 0xdc, 0xdd, 0xaf, 0xcd, 0xdc, 0x08, 0xbc, 0x77, 0x3b, 0x62, 0x56, + 0x50, 0x18, 0x66, 0xd4, 0xe8, 0x02, 0x80, 0x4b, 0x76, 0xbd, 0x16, 0x69, 0x38, 0xc9, 0x96, 0x18, + 0x6f, 0x24, 0xca, 0x42, 0x5d, 0x61, 0xb0, 0x46, 0x65, 0xdf, 0x81, 0xca, 0xe2, 0x6e, 0xe8, 0xb9, + 0x8d, 0xd0, 0x8d, 0xd1, 0x36, 0x4c, 0xb7, 0x23, 0xb2, 0x41, 0x22, 0x05, 0xaa, 0x5a, 0xe7, 0xca, + 0xe7, 0xc7, 0x2f, 0x9c, 0xcf, 0xfd, 0x58, 0x93, 0x74, 0x25, 0x48, 0xa2, 0xbd, 0xa5, 0x07, 0x44, + 0x7d, 0xd3, 0x19, 0x2c, 0xce, 0x72, 0xb6, 0xff, 0x75, 0x09, 0x4e, 0x2d, 0xbe, 0xd7, 0x89, 0x48, + 0xdd, 0x8b, 0xb7, 0xb3, 0x33, 0xdc, 0xf5, 0xe2, 0xed, 0x6b, 0x69, 0x0f, 0xa8, 0xa9, 0x55, 0x17, + 0x70, 0xac, 0x28, 0xd0, 0x33, 0x30, 0x4a, 0x7f, 0xdf, 0xc0, 0x6b, 0xe2, 0x93, 0x4f, 0x08, 0xe2, + 0xf1, 0xba, 0x93, 0x38, 0x75, 0x8e, 0xc2, 0x92, 0x06, 0x5d, 0x85, 0xf1, 0x16, 0x5b, 0x90, 0x9b, + 0x57, 0x43, 0x97, 0xb0, 0xc1, 0xac, 0x2c, 0x3d, 0x45, 0xc9, 0x97, 0x53, 0xf0, 0xdd, 0xfd, 0x5a, + 0x95, 0xb7, 0x4d, 0xb0, 0xd0, 0x70, 0x58, 0x2f, 0x8f, 0x6c, 0xb5, 0xbe, 0x86, 0x18, 0x27, 0xc8, + 0x59, 0x5b, 0xe7, 0xb5, 0xa5, 0x32, 0xcc, 0x96, 0xca, 0x44, 0xfe, 0x32, 0x41, 0xcf, 0xc2, 0xd0, + 0xb6, 0x17, 0xb8, 0xd5, 0x11, 0xc6, 0xeb, 0x61, 0x3a, 0xe6, 0x97, 0xbd, 0xc0, 0xbd, 0xbb, 0x5f, + 0x9b, 0x35, 0x9a, 0x43, 0x81, 0x98, 0x91, 0xda, 0xff, 0xc0, 0x12, 0xdd, 0xb8, 0xea, 0xf9, 0xa6, + 0xa0, 0xb8, 0x00, 0x10, 0x93, 0x56, 0x44, 0x12, 0xad, 0x23, 0xd5, 0x74, 0x68, 0x2a, 0x0c, 0xd6, + 0xa8, 0xa8, 0x18, 0x88, 0xb7, 0x9c, 0x88, 0xcd, 0x2a, 0xd1, 0x9d, 0x4a, 0x0c, 0x34, 0x25, 0x02, + 0xa7, 0x34, 0x86, 0x18, 0x28, 0xf7, 0x15, 0x03, 0xbf, 0x63, 0xc1, 0xe8, 0x92, 0x17, 0xb8, 0x5e, + 0xb0, 0x89, 0x3e, 0x07, 0x63, 0x54, 0x4a, 0xbb, 0x4e, 0xe2, 0x08, 0x09, 0xf0, 0x13, 0xda, 0x2c, + 0x53, 0x42, 0x73, 0xbe, 0xbd, 0xbd, 0x49, 0x01, 0xf1, 0x3c, 0xa5, 0xa6, 0xf3, 0xee, 0xfa, 0xad, + 0x77, 0x48, 0x2b, 0xb9, 0x4a, 0x12, 0x27, 0xfd, 0x9c, 0x14, 0x86, 0x15, 0x57, 0x74, 0x19, 0x46, + 0x12, 0x27, 0xda, 0x24, 0x89, 0x10, 0x05, 0xb9, 0x4b, 0x96, 0x97, 0xc4, 0x74, 0x6e, 0x92, 0xa0, + 0x45, 0x52, 0x01, 0xb9, 0xce, 0x8a, 0x62, 0xc1, 0xc2, 0x6e, 0xc1, 0xc4, 0xb2, 0xd3, 0x76, 0x6e, + 0x79, 0xbe, 0x97, 0x78, 0x24, 0x46, 0x8f, 0x43, 0xd9, 0x71, 0x5d, 0xb6, 0x3e, 0x2a, 0x4b, 0xa7, + 0x0e, 0xf6, 0x6b, 0xe5, 0x45, 0x97, 0x0e, 0x14, 0x28, 0xaa, 0x3d, 0x4c, 0x29, 0xd0, 0x93, 0x30, + 0xe4, 0x46, 0x61, 0xbb, 0x5a, 0x62, 0x94, 0xa7, 0xe9, 0x98, 0xd6, 0xa3, 0xb0, 0x9d, 0x21, 0x65, + 0x34, 0xf6, 0xb7, 0x4a, 0x80, 0x96, 0x49, 0x7b, 0x6b, 0xb5, 0x69, 0x8c, 0xe4, 0x79, 0x18, 0xdb, + 0x09, 0x03, 0x2f, 0x09, 0xa3, 0x58, 0x54, 0xc8, 0x26, 0xd0, 0x55, 0x01, 0xc3, 0x0a, 0x8b, 0xce, + 0xc1, 0x50, 0x3b, 0x5d, 0xfc, 0x13, 0x52, 0x70, 0xb0, 0x65, 0xcf, 0x30, 0x94, 0xa2, 0x13, 0x93, + 0x48, 0x4c, 0x7c, 0x45, 0x71, 0x23, 0x26, 0x11, 0x66, 0x98, 0x74, 0xde, 0xd0, 0x19, 0x25, 0xa6, + 0x75, 0x66, 0xde, 0x50, 0x0c, 0xd6, 0xa8, 0xd0, 0x0d, 0xa8, 0xf0, 0x7f, 0x98, 0x6c, 0xb0, 0x39, + 0x5e, 0x20, 0x33, 0xae, 0x84, 0x2d, 0xc7, 0xcf, 0x76, 0xf9, 0x24, 0x9b, 0x5d, 0xb2, 0x38, 0x4e, + 0x39, 0x19, 0xb3, 0x6b, 0xa4, 0xef, 0xec, 0xfa, 0x25, 0x0b, 0xd0, 0xb2, 0x17, 0xb8, 0x24, 0x3a, + 0x86, 0x0d, 0xf3, 0x70, 0x13, 0xff, 0x3f, 0xd0, 0xa6, 0x85, 0x3b, 0xed, 0x30, 0x20, 0x41, 0xb2, + 0x1c, 0x06, 0x2e, 0xdf, 0x44, 0x3f, 0x09, 0x43, 0x09, 0xad, 0x8a, 0x37, 0xeb, 0x31, 0x39, 0x18, + 0xb4, 0x82, 0xbb, 0xfb, 0xb5, 0xd3, 0xdd, 0x25, 0x58, 0x13, 0x58, 0x19, 0xf4, 0x93, 0x30, 0x12, + 0x27, 0x4e, 0xd2, 0x89, 0x45, 0x43, 0x1f, 0x91, 0x0d, 0x6d, 0x32, 0xe8, 0xdd, 0xfd, 0xda, 0xb4, + 0x2a, 0xc6, 0x41, 0x58, 0x14, 0x40, 0x4f, 0xc0, 0xe8, 0x0e, 0x89, 0x63, 0x67, 0x53, 0xca, 0xbf, + 0x69, 0x51, 0x76, 0xf4, 0x2a, 0x07, 0x63, 0x89, 0x47, 0x8f, 0xc2, 0x30, 0x89, 0xa2, 0x30, 0x12, + 0xf3, 0x60, 0x52, 0x10, 0x0e, 0xaf, 0x50, 0x20, 0xe6, 0x38, 0xfb, 0xdf, 0x59, 0x30, 0xad, 0xda, + 0xca, 0xeb, 0x3a, 0x86, 0xe5, 0xfd, 0x26, 0x40, 0x4b, 0x7e, 0x60, 0xcc, 0x96, 0xd7, 0xf8, 0x85, + 0xc7, 0xf2, 0x26, 0x5d, 0x77, 0x37, 0xa6, 0x9c, 0x15, 0x28, 0xc6, 0x1a, 0x37, 0xfb, 0x9f, 0x59, + 0x70, 0x22, 0xf3, 0x45, 0x57, 0xbc, 0x38, 0x41, 0x6f, 0x75, 0x7d, 0xd5, 0xfc, 0x60, 0x5f, 0x45, + 0x4b, 0xb3, 0x6f, 0x52, 0xb3, 0x44, 0x42, 0xb4, 0x2f, 0xba, 0x04, 0xc3, 0x5e, 0x42, 0x76, 0xe4, + 0xc7, 0x3c, 0xda, 0xf3, 0x63, 0x78, 0xab, 0xd2, 0x11, 0x59, 0xa3, 0x25, 0x31, 0x67, 0x60, 0xff, + 0x0f, 0x0b, 0x2a, 0xcb, 0x61, 0xb0, 0xe1, 0x6d, 0x5e, 0x75, 0xda, 0xc7, 0x30, 0x16, 0x6b, 0x30, + 0xc4, 0xb8, 0xf3, 0x86, 0x3f, 0x9e, 0xdf, 0x70, 0xd1, 0x9c, 0x79, 0xba, 0x8b, 0x71, 0x6d, 0x41, + 0x89, 0x1f, 0x0a, 0xc2, 0x8c, 0xc5, 0xdc, 0x27, 0xa0, 0xa2, 0x08, 0xd0, 0x0c, 0x94, 0xb7, 0x09, + 0xd7, 0x10, 0x2b, 0x98, 0xfe, 0x44, 0x27, 0x61, 0x78, 0xd7, 0xf1, 0x3b, 0x62, 0x79, 0x62, 0xfe, + 0xe7, 0x93, 0xa5, 0x17, 0x2d, 0xfb, 0x9b, 0x6c, 0x8d, 0x89, 0x4a, 0x56, 0x82, 0x5d, 0xb1, 0xfc, + 0xdf, 0x83, 0x93, 0x7e, 0x8e, 0xd4, 0x11, 0x1d, 0x31, 0xb8, 0x94, 0x7a, 0x48, 0xb4, 0xf5, 0x64, + 0x1e, 0x16, 0xe7, 0xd6, 0x41, 0x05, 0x77, 0xd8, 0xa6, 0x33, 0xca, 0xf1, 0x59, 0x7b, 0xc5, 0xce, + 0x7f, 0x5d, 0xc0, 0xb0, 0xc2, 0x52, 0x01, 0x71, 0x52, 0x35, 0xfe, 0x32, 0xd9, 0x6b, 0x12, 0x9f, + 0xb4, 0x92, 0x30, 0xfa, 0x40, 0x9b, 0xff, 0x30, 0xef, 0x7d, 0x2e, 0x5f, 0xc6, 0x05, 0x83, 0xf2, + 0x65, 0xb2, 0xc7, 0x87, 0x42, 0xff, 0xba, 0x72, 0xcf, 0xaf, 0xfb, 0x0d, 0x0b, 0x26, 0xd5, 0xd7, + 0x1d, 0xc3, 0x42, 0x5a, 0x32, 0x17, 0xd2, 0xc3, 0x3d, 0xe7, 0x63, 0xc1, 0x12, 0xfa, 0x21, 0x13, + 0x01, 0x82, 0xa6, 0x11, 0x85, 0xb4, 0x6b, 0xa8, 0xcc, 0xfe, 0x20, 0x07, 0x64, 0x90, 0xef, 0xba, + 0x4c, 0xf6, 0xd6, 0x43, 0xba, 0xe1, 0xe7, 0x7f, 0x97, 0x31, 0x6a, 0x43, 0x3d, 0x47, 0xed, 0x37, + 0x4b, 0x70, 0x4a, 0xf5, 0x80, 0xb1, 0xa5, 0xfe, 0xa8, 0xf7, 0xc1, 0xb3, 0x30, 0xee, 0x92, 0x0d, + 0xa7, 0xe3, 0x27, 0xca, 0x08, 0x18, 0xe6, 0x86, 0x60, 0x3d, 0x05, 0x63, 0x9d, 0xe6, 0x10, 0xdd, + 0xf6, 0x6f, 0x80, 0xc9, 0xde, 0xc4, 0xa1, 0x33, 0x98, 0xea, 0x5b, 0x9a, 0x29, 0x37, 0xa1, 0x9b, + 0x72, 0xc2, 0x6c, 0x7b, 0x14, 0x86, 0xbd, 0x1d, 0xba, 0x17, 0x97, 0xcc, 0x2d, 0x76, 0x8d, 0x02, + 0x31, 0xc7, 0xa1, 0x8f, 0xc1, 0x68, 0x2b, 0xdc, 0xd9, 0x71, 0x02, 0xb7, 0x5a, 0x66, 0x1a, 0xe0, + 0x38, 0xdd, 0xae, 0x97, 0x39, 0x08, 0x4b, 0x1c, 0x7a, 0x08, 0x86, 0x9c, 0x68, 0x33, 0xae, 0x0e, + 0x31, 0x9a, 0x31, 0x5a, 0xd3, 0x62, 0xb4, 0x19, 0x63, 0x06, 0xa5, 0x9a, 0xdd, 0xed, 0x30, 0xda, + 0xf6, 0x82, 0xcd, 0xba, 0x17, 0x31, 0x35, 0x4d, 0xd3, 0xec, 0x5e, 0x57, 0x18, 0xac, 0x51, 0xa1, + 0x55, 0x18, 0x6e, 0x87, 0x51, 0x12, 0x57, 0x47, 0x58, 0x77, 0x3f, 0x52, 0xb0, 0x94, 0xf8, 0xd7, + 0x36, 0xc2, 0x28, 0x49, 0x3f, 0x80, 0xfe, 0x8b, 0x31, 0x2f, 0x8e, 0x7e, 0x12, 0xca, 0x24, 0xd8, + 0xad, 0x8e, 0x32, 0x2e, 0x73, 0x79, 0x5c, 0x56, 0x82, 0xdd, 0x9b, 0x4e, 0x94, 0xca, 0x99, 0x95, + 0x60, 0x17, 0xd3, 0x32, 0xe8, 0x0d, 0xa8, 0x48, 0x37, 0x50, 0x5c, 0x1d, 0x2b, 0x9e, 0x62, 0x58, + 0x10, 0x61, 0xf2, 0x6e, 0xc7, 0x8b, 0xc8, 0x0e, 0x09, 0x92, 0x38, 0x35, 0x5f, 0x24, 0x36, 0xc6, + 0x29, 0x37, 0xf4, 0x06, 0x4c, 0x70, 0xcd, 0xef, 0x6a, 0xd8, 0x09, 0x92, 0xb8, 0x5a, 0x61, 0xcd, + 0xcb, 0xf5, 0x19, 0xdc, 0x4c, 0xe9, 0x96, 0x4e, 0x0a, 0xa6, 0x13, 0x1a, 0x30, 0xc6, 0x06, 0x2b, + 0x84, 0x61, 0xd2, 0xf7, 0x76, 0x49, 0x40, 0xe2, 0xb8, 0x11, 0x85, 0xb7, 0x48, 0x15, 0x58, 0xcb, + 0xcf, 0xe4, 0x9b, 0xd2, 0xe1, 0x2d, 0xb2, 0x34, 0x7b, 0xb0, 0x5f, 0x9b, 0xbc, 0xa2, 0x97, 0xc1, + 0x26, 0x0b, 0x74, 0x03, 0xa6, 0xa8, 0x4a, 0xe9, 0xa5, 0x4c, 0xc7, 0xfb, 0x31, 0x45, 0x07, 0xfb, + 0xb5, 0x29, 0x6c, 0x14, 0xc2, 0x19, 0x26, 0xe8, 0x55, 0xa8, 0xf8, 0xde, 0x06, 0x69, 0xed, 0xb5, + 0x7c, 0x52, 0x9d, 0x60, 0x1c, 0x73, 0x97, 0xd5, 0x15, 0x49, 0xc4, 0x55, 0x76, 0xf5, 0x17, 0xa7, + 0xc5, 0xd1, 0x4d, 0x38, 0x9d, 0x90, 0x68, 0xc7, 0x0b, 0x1c, 0xba, 0x1c, 0x84, 0x3e, 0xc9, 0x1c, + 0x12, 0x93, 0x6c, 0xbe, 0x9d, 0x15, 0x5d, 0x77, 0x7a, 0x3d, 0x97, 0x0a, 0x17, 0x94, 0x46, 0xd7, + 0x61, 0x9a, 0xad, 0x84, 0x46, 0xc7, 0xf7, 0x1b, 0xa1, 0xef, 0xb5, 0xf6, 0xaa, 0x53, 0x8c, 0xe1, + 0xc7, 0xa4, 0xc7, 0x61, 0xcd, 0x44, 0x53, 0x03, 0x2b, 0xfd, 0x87, 0xb3, 0xa5, 0xd1, 0x2d, 0x98, + 0x8e, 0x49, 0xab, 0x13, 0x79, 0xc9, 0x1e, 0x9d, 0xbf, 0xe4, 0x4e, 0x52, 0x9d, 0x2e, 0x36, 0x13, + 0x9b, 0x26, 0x29, 0xf7, 0xec, 0x64, 0x80, 0x38, 0xcb, 0x90, 0x2e, 0xed, 0x38, 0x71, 0xbd, 0xa0, + 0x3a, 0xc3, 0x24, 0x86, 0x5a, 0x19, 0x4d, 0x0a, 0xc4, 0x1c, 0xc7, 0x6c, 0x6e, 0xfa, 0xe3, 0x3a, + 0x95, 0xa0, 0xb3, 0x8c, 0x30, 0xb5, 0xb9, 0x25, 0x02, 0xa7, 0x34, 0x74, 0x5b, 0x4e, 0x92, 0xbd, + 0x2a, 0x62, 0xa4, 0x6a, 0xb9, 0xac, 0xaf, 0xbf, 0x81, 0x29, 0x1c, 0x5d, 0x81, 0x51, 0x12, 0xec, + 0xae, 0x46, 0xe1, 0x4e, 0xf5, 0x44, 0xf1, 0x9a, 0x5d, 0xe1, 0x24, 0x5c, 0xa0, 0xa7, 0x06, 0x80, + 0x00, 0x63, 0xc9, 0x02, 0xdd, 0x81, 0x6a, 0xce, 0x88, 0xf0, 0x01, 0x38, 0xc9, 0x06, 0xe0, 0x65, + 0x51, 0xb6, 0xba, 0x5e, 0x40, 0x77, 0xb7, 0x07, 0x0e, 0x17, 0x72, 0xb7, 0x6f, 0xc1, 0x94, 0x12, + 0x2c, 0x6c, 0x6c, 0x51, 0x0d, 0x86, 0xa9, 0xc4, 0x94, 0x46, 0x70, 0x85, 0x76, 0x25, 0x15, 0xa4, + 0x31, 0xe6, 0x70, 0xd6, 0x95, 0xde, 0x7b, 0x64, 0x69, 0x2f, 0x21, 0xdc, 0x2c, 0x2a, 0x6b, 0x5d, + 0x29, 0x11, 0x38, 0xa5, 0xb1, 0xff, 0x2f, 0x57, 0x4c, 0x52, 0xe9, 0x35, 0x80, 0xbc, 0x7e, 0x1a, + 0xc6, 0xb6, 0xc2, 0x38, 0xa1, 0xd4, 0xac, 0x8e, 0xe1, 0x54, 0x15, 0xb9, 0x24, 0xe0, 0x58, 0x51, + 0xa0, 0x97, 0x60, 0xb2, 0xa5, 0x57, 0x20, 0x36, 0x9b, 0x53, 0xa2, 0x88, 0x59, 0x3b, 0x36, 0x69, + 0xd1, 0x8b, 0x30, 0xc6, 0x3c, 0xc3, 0xad, 0xd0, 0x17, 0x06, 0x98, 0xdc, 0x31, 0xc7, 0x1a, 0x02, + 0x7e, 0x57, 0xfb, 0x8d, 0x15, 0x35, 0x35, 0x63, 0x69, 0x13, 0xd6, 0x1a, 0x42, 0xcc, 0x2b, 0x33, + 0xf6, 0x12, 0x83, 0x62, 0x81, 0xb5, 0xff, 0x7a, 0x49, 0xeb, 0x65, 0x6a, 0x52, 0x10, 0xd4, 0x80, + 0xd1, 0xdb, 0x8e, 0x97, 0x78, 0xc1, 0xa6, 0xd8, 0xcf, 0x9f, 0xe8, 0x29, 0xf3, 0x59, 0xa1, 0xd7, + 0x79, 0x01, 0xbe, 0x2b, 0x89, 0x3f, 0x58, 0xb2, 0xa1, 0x1c, 0xa3, 0x4e, 0x10, 0x50, 0x8e, 0xa5, + 0x41, 0x39, 0x62, 0x5e, 0x80, 0x73, 0x14, 0x7f, 0xb0, 0x64, 0x83, 0xde, 0x02, 0x90, 0xf3, 0x86, + 0xb8, 0xc2, 0x23, 0xfb, 0x74, 0x7f, 0xa6, 0xeb, 0xaa, 0xcc, 0xd2, 0x14, 0xdd, 0xf3, 0xd2, 0xff, + 0x58, 0xe3, 0x67, 0x27, 0x4c, 0xef, 0xe9, 0x6e, 0x0c, 0xfa, 0x2c, 0x5d, 0xaa, 0x4e, 0x94, 0x10, + 0x77, 0x31, 0x11, 0x9d, 0xf3, 0xe4, 0x60, 0x6a, 0xeb, 0xba, 0xb7, 0x43, 0xf4, 0x65, 0x2d, 0x98, + 0xe0, 0x94, 0x9f, 0xfd, 0xdb, 0x65, 0xa8, 0x16, 0x35, 0x97, 0x4e, 0x3a, 0x72, 0xc7, 0x4b, 0x96, + 0xa9, 0xba, 0x62, 0x99, 0x93, 0x6e, 0x45, 0xc0, 0xb1, 0xa2, 0xa0, 0xa3, 0x1f, 0x7b, 0x9b, 0xd2, + 0xea, 0x18, 0x4e, 0x47, 0xbf, 0xc9, 0xa0, 0x58, 0x60, 0x29, 0x5d, 0x44, 0x9c, 0x58, 0xb8, 0xfc, + 0xb5, 0x59, 0x82, 0x19, 0x14, 0x0b, 0xac, 0xee, 0x30, 0x18, 0xea, 0xe3, 0x30, 0x30, 0xba, 0x68, + 0xf8, 0x68, 0xbb, 0x08, 0xbd, 0x0d, 0xb0, 0xe1, 0x05, 0x5e, 0xbc, 0xc5, 0xb8, 0x8f, 0x1c, 0x9a, + 0xbb, 0x52, 0x76, 0x56, 0x15, 0x17, 0xac, 0x71, 0x44, 0x2f, 0xc0, 0xb8, 0x5a, 0x80, 0x6b, 0xf5, + 0xea, 0xa8, 0xe9, 0x4f, 0x4e, 0xa5, 0x51, 0x1d, 0xeb, 0x74, 0xf6, 0x3b, 0xd9, 0xf9, 0x22, 0x56, + 0x80, 0xd6, 0xbf, 0xd6, 0xa0, 0xfd, 0x5b, 0xea, 0xdd, 0xbf, 0xf6, 0xef, 0x97, 0x61, 0xda, 0xa8, + 0xac, 0x13, 0x0f, 0x20, 0xb3, 0x2e, 0xd2, 0x8d, 0xc8, 0x49, 0x88, 0x58, 0x7f, 0x76, 0xff, 0xa5, + 0xa2, 0x6f, 0x56, 0x74, 0x05, 0xf0, 0xf2, 0xe8, 0x6d, 0xa8, 0xf8, 0x4e, 0xcc, 0x9c, 0x0f, 0x44, + 0xac, 0xbb, 0x41, 0x98, 0xa5, 0x8a, 0xbe, 0x13, 0x27, 0xda, 0x5e, 0xc0, 0x79, 0xa7, 0x2c, 0xe9, + 0x8e, 0x49, 0x95, 0x13, 0x79, 0xa6, 0xa4, 0x1a, 0x41, 0x35, 0x98, 0x3d, 0xcc, 0x71, 0xe8, 0x45, + 0x98, 0x88, 0x08, 0x9b, 0x15, 0xcb, 0x54, 0xd7, 0x62, 0xd3, 0x6c, 0x38, 0x55, 0xca, 0xb0, 0x86, + 0xc3, 0x06, 0x65, 0xaa, 0x6b, 0x8f, 0xf4, 0xd0, 0xb5, 0x9f, 0x80, 0x51, 0xf6, 0x43, 0xcd, 0x00, + 0x35, 0x1a, 0x6b, 0x1c, 0x8c, 0x25, 0x3e, 0x3b, 0x61, 0xc6, 0x06, 0x9c, 0x30, 0x4f, 0xc2, 0x54, + 0xdd, 0x21, 0x3b, 0x61, 0xb0, 0x12, 0xb8, 0xed, 0xd0, 0x0b, 0x12, 0x54, 0x85, 0x21, 0xb6, 0x3b, + 0xf0, 0xb5, 0x3d, 0x44, 0x39, 0xe0, 0x21, 0xaa, 0x39, 0xdb, 0x7f, 0x54, 0x82, 0xc9, 0x3a, 0xf1, + 0x49, 0x42, 0xb8, 0xad, 0x11, 0xa3, 0x55, 0x40, 0x9b, 0x91, 0xd3, 0x22, 0x0d, 0x12, 0x79, 0xa1, + 0xdb, 0x24, 0xad, 0x30, 0x60, 0x27, 0x35, 0x74, 0xbb, 0x3b, 0x7d, 0xb0, 0x5f, 0x43, 0x17, 0xbb, + 0xb0, 0x38, 0xa7, 0x04, 0x7a, 0x13, 0x26, 0xdb, 0x11, 0x31, 0x7c, 0x68, 0x56, 0x91, 0xba, 0xd0, + 0xd0, 0x09, 0xb9, 0xa6, 0x6a, 0x80, 0xb0, 0xc9, 0x0a, 0x7d, 0x06, 0x66, 0xc2, 0xa8, 0xbd, 0xe5, + 0x04, 0x75, 0xd2, 0x26, 0x81, 0x4b, 0x55, 0x71, 0xe1, 0x23, 0x38, 0x79, 0xb0, 0x5f, 0x9b, 0xb9, + 0x9e, 0xc1, 0xe1, 0x2e, 0x6a, 0xf4, 0x26, 0xcc, 0xb6, 0xa3, 0xb0, 0xed, 0x6c, 0xb2, 0x89, 0x22, + 0x34, 0x0e, 0x2e, 0x7d, 0x9e, 0x3e, 0xd8, 0xaf, 0xcd, 0x36, 0xb2, 0xc8, 0xbb, 0xfb, 0xb5, 0x13, + 0xac, 0xa3, 0x28, 0x24, 0x45, 0xe2, 0x6e, 0x36, 0xf6, 0x26, 0x9c, 0xaa, 0x87, 0xb7, 0x83, 0xdb, + 0x4e, 0xe4, 0x2e, 0x36, 0xd6, 0x34, 0xe3, 0xfe, 0x9a, 0x34, 0x2e, 0xf9, 0xb9, 0x57, 0xee, 0x3e, + 0xa5, 0x95, 0xe4, 0xea, 0xff, 0xaa, 0xe7, 0x93, 0x02, 0x27, 0xc2, 0xdf, 0x2c, 0x19, 0x35, 0xa5, + 0xf4, 0xca, 0x53, 0x6f, 0x15, 0x7a, 0xea, 0x5f, 0x83, 0xb1, 0x0d, 0x8f, 0xf8, 0x2e, 0x26, 0x1b, + 0x62, 0x64, 0x1e, 0x2f, 0x3e, 0xc0, 0x58, 0xa5, 0x94, 0xd2, 0x69, 0xc4, 0x4d, 0xd3, 0x55, 0x51, + 0x18, 0x2b, 0x36, 0x68, 0x1b, 0x66, 0xa4, 0xed, 0x23, 0xb1, 0x62, 0x11, 0x3f, 0xd1, 0xcb, 0xa0, + 0x32, 0x99, 0xb3, 0x01, 0xc4, 0x19, 0x36, 0xb8, 0x8b, 0x31, 0xb5, 0x45, 0x77, 0xe8, 0x76, 0x35, + 0xc4, 0xa6, 0x34, 0xb3, 0x45, 0x99, 0x59, 0xcd, 0xa0, 0xf6, 0x57, 0x2d, 0x78, 0xa0, 0xab, 0x67, + 0x84, 0x7b, 0xe1, 0x88, 0x47, 0x21, 0x6b, 0xee, 0x97, 0xfa, 0x9b, 0xfb, 0xf6, 0xaf, 0x5b, 0x70, + 0x72, 0x65, 0xa7, 0x9d, 0xec, 0xd5, 0x3d, 0xf3, 0x34, 0xe1, 0x13, 0x30, 0xb2, 0x43, 0x5c, 0xaf, + 0xb3, 0x23, 0x46, 0xae, 0x26, 0x45, 0xfa, 0x55, 0x06, 0xbd, 0xbb, 0x5f, 0x9b, 0x6c, 0x26, 0x61, + 0xe4, 0x6c, 0x12, 0x0e, 0xc0, 0x82, 0x1c, 0xfd, 0x0c, 0xd7, 0x4d, 0xaf, 0x78, 0x3b, 0x9e, 0x3c, + 0x90, 0xea, 0xe9, 0xf2, 0x9a, 0x97, 0x1d, 0x3a, 0xff, 0x5a, 0xc7, 0x09, 0x12, 0x2f, 0xd9, 0x33, + 0x75, 0x59, 0xc6, 0x08, 0xa7, 0x3c, 0xed, 0xef, 0x5a, 0x30, 0x2d, 0xe5, 0xc9, 0xa2, 0xeb, 0x46, + 0x24, 0x8e, 0xd1, 0x1c, 0x94, 0xbc, 0xb6, 0x68, 0x29, 0x88, 0xd2, 0xa5, 0xb5, 0x06, 0x2e, 0x79, + 0x6d, 0xd4, 0x80, 0x0a, 0x3f, 0xdb, 0x4a, 0x27, 0xd8, 0x40, 0x27, 0x64, 0xcc, 0xf6, 0x5b, 0x97, + 0x25, 0x71, 0xca, 0x44, 0x6a, 0xc6, 0x6c, 0x2f, 0x2a, 0x9b, 0x27, 0x2d, 0x97, 0x04, 0x1c, 0x2b, + 0x0a, 0x74, 0x1e, 0xc6, 0x82, 0xd0, 0xe5, 0x47, 0x8d, 0x7c, 0x5d, 0xb3, 0x69, 0x7b, 0x4d, 0xc0, + 0xb0, 0xc2, 0xda, 0x3f, 0x6f, 0xc1, 0x84, 0xfc, 0xb2, 0x01, 0x95, 0x74, 0xba, 0xbc, 0x52, 0x05, + 0x3d, 0x5d, 0x5e, 0x54, 0xc9, 0x66, 0x18, 0x43, 0xb7, 0x2e, 0x1f, 0x46, 0xb7, 0xb6, 0xbf, 0x52, + 0x82, 0x29, 0xd9, 0x9c, 0x66, 0xe7, 0x56, 0x4c, 0x12, 0xb4, 0x0e, 0x15, 0x87, 0x77, 0x39, 0x91, + 0xb3, 0xf6, 0xd1, 0x7c, 0xab, 0xcb, 0x18, 0x9f, 0x74, 0x44, 0x17, 0x65, 0x69, 0x9c, 0x32, 0x42, + 0x3e, 0xcc, 0x06, 0x61, 0xc2, 0xb6, 0x3e, 0x85, 0xef, 0x75, 0x36, 0x90, 0xe5, 0x7e, 0x46, 0x70, + 0x9f, 0xbd, 0x96, 0xe5, 0x82, 0xbb, 0x19, 0xa3, 0x15, 0xe9, 0xe9, 0x29, 0xb3, 0x1a, 0xce, 0xf5, + 0xaa, 0xa1, 0xd8, 0xd1, 0x63, 0xff, 0x9e, 0x05, 0x15, 0x49, 0x76, 0x1c, 0xc7, 0x40, 0x57, 0x61, + 0x34, 0x66, 0x83, 0x20, 0xbb, 0xc6, 0xee, 0xd5, 0x70, 0x3e, 0x5e, 0xe9, 0x8e, 0xce, 0xff, 0xc7, + 0x58, 0xf2, 0x60, 0xae, 0x6a, 0xd5, 0xfc, 0x0f, 0x89, 0xab, 0x5a, 0xb5, 0xa7, 0x60, 0x97, 0xf9, + 0xcf, 0xac, 0xcd, 0x9a, 0x3d, 0x4f, 0x15, 0xcf, 0x76, 0x44, 0x36, 0xbc, 0x3b, 0x59, 0xc5, 0xb3, + 0xc1, 0xa0, 0x58, 0x60, 0xd1, 0x5b, 0x30, 0xd1, 0x92, 0x1e, 0xde, 0x54, 0x0c, 0x3c, 0xd6, 0xd3, + 0x5f, 0xae, 0x8e, 0x56, 0x78, 0x40, 0xce, 0xb2, 0x56, 0x1e, 0x1b, 0xdc, 0xa8, 0x84, 0x49, 0x4f, + 0x85, 0xcb, 0x3d, 0x9d, 0x2b, 0x11, 0x49, 0x52, 0xbe, 0x85, 0x07, 0xc2, 0xf6, 0xaf, 0x58, 0x30, + 0xc2, 0xfd, 0x84, 0x83, 0x39, 0x56, 0xb5, 0xa3, 0xa2, 0xb4, 0xef, 0x6e, 0x52, 0xa0, 0x38, 0x39, + 0x42, 0x57, 0xa1, 0xc2, 0x7e, 0x30, 0x7f, 0x49, 0xb9, 0x38, 0x12, 0x89, 0xd7, 0xaa, 0x37, 0xf0, + 0xa6, 0x2c, 0x86, 0x53, 0x0e, 0xf6, 0x2f, 0x96, 0xa9, 0xa8, 0x4a, 0x49, 0x8d, 0x5d, 0xdc, 0xba, + 0x7f, 0xbb, 0x78, 0xe9, 0x7e, 0xed, 0xe2, 0x9b, 0x30, 0xdd, 0xd2, 0xce, 0xa5, 0xd2, 0x91, 0x3c, + 0xdf, 0x73, 0x92, 0x68, 0x47, 0x58, 0xdc, 0x57, 0xb6, 0x6c, 0x32, 0xc1, 0x59, 0xae, 0xe8, 0xb3, + 0x30, 0xc1, 0xc7, 0x59, 0xd4, 0x32, 0xc4, 0x6a, 0xf9, 0x58, 0xf1, 0x7c, 0xd1, 0xab, 0x60, 0x33, + 0xb1, 0xa9, 0x15, 0xc7, 0x06, 0x33, 0xfb, 0x4b, 0xc3, 0x30, 0xbc, 0xb2, 0x4b, 0x82, 0xe4, 0x18, + 0x04, 0x52, 0x0b, 0xa6, 0xbc, 0x60, 0x37, 0xf4, 0x77, 0x89, 0xcb, 0xf1, 0x87, 0xd9, 0x5c, 0x4f, + 0x0b, 0xd6, 0x53, 0x6b, 0x06, 0x0b, 0x9c, 0x61, 0x79, 0x3f, 0x2c, 0xf7, 0x8b, 0x30, 0xc2, 0xc7, + 0x5e, 0x98, 0xed, 0xb9, 0x5e, 0x70, 0xd6, 0x89, 0x62, 0x15, 0xa4, 0x5e, 0x05, 0xee, 0x76, 0x17, + 0xc5, 0xd1, 0x3b, 0x30, 0xb5, 0xe1, 0x45, 0x71, 0x42, 0x4d, 0xee, 0x38, 0x71, 0x76, 0xda, 0xf7, + 0x60, 0xa9, 0xab, 0x7e, 0x58, 0x35, 0x38, 0xe1, 0x0c, 0x67, 0xb4, 0x09, 0x93, 0xd4, 0x78, 0x4c, + 0xab, 0x1a, 0x3d, 0x74, 0x55, 0xca, 0x15, 0x77, 0x45, 0x67, 0x84, 0x4d, 0xbe, 0x54, 0x98, 0xb4, + 0x98, 0xb1, 0x39, 0xc6, 0x34, 0x0a, 0x25, 0x4c, 0xb8, 0x95, 0xc9, 0x71, 0x54, 0x26, 0xb1, 0x78, + 0x8e, 0x8a, 0x29, 0x93, 0xd2, 0xa8, 0x0d, 0xfb, 0x6b, 0x74, 0x77, 0xa4, 0x7d, 0x78, 0x0c, 0x5b, + 0xcb, 0x2b, 0xe6, 0xd6, 0x72, 0xa6, 0x70, 0x3c, 0x0b, 0xb6, 0x95, 0xcf, 0xc1, 0xb8, 0x36, 0xdc, + 0x68, 0x01, 0x2a, 0x2d, 0x19, 0x7c, 0x20, 0xa4, 0xae, 0x52, 0x5f, 0x54, 0x54, 0x02, 0x4e, 0x69, + 0x68, 0x6f, 0x50, 0x65, 0x2f, 0x1b, 0x8c, 0x44, 0x55, 0x41, 0xcc, 0x30, 0xf6, 0x73, 0x00, 0x2b, + 0x77, 0x48, 0x6b, 0x91, 0x1b, 0x5f, 0xda, 0x19, 0x97, 0x55, 0x7c, 0xc6, 0x65, 0xff, 0xb1, 0x05, + 0x53, 0xab, 0xcb, 0x86, 0x52, 0x3e, 0x0f, 0xc0, 0xb5, 0xd0, 0xd7, 0x5f, 0xbf, 0x26, 0xbd, 0xc3, + 0xdc, 0xc1, 0xa7, 0xa0, 0x58, 0xa3, 0x40, 0x67, 0xa0, 0xec, 0x77, 0x02, 0xa1, 0x1c, 0x8e, 0x1e, + 0xec, 0xd7, 0xca, 0x57, 0x3a, 0x01, 0xa6, 0x30, 0x2d, 0xfe, 0xa7, 0x3c, 0x70, 0xfc, 0x4f, 0xdf, + 0xf8, 0x57, 0x54, 0x83, 0xe1, 0xdb, 0xb7, 0x3d, 0x37, 0xae, 0x0e, 0xa7, 0x9e, 0xeb, 0xd7, 0x5f, + 0x5f, 0xab, 0xc7, 0x98, 0xc3, 0xed, 0xbf, 0x58, 0x86, 0x99, 0x55, 0x9f, 0xdc, 0x31, 0x3e, 0xeb, + 0x31, 0x18, 0x71, 0x23, 0x6f, 0x97, 0x44, 0xd9, 0x5d, 0xbc, 0xce, 0xa0, 0x58, 0x60, 0x07, 0x8e, + 0x59, 0xba, 0xd1, 0xbd, 0x1f, 0x1f, 0x75, 0x94, 0x56, 0xff, 0xae, 0x78, 0x0b, 0x46, 0xf9, 0x51, + 0x29, 0xef, 0x8c, 0xf1, 0x0b, 0xcf, 0xe6, 0x35, 0x21, 0xdb, 0x17, 0xf3, 0xc2, 0xf9, 0xc1, 0xe3, + 0x46, 0x94, 0x10, 0x13, 0x50, 0x2c, 0x59, 0xce, 0x7d, 0x12, 0x26, 0x74, 0xca, 0x43, 0x05, 0x90, + 0xfc, 0x25, 0x0b, 0x4e, 0xac, 0xfa, 0x61, 0x6b, 0x3b, 0x13, 0x40, 0xf6, 0x02, 0x8c, 0xd3, 0xf5, + 0x14, 0x1b, 0x91, 0x94, 0x46, 0x94, 0xa9, 0x40, 0x61, 0x9d, 0x4e, 0x2b, 0x76, 0xe3, 0xc6, 0x5a, + 0x3d, 0x2f, 0x38, 0x55, 0xa0, 0xb0, 0x4e, 0x67, 0xff, 0x81, 0x05, 0x0f, 0x5f, 0x5c, 0x5e, 0x69, + 0x90, 0x28, 0xf6, 0xe2, 0x84, 0x04, 0x49, 0x57, 0x7c, 0x2c, 0x55, 0xee, 0x5c, 0xad, 0x29, 0xa9, + 0x72, 0x57, 0x67, 0xad, 0x10, 0xd8, 0x0f, 0x4b, 0xec, 0xf7, 0xaf, 0x59, 0x70, 0xe2, 0xa2, 0x97, + 0x60, 0xd2, 0x0e, 0xb3, 0xf1, 0xa9, 0x11, 0x69, 0x87, 0xb1, 0x97, 0x84, 0xd1, 0x5e, 0x36, 0x3e, + 0x15, 0x2b, 0x0c, 0xd6, 0xa8, 0x78, 0xcd, 0xbb, 0x5e, 0x4c, 0x5b, 0x5a, 0x32, 0x2d, 0x4c, 0x2c, + 0xe0, 0x58, 0x51, 0xd0, 0x0f, 0x73, 0xbd, 0x88, 0x69, 0x08, 0x7b, 0x62, 0x39, 0xab, 0x0f, 0xab, + 0x4b, 0x04, 0x4e, 0x69, 0xec, 0xaf, 0x5a, 0x70, 0xea, 0xa2, 0xdf, 0x89, 0x13, 0x12, 0x6d, 0xc4, + 0x46, 0x63, 0x9f, 0x83, 0x0a, 0x91, 0x5a, 0xb8, 0x68, 0xab, 0xda, 0x37, 0x94, 0x7a, 0xce, 0x83, + 0x63, 0x15, 0xdd, 0x00, 0xd1, 0x98, 0x87, 0x8b, 0x22, 0xfc, 0x46, 0x09, 0x26, 0x2f, 0xad, 0xaf, + 0x37, 0x2e, 0x92, 0x44, 0x88, 0xcc, 0xfe, 0x5e, 0x24, 0xac, 0x19, 0xc2, 0xbd, 0x74, 0x9d, 0x4e, + 0xe2, 0xf9, 0xf3, 0xfc, 0x5e, 0xc2, 0xfc, 0x5a, 0x90, 0x5c, 0x8f, 0x9a, 0x49, 0xe4, 0x05, 0x9b, + 0xb9, 0xa6, 0xb3, 0x14, 0xec, 0xe5, 0x22, 0xc1, 0x8e, 0x9e, 0x83, 0x11, 0x76, 0x31, 0x42, 0x6a, + 0x1d, 0x0f, 0x2a, 0x55, 0x81, 0x41, 0xef, 0xee, 0xd7, 0x2a, 0x37, 0xf0, 0x1a, 0xff, 0x83, 0x05, + 0x29, 0xba, 0x01, 0xe3, 0x5b, 0x49, 0xd2, 0xbe, 0x44, 0x1c, 0x97, 0x44, 0x52, 0x3a, 0x9c, 0xcd, + 0x93, 0x0e, 0xb4, 0x13, 0x38, 0x59, 0xba, 0xa0, 0x52, 0x58, 0x8c, 0x75, 0x3e, 0x76, 0x13, 0x20, + 0xc5, 0x1d, 0x91, 0xd9, 0x60, 0xff, 0xc0, 0x82, 0xd1, 0x4b, 0x4e, 0xe0, 0xfa, 0x24, 0x42, 0x2f, + 0xc3, 0x10, 0xb9, 0x43, 0x5a, 0x62, 0x07, 0xcf, 0x6d, 0x70, 0xba, 0xcb, 0x71, 0x47, 0x18, 0xfd, + 0x8f, 0x59, 0x29, 0x74, 0x09, 0x46, 0x69, 0x6b, 0x2f, 0xaa, 0x30, 0xe5, 0x47, 0x8a, 0xbe, 0x58, + 0x0d, 0x3b, 0xdf, 0x18, 0x05, 0x08, 0xcb, 0xe2, 0xcc, 0xa1, 0xd3, 0x6a, 0x37, 0xa9, 0x00, 0x4b, + 0x7a, 0x99, 0x5b, 0xeb, 0xcb, 0x0d, 0x4e, 0x24, 0xb8, 0x71, 0x87, 0x8e, 0x04, 0xe2, 0x94, 0x89, + 0xbd, 0x0e, 0x15, 0x3a, 0xa8, 0x8b, 0xbe, 0xe7, 0xf4, 0xf6, 0x25, 0x3d, 0x05, 0x15, 0xe9, 0xd7, + 0x89, 0x45, 0xa4, 0x33, 0xe3, 0x2a, 0xdd, 0x3e, 0x31, 0x4e, 0xf1, 0xf6, 0x8b, 0x70, 0x92, 0x1d, + 0x94, 0x3a, 0xc9, 0x96, 0xb1, 0xc6, 0xfa, 0x4e, 0x66, 0xfb, 0xeb, 0x43, 0x30, 0xbb, 0xd6, 0x5c, + 0x6e, 0x9a, 0xee, 0xc2, 0x17, 0x61, 0x82, 0xef, 0xed, 0x74, 0x8a, 0x3a, 0xbe, 0x28, 0xaf, 0x8e, + 0x03, 0xd6, 0x35, 0x1c, 0x36, 0x28, 0xd1, 0xc3, 0x50, 0xf6, 0xde, 0x0d, 0xb2, 0x01, 0x6e, 0x6b, + 0xaf, 0x5d, 0xc3, 0x14, 0x4e, 0xd1, 0x54, 0x4d, 0xe0, 0x22, 0x51, 0xa1, 0x95, 0xaa, 0xf0, 0x0a, + 0x4c, 0x79, 0x71, 0x2b, 0xf6, 0xd6, 0x02, 0x2a, 0x2f, 0x9c, 0x96, 0x9c, 0xec, 0xa9, 0x0e, 0x4f, + 0x9b, 0xaa, 0xb0, 0x38, 0x43, 0xad, 0xc9, 0xe7, 0xe1, 0x81, 0x55, 0x8d, 0xbe, 0x51, 0xd0, 0x54, + 0x8b, 0x6a, 0xb3, 0xaf, 0x8b, 0x59, 0xb0, 0x8d, 0xd0, 0xa2, 0xf8, 0x07, 0xc7, 0x58, 0xe2, 0xd0, + 0x45, 0x98, 0x6d, 0x6d, 0x39, 0xed, 0xc5, 0x4e, 0xb2, 0x55, 0xf7, 0xe2, 0x56, 0xb8, 0x4b, 0xa2, + 0x3d, 0xa6, 0xdb, 0x8e, 0xa5, 0x6e, 0x23, 0x85, 0x58, 0xbe, 0xb4, 0xd8, 0xa0, 0x94, 0xb8, 0xbb, + 0x8c, 0xa9, 0x54, 0xc0, 0x91, 0x29, 0x15, 0x8b, 0x30, 0x2d, 0xeb, 0x6a, 0x92, 0x98, 0x09, 0xfc, + 0x71, 0xd6, 0x3a, 0x75, 0xc3, 0x44, 0x80, 0x55, 0xdb, 0xb2, 0xf4, 0xf6, 0x3b, 0x50, 0x51, 0x81, + 0x60, 0x32, 0x96, 0xd1, 0x2a, 0x88, 0x65, 0xec, 0x2f, 0xaa, 0xa5, 0x3b, 0xbb, 0x9c, 0xeb, 0xce, + 0xfe, 0x5b, 0x16, 0xa4, 0xf1, 0x30, 0xe8, 0x12, 0x54, 0xda, 0x21, 0x3b, 0xd2, 0x8a, 0xe4, 0x39, + 0xf1, 0x83, 0xb9, 0xab, 0x9a, 0x4b, 0x10, 0xde, 0x0d, 0x0d, 0x59, 0x02, 0xa7, 0x85, 0xd1, 0x12, + 0x8c, 0xb6, 0x23, 0xd2, 0x4c, 0xd8, 0x05, 0x82, 0xbe, 0x7c, 0xf8, 0x50, 0x73, 0x7a, 0x2c, 0x0b, + 0xda, 0xbf, 0x69, 0x01, 0x70, 0x6f, 0xb1, 0x13, 0x6c, 0x92, 0x63, 0xb0, 0x80, 0xeb, 0x30, 0x14, + 0xb7, 0x49, 0xab, 0xd7, 0x61, 0x63, 0xda, 0x9e, 0x66, 0x9b, 0xb4, 0xd2, 0x0e, 0xa7, 0xff, 0x30, + 0x2b, 0x6d, 0xff, 0x1c, 0xc0, 0x54, 0x4a, 0x46, 0x2d, 0x13, 0xf4, 0x8c, 0x11, 0x2f, 0x7f, 0x26, + 0x13, 0x2f, 0x5f, 0x61, 0xd4, 0x5a, 0x88, 0xfc, 0x3b, 0x50, 0xde, 0x71, 0xee, 0x08, 0xf3, 0xe7, + 0xa9, 0xde, 0xcd, 0xa0, 0xfc, 0xe7, 0xaf, 0x3a, 0x77, 0xb8, 0x82, 0xf9, 0x94, 0x9c, 0x20, 0x57, + 0x9d, 0x3b, 0x77, 0xf9, 0x91, 0x22, 0x93, 0x35, 0xd4, 0xca, 0xfa, 0xc2, 0x9f, 0xa4, 0xff, 0xd9, + 0xb6, 0x41, 0x2b, 0x61, 0x75, 0x79, 0x81, 0xf0, 0x9d, 0x0e, 0x54, 0x97, 0x17, 0x64, 0xeb, 0xf2, + 0x82, 0x01, 0xea, 0xf2, 0x02, 0xf4, 0x1e, 0x8c, 0x8a, 0xb3, 0x0a, 0x16, 0xe8, 0x37, 0x7e, 0x61, + 0x61, 0x80, 0xfa, 0xc4, 0x51, 0x07, 0xaf, 0x73, 0x41, 0x2a, 0xd0, 0x02, 0xda, 0xb7, 0x5e, 0x59, + 0x21, 0xfa, 0x1b, 0x16, 0x4c, 0x89, 0xdf, 0x98, 0xbc, 0xdb, 0x21, 0x71, 0x22, 0x36, 0xea, 0x8f, + 0x0f, 0xde, 0x06, 0x51, 0x90, 0x37, 0xe5, 0xe3, 0x52, 0x5a, 0x9a, 0xc8, 0xbe, 0x2d, 0xca, 0xb4, + 0x02, 0xfd, 0x63, 0x0b, 0x4e, 0xee, 0x38, 0x77, 0x78, 0x8d, 0x1c, 0x86, 0x9d, 0xc4, 0x0b, 0x45, + 0xe0, 0xe2, 0xcb, 0x83, 0x0d, 0x7f, 0x57, 0x71, 0xde, 0x48, 0x19, 0xe3, 0x74, 0x32, 0x8f, 0xa4, + 0x6f, 0x53, 0x73, 0xdb, 0x35, 0xb7, 0x01, 0x63, 0x72, 0xbe, 0xe5, 0x98, 0x29, 0x75, 0x5d, 0x0b, + 0x39, 0xf4, 0x51, 0x91, 0x66, 0xd6, 0xb0, 0x7a, 0xc4, 0x5c, 0xbb, 0xaf, 0xf5, 0xbc, 0x03, 0x13, + 0xfa, 0x1c, 0xbb, 0xaf, 0x75, 0xbd, 0x0b, 0x27, 0x72, 0xe6, 0xd2, 0x7d, 0xad, 0xf2, 0x36, 0x9c, + 0x29, 0x9c, 0x1f, 0xf7, 0xb3, 0x62, 0xfb, 0x1b, 0x96, 0x2e, 0x07, 0x8f, 0xc1, 0x6f, 0xb4, 0x6c, + 0xfa, 0x8d, 0xce, 0xf6, 0x5e, 0x39, 0x05, 0xce, 0xa3, 0xb7, 0xf4, 0x46, 0x53, 0xa9, 0x8e, 0x5e, + 0x85, 0x11, 0x9f, 0x42, 0xe4, 0x01, 0x99, 0xdd, 0x7f, 0x45, 0xa6, 0x2a, 0x11, 0x83, 0xc7, 0x58, + 0x70, 0xb0, 0x7f, 0xc7, 0x82, 0xa1, 0x63, 0xe8, 0x09, 0x6c, 0xf6, 0xc4, 0x33, 0x85, 0xac, 0xc5, + 0x6d, 0xf0, 0x79, 0xec, 0xdc, 0x5e, 0xb9, 0x93, 0x90, 0x20, 0x66, 0x7a, 0x75, 0x6e, 0xc7, 0xfc, + 0x9f, 0x12, 0x8c, 0xd3, 0xaa, 0x64, 0x34, 0xc7, 0x4b, 0x30, 0xe9, 0x3b, 0xb7, 0x88, 0x2f, 0x7d, + 0xd9, 0x59, 0xeb, 0xf2, 0x8a, 0x8e, 0xc4, 0x26, 0x2d, 0x2d, 0xbc, 0xa1, 0xbb, 0xf5, 0x85, 0xfe, + 0xa2, 0x0a, 0x1b, 0x3e, 0x7f, 0x6c, 0xd2, 0x52, 0x43, 0xe7, 0xb6, 0x93, 0xb4, 0xb6, 0x84, 0xe5, + 0xa9, 0x9a, 0xfb, 0x3a, 0x05, 0x62, 0x8e, 0xa3, 0x7a, 0x98, 0x9c, 0x9d, 0x37, 0x49, 0xc4, 0xf4, + 0x30, 0xae, 0xe5, 0x2a, 0x3d, 0x0c, 0x9b, 0x68, 0x9c, 0xa5, 0x47, 0x9f, 0x84, 0x29, 0xda, 0x39, + 0x61, 0x27, 0x91, 0xb1, 0x2a, 0xc3, 0x2c, 0x56, 0x85, 0x85, 0x26, 0xaf, 0x1b, 0x18, 0x9c, 0xa1, + 0x44, 0x0d, 0x38, 0xe9, 0x05, 0x2d, 0xbf, 0xe3, 0x92, 0x1b, 0x81, 0x17, 0x78, 0x89, 0xe7, 0xf8, + 0xde, 0x7b, 0xc4, 0x15, 0x7a, 0xb0, 0x0a, 0x2b, 0x5a, 0xcb, 0xa1, 0xc1, 0xb9, 0x25, 0xed, 0x9f, + 0x81, 0x13, 0x57, 0x42, 0xc7, 0x5d, 0x72, 0x7c, 0x27, 0x68, 0x91, 0x68, 0x2d, 0xd8, 0xec, 0x7b, + 0x52, 0xae, 0x9f, 0x6b, 0x97, 0xfa, 0x9d, 0x6b, 0xdb, 0x5b, 0x80, 0xf4, 0x0a, 0x44, 0x8c, 0x16, + 0x86, 0x51, 0x8f, 0x57, 0x25, 0xa6, 0xff, 0xe3, 0xf9, 0x4a, 0x72, 0x57, 0xcb, 0xb4, 0xe8, 0x23, + 0x0e, 0xc0, 0x92, 0x11, 0x35, 0xa4, 0xf2, 0xb4, 0xea, 0xfe, 0x36, 0xae, 0xfd, 0x02, 0xcc, 0xb2, + 0x92, 0x87, 0xb4, 0xbf, 0xfe, 0xaa, 0x05, 0xd3, 0xd7, 0x32, 0x97, 0x53, 0x1f, 0x83, 0x91, 0x98, + 0x44, 0x39, 0x4e, 0xca, 0x26, 0x83, 0x62, 0x81, 0x3d, 0x72, 0x67, 0xc8, 0x0f, 0x2d, 0xa8, 0xb0, + 0xe0, 0xdf, 0x36, 0xb5, 0xa5, 0xee, 0xbf, 0x52, 0xbb, 0x6c, 0x28, 0xb5, 0xb9, 0x46, 0xba, 0x6a, + 0x4e, 0x91, 0x4e, 0x8b, 0x2e, 0xab, 0x4b, 0x9b, 0x3d, 0xec, 0xf3, 0x94, 0x0d, 0xbf, 0xe2, 0x37, + 0x65, 0xde, 0xec, 0x94, 0xd7, 0x38, 0xd9, 0x51, 0xb5, 0xa2, 0xfd, 0x90, 0x1c, 0x55, 0xab, 0xf6, + 0x14, 0x48, 0xbf, 0x86, 0xd6, 0x64, 0xb6, 0x2b, 0x7c, 0x9a, 0x85, 0x74, 0xb2, 0xb5, 0xa9, 0x6e, + 0x37, 0xd7, 0x44, 0x88, 0xa6, 0x80, 0xde, 0x65, 0x82, 0x4c, 0xfc, 0xe3, 0x57, 0xd6, 0xd3, 0x22, + 0xf6, 0x25, 0x98, 0xce, 0x74, 0x18, 0x7a, 0x01, 0x86, 0xdb, 0x5b, 0x4e, 0x4c, 0x32, 0x21, 0x3a, + 0xc3, 0x0d, 0x0a, 0xbc, 0xbb, 0x5f, 0x9b, 0x52, 0x05, 0x18, 0x04, 0x73, 0x6a, 0xfb, 0xbf, 0x5b, + 0x30, 0x74, 0x2d, 0x74, 0x8f, 0x63, 0x32, 0xbd, 0x62, 0x4c, 0xa6, 0x87, 0x8a, 0x52, 0x5f, 0x14, + 0xce, 0xa3, 0xd5, 0xcc, 0x3c, 0x3a, 0x5b, 0xc8, 0xa1, 0xf7, 0x14, 0xda, 0x81, 0x71, 0x96, 0x50, + 0x43, 0x84, 0x0b, 0x3d, 0x67, 0xd8, 0x57, 0xb5, 0x8c, 0x7d, 0x35, 0xad, 0x91, 0x6a, 0x56, 0xd6, + 0x13, 0x30, 0x2a, 0x42, 0x56, 0xb2, 0xc1, 0xab, 0x82, 0x16, 0x4b, 0xbc, 0xfd, 0x2b, 0x65, 0x30, + 0x12, 0x78, 0xa0, 0xdf, 0xb3, 0x60, 0x3e, 0xe2, 0xd7, 0x75, 0xdc, 0x7a, 0x27, 0xf2, 0x82, 0xcd, + 0x66, 0x6b, 0x8b, 0xb8, 0x1d, 0xdf, 0x0b, 0x36, 0xd7, 0x36, 0x83, 0x50, 0x81, 0x57, 0xee, 0x90, + 0x56, 0x87, 0x39, 0xa8, 0xfb, 0x64, 0x0b, 0x51, 0x47, 0xc2, 0x17, 0x0e, 0xf6, 0x6b, 0xf3, 0xf8, + 0x50, 0xbc, 0xf1, 0x21, 0xdb, 0x82, 0xfe, 0xc0, 0x82, 0x05, 0x9e, 0xd7, 0x62, 0xf0, 0xf6, 0xf7, + 0xb0, 0x46, 0x1b, 0x92, 0x55, 0xca, 0x64, 0x9d, 0x44, 0x3b, 0x4b, 0x9f, 0x10, 0x1d, 0xba, 0xd0, + 0x38, 0x5c, 0x5d, 0xf8, 0xb0, 0x8d, 0xb3, 0xff, 0x65, 0x19, 0x26, 0x69, 0x2f, 0xa6, 0x57, 0xd4, + 0x5f, 0x30, 0xa6, 0xc4, 0x23, 0x99, 0x29, 0x31, 0x6b, 0x10, 0x1f, 0xcd, 0xed, 0xf4, 0x18, 0x66, + 0x7d, 0x27, 0x4e, 0x2e, 0x11, 0x27, 0x4a, 0x6e, 0x11, 0x87, 0x9d, 0xc1, 0x8a, 0x69, 0x7e, 0x98, + 0x63, 0x5d, 0xe5, 0xc5, 0xba, 0x92, 0x65, 0x86, 0xbb, 0xf9, 0xa3, 0x5d, 0x40, 0xec, 0xbc, 0x37, + 0x72, 0x82, 0x98, 0x7f, 0x8b, 0x27, 0x9c, 0xd7, 0x87, 0xab, 0x75, 0x4e, 0xd4, 0x8a, 0xae, 0x74, + 0x71, 0xc3, 0x39, 0x35, 0x68, 0xe7, 0xf8, 0xc3, 0x83, 0x9e, 0xe3, 0x8f, 0xf4, 0x89, 0x10, 0xdf, + 0x81, 0x19, 0x31, 0x2a, 0x1b, 0xde, 0xa6, 0xd8, 0xa4, 0xdf, 0xc8, 0xc4, 0xf9, 0x58, 0x83, 0x47, + 0x24, 0xf4, 0x09, 0xf2, 0xb1, 0x7f, 0x16, 0x4e, 0xd0, 0xea, 0xcc, 0x78, 0xe6, 0x18, 0x11, 0x98, + 0xde, 0xee, 0xdc, 0x22, 0x3e, 0x49, 0x24, 0x4c, 0x54, 0x9a, 0xab, 0xf6, 0x9b, 0xa5, 0x53, 0xdd, + 0xf2, 0xb2, 0xc9, 0x02, 0x67, 0x79, 0xda, 0xbf, 0x6a, 0x01, 0x8b, 0x18, 0x3c, 0x86, 0xed, 0xef, + 0x53, 0xe6, 0xf6, 0x57, 0x2d, 0x92, 0x40, 0x05, 0x3b, 0xdf, 0xf3, 0x7c, 0x58, 0x1a, 0x51, 0x78, + 0x67, 0x4f, 0xea, 0xfe, 0xfd, 0x35, 0xae, 0xff, 0x6d, 0xf1, 0x05, 0xa9, 0x6e, 0x2f, 0xa2, 0xcf, + 0xc3, 0x58, 0xcb, 0x69, 0x3b, 0x2d, 0x9e, 0x39, 0xa9, 0xd0, 0xfb, 0x63, 0x14, 0x9a, 0x5f, 0x16, + 0x25, 0xb8, 0x37, 0xe3, 0x27, 0xe4, 0x57, 0x4a, 0x70, 0x5f, 0x0f, 0x86, 0xaa, 0x72, 0x6e, 0x1b, + 0x26, 0x0d, 0x66, 0xf7, 0xd5, 0xf4, 0xfd, 0x3c, 0xdf, 0x2e, 0x94, 0xc5, 0xb2, 0x03, 0xb3, 0x81, + 0xf6, 0x9f, 0x0a, 0x47, 0xa9, 0x4e, 0x7f, 0xb4, 0xdf, 0x86, 0xc0, 0x24, 0xa9, 0x16, 0x11, 0x99, + 0x61, 0x83, 0xbb, 0x39, 0xdb, 0x7f, 0xc7, 0x82, 0x07, 0x74, 0x42, 0xed, 0x62, 0x69, 0x3f, 0x7f, + 0x72, 0x1d, 0xc6, 0xc2, 0x36, 0x89, 0x9c, 0xd4, 0x26, 0x3b, 0x2f, 0x3b, 0xfd, 0xba, 0x80, 0xdf, + 0xdd, 0xaf, 0x9d, 0xd4, 0xb9, 0x4b, 0x38, 0x56, 0x25, 0x91, 0x0d, 0x23, 0xac, 0x33, 0x62, 0x71, + 0xe9, 0x97, 0x65, 0x17, 0x62, 0xe7, 0x50, 0x31, 0x16, 0x18, 0xfb, 0xe7, 0x2c, 0x3e, 0xb1, 0xf4, + 0xa6, 0xa3, 0x77, 0x61, 0x66, 0x87, 0x9a, 0x6f, 0x2b, 0x77, 0xda, 0x11, 0xf7, 0x86, 0xcb, 0x7e, + 0x7a, 0xaa, 0x5f, 0x3f, 0x69, 0x1f, 0xb9, 0x54, 0x15, 0x6d, 0x9e, 0xb9, 0x9a, 0x61, 0x86, 0xbb, + 0xd8, 0xdb, 0x7f, 0x56, 0xe2, 0x2b, 0x91, 0x69, 0x75, 0x4f, 0xc0, 0x68, 0x3b, 0x74, 0x97, 0xd7, + 0xea, 0x58, 0xf4, 0x90, 0x12, 0x57, 0x0d, 0x0e, 0xc6, 0x12, 0x8f, 0x2e, 0x00, 0x90, 0x3b, 0x09, + 0x89, 0x02, 0xc7, 0x57, 0xa7, 0xe4, 0x4a, 0x79, 0x5a, 0x51, 0x18, 0xac, 0x51, 0xd1, 0x32, 0xed, + 0x28, 0xdc, 0xf5, 0x5c, 0x76, 0xeb, 0xa2, 0x6c, 0x96, 0x69, 0x28, 0x0c, 0xd6, 0xa8, 0xa8, 0xa9, + 0xdc, 0x09, 0x62, 0xbe, 0x01, 0x3a, 0xb7, 0x44, 0x66, 0x9b, 0xb1, 0xd4, 0x54, 0xbe, 0xa1, 0x23, + 0xb1, 0x49, 0x8b, 0x16, 0x61, 0x24, 0x71, 0xd8, 0xd9, 0xef, 0x70, 0x71, 0x2c, 0xcd, 0x3a, 0xa5, + 0xd0, 0x13, 0x08, 0xd1, 0x02, 0x58, 0x14, 0x44, 0x6f, 0x4a, 0x11, 0xcc, 0x45, 0xb2, 0x88, 0x89, + 0x2a, 0x9c, 0xb6, 0xba, 0xf8, 0xd6, 0x65, 0xb0, 0x88, 0xb5, 0x32, 0x78, 0xd9, 0x5f, 0xac, 0x00, + 0xa4, 0xda, 0x1e, 0x7a, 0xaf, 0x4b, 0x44, 0x3c, 0xdd, 0x5b, 0x3f, 0x3c, 0x3a, 0xf9, 0x80, 0xbe, + 0x64, 0xc1, 0xb8, 0xe3, 0xfb, 0x61, 0xcb, 0x49, 0x58, 0x2f, 0x97, 0x7a, 0x8b, 0x28, 0x51, 0xff, + 0x62, 0x5a, 0x82, 0x37, 0xe1, 0x39, 0x79, 0xac, 0xab, 0x61, 0xfa, 0xb6, 0x42, 0xaf, 0x18, 0xfd, + 0x84, 0x34, 0x02, 0xf8, 0xf4, 0x98, 0xcb, 0x1a, 0x01, 0x15, 0x26, 0x8d, 0x35, 0xfd, 0x1f, 0xdd, + 0x30, 0x12, 0xca, 0x0c, 0x15, 0xdf, 0x9d, 0x35, 0x94, 0x9e, 0x7e, 0xb9, 0x64, 0x50, 0x43, 0x8f, + 0x0d, 0x1f, 0x2e, 0xbe, 0x60, 0xae, 0x69, 0xd7, 0x7d, 0xe2, 0xc2, 0xdf, 0x81, 0x69, 0xd7, 0xdc, + 0x6e, 0xc5, 0x6c, 0x7a, 0xbc, 0x88, 0x6f, 0x66, 0x77, 0x4e, 0x37, 0xd8, 0x0c, 0x02, 0x67, 0x19, + 0xa3, 0x06, 0x8f, 0xd2, 0x5f, 0x0b, 0x36, 0x42, 0x11, 0x5b, 0x67, 0x17, 0x8e, 0xe5, 0x5e, 0x9c, + 0x90, 0x1d, 0x4a, 0x99, 0xee, 0xa3, 0xd7, 0x44, 0x59, 0xac, 0xb8, 0xa0, 0x57, 0x61, 0x84, 0x5d, + 0x9f, 0x8a, 0xab, 0x63, 0xc5, 0x7e, 0x40, 0xf3, 0xe6, 0x6f, 0xba, 0xa8, 0xd8, 0xdf, 0x18, 0x0b, + 0x0e, 0xe8, 0x92, 0xbc, 0xbf, 0x1f, 0xaf, 0x05, 0x37, 0x62, 0xc2, 0xee, 0xef, 0x57, 0x96, 0x3e, + 0x9a, 0x5e, 0xcd, 0xe7, 0xf0, 0xdc, 0xa4, 0x79, 0x46, 0x49, 0xaa, 0xaf, 0x88, 0xff, 0x32, 0x17, + 0x5f, 0x15, 0x8a, 0x9b, 0x67, 0xe6, 0xeb, 0x4b, 0xbb, 0xf3, 0xa6, 0xc9, 0x02, 0x67, 0x79, 0x1e, + 0xeb, 0xf6, 0x39, 0x17, 0xc0, 0x4c, 0x76, 0x61, 0xdd, 0xd7, 0xed, 0xfa, 0x07, 0x43, 0x30, 0x65, + 0x4e, 0x04, 0xb4, 0x00, 0x15, 0xc1, 0x44, 0x65, 0xdf, 0x52, 0x73, 0xfb, 0xaa, 0x44, 0xe0, 0x94, + 0x86, 0x65, 0x1f, 0x63, 0xc5, 0xb5, 0xa0, 0xa9, 0x34, 0xfb, 0x98, 0xc2, 0x60, 0x8d, 0x8a, 0x2a, + 0xd1, 0xb7, 0xc2, 0x30, 0x51, 0x5b, 0x81, 0x9a, 0x2d, 0x4b, 0x0c, 0x8a, 0x05, 0x96, 0x6e, 0x01, + 0xdb, 0x24, 0x0a, 0x88, 0x6f, 0x7a, 0x32, 0xd5, 0x16, 0x70, 0x59, 0x47, 0x62, 0x93, 0x96, 0x6e, + 0x69, 0x61, 0xcc, 0xa6, 0x9f, 0x50, 0xd5, 0xd3, 0x20, 0xb4, 0x26, 0xbf, 0x3e, 0x28, 0xf1, 0xe8, + 0x0d, 0x78, 0x40, 0xdd, 0xf6, 0xc3, 0xdc, 0x33, 0x2c, 0x6b, 0x1c, 0x31, 0x2c, 0xeb, 0x07, 0x96, + 0xf3, 0xc9, 0x70, 0x51, 0x79, 0xf4, 0x0a, 0x4c, 0x09, 0x15, 0x58, 0x72, 0x1c, 0x35, 0x63, 0x0e, + 0x2e, 0x1b, 0x58, 0x9c, 0xa1, 0x46, 0x75, 0x98, 0xa1, 0x10, 0xa6, 0x85, 0x4a, 0x0e, 0xfc, 0xd6, + 0xa2, 0xda, 0xeb, 0x2f, 0x67, 0xf0, 0xb8, 0xab, 0x04, 0x5a, 0x84, 0x69, 0xae, 0xa3, 0x50, 0x9b, + 0x92, 0x8d, 0x83, 0x08, 0x79, 0x55, 0x0b, 0xe1, 0xba, 0x89, 0xc6, 0x59, 0x7a, 0xf4, 0x22, 0x4c, + 0x38, 0x51, 0x6b, 0xcb, 0x4b, 0x48, 0x2b, 0xe9, 0x44, 0x3c, 0x3b, 0x86, 0x16, 0xb4, 0xb1, 0xa8, + 0xe1, 0xb0, 0x41, 0x69, 0xbf, 0x07, 0x27, 0x72, 0xa2, 0xe5, 0xe9, 0xc4, 0x71, 0xda, 0x9e, 0xfc, + 0xa6, 0x4c, 0x38, 0xd9, 0x62, 0x63, 0x4d, 0x7e, 0x8d, 0x46, 0x45, 0x67, 0x27, 0x73, 0x89, 0x6b, + 0x09, 0x33, 0xd5, 0xec, 0x5c, 0x95, 0x08, 0x9c, 0xd2, 0xd8, 0xdf, 0x01, 0xd0, 0x1c, 0x3a, 0x03, + 0x04, 0x13, 0xbd, 0x08, 0x13, 0x32, 0xcb, 0xab, 0x96, 0x53, 0x51, 0x7d, 0xe6, 0x45, 0x0d, 0x87, + 0x0d, 0x4a, 0xda, 0xb6, 0x40, 0xba, 0xa9, 0xb2, 0xc1, 0x6b, 0xca, 0x7f, 0x85, 0x53, 0x1a, 0xf4, + 0x34, 0x8c, 0xc5, 0xc4, 0xdf, 0xb8, 0xe2, 0x05, 0xdb, 0x62, 0x62, 0x2b, 0x29, 0xdc, 0x14, 0x70, + 0xac, 0x28, 0xd0, 0x12, 0x94, 0x3b, 0x9e, 0x2b, 0xa6, 0xb2, 0xdc, 0xf0, 0xcb, 0x37, 0xd6, 0xea, + 0x77, 0xf7, 0x6b, 0x8f, 0x14, 0x25, 0xaf, 0xa5, 0xa6, 0x7d, 0x3c, 0x4f, 0x97, 0x1f, 0x2d, 0x9c, + 0x77, 0x36, 0x30, 0x72, 0xc8, 0xb3, 0x81, 0x0b, 0x00, 0xe2, 0xab, 0xe5, 0x5c, 0x2e, 0xa7, 0xa3, + 0x76, 0x51, 0x61, 0xb0, 0x46, 0x85, 0x62, 0x98, 0x6d, 0x45, 0xc4, 0x91, 0x36, 0x34, 0x8f, 0xfb, + 0x1e, 0xbb, 0x77, 0x07, 0xc1, 0x72, 0x96, 0x19, 0xee, 0xe6, 0x8f, 0x42, 0x98, 0x75, 0xc5, 0xe5, + 0xd2, 0xb4, 0xd2, 0xca, 0xe1, 0x83, 0xcd, 0x59, 0x5c, 0x4d, 0x96, 0x11, 0xee, 0xe6, 0x8d, 0xde, + 0x86, 0x39, 0x09, 0xec, 0xbe, 0xcf, 0xcb, 0x96, 0x4b, 0x79, 0xe9, 0xec, 0xc1, 0x7e, 0x6d, 0xae, + 0x5e, 0x48, 0x85, 0x7b, 0x70, 0x40, 0x18, 0x46, 0xd8, 0x59, 0x52, 0x5c, 0x1d, 0x67, 0xfb, 0xdc, + 0x93, 0xc5, 0xce, 0x00, 0x3a, 0xd7, 0xe7, 0xd9, 0x39, 0x94, 0x88, 0xbf, 0x4d, 0x8f, 0xe5, 0x18, + 0x10, 0x0b, 0x4e, 0x68, 0x03, 0xc6, 0x9d, 0x20, 0x08, 0x13, 0x87, 0xab, 0x50, 0x13, 0xc5, 0xba, + 0x9f, 0xc6, 0x78, 0x31, 0x2d, 0xc1, 0xb9, 0xab, 0x90, 0x3e, 0x0d, 0x83, 0x75, 0xc6, 0xe8, 0x36, + 0x4c, 0x87, 0xb7, 0xa9, 0x70, 0x94, 0x5e, 0x8a, 0xb8, 0x3a, 0xc9, 0xea, 0x7a, 0x7e, 0x40, 0x3f, + 0xad, 0x51, 0x58, 0x93, 0x5a, 0x26, 0x53, 0x9c, 0xad, 0x05, 0xcd, 0x1b, 0xde, 0xea, 0xa9, 0x34, + 0xd0, 0x3c, 0xf5, 0x56, 0xeb, 0xce, 0x69, 0x76, 0x3f, 0x9c, 0xc7, 0x93, 0xb2, 0xd5, 0x3f, 0x9d, + 0xb9, 0x1f, 0x9e, 0xa2, 0xb0, 0x4e, 0x87, 0xb6, 0x60, 0x22, 0x3d, 0xb2, 0x8a, 0x62, 0x96, 0x3e, + 0x66, 0xfc, 0xc2, 0x85, 0xc1, 0x3e, 0x6e, 0x4d, 0x2b, 0xc9, 0x2d, 0x07, 0x1d, 0x82, 0x0d, 0xce, + 0x73, 0x3f, 0x09, 0xe3, 0xda, 0xc0, 0x1e, 0x26, 0x5c, 0x7a, 0xee, 0x15, 0x98, 0xc9, 0x0e, 0xdd, + 0xa1, 0xc2, 0xad, 0xff, 0x67, 0x09, 0xa6, 0x73, 0x4e, 0xae, 0x58, 0x02, 0xdc, 0x8c, 0x40, 0x4d, + 0xf3, 0xdd, 0x9a, 0x62, 0xb1, 0x34, 0x80, 0x58, 0x94, 0x32, 0xba, 0x5c, 0x28, 0xa3, 0x85, 0x28, + 0x1c, 0x7a, 0x3f, 0xa2, 0xd0, 0xdc, 0x7d, 0x86, 0x07, 0xda, 0x7d, 0x8e, 0x40, 0x7c, 0x1a, 0x1b, + 0xd8, 0xe8, 0x00, 0x1b, 0xd8, 0x2f, 0x96, 0x60, 0x26, 0x0d, 0x2d, 0x17, 0xe9, 0xa6, 0xef, 0xff, + 0x79, 0xc7, 0xab, 0xc6, 0x79, 0x47, 0x7e, 0x3a, 0xe9, 0x4c, 0xab, 0x0a, 0xcf, 0x3e, 0x70, 0xe6, + 0xec, 0xe3, 0xc9, 0x81, 0xb8, 0xf5, 0x3e, 0x07, 0xf9, 0xbb, 0x25, 0x38, 0x95, 0x2d, 0xb2, 0xec, + 0x3b, 0xde, 0xce, 0x31, 0xf4, 0xcd, 0x75, 0xa3, 0x6f, 0x9e, 0x19, 0xe4, 0x6b, 0x58, 0xd3, 0x0a, + 0x3b, 0xe8, 0xf5, 0x4c, 0x07, 0x2d, 0x0c, 0xce, 0xb2, 0x77, 0x2f, 0x7d, 0xc7, 0x82, 0x33, 0xb9, + 0xe5, 0x8e, 0xc1, 0xfb, 0x7a, 0xcd, 0xf4, 0xbe, 0x3e, 0x31, 0xf0, 0x37, 0x15, 0xb8, 0x63, 0xbf, + 0x5a, 0x2e, 0xf8, 0x16, 0xe6, 0xbf, 0xba, 0x0e, 0xe3, 0x4e, 0xab, 0x45, 0xe2, 0xf8, 0x6a, 0xe8, + 0xaa, 0x7c, 0x53, 0xcf, 0xb0, 0x3d, 0x29, 0x05, 0xdf, 0xdd, 0xaf, 0xcd, 0x65, 0x59, 0xa4, 0x68, + 0xac, 0x73, 0x30, 0x73, 0xd8, 0x95, 0x8e, 0x34, 0x87, 0xdd, 0x05, 0x80, 0x5d, 0x65, 0xd5, 0x66, + 0x9d, 0x61, 0x9a, 0xbd, 0xab, 0x51, 0xa1, 0x9f, 0x66, 0xba, 0x22, 0x0f, 0x19, 0xe1, 0x87, 0x1c, + 0xcf, 0x0d, 0x38, 0x56, 0x7a, 0xf8, 0x09, 0xbf, 0xa1, 0xaa, 0x1c, 0x87, 0x8a, 0x25, 0xfa, 0x0c, + 0xcc, 0xc4, 0x3c, 0x09, 0xc2, 0xb2, 0xef, 0xc4, 0xec, 0x5e, 0x84, 0x90, 0x89, 0xec, 0xda, 0x69, + 0x33, 0x83, 0xc3, 0x5d, 0xd4, 0xf6, 0x3f, 0x2c, 0xc3, 0x83, 0x3d, 0xa6, 0x28, 0x5a, 0x34, 0x8f, + 0x78, 0x9f, 0xca, 0x7a, 0x77, 0xe6, 0x72, 0x0b, 0x1b, 0xee, 0x9e, 0xcc, 0x18, 0x97, 0xde, 0xf7, + 0x18, 0x7f, 0xd9, 0xd2, 0xfc, 0x6e, 0x3c, 0x10, 0xf4, 0x53, 0x87, 0x5c, 0x7a, 0x3f, 0xaa, 0x8e, + 0xfa, 0x2f, 0x58, 0xf0, 0x48, 0xee, 0x67, 0x19, 0xa1, 0x22, 0x0b, 0x50, 0x69, 0x51, 0xa0, 0x76, + 0x77, 0x29, 0xbd, 0x41, 0x28, 0x11, 0x38, 0xa5, 0x31, 0x22, 0x42, 0x4a, 0x7d, 0x23, 0x42, 0xfe, + 0xb9, 0x05, 0x27, 0xb3, 0x8d, 0x38, 0x06, 0xc9, 0xb4, 0x66, 0x4a, 0xa6, 0x8f, 0x0e, 0x32, 0xe4, + 0x05, 0x42, 0xe9, 0xdf, 0x4f, 0xc1, 0xe9, 0xae, 0x9d, 0x8b, 0xf7, 0xdd, 0x2e, 0xcc, 0x6e, 0x32, + 0x15, 0x5e, 0xbb, 0x15, 0x26, 0x3e, 0x26, 0xf7, 0x02, 0x5d, 0xcf, 0x2b, 0x64, 0xdc, 0x0c, 0xe9, + 0x22, 0xc1, 0xdd, 0x55, 0xa0, 0x2f, 0x58, 0x70, 0xd2, 0xb9, 0x1d, 0x77, 0xbd, 0x49, 0x22, 0xe6, + 0xcc, 0xf3, 0xb9, 0xde, 0xb1, 0x3e, 0x6f, 0x98, 0x2c, 0x55, 0x0f, 0xf6, 0x6b, 0x27, 0xf3, 0xa8, + 0x70, 0x6e, 0x5d, 0x08, 0x8b, 0x94, 0x7b, 0x54, 0xcb, 0xe9, 0x71, 0x6f, 0x31, 0xef, 0x56, 0x09, + 0x97, 0x51, 0x12, 0x83, 0x15, 0x1f, 0x74, 0x13, 0x2a, 0x9b, 0xf2, 0xaa, 0x97, 0x90, 0x81, 0xb9, + 0x9b, 0x4a, 0xee, 0x7d, 0x30, 0x1e, 0xb1, 0xaf, 0x50, 0x38, 0x65, 0x85, 0x5e, 0x81, 0x72, 0xb0, + 0x11, 0x8b, 0x3b, 0xd4, 0xf9, 0xf1, 0x3d, 0x66, 0x04, 0x15, 0xbf, 0x80, 0x7a, 0x6d, 0xb5, 0x89, + 0x69, 0x41, 0x5a, 0x3e, 0xba, 0xe5, 0x0a, 0x87, 0x6e, 0x6e, 0x79, 0xbc, 0x54, 0xef, 0x2e, 0x8f, + 0x97, 0xea, 0x98, 0x16, 0x44, 0xab, 0x30, 0xcc, 0xee, 0x99, 0x08, 0x6f, 0x6d, 0xee, 0x05, 0xfa, + 0xae, 0x3b, 0x34, 0xfc, 0x46, 0x2a, 0x03, 0x63, 0x5e, 0x1c, 0xbd, 0x0a, 0x23, 0x2d, 0x96, 0x4c, + 0x5f, 0x98, 0xd6, 0xf9, 0x49, 0x21, 0xba, 0xd2, 0xed, 0xf3, 0x33, 0x2a, 0x0e, 0xc7, 0x82, 0x03, + 0xe3, 0x45, 0xda, 0x5b, 0x1b, 0xb1, 0xb0, 0x98, 0xf3, 0x79, 0x75, 0x3d, 0x7c, 0x20, 0x78, 0x31, + 0x38, 0x16, 0x1c, 0xd0, 0x27, 0xa1, 0xb4, 0xd1, 0x12, 0x17, 0x4d, 0x72, 0x7d, 0xb3, 0xe6, 0xdd, + 0xe0, 0xa5, 0x91, 0x83, 0xfd, 0x5a, 0x69, 0x75, 0x19, 0x97, 0x36, 0x5a, 0xe8, 0x1a, 0x8c, 0x6e, + 0xf0, 0x0b, 0x9e, 0x22, 0x71, 0xea, 0xe3, 0xf9, 0x77, 0x4f, 0xbb, 0xee, 0x80, 0xf2, 0x9b, 0x15, + 0x02, 0x81, 0x25, 0x13, 0xb4, 0x0e, 0xb0, 0xa1, 0x2e, 0xaa, 0x8a, 0xcc, 0xa9, 0x1f, 0x1d, 0xe4, + 0x3a, 0xab, 0x30, 0x1a, 0x15, 0x14, 0x6b, 0x7c, 0xe8, 0xcc, 0x74, 0xe4, 0x8b, 0x1e, 0x2c, 0x6b, + 0x6a, 0xc1, 0xcc, 0xcc, 0x7d, 0xf6, 0x83, 0xcf, 0x4c, 0x85, 0xc2, 0x29, 0x2b, 0xb4, 0x0d, 0x93, + 0xbb, 0x71, 0x7b, 0x8b, 0xc8, 0xc5, 0xc8, 0x12, 0xa8, 0x9a, 0x66, 0x65, 0x9a, 0xed, 0x56, 0x10, + 0x7a, 0x51, 0xd2, 0x71, 0xfc, 0x2e, 0xf9, 0xc1, 0x12, 0x80, 0xdd, 0xd4, 0x99, 0x61, 0x93, 0x37, + 0xed, 0xea, 0x77, 0x3b, 0xe1, 0xad, 0xbd, 0x84, 0x88, 0xb4, 0xaa, 0xb9, 0x5d, 0xfd, 0x1a, 0x27, + 0xe9, 0xee, 0x6a, 0x81, 0xc0, 0x92, 0x89, 0xea, 0x14, 0x26, 0xf7, 0x66, 0xfa, 0x74, 0x4a, 0x57, + 0x7b, 0xd3, 0x4e, 0x61, 0x72, 0x2e, 0x65, 0xc5, 0xe4, 0x5b, 0x7b, 0x2b, 0x4c, 0xc2, 0x20, 0x23, + 0x5b, 0x67, 0x8b, 0xe5, 0x5b, 0x23, 0x87, 0xbe, 0x5b, 0xbe, 0xe5, 0x51, 0xe1, 0xdc, 0xba, 0x90, + 0x0b, 0x53, 0xed, 0x30, 0x4a, 0x6e, 0x87, 0x91, 0x9c, 0x4b, 0xa8, 0x87, 0xa1, 0x64, 0x50, 0x8a, + 0x1a, 0x59, 0x2c, 0xad, 0x89, 0xc1, 0x19, 0x9e, 0x74, 0x48, 0xe2, 0x96, 0xe3, 0x93, 0xb5, 0xeb, + 0xd5, 0x13, 0xc5, 0x43, 0xd2, 0xe4, 0x24, 0xdd, 0x43, 0x22, 0x10, 0x58, 0x32, 0xa1, 0x92, 0x86, + 0x65, 0xe8, 0x66, 0x79, 0x60, 0x0b, 0x24, 0x4d, 0x57, 0x94, 0x29, 0x97, 0x34, 0x0c, 0x8c, 0x79, + 0x71, 0xf4, 0x39, 0xa8, 0x08, 0xfd, 0x2f, 0x8c, 0xab, 0xa7, 0xba, 0xb4, 0xd1, 0xb4, 0x65, 0x9c, + 0xe8, 0x7a, 0x33, 0x7f, 0x8b, 0x14, 0x97, 0xc9, 0x24, 0x11, 0x4e, 0x99, 0xda, 0x5f, 0x1c, 0xe9, + 0xd6, 0x0c, 0x98, 0x9e, 0xff, 0x45, 0xab, 0xeb, 0xa8, 0xf4, 0xe3, 0x83, 0x1a, 0xa7, 0x47, 0x78, + 0x68, 0xfa, 0x05, 0x0b, 0x4e, 0xb7, 0x73, 0x3f, 0x4a, 0x6c, 0xb3, 0x83, 0xd9, 0xb8, 0xbc, 0x1b, + 0x54, 0x86, 0xe5, 0x7c, 0x3c, 0x2e, 0xa8, 0x29, 0xab, 0x0f, 0x97, 0xdf, 0xb7, 0x3e, 0x7c, 0x15, + 0xc6, 0x98, 0x2a, 0x97, 0x66, 0x73, 0x19, 0x28, 0xe0, 0x88, 0x6d, 0xd8, 0xcb, 0xa2, 0x20, 0x56, + 0x2c, 0xd0, 0xcf, 0x5b, 0xf0, 0x70, 0xb6, 0xe9, 0x98, 0x30, 0xb4, 0xc8, 0x0e, 0xc8, 0x4d, 0x8c, + 0x55, 0xf1, 0xfd, 0x0f, 0x37, 0x7a, 0x11, 0xdf, 0xed, 0x47, 0x80, 0x7b, 0x57, 0x86, 0xea, 0x39, + 0x36, 0xce, 0x88, 0x79, 0x92, 0xd2, 0xdf, 0xce, 0x39, 0x5e, 0x2d, 0xfd, 0x6b, 0x56, 0x8e, 0x7a, + 0xc9, 0xed, 0xa9, 0x97, 0x4d, 0x7b, 0xea, 0xb1, 0xac, 0x3d, 0xd5, 0xe5, 0x1d, 0x31, 0x4c, 0xa9, + 0xc1, 0xf3, 0x97, 0x0e, 0x9a, 0xb8, 0xc6, 0xf6, 0xe1, 0x5c, 0x3f, 0x31, 0xcb, 0xc2, 0xa7, 0x5c, + 0x75, 0xae, 0x98, 0x86, 0x4f, 0xb9, 0x6b, 0x75, 0xcc, 0x30, 0x83, 0xa6, 0x40, 0xb0, 0xff, 0xab, + 0x05, 0xe5, 0x46, 0xe8, 0x1e, 0x83, 0xb7, 0xe7, 0x53, 0x86, 0xb7, 0xe7, 0xc1, 0x82, 0x57, 0xe4, + 0x0a, 0x7d, 0x3b, 0x2b, 0x19, 0xdf, 0xce, 0xc3, 0x45, 0x0c, 0x7a, 0x7b, 0x72, 0xfe, 0x5e, 0x19, + 0xf4, 0x37, 0xef, 0xd0, 0xbf, 0xba, 0x97, 0x38, 0xdc, 0x72, 0xaf, 0x67, 0xf0, 0x04, 0x67, 0x16, + 0x75, 0x25, 0xaf, 0xf8, 0xfd, 0x88, 0x85, 0xe3, 0xbe, 0x4e, 0xbc, 0xcd, 0xad, 0x84, 0xb8, 0xd9, + 0xcf, 0x39, 0xbe, 0x70, 0xdc, 0xff, 0x64, 0xc1, 0x74, 0xa6, 0x76, 0xe4, 0xe7, 0xdd, 0x17, 0xba, + 0x47, 0xff, 0xcd, 0x6c, 0xdf, 0x0b, 0x46, 0xf3, 0x00, 0xca, 0x95, 0x2e, 0x7d, 0x24, 0x4c, 0x77, + 0x55, 0xbe, 0xf6, 0x18, 0x6b, 0x14, 0xe8, 0x05, 0x18, 0x4f, 0xc2, 0x76, 0xe8, 0x87, 0x9b, 0x7b, + 0x97, 0x89, 0x4c, 0xba, 0xa1, 0x0e, 0x3c, 0xd6, 0x53, 0x14, 0xd6, 0xe9, 0xec, 0x5f, 0x2b, 0x43, + 0xf6, 0x9d, 0xc4, 0xff, 0x3f, 0x27, 0x3f, 0x9c, 0x73, 0xf2, 0xbb, 0x16, 0xcc, 0xd0, 0xda, 0x59, + 0x44, 0x8b, 0x0c, 0x64, 0x55, 0x0f, 0x1d, 0x58, 0x3d, 0x1e, 0x3a, 0x78, 0x8c, 0xca, 0x2e, 0x37, + 0xec, 0x24, 0xc2, 0x97, 0xa3, 0x09, 0x27, 0x0a, 0xc5, 0x02, 0x2b, 0xe8, 0x48, 0x14, 0x89, 0x5b, + 0x40, 0x3a, 0x1d, 0x89, 0x22, 0x2c, 0xb0, 0xf2, 0x1d, 0x84, 0xa1, 0x82, 0x77, 0x10, 0x58, 0xbe, + 0x2a, 0x11, 0x45, 0x21, 0x54, 0x03, 0x2d, 0x5f, 0x95, 0x0c, 0xaf, 0x48, 0x69, 0xec, 0x6f, 0x94, + 0x61, 0xa2, 0x11, 0xba, 0x69, 0xec, 0xfb, 0xf3, 0x46, 0xec, 0xfb, 0xb9, 0x4c, 0xec, 0xfb, 0x8c, + 0x4e, 0x7b, 0x34, 0xa1, 0xef, 0x22, 0x9b, 0x19, 0x7b, 0x95, 0xe3, 0x1e, 0xc3, 0xde, 0x8d, 0x6c, + 0x66, 0x8a, 0x11, 0x36, 0xf9, 0xfe, 0x38, 0x85, 0xbb, 0xff, 0xb9, 0x05, 0x53, 0x8d, 0xd0, 0xa5, + 0x13, 0xf4, 0xc7, 0x69, 0x36, 0xea, 0xd9, 0xd0, 0x46, 0x7a, 0x64, 0x43, 0xfb, 0xfb, 0x16, 0x8c, + 0x36, 0x42, 0xf7, 0x18, 0xfc, 0x9c, 0x2f, 0x9b, 0x7e, 0xce, 0x07, 0x0a, 0xa4, 0x6c, 0x81, 0x6b, + 0xf3, 0xb7, 0xca, 0x30, 0x49, 0xdb, 0x19, 0x6e, 0xca, 0x51, 0x32, 0x7a, 0xc4, 0x1a, 0xa0, 0x47, + 0xa8, 0x32, 0x17, 0xfa, 0x7e, 0x78, 0x3b, 0x3b, 0x62, 0xab, 0x0c, 0x8a, 0x05, 0x16, 0x3d, 0x0d, + 0x63, 0xed, 0x88, 0xec, 0x7a, 0x61, 0x27, 0xce, 0xde, 0x23, 0x6c, 0x08, 0x38, 0x56, 0x14, 0xe8, + 0x79, 0x98, 0x88, 0xbd, 0xa0, 0x45, 0x64, 0x64, 0xc5, 0x10, 0x8b, 0xac, 0xe0, 0x09, 0x25, 0x35, + 0x38, 0x36, 0xa8, 0xd0, 0xeb, 0x50, 0x61, 0xff, 0xd9, 0xba, 0x39, 0xfc, 0x33, 0x07, 0xdc, 0x54, + 0x95, 0x0c, 0x70, 0xca, 0x0b, 0x5d, 0x00, 0x48, 0x64, 0x0c, 0x48, 0x2c, 0xae, 0xb9, 0x2a, 0x8d, + 0x52, 0x45, 0x87, 0xc4, 0x58, 0xa3, 0x42, 0x4f, 0x41, 0x25, 0x71, 0x3c, 0xff, 0x8a, 0x17, 0x90, + 0x58, 0xc4, 0xd0, 0x88, 0x24, 0xcd, 0x02, 0x88, 0x53, 0x3c, 0xdd, 0xd1, 0xd9, 0x25, 0x6a, 0xfe, + 0x48, 0xca, 0x18, 0xa3, 0x66, 0x3b, 0xfa, 0x15, 0x05, 0xc5, 0x1a, 0x85, 0xfd, 0x22, 0x9c, 0x6a, + 0x84, 0x6e, 0x23, 0x8c, 0x92, 0xd5, 0x30, 0xba, 0xed, 0x44, 0xae, 0x1c, 0xbf, 0x9a, 0xcc, 0x17, + 0x4c, 0x77, 0xdd, 0x61, 0x6e, 0xd7, 0x1b, 0x99, 0x80, 0x9f, 0x63, 0x7b, 0xfa, 0x21, 0x2f, 0x3c, + 0xfc, 0xdb, 0x12, 0xa0, 0x06, 0x8b, 0x52, 0x31, 0x5e, 0xd2, 0x79, 0x1b, 0xa6, 0x62, 0x72, 0xc5, + 0x0b, 0x3a, 0x77, 0x04, 0xab, 0x5e, 0xb7, 0x49, 0x9a, 0x2b, 0x3a, 0x25, 0xf7, 0x8d, 0x98, 0x30, + 0x9c, 0xe1, 0x46, 0xbb, 0x30, 0xea, 0x04, 0x8b, 0xf1, 0x8d, 0x98, 0x44, 0xe2, 0xe5, 0x18, 0xd6, + 0x85, 0x58, 0x02, 0x71, 0x8a, 0xa7, 0x53, 0x86, 0xfd, 0xb9, 0x16, 0x06, 0x38, 0x0c, 0x13, 0x39, + 0xc9, 0xd8, 0xdb, 0x03, 0x1a, 0x1c, 0x1b, 0x54, 0x68, 0x15, 0x50, 0xdc, 0x69, 0xb7, 0x7d, 0x76, + 0xa8, 0xe7, 0xf8, 0x17, 0xa3, 0xb0, 0xd3, 0xe6, 0x61, 0xc6, 0x22, 0x6d, 0x7f, 0xb3, 0x0b, 0x8b, + 0x73, 0x4a, 0x50, 0xc1, 0xb0, 0x11, 0xb3, 0xdf, 0xe2, 0x1e, 0x35, 0xf7, 0x4d, 0x36, 0x19, 0x08, + 0x4b, 0x9c, 0xfd, 0x79, 0xb6, 0x99, 0xb1, 0x07, 0x3f, 0x92, 0x4e, 0x44, 0xd0, 0x0e, 0x4c, 0xb6, + 0xd9, 0x86, 0x95, 0x44, 0xa1, 0xef, 0x13, 0xa9, 0x37, 0xde, 0x5b, 0xc4, 0x0c, 0x7f, 0x00, 0x40, + 0x67, 0x87, 0x4d, 0xee, 0xf6, 0x17, 0xa7, 0x99, 0x5c, 0x6a, 0x72, 0xa3, 0x65, 0x54, 0xc4, 0xc1, + 0x0a, 0x0d, 0x6d, 0xae, 0xf8, 0x81, 0xad, 0x54, 0xd2, 0x8b, 0x58, 0x5a, 0x2c, 0xcb, 0xa2, 0xd7, + 0x58, 0x7c, 0x36, 0x17, 0x06, 0xfd, 0x9e, 0xf6, 0xe3, 0x54, 0x46, 0x6c, 0xb6, 0x28, 0x88, 0x35, + 0x26, 0xe8, 0x0a, 0x4c, 0x8a, 0xf7, 0x21, 0x84, 0x0b, 0xa1, 0x6c, 0x98, 0xbf, 0x93, 0x58, 0x47, + 0xde, 0xcd, 0x02, 0xb0, 0x59, 0x18, 0x6d, 0xc2, 0xc3, 0xda, 0x6b, 0x46, 0x39, 0x51, 0x5b, 0x5c, + 0xb6, 0x3c, 0x72, 0xb0, 0x5f, 0x7b, 0x78, 0xbd, 0x17, 0x21, 0xee, 0xcd, 0x07, 0x5d, 0x87, 0x53, + 0x4e, 0x2b, 0xf1, 0x76, 0x49, 0x9d, 0x38, 0xae, 0xef, 0x05, 0xc4, 0xbc, 0x58, 0x7f, 0xe6, 0x60, + 0xbf, 0x76, 0x6a, 0x31, 0x8f, 0x00, 0xe7, 0x97, 0x43, 0x2f, 0x43, 0xc5, 0x0d, 0x62, 0xd1, 0x07, + 0x23, 0xc6, 0x43, 0x5d, 0x95, 0xfa, 0xb5, 0xa6, 0xfa, 0xfe, 0xf4, 0x0f, 0x4e, 0x0b, 0xa0, 0x4d, + 0xfe, 0xa0, 0xbb, 0xb2, 0x48, 0x46, 0xbb, 0xb2, 0x25, 0x64, 0x6d, 0x5b, 0xe3, 0xc6, 0x09, 0xf7, + 0x9f, 0xa9, 0x98, 0x48, 0xe3, 0x32, 0x8a, 0xc1, 0x18, 0xbd, 0x0a, 0x28, 0x26, 0xd1, 0xae, 0xd7, + 0x22, 0x8b, 0x2d, 0x96, 0x71, 0x95, 0x79, 0x5d, 0xc6, 0x8c, 0x00, 0x7f, 0xd4, 0xec, 0xa2, 0xc0, + 0x39, 0xa5, 0xd0, 0x25, 0x2a, 0x51, 0x74, 0xa8, 0x08, 0x61, 0x95, 0x6a, 0x5e, 0xb5, 0x4e, 0xda, + 0x11, 0x69, 0x39, 0x09, 0x71, 0x4d, 0x8e, 0x38, 0x53, 0x8e, 0xee, 0x37, 0x2a, 0x91, 0x3d, 0x98, + 0x81, 0x97, 0xdd, 0xc9, 0xec, 0xa9, 0x85, 0xb4, 0x15, 0xc6, 0xc9, 0x35, 0x92, 0xdc, 0x0e, 0xa3, + 0x6d, 0x91, 0xd4, 0x2a, 0xcd, 0x62, 0x97, 0xa2, 0xb0, 0x4e, 0x47, 0x35, 0x22, 0x76, 0x74, 0xb5, + 0x56, 0x67, 0xe7, 0x0c, 0x63, 0xe9, 0x3a, 0xb9, 0xc4, 0xc1, 0x58, 0xe2, 0x25, 0xe9, 0x5a, 0x63, + 0x99, 0x9d, 0x1e, 0x64, 0x48, 0xd7, 0x1a, 0xcb, 0x58, 0xe2, 0x11, 0xe9, 0x7e, 0x04, 0x6d, 0xaa, + 0xf8, 0x84, 0xa6, 0x5b, 0x2e, 0x0f, 0xf8, 0x0e, 0x5a, 0x00, 0x33, 0xea, 0xf9, 0x35, 0x9e, 0xed, + 0x2b, 0xae, 0x4e, 0x17, 0xbf, 0x2c, 0x9f, 0x9b, 0x2a, 0x4c, 0x79, 0xd5, 0xd6, 0x32, 0x9c, 0x70, + 0x17, 0x6f, 0x23, 0x61, 0xc3, 0x4c, 0xdf, 0x87, 0x08, 0x16, 0xa0, 0x12, 0x77, 0x6e, 0xb9, 0xe1, + 0x8e, 0xe3, 0x05, 0xcc, 0xed, 0xaf, 0x3f, 0x7a, 0x2e, 0x11, 0x38, 0xa5, 0x41, 0xab, 0x30, 0xe6, + 0x08, 0xe3, 0x4b, 0x38, 0xea, 0x73, 0x6f, 0x70, 0x4b, 0x03, 0x8d, 0x7b, 0x34, 0xd5, 0xfb, 0xff, + 0xaa, 0x2c, 0x7a, 0x09, 0x26, 0xc5, 0x25, 0x23, 0x11, 0x1f, 0x78, 0xc2, 0x8c, 0x47, 0x6f, 0xea, + 0x48, 0x6c, 0xd2, 0xa2, 0x9f, 0x86, 0x29, 0xca, 0x25, 0x15, 0x6c, 0xd5, 0x93, 0x83, 0x48, 0x44, + 0x2d, 0xc1, 0xb4, 0x5e, 0x18, 0x67, 0x98, 0x21, 0x17, 0x1e, 0x72, 0x3a, 0x49, 0xb8, 0x43, 0x67, + 0xb8, 0x39, 0xff, 0xd7, 0xc3, 0x6d, 0x12, 0x30, 0x3f, 0xfd, 0xd8, 0xd2, 0xb9, 0x83, 0xfd, 0xda, + 0x43, 0x8b, 0x3d, 0xe8, 0x70, 0x4f, 0x2e, 0xe8, 0x06, 0x8c, 0x27, 0xa1, 0x2f, 0x02, 0x7b, 0xe3, + 0xea, 0xe9, 0xe2, 0x84, 0x33, 0xeb, 0x8a, 0x4c, 0x77, 0x27, 0xa8, 0xa2, 0x58, 0xe7, 0x83, 0xd6, + 0xf9, 0x1a, 0x63, 0x79, 0x0b, 0x49, 0x5c, 0x7d, 0xa0, 0xb8, 0x63, 0x54, 0x7a, 0x43, 0x73, 0x09, + 0x8a, 0x92, 0x58, 0x67, 0x83, 0x2e, 0xc2, 0x6c, 0x3b, 0xf2, 0x42, 0x36, 0xb1, 0x95, 0xcb, 0xb7, + 0x6a, 0xa4, 0x22, 0x9b, 0x6d, 0x64, 0x09, 0x70, 0x77, 0x19, 0x74, 0x9e, 0x2a, 0xa8, 0x1c, 0x58, + 0x3d, 0xc3, 0x1f, 0xa8, 0xe0, 0xca, 0x29, 0x87, 0x61, 0x85, 0x9d, 0xfb, 0x34, 0xcc, 0x76, 0x49, + 0xca, 0x43, 0x05, 0x59, 0xfe, 0xfa, 0x30, 0x54, 0x94, 0x3b, 0x10, 0x2d, 0x98, 0x5e, 0xde, 0x33, + 0x59, 0x2f, 0xef, 0x18, 0xd5, 0xd7, 0x74, 0xc7, 0xee, 0x7a, 0xce, 0x1b, 0xdb, 0xe7, 0x0a, 0x44, + 0xc3, 0xe0, 0x37, 0xa2, 0x0e, 0xf1, 0xfe, 0x78, 0x6a, 0x30, 0x0e, 0xf5, 0x34, 0x18, 0x07, 0x7c, + 0xef, 0x8e, 0x9a, 0x86, 0xed, 0xd0, 0x5d, 0x6b, 0x64, 0x1f, 0x80, 0x6a, 0x50, 0x20, 0xe6, 0x38, + 0xa6, 0xdc, 0xd3, 0x6d, 0x9d, 0x29, 0xf7, 0xa3, 0xf7, 0xa8, 0xdc, 0x4b, 0x06, 0x38, 0xe5, 0x85, + 0x7c, 0x98, 0x6d, 0x99, 0x6f, 0x77, 0xa9, 0x5b, 0x50, 0x8f, 0xf6, 0x7d, 0x45, 0xab, 0xa3, 0x3d, + 0xe8, 0xb1, 0x9c, 0xe5, 0x82, 0xbb, 0x19, 0xa3, 0x97, 0x60, 0xec, 0xdd, 0x30, 0x66, 0xd3, 0x4e, + 0xec, 0x6d, 0xf2, 0xde, 0xc9, 0xd8, 0x6b, 0xd7, 0x9b, 0x0c, 0x7e, 0x77, 0xbf, 0x36, 0xde, 0x08, + 0x5d, 0xf9, 0x17, 0xab, 0x02, 0xe8, 0x0e, 0x9c, 0x32, 0x24, 0x82, 0x6a, 0x2e, 0x0c, 0xde, 0xdc, + 0x87, 0x45, 0x75, 0xa7, 0xd6, 0xf2, 0x38, 0xe1, 0xfc, 0x0a, 0xec, 0x6f, 0x72, 0xa7, 0xa7, 0x70, + 0x8d, 0x90, 0xb8, 0xe3, 0x1f, 0x47, 0xd6, 0xfe, 0x15, 0xc3, 0x6b, 0x73, 0xcf, 0x8e, 0xf5, 0xdf, + 0xb7, 0x98, 0x63, 0x7d, 0x9d, 0xec, 0xb4, 0x7d, 0x27, 0x39, 0x8e, 0xd0, 0xda, 0xd7, 0x60, 0x2c, + 0x11, 0xb5, 0xf5, 0x7a, 0x68, 0x40, 0x6b, 0x14, 0x3b, 0x5c, 0x50, 0x1b, 0xa2, 0x84, 0x62, 0xc5, + 0xc6, 0xfe, 0xa7, 0x7c, 0x04, 0x24, 0xe6, 0x18, 0x7c, 0x0b, 0x75, 0xd3, 0xb7, 0x50, 0xeb, 0xf3, + 0x05, 0x05, 0x3e, 0x86, 0x7f, 0x62, 0xb6, 0x9b, 0xd9, 0x1e, 0x1f, 0xf6, 0x13, 0x1d, 0xfb, 0x97, + 0x2d, 0x38, 0x99, 0x77, 0xa4, 0x4f, 0x95, 0x18, 0x6e, 0xf9, 0xa8, 0x13, 0x2e, 0xd5, 0x83, 0x37, + 0x05, 0x1c, 0x2b, 0x8a, 0x81, 0x93, 0x7d, 0x1f, 0x2e, 0xc9, 0xd2, 0x75, 0x30, 0x9f, 0x79, 0x43, + 0xaf, 0xf0, 0x58, 0x79, 0x4b, 0xbd, 0xc3, 0x76, 0xb8, 0x38, 0x79, 0xfb, 0xeb, 0x25, 0x38, 0xc9, + 0x5d, 0xd4, 0x8b, 0xbb, 0xa1, 0xe7, 0x36, 0x42, 0x57, 0xdc, 0x1c, 0x78, 0x13, 0x26, 0xda, 0x9a, + 0xb9, 0xda, 0x2b, 0xcd, 0x8b, 0x6e, 0xd6, 0xa6, 0x66, 0x83, 0x0e, 0xc5, 0x06, 0x2f, 0xe4, 0xc2, + 0x04, 0xd9, 0xf5, 0x5a, 0xca, 0xcf, 0x59, 0x3a, 0xb4, 0x48, 0x57, 0xb5, 0xac, 0x68, 0x7c, 0xb0, + 0xc1, 0xf5, 0x3e, 0x3c, 0xc9, 0x61, 0x7f, 0xc5, 0x82, 0x07, 0x0a, 0x92, 0xc2, 0xd0, 0xea, 0x6e, + 0xb3, 0xc3, 0x00, 0xf1, 0x66, 0xa0, 0xaa, 0x8e, 0x1f, 0x11, 0x60, 0x81, 0x45, 0x3f, 0x05, 0xc0, + 0x5d, 0xfc, 0xec, 0x85, 0xf6, 0x52, 0xef, 0x5b, 0xe7, 0x46, 0xb2, 0x04, 0xed, 0x46, 0xbd, 0x7a, + 0x93, 0x5d, 0xe3, 0x65, 0xff, 0x6a, 0x19, 0x86, 0xf9, 0x03, 0xd2, 0xab, 0x30, 0xba, 0xc5, 0x53, + 0xd0, 0x0e, 0x92, 0xed, 0x36, 0x35, 0x47, 0x38, 0x00, 0xcb, 0xc2, 0xe8, 0x2a, 0x9c, 0x10, 0xb7, + 0x53, 0xea, 0xc4, 0x77, 0xf6, 0xa4, 0x55, 0xcb, 0xdf, 0x69, 0x90, 0x39, 0xc4, 0x4f, 0xac, 0x75, + 0x93, 0xe0, 0xbc, 0x72, 0xe8, 0x95, 0xae, 0xc4, 0x73, 0x3c, 0x79, 0xaf, 0xd2, 0x81, 0xfb, 0x24, + 0x9f, 0x7b, 0x09, 0x26, 0xdb, 0x5d, 0xf6, 0xbb, 0xf6, 0x76, 0xaf, 0x69, 0xb3, 0x9b, 0xb4, 0x2c, + 0x3e, 0xa0, 0xc3, 0xa2, 0x21, 0xd6, 0xb7, 0x22, 0x12, 0x6f, 0x85, 0xbe, 0x2b, 0x1e, 0xaa, 0x4c, + 0xe3, 0x03, 0x32, 0x78, 0xdc, 0x55, 0x82, 0x72, 0xd9, 0x70, 0x3c, 0xbf, 0x13, 0x91, 0x94, 0xcb, + 0x88, 0xc9, 0x65, 0x35, 0x83, 0xc7, 0x5d, 0x25, 0xe8, 0x3c, 0x3a, 0x25, 0x5e, 0x39, 0x94, 0x77, + 0x96, 0x55, 0xd0, 0xc7, 0xa8, 0x8c, 0x4a, 0xef, 0x91, 0x47, 0x43, 0x1c, 0xf9, 0xab, 0x77, 0x12, + 0xb5, 0xf7, 0xb3, 0x44, 0x3c, 0xba, 0xe4, 0x72, 0x2f, 0x6f, 0xed, 0xfd, 0xa9, 0x05, 0x27, 0x72, + 0x02, 0xc1, 0xb8, 0xa8, 0xda, 0xf4, 0xe2, 0x44, 0x3d, 0x0f, 0xa0, 0x89, 0x2a, 0x0e, 0xc7, 0x8a, + 0x82, 0xae, 0x07, 0x2e, 0x0c, 0xb3, 0x02, 0x50, 0x04, 0x6f, 0x08, 0xec, 0xe1, 0x04, 0x20, 0x3a, + 0x07, 0x43, 0x9d, 0x98, 0x44, 0xf2, 0x81, 0x3a, 0x29, 0xbf, 0x99, 0x47, 0x90, 0x61, 0xa8, 0x46, + 0xb9, 0xa9, 0x9c, 0x71, 0x9a, 0x46, 0xc9, 0xdd, 0x71, 0x1c, 0x67, 0x7f, 0xb9, 0x0c, 0xd3, 0x99, + 0xb0, 0x4d, 0xda, 0x90, 0x9d, 0x30, 0xf0, 0x92, 0x50, 0xe5, 0x3d, 0xe3, 0x69, 0x1e, 0x48, 0x7b, + 0xeb, 0xaa, 0x80, 0x63, 0x45, 0x81, 0x1e, 0x93, 0x2f, 0x97, 0x66, 0x9f, 0x3d, 0x58, 0xaa, 0x1b, + 0x8f, 0x97, 0x0e, 0xfa, 0x7e, 0xc9, 0xa3, 0x30, 0xd4, 0x0e, 0xd5, 0xb3, 0xd2, 0x6a, 0x3c, 0xf1, + 0x52, 0xbd, 0x11, 0x86, 0x3e, 0x66, 0x48, 0xf4, 0x31, 0xf1, 0xf5, 0x99, 0xf3, 0x0a, 0xec, 0xb8, + 0x61, 0xac, 0x75, 0xc1, 0x13, 0x30, 0xba, 0x4d, 0xf6, 0x22, 0x2f, 0xd8, 0xcc, 0x9e, 0xd6, 0x5c, + 0xe6, 0x60, 0x2c, 0xf1, 0x66, 0xb6, 0xf0, 0xd1, 0xfb, 0xf2, 0x04, 0xc9, 0x58, 0xdf, 0x5d, 0xed, + 0xb7, 0x2c, 0x98, 0x66, 0x39, 0x46, 0xc5, 0xed, 0x78, 0x2f, 0x0c, 0x8e, 0x41, 0x4f, 0x78, 0x14, + 0x86, 0x23, 0x5a, 0x69, 0xf6, 0x5d, 0x01, 0xd6, 0x12, 0xcc, 0x71, 0xe8, 0x21, 0x18, 0x62, 0x4d, + 0xa0, 0x83, 0x37, 0xc1, 0xb3, 0x8c, 0xd7, 0x9d, 0xc4, 0xc1, 0x0c, 0xca, 0xae, 0x29, 0x61, 0xd2, + 0xf6, 0x3d, 0xde, 0xe8, 0xd4, 0xdd, 0xfa, 0xe1, 0xb8, 0xa6, 0x94, 0xdb, 0xb4, 0xf7, 0x77, 0x4d, + 0x29, 0x9f, 0x65, 0x6f, 0x1d, 0xfc, 0xbf, 0x95, 0xe0, 0x6c, 0x6e, 0xb9, 0xf4, 0x64, 0x77, 0xd5, + 0x38, 0xd9, 0xbd, 0x90, 0x39, 0xd9, 0xb5, 0x7b, 0x97, 0x3e, 0x9a, 0xb3, 0xde, 0xfc, 0x23, 0xd8, + 0xf2, 0x31, 0x1e, 0xc1, 0x0e, 0x0d, 0xaa, 0xa6, 0x0c, 0xf7, 0x51, 0x53, 0xbe, 0x63, 0xc1, 0x99, + 0xdc, 0x2e, 0xfb, 0x90, 0xdc, 0x0b, 0xcb, 0x6d, 0x5b, 0x81, 0x0d, 0xf1, 0xc3, 0x52, 0xc1, 0xb7, + 0x30, 0x6b, 0xe2, 0x3c, 0x95, 0x33, 0x0c, 0x19, 0x0b, 0xb5, 0x6b, 0x82, 0xcb, 0x18, 0x0e, 0xc3, + 0x0a, 0x8b, 0x3c, 0xed, 0x86, 0x15, 0x6f, 0xda, 0x4b, 0x87, 0x5a, 0x32, 0xf3, 0xa6, 0x77, 0x5c, + 0xbf, 0xca, 0x9f, 0xbd, 0x6d, 0x75, 0x55, 0xb3, 0x00, 0xcb, 0x83, 0x5b, 0x80, 0x13, 0xf9, 0xd6, + 0x1f, 0x5a, 0x84, 0xe9, 0x1d, 0x2f, 0x60, 0x8f, 0x83, 0x9a, 0x7a, 0x8f, 0xba, 0x96, 0x7a, 0xd5, + 0x44, 0xe3, 0x2c, 0xfd, 0xdc, 0x4b, 0x30, 0x79, 0xef, 0x2e, 0xab, 0xef, 0x96, 0xe1, 0xc1, 0x1e, + 0xcb, 0x9e, 0xcb, 0x7a, 0x63, 0x0c, 0x34, 0x59, 0xdf, 0x35, 0x0e, 0x0d, 0x38, 0xb9, 0xd1, 0xf1, + 0xfd, 0x3d, 0x16, 0xe5, 0x44, 0x5c, 0x49, 0x21, 0x14, 0x13, 0x95, 0x40, 0x78, 0x35, 0x87, 0x06, + 0xe7, 0x96, 0x44, 0xaf, 0x02, 0x0a, 0x6f, 0xb1, 0xa4, 0xb6, 0x6e, 0x9a, 0xa0, 0x80, 0x75, 0x7c, + 0x39, 0x5d, 0x8c, 0xd7, 0xbb, 0x28, 0x70, 0x4e, 0x29, 0xaa, 0x61, 0xb2, 0x27, 0xcd, 0x55, 0xb3, + 0x32, 0x1a, 0x26, 0xd6, 0x91, 0xd8, 0xa4, 0x45, 0x17, 0x61, 0xd6, 0xd9, 0x75, 0x3c, 0x9e, 0xb0, + 0x4a, 0x32, 0xe0, 0x2a, 0xa6, 0x72, 0x14, 0x2d, 0x66, 0x09, 0x70, 0x77, 0x19, 0xb4, 0x61, 0x78, + 0xf9, 0x78, 0xbe, 0xfc, 0x0b, 0x03, 0xcf, 0xd6, 0x81, 0xfd, 0x7e, 0xf6, 0x7f, 0xb4, 0xe8, 0xf6, + 0x95, 0xf3, 0x1a, 0x25, 0xed, 0x07, 0xe5, 0xbf, 0xd2, 0x6e, 0x87, 0xa9, 0x7e, 0x58, 0xd6, 0x91, + 0xd8, 0xa4, 0xe5, 0x13, 0x22, 0x4e, 0xc3, 0xa5, 0x0d, 0x3d, 0x51, 0x5c, 0xa7, 0x54, 0x14, 0xe8, + 0x0d, 0x18, 0x75, 0xbd, 0x5d, 0x2f, 0x0e, 0x23, 0xb1, 0x58, 0x0e, 0xfb, 0x0a, 0xb3, 0x92, 0x83, + 0x75, 0xce, 0x06, 0x4b, 0x7e, 0xf6, 0x97, 0x4b, 0x30, 0x29, 0x6b, 0x7c, 0xad, 0x13, 0x26, 0xce, + 0x31, 0x6c, 0xcb, 0x17, 0x8d, 0x6d, 0xf9, 0x63, 0xbd, 0xee, 0x94, 0xb2, 0x26, 0x15, 0x6e, 0xc7, + 0xd7, 0x33, 0xdb, 0xf1, 0xe3, 0xfd, 0x59, 0xf5, 0xde, 0x86, 0x7f, 0xd7, 0x82, 0x59, 0x83, 0xfe, + 0x18, 0x76, 0x83, 0x55, 0x73, 0x37, 0x78, 0xa4, 0xef, 0x37, 0x14, 0xec, 0x02, 0x5f, 0x2b, 0x65, + 0xda, 0xce, 0xa4, 0xff, 0xbb, 0x30, 0xb4, 0xe5, 0x44, 0x6e, 0xaf, 0xb4, 0x8b, 0x5d, 0x85, 0xe6, + 0x2f, 0x39, 0x91, 0xcb, 0x65, 0xf8, 0xd3, 0xea, 0xa1, 0x2c, 0x27, 0x72, 0xfb, 0xde, 0x0e, 0x60, + 0x55, 0xa1, 0x17, 0x61, 0x24, 0x6e, 0x85, 0x6d, 0x15, 0x7b, 0x79, 0x8e, 0x3f, 0xa2, 0x45, 0x21, + 0x77, 0xf7, 0x6b, 0xc8, 0xac, 0x8e, 0x82, 0xb1, 0xa0, 0x9f, 0xdb, 0x84, 0x8a, 0xaa, 0xfa, 0xbe, + 0x46, 0x95, 0xff, 0x51, 0x19, 0x4e, 0xe4, 0xcc, 0x0b, 0x14, 0x1b, 0xbd, 0xf5, 0xec, 0x80, 0xd3, + 0xe9, 0x7d, 0xf6, 0x57, 0xcc, 0x2c, 0x16, 0x57, 0x8c, 0xff, 0xc0, 0x95, 0xde, 0x88, 0x49, 0xb6, + 0x52, 0x0a, 0xea, 0x5f, 0x29, 0xad, 0xec, 0xd8, 0xba, 0x9a, 0x56, 0xa4, 0x5a, 0x7a, 0x5f, 0xc7, + 0xf4, 0x7f, 0x95, 0xe1, 0x64, 0xde, 0x55, 0x74, 0xf4, 0xb3, 0x99, 0x47, 0x1c, 0x9e, 0x1f, 0xf4, + 0x12, 0x3b, 0x7f, 0xd9, 0x41, 0x64, 0x78, 0x99, 0x37, 0x9f, 0x75, 0xe8, 0xdb, 0xcd, 0xa2, 0x4e, + 0x76, 0x5d, 0x27, 0xe2, 0x8f, 0x6f, 0xc8, 0x25, 0xfe, 0xf1, 0x81, 0x1b, 0x20, 0x5e, 0xed, 0x88, + 0x33, 0xd7, 0x75, 0x24, 0xb8, 0xff, 0x75, 0x1d, 0x59, 0xf3, 0x9c, 0x07, 0xe3, 0xda, 0xd7, 0xdc, + 0xd7, 0x11, 0xdf, 0xa6, 0x3b, 0x8a, 0xd6, 0xee, 0xfb, 0x3a, 0xea, 0x5f, 0xb1, 0x20, 0x13, 0x27, + 0xa5, 0xfc, 0x1f, 0x56, 0xa1, 0xff, 0xe3, 0x1c, 0x0c, 0x45, 0xa1, 0x4f, 0xb2, 0x79, 0xfd, 0x71, + 0xe8, 0x13, 0xcc, 0x30, 0xea, 0x55, 0xdc, 0x72, 0xd1, 0xab, 0xb8, 0xd4, 0x34, 0xf6, 0xc9, 0x2e, + 0x91, 0xde, 0x08, 0x25, 0x93, 0xaf, 0x50, 0x20, 0xe6, 0x38, 0xfb, 0x37, 0x86, 0xe0, 0x44, 0xce, + 0xe5, 0x34, 0x6a, 0xa8, 0x6c, 0x3a, 0x09, 0xb9, 0xed, 0xec, 0x65, 0x73, 0x8d, 0x5e, 0xe4, 0x60, + 0x2c, 0xf1, 0x2c, 0x96, 0x93, 0xa7, 0x2b, 0xcb, 0xf8, 0x88, 0x44, 0x96, 0x32, 0x81, 0xbd, 0x5f, + 0x0f, 0xa5, 0x5e, 0x00, 0x88, 0x63, 0x7f, 0x25, 0xa0, 0xca, 0x97, 0x2b, 0x22, 0x45, 0xd3, 0xdc, + 0x76, 0xcd, 0x2b, 0x02, 0x83, 0x35, 0x2a, 0x54, 0x87, 0x99, 0x76, 0x14, 0x26, 0xdc, 0xef, 0x56, + 0xe7, 0x31, 0x0a, 0xc3, 0xe6, 0x35, 0xa3, 0x46, 0x06, 0x8f, 0xbb, 0x4a, 0xa0, 0x17, 0x60, 0x5c, + 0x5c, 0x3d, 0x6a, 0x84, 0xa1, 0x2f, 0xbc, 0x34, 0xea, 0xc4, 0xbb, 0x99, 0xa2, 0xb0, 0x4e, 0xa7, + 0x15, 0x63, 0xce, 0xbc, 0xd1, 0xdc, 0x62, 0xdc, 0xa1, 0xa7, 0xd1, 0x65, 0x32, 0x52, 0x8c, 0x0d, + 0x94, 0x91, 0x22, 0xf5, 0x5b, 0x55, 0x06, 0x3e, 0xbf, 0x80, 0xbe, 0x9e, 0x9e, 0x6f, 0x96, 0x61, + 0x84, 0x0f, 0xc5, 0x31, 0xa8, 0x62, 0xab, 0xc2, 0x77, 0xd3, 0x23, 0x0f, 0x00, 0x6f, 0xcb, 0x7c, + 0xdd, 0x49, 0x1c, 0x2e, 0x86, 0xd4, 0x6a, 0x48, 0xbd, 0x3c, 0x68, 0xde, 0x58, 0x2f, 0x73, 0x19, + 0xe7, 0x04, 0x70, 0x1e, 0xda, 0xea, 0x79, 0x1b, 0x20, 0x66, 0x8f, 0x75, 0x52, 0x1e, 0x22, 0x6f, + 0xe9, 0x93, 0x3d, 0x6a, 0x6f, 0x2a, 0x62, 0xde, 0x86, 0x74, 0x0a, 0x2a, 0x04, 0xd6, 0x38, 0xce, + 0x7d, 0x02, 0x2a, 0x8a, 0xb8, 0x9f, 0x25, 0x37, 0xa1, 0x0b, 0xaf, 0x4f, 0xc1, 0x74, 0xa6, 0xae, + 0x43, 0x19, 0x82, 0xbf, 0x6d, 0xc1, 0x34, 0x6f, 0xf2, 0x4a, 0xb0, 0x2b, 0x16, 0xfb, 0x7b, 0x70, + 0xd2, 0xcf, 0x59, 0x74, 0x62, 0x44, 0x07, 0x5f, 0xa4, 0xca, 0xf0, 0xcb, 0xc3, 0xe2, 0xdc, 0x3a, + 0xa8, 0xf1, 0xcf, 0x9f, 0x19, 0x76, 0x7c, 0x11, 0x81, 0x3c, 0xc1, 0xf3, 0x39, 0x73, 0x18, 0x56, + 0x58, 0xfb, 0x7b, 0x16, 0xcc, 0x76, 0x3d, 0x52, 0xff, 0x81, 0xb6, 0x5d, 0xa4, 0xab, 0x2e, 0x15, + 0xa4, 0xab, 0xd6, 0x3f, 0xad, 0xdc, 0xf3, 0xd3, 0xbe, 0x6e, 0x81, 0x98, 0x81, 0xc7, 0xa0, 0xce, + 0x7f, 0xda, 0x54, 0xe7, 0xe7, 0x8a, 0x27, 0x75, 0x81, 0x1e, 0xff, 0xe7, 0x16, 0xcc, 0x70, 0x82, + 0xf4, 0xf0, 0xe2, 0x03, 0x1d, 0x87, 0x41, 0xde, 0x50, 0x51, 0x8f, 0x56, 0xe6, 0x7f, 0x94, 0x31, + 0x58, 0x43, 0x3d, 0x07, 0xeb, 0xbf, 0x58, 0x80, 0xf8, 0xe7, 0x67, 0x5f, 0x5e, 0xe6, 0x9b, 0x92, + 0x66, 0x6a, 0xa7, 0x42, 0x40, 0x61, 0xb0, 0x46, 0x75, 0x24, 0x0d, 0xcf, 0x9c, 0x0d, 0x95, 0xfb, + 0x9f, 0x0d, 0x1d, 0xe2, 0x5b, 0xff, 0xda, 0x10, 0x64, 0x03, 0x11, 0xd1, 0x4d, 0x98, 0x68, 0x39, + 0x6d, 0xe7, 0x96, 0xe7, 0x7b, 0x89, 0x47, 0xe2, 0x5e, 0x87, 0xca, 0xcb, 0x1a, 0x9d, 0x38, 0x88, + 0xd1, 0x20, 0xd8, 0xe0, 0x83, 0xe6, 0x01, 0xda, 0x91, 0xb7, 0xeb, 0xf9, 0x64, 0x93, 0xd9, 0x1a, + 0xec, 0x36, 0x02, 0x3f, 0x29, 0x95, 0x50, 0xac, 0x51, 0xe4, 0x44, 0xaf, 0x97, 0xef, 0x5f, 0xf4, + 0xfa, 0xd0, 0x21, 0xa3, 0xd7, 0x87, 0x07, 0x8a, 0x5e, 0xc7, 0x70, 0x5a, 0xee, 0xaa, 0xf4, 0xff, + 0xaa, 0xe7, 0x13, 0xa1, 0x4a, 0xf1, 0x3b, 0x0a, 0x73, 0x07, 0xfb, 0xb5, 0xd3, 0x38, 0x97, 0x02, + 0x17, 0x94, 0x44, 0x3f, 0x05, 0x55, 0xc7, 0xf7, 0xc3, 0xdb, 0xaa, 0xd7, 0x56, 0xe2, 0x96, 0xe3, + 0xa7, 0xa9, 0x40, 0xc7, 0x96, 0x1e, 0x3a, 0xd8, 0xaf, 0x55, 0x17, 0x0b, 0x68, 0x70, 0x61, 0x69, + 0x7b, 0x1b, 0x4e, 0x34, 0x49, 0x24, 0x1f, 0x02, 0x53, 0xab, 0x6f, 0x1d, 0x2a, 0x51, 0x66, 0xb9, + 0x0f, 0x74, 0x25, 0x5d, 0x4b, 0xc0, 0x25, 0x97, 0x77, 0xca, 0xc8, 0xfe, 0x33, 0x0b, 0x46, 0x45, + 0x70, 0xe3, 0x31, 0x68, 0x19, 0x8b, 0x86, 0xc3, 0xa7, 0x96, 0x2f, 0x12, 0x59, 0x63, 0x0a, 0x5d, + 0x3d, 0x6b, 0x19, 0x57, 0xcf, 0x23, 0xbd, 0x98, 0xf4, 0x76, 0xf2, 0xfc, 0x52, 0x19, 0xa6, 0xcc, + 0xc0, 0xce, 0x63, 0xe8, 0x82, 0x6b, 0x30, 0x1a, 0x8b, 0x28, 0xe2, 0x52, 0x71, 0x34, 0x5a, 0x76, + 0x10, 0xd3, 0x33, 0x6b, 0x11, 0x37, 0x2c, 0x99, 0xe4, 0x86, 0x27, 0x97, 0xef, 0x63, 0x78, 0x72, + 0xbf, 0xd8, 0xda, 0xa1, 0xa3, 0x88, 0xad, 0xb5, 0xbf, 0xc5, 0x84, 0xbf, 0x0e, 0x3f, 0x86, 0x1d, + 0xfb, 0xa2, 0xb9, 0x4d, 0xd8, 0x3d, 0x66, 0x96, 0x68, 0x54, 0xc1, 0xce, 0xfd, 0x8f, 0x2c, 0x18, + 0x17, 0x84, 0xc7, 0xd0, 0xec, 0xcf, 0x98, 0xcd, 0x7e, 0xb0, 0x47, 0xb3, 0x0b, 0xda, 0xfb, 0xb7, + 0x4b, 0xaa, 0xbd, 0x0d, 0xf1, 0x46, 0x7e, 0xdf, 0xd4, 0xd0, 0x63, 0xd4, 0x4e, 0x0b, 0x5b, 0xa1, + 0x2f, 0xf4, 0xb2, 0x87, 0xd2, 0x6b, 0x6a, 0x1c, 0x7e, 0x57, 0xfb, 0x8d, 0x15, 0x35, 0xbb, 0x45, + 0x15, 0x46, 0x89, 0xd8, 0x40, 0xf3, 0x5e, 0xe8, 0x77, 0x01, 0xd2, 0x87, 0xce, 0xc5, 0xbd, 0xce, + 0xc3, 0xbf, 0xfd, 0x9f, 0xde, 0x3b, 0x53, 0xbc, 0xb0, 0xc6, 0x57, 0x5e, 0x7c, 0x60, 0x75, 0x0c, + 0x9b, 0x27, 0x31, 0xd7, 0x04, 0x1c, 0x2b, 0x0a, 0xfb, 0x13, 0x4c, 0x26, 0xb3, 0x0e, 0x3a, 0xdc, + 0x95, 0xb0, 0x3f, 0x1e, 0x55, 0x5d, 0xcb, 0xdc, 0xb0, 0x75, 0xfd, 0xe2, 0x59, 0x6f, 0x11, 0x48, + 0x2b, 0xd6, 0x83, 0x7c, 0xd3, 0xdb, 0x69, 0xe8, 0xb3, 0x5d, 0x07, 0x74, 0xcf, 0xf4, 0x91, 0xa5, + 0x87, 0x38, 0x92, 0x63, 0x99, 0xee, 0x58, 0x46, 0xb0, 0xb5, 0x46, 0x36, 0x79, 0xf7, 0xb2, 0x44, + 0xe0, 0x94, 0x06, 0x2d, 0x08, 0x9b, 0x8f, 0x3b, 0x40, 0x1e, 0xcc, 0xd8, 0x7c, 0xf2, 0xf3, 0x35, + 0xa3, 0xef, 0x59, 0x18, 0x57, 0x0f, 0xa2, 0x34, 0xf8, 0xbb, 0x12, 0x15, 0xae, 0x4b, 0xad, 0xa4, + 0x60, 0xac, 0xd3, 0xa0, 0x75, 0x98, 0x8e, 0xf9, 0x6b, 0x2d, 0xf2, 0x2e, 0x82, 0xb0, 0xe8, 0x9f, + 0xcc, 0x3c, 0xa9, 0x2e, 0xd1, 0x77, 0x19, 0x88, 0x2f, 0x56, 0x79, 0x7b, 0x21, 0xcb, 0x02, 0xbd, + 0x02, 0x53, 0xbe, 0xfe, 0x6a, 0x65, 0x43, 0x18, 0xfc, 0x2a, 0xc8, 0xca, 0x78, 0xd3, 0xb2, 0x81, + 0x33, 0xd4, 0x54, 0x09, 0xd0, 0x21, 0x22, 0x49, 0x8d, 0x13, 0x6c, 0x92, 0x58, 0x3c, 0xe7, 0xc0, + 0x94, 0x80, 0x2b, 0x05, 0x34, 0xb8, 0xb0, 0x34, 0x7a, 0x11, 0x26, 0xe4, 0xe7, 0x6b, 0x77, 0x73, + 0xd2, 0x50, 0x3e, 0x0d, 0x87, 0x0d, 0x4a, 0x74, 0x1b, 0x4e, 0xc9, 0xff, 0xeb, 0x91, 0xb3, 0xb1, + 0xe1, 0xb5, 0xc4, 0xd5, 0xa8, 0x71, 0xc6, 0x62, 0x51, 0xc6, 0x35, 0xaf, 0xe4, 0x11, 0xdd, 0xdd, + 0xaf, 0x9d, 0x13, 0xbd, 0x96, 0x8b, 0x67, 0x83, 0x98, 0xcf, 0x1f, 0x5d, 0x85, 0x13, 0x5b, 0xc4, + 0xf1, 0x93, 0xad, 0xe5, 0x2d, 0xd2, 0xda, 0x96, 0x8b, 0x88, 0xdd, 0xf8, 0xd1, 0x02, 0xe0, 0x2e, + 0x75, 0x93, 0xe0, 0xbc, 0x72, 0xe8, 0x2d, 0xa8, 0xb6, 0x3b, 0xb7, 0x7c, 0x2f, 0xde, 0xba, 0x16, + 0x26, 0xec, 0x2c, 0x51, 0xbd, 0x27, 0x22, 0xae, 0x06, 0xa9, 0xdb, 0x4e, 0x8d, 0x02, 0x3a, 0x5c, + 0xc8, 0xe1, 0xfd, 0x9d, 0xf2, 0xbe, 0x4b, 0x0b, 0x6b, 0x1a, 0x06, 0xfa, 0x1c, 0x4c, 0xe8, 0x23, + 0x29, 0x84, 0xfc, 0x63, 0xfd, 0x5e, 0x49, 0x15, 0xfa, 0x89, 0x1a, 0x55, 0x1d, 0x87, 0x0d, 0x8e, + 0xf6, 0xbf, 0x28, 0x41, 0xad, 0x4f, 0x0e, 0xa9, 0x8c, 0xeb, 0xca, 0x1a, 0xc8, 0x75, 0xb5, 0x28, + 0x9f, 0x0e, 0xb9, 0x96, 0x49, 0x4c, 0x9d, 0x79, 0x16, 0x24, 0x4d, 0x4f, 0x9d, 0xa5, 0x1f, 0x38, + 0x6a, 0x4b, 0xf7, 0x7e, 0x0d, 0xf5, 0x0d, 0x5e, 0x6b, 0xe8, 0x6e, 0xcc, 0xe1, 0xc1, 0xd5, 0xdd, + 0x42, 0x0f, 0xa6, 0xfd, 0xad, 0x12, 0x9c, 0x52, 0x5d, 0xf8, 0xe3, 0xdb, 0x71, 0x37, 0xba, 0x3b, + 0xee, 0x08, 0xfc, 0xbf, 0xf6, 0x75, 0x18, 0x69, 0xee, 0xc5, 0xad, 0xc4, 0x1f, 0x40, 0x3b, 0x78, + 0xd4, 0x58, 0x39, 0xe9, 0x1e, 0xc6, 0x5e, 0xff, 0x12, 0x0b, 0xc9, 0xfe, 0xcb, 0x16, 0x4c, 0xaf, + 0x2f, 0x37, 0x9a, 0x61, 0x6b, 0x9b, 0x24, 0x8b, 0xdc, 0xbb, 0x81, 0x85, 0x72, 0x60, 0xdd, 0xe3, + 0xa6, 0x9f, 0xa7, 0x4e, 0x9c, 0x83, 0xa1, 0xad, 0x30, 0x4e, 0xb2, 0x3e, 0xfe, 0x4b, 0x61, 0x9c, + 0x60, 0x86, 0xb1, 0xff, 0xc4, 0x82, 0x61, 0xf6, 0xe0, 0x55, 0xbf, 0x87, 0xd1, 0x06, 0xf9, 0x2e, + 0xf4, 0x02, 0x8c, 0x90, 0x8d, 0x0d, 0xd2, 0x4a, 0xc4, 0xa8, 0xca, 0x8b, 0x24, 0x23, 0x2b, 0x0c, + 0x4a, 0x77, 0x44, 0x56, 0x19, 0xff, 0x8b, 0x05, 0x31, 0xfa, 0x2c, 0x54, 0x12, 0x6f, 0x87, 0x2c, + 0xba, 0xae, 0x70, 0xaf, 0x1f, 0x2e, 0x92, 0x4a, 0xed, 0xd0, 0xeb, 0x92, 0x09, 0x4e, 0xf9, 0xd9, + 0xbf, 0x50, 0x02, 0x48, 0x2f, 0x9c, 0xf5, 0xfb, 0xcc, 0xa5, 0xae, 0xf7, 0xdf, 0x1e, 0xcb, 0x79, + 0xff, 0x0d, 0xa5, 0x0c, 0x73, 0x5e, 0x7f, 0x53, 0x5d, 0x55, 0x1e, 0xa8, 0xab, 0x86, 0x0e, 0xd3, + 0x55, 0xcb, 0x30, 0x9b, 0x5e, 0x98, 0x33, 0x6f, 0x0f, 0xb3, 0xdc, 0xb0, 0xeb, 0x59, 0x24, 0xee, + 0xa6, 0xb7, 0xbf, 0x64, 0x81, 0x88, 0xae, 0x1d, 0x60, 0x42, 0xbf, 0x29, 0x9f, 0x6a, 0x32, 0x12, + 0xdb, 0x9d, 0x2b, 0x0e, 0x37, 0x16, 0xe9, 0xec, 0x94, 0x64, 0x37, 0x92, 0xd8, 0x19, 0xbc, 0xec, + 0xdf, 0xb5, 0x60, 0x9c, 0xa3, 0xaf, 0x32, 0x13, 0xb4, 0x7f, 0x6b, 0x0e, 0x95, 0x59, 0x98, 0xbd, + 0x62, 0x44, 0x19, 0xab, 0x04, 0xb4, 0xfa, 0x2b, 0x46, 0x12, 0x81, 0x53, 0x1a, 0xf4, 0x04, 0x8c, + 0xc6, 0x9d, 0x5b, 0x8c, 0x3c, 0x13, 0x60, 0xdb, 0xe4, 0x60, 0x2c, 0xf1, 0x74, 0x5e, 0xcd, 0x64, + 0xe3, 0xab, 0xd1, 0x25, 0x18, 0xe1, 0x62, 0x43, 0x2c, 0xe3, 0x1e, 0x87, 0x09, 0x5a, 0x54, 0x36, + 0xf0, 0x67, 0xb7, 0x99, 0xb8, 0x11, 0xe5, 0xd1, 0x5b, 0x30, 0xee, 0x86, 0xb7, 0x83, 0xdb, 0x4e, + 0xe4, 0x2e, 0x36, 0xd6, 0x44, 0xaf, 0xe7, 0x46, 0xc9, 0xd5, 0x53, 0x32, 0x3d, 0xd2, 0x9b, 0xb9, + 0xe7, 0x52, 0x14, 0xd6, 0xd9, 0xa1, 0x75, 0x96, 0xc3, 0x83, 0x3f, 0x06, 0xda, 0x2b, 0x6e, 0x44, + 0xbd, 0x1f, 0xaa, 0x71, 0x9e, 0x14, 0x89, 0x3e, 0xc4, 0x53, 0xa2, 0x29, 0x23, 0xfb, 0x0b, 0x27, + 0xc0, 0x18, 0x6d, 0x23, 0xff, 0xaf, 0x75, 0x44, 0xf9, 0x7f, 0x31, 0x8c, 0x91, 0x9d, 0x76, 0xb2, + 0x57, 0xf7, 0xa2, 0x5e, 0x09, 0xd9, 0x57, 0x04, 0x4d, 0x37, 0x4f, 0x89, 0xc1, 0x8a, 0x4f, 0x7e, + 0x92, 0xe6, 0xf2, 0x07, 0x98, 0xa4, 0x79, 0xe8, 0x18, 0x93, 0x34, 0x5f, 0x83, 0xd1, 0x4d, 0x2f, + 0xc1, 0xa4, 0x1d, 0x8a, 0x2d, 0x33, 0x77, 0x26, 0x5c, 0xe4, 0x24, 0xdd, 0xe9, 0x45, 0x05, 0x02, + 0x4b, 0x26, 0xe8, 0x55, 0xb5, 0x06, 0x46, 0x8a, 0x55, 0xc1, 0x6e, 0xef, 0x76, 0xee, 0x2a, 0x10, + 0x49, 0x99, 0x47, 0xef, 0x35, 0x29, 0xb3, 0x4a, 0xaa, 0x3c, 0xf6, 0xfe, 0x92, 0x2a, 0x1b, 0x49, + 0xa7, 0x2b, 0x47, 0x97, 0x74, 0xfa, 0x4b, 0x16, 0x9c, 0x6a, 0xe7, 0xe5, 0x5f, 0x17, 0x89, 0x92, + 0x5f, 0x18, 0x38, 0x0f, 0xbd, 0x51, 0x21, 0x4b, 0x24, 0x91, 0x4b, 0x86, 0xf3, 0xab, 0x93, 0xd9, + 0xab, 0xc7, 0xef, 0x35, 0x7b, 0xf5, 0xfd, 0xc9, 0xa8, 0x9c, 0xe6, 0xb2, 0x9e, 0x3c, 0xc2, 0x5c, + 0xd6, 0x53, 0xef, 0x3b, 0x97, 0xb5, 0x96, 0x8f, 0x7a, 0xfa, 0x28, 0xf2, 0x51, 0xbf, 0x6d, 0x0a, + 0x7b, 0x9e, 0x26, 0xf9, 0xa9, 0x3e, 0xc2, 0xde, 0xe0, 0xdb, 0x5b, 0xdc, 0xf3, 0xdc, 0xdb, 0xb3, + 0xf7, 0x94, 0x7b, 0xdb, 0xc8, 0x6a, 0x8d, 0x8e, 0x2e, 0xab, 0xf5, 0x4d, 0x7d, 0x0b, 0x3a, 0x51, + 0xcc, 0x57, 0xed, 0x34, 0xdd, 0x7c, 0xf3, 0x36, 0xa1, 0xee, 0x6c, 0xd9, 0x27, 0x8f, 0x27, 0x5b, + 0xf6, 0xa9, 0x23, 0xcf, 0x96, 0x7d, 0xfa, 0x18, 0xb2, 0x65, 0x3f, 0xf0, 0x81, 0x66, 0xcb, 0xae, + 0xde, 0xdf, 0x6c, 0xd9, 0x67, 0x8e, 0x22, 0x5b, 0xf6, 0x4d, 0xa8, 0xb4, 0xe5, 0x15, 0xbc, 0xea, + 0x5c, 0xf1, 0x90, 0xe4, 0xde, 0xd3, 0xe3, 0x43, 0xa2, 0x50, 0x38, 0x65, 0x45, 0xf9, 0xa6, 0xd9, + 0xb3, 0x1f, 0x2c, 0xe6, 0x9b, 0x6b, 0xb6, 0xf7, 0xc8, 0x99, 0xfd, 0x57, 0x4a, 0x70, 0xb6, 0xf7, + 0xbc, 0x4e, 0x6d, 0xfe, 0x46, 0xea, 0xc0, 0xcd, 0xd8, 0xfc, 0x4c, 0xe9, 0xd2, 0xa8, 0x06, 0xbe, + 0xa7, 0x7c, 0x11, 0x66, 0x55, 0x24, 0x92, 0xef, 0xb5, 0xf6, 0xb4, 0xc7, 0x6d, 0x54, 0x70, 0x7b, + 0x33, 0x4b, 0x80, 0xbb, 0xcb, 0xa0, 0x45, 0x98, 0x36, 0x80, 0x6b, 0x75, 0xa1, 0x92, 0x2b, 0x27, + 0x43, 0xd3, 0x44, 0xe3, 0x2c, 0xbd, 0xfd, 0x35, 0x0b, 0x1e, 0x28, 0x48, 0xbc, 0x39, 0xf0, 0x35, + 0xdc, 0x0d, 0x98, 0x6e, 0x9b, 0x45, 0xfb, 0xdc, 0xd6, 0x37, 0xd2, 0x7b, 0xaa, 0xb6, 0x66, 0x10, + 0x38, 0xcb, 0x74, 0xe9, 0xfc, 0xb7, 0xbf, 0x7f, 0xf6, 0x23, 0x7f, 0xf8, 0xfd, 0xb3, 0x1f, 0xf9, + 0xde, 0xf7, 0xcf, 0x7e, 0xe4, 0x2f, 0x1c, 0x9c, 0xb5, 0xbe, 0x7d, 0x70, 0xd6, 0xfa, 0xc3, 0x83, + 0xb3, 0xd6, 0xf7, 0x0e, 0xce, 0x5a, 0x7f, 0x7a, 0x70, 0xd6, 0xfa, 0x85, 0x1f, 0x9c, 0xfd, 0xc8, + 0x9b, 0xa5, 0xdd, 0x67, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x81, 0xfc, 0x41, 0x31, 0xf8, + 0xc9, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/core/v1/generated.proto b/staging/src/k8s.io/api/core/v1/generated.proto index a073471f858..eb94478816b 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -1014,10 +1014,12 @@ message ExecAction { // Fibre Channel volumes can only be mounted as read/write once. // Fibre Channel volumes support ownership management and SELinux relabeling. message FCVolumeSource { - // Required: FC target worldwide names (WWNs) + // Optional: FC target worldwide names (WWNs) + // +optional repeated string targetWWNs = 1; - // Required: FC target lun number + // Optional: FC target lun number + // +optional optional int32 lun = 2; // Filesystem type to mount. @@ -1031,6 +1033,11 @@ message FCVolumeSource { // the ReadOnly setting in VolumeMounts. // +optional optional bool readOnly = 4; + + // Optional: FC volume world wide identifiers (wwids) + // Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously. + // +optional + repeated string wwids = 5; } // FlexVolume represents a generic volume resource that is @@ -1599,6 +1606,11 @@ message NodeCondition { optional string message = 6; } +// NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil. +message NodeConfigSource { + optional ObjectReference configMapRef = 1; +} + // NodeDaemonEndpoints lists ports opened by daemons running on the Node. message NodeDaemonEndpoints { // Endpoint on which Kubelet is listening. @@ -1689,6 +1701,11 @@ message NodeSpec { // If specified, the node's taints. // +optional repeated Taint taints = 5; + + // If specified, the source to get node configuration from + // The DynamicKubeletConfig feature gate must be enabled for the Kubelet to use this field + // +optional + optional NodeConfigSource configSource = 6; } // NodeStatus is information about the current status of a node. @@ -2316,16 +2333,6 @@ message Pod { // Pod affinity is a group of inter pod affinity scheduling rules. message PodAffinity { - // NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. - // If the affinity requirements specified by this field are not met at - // scheduling time, the pod will not be scheduled onto the node. - // If the affinity requirements specified by this field cease to be met - // at some point during pod execution (e.g. due to a pod label update), the - // system will try to eventually evict the pod from its node. - // When there are multiple elements, the lists of nodes corresponding to each - // podAffinityTerm are intersected, i.e. all terms must be satisfied. - // +optional - // RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:"requiredDuringSchedulingRequiredDuringExecution,omitempty"` // If the affinity requirements specified by this field are not met at // scheduling time, the pod will not be scheduled onto the node. // If the affinity requirements specified by this field cease to be met @@ -2377,16 +2384,6 @@ message PodAffinityTerm { // Pod anti affinity is a group of inter pod anti affinity scheduling rules. message PodAntiAffinity { - // NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. - // If the anti-affinity requirements specified by this field are not met at - // scheduling time, the pod will not be scheduled onto the node. - // If the anti-affinity requirements specified by this field cease to be met - // at some point during pod execution (e.g. due to a pod label update), the - // system will try to eventually evict the pod from its node. - // When there are multiple elements, the lists of nodes corresponding to each - // podAffinityTerm are intersected, i.e. all terms must be satisfied. - // +optional - // RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:"requiredDuringSchedulingRequiredDuringExecution,omitempty"` // If the anti-affinity requirements specified by this field are not met at // scheduling time, the pod will not be scheduled onto the node. // If the anti-affinity requirements specified by this field cease to be met @@ -3780,6 +3777,18 @@ message ServiceSpec { // and ExternalTrafficPolicy is set to Local. // +optional optional int32 healthCheckNodePort = 12; + + // publishNotReadyAddresses, when set to true, indicates that DNS implementations + // must publish the notReadyAddresses of subsets for the Endpoints associated with + // the Service. The default value is false. + // The primary use case for setting this field is to use a StatefulSet's Headless Service + // to propagate SRV records for its Pods without respect to their readiness for purpose + // of peer discovery. + // This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints + // when that annotation is deprecated and all clients have been converted to use this + // field. + // +optional + optional bool publishNotReadyAddresses = 13; } // ServiceStatus represents the current status of a service. diff --git a/staging/src/k8s.io/api/core/v1/register.go b/staging/src/k8s.io/api/core/v1/register.go index 73252bb14c0..4916ee3c23c 100644 --- a/staging/src/k8s.io/api/core/v1/register.go +++ b/staging/src/k8s.io/api/core/v1/register.go @@ -59,6 +59,7 @@ func addKnownTypes(scheme *runtime.Scheme) error { &Endpoints{}, &EndpointsList{}, &Node{}, + &NodeConfigSource{}, &NodeList{}, &NodeProxyOptions{}, &Binding{}, diff --git a/staging/src/k8s.io/api/core/v1/types.generated.go b/staging/src/k8s.io/api/core/v1/types.generated.go index 3a422a59fc9..edf39c93b35 100644 --- a/staging/src/k8s.io/api/core/v1/types.generated.go +++ b/staging/src/k8s.io/api/core/v1/types.generated.go @@ -17212,16 +17212,19 @@ func (x *FCVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [4]bool + var yyq2 [5]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false + yyq2[0] = len(x.TargetWWNs) != 0 + yyq2[1] = x.Lun != nil yyq2[2] = x.FSType != "" yyq2[3] = x.ReadOnly != false + yyq2[4] = len(x.WWIDs) != 0 var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(4) + r.EncodeArrayStart(5) } else { - yynn2 = 2 + yynn2 = 0 for _, b := range yyq2 { if b { yynn2++ @@ -17232,57 +17235,69 @@ func (x *FCVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if x.TargetWWNs == nil { - r.EncodeNil() - } else { - yym4 := z.EncBinary() - _ = yym4 - if false { + if yyq2[0] { + if x.TargetWWNs == nil { + r.EncodeNil() } else { - z.F.EncSliceStringV(x.TargetWWNs, false, e) + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + z.F.EncSliceStringV(x.TargetWWNs, false, e) + } } + } else { + r.EncodeNil() } } else { - z.EncSendContainerState(codecSelfer_containerMapKey1234) - r.EncodeString(codecSelferC_UTF81234, string("targetWWNs")) - z.EncSendContainerState(codecSelfer_containerMapValue1234) - if x.TargetWWNs == nil { - r.EncodeNil() - } else { - yym5 := z.EncBinary() - _ = yym5 - if false { + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("targetWWNs")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.TargetWWNs == nil { + r.EncodeNil() } else { - z.F.EncSliceStringV(x.TargetWWNs, false, e) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + z.F.EncSliceStringV(x.TargetWWNs, false, e) + } } } } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if x.Lun == nil { - r.EncodeNil() - } else { - yy7 := *x.Lun - yym8 := z.EncBinary() - _ = yym8 - if false { + if yyq2[1] { + if x.Lun == nil { + r.EncodeNil() } else { - r.EncodeInt(int64(yy7)) + yy7 := *x.Lun + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeInt(int64(yy7)) + } } + } else { + r.EncodeNil() } } else { - z.EncSendContainerState(codecSelfer_containerMapKey1234) - r.EncodeString(codecSelferC_UTF81234, string("lun")) - z.EncSendContainerState(codecSelfer_containerMapValue1234) - if x.Lun == nil { - r.EncodeNil() - } else { - yy9 := *x.Lun - yym10 := z.EncBinary() - _ = yym10 - if false { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("lun")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Lun == nil { + r.EncodeNil() } else { - r.EncodeInt(int64(yy9)) + yy9 := *x.Lun + yym10 := z.EncBinary() + _ = yym10 + if false { + } else { + r.EncodeInt(int64(yy9)) + } } } } @@ -17336,6 +17351,39 @@ func (x *FCVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[4] { + if x.WWIDs == nil { + r.EncodeNil() + } else { + yym18 := z.EncBinary() + _ = yym18 + if false { + } else { + z.F.EncSliceStringV(x.WWIDs, false, e) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[4] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("wwids")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.WWIDs == nil { + r.EncodeNil() + } else { + yym19 := z.EncBinary() + _ = yym19 + if false { + } else { + z.F.EncSliceStringV(x.WWIDs, false, e) + } + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -17449,6 +17497,18 @@ func (x *FCVolumeSource) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { *((*bool)(yyv10)) = r.DecodeBool() } } + case "wwids": + if r.TryDecodeAsNil() { + x.WWIDs = nil + } else { + yyv12 := &x.WWIDs + yym13 := z.DecBinary() + _ = yym13 + if false { + } else { + z.F.DecSliceStringX(yyv12, false, d) + } + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -17460,16 +17520,16 @@ func (x *FCVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj12 int - var yyb12 bool - var yyhl12 bool = l >= 0 - yyj12++ - if yyhl12 { - yyb12 = yyj12 > l + var yyj14 int + var yyb14 bool + var yyhl14 bool = l >= 0 + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l } else { - yyb12 = r.CheckBreak() + yyb14 = r.CheckBreak() } - if yyb12 { + if yyb14 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -17477,21 +17537,21 @@ func (x *FCVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.TargetWWNs = nil } else { - yyv13 := &x.TargetWWNs - yym14 := z.DecBinary() - _ = yym14 + yyv15 := &x.TargetWWNs + yym16 := z.DecBinary() + _ = yym16 if false { } else { - z.F.DecSliceStringX(yyv13, false, d) + z.F.DecSliceStringX(yyv15, false, d) } } - yyj12++ - if yyhl12 { - yyb12 = yyj12 > l + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l } else { - yyb12 = r.CheckBreak() + yyb14 = r.CheckBreak() } - if yyb12 { + if yyb14 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -17504,20 +17564,20 @@ func (x *FCVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.Lun == nil { x.Lun = new(int32) } - yym16 := z.DecBinary() - _ = yym16 + yym18 := z.DecBinary() + _ = yym18 if false { } else { *((*int32)(x.Lun)) = int32(r.DecodeInt(32)) } } - yyj12++ - if yyhl12 { - yyb12 = yyj12 > l + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l } else { - yyb12 = r.CheckBreak() + yyb14 = r.CheckBreak() } - if yyb12 { + if yyb14 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -17525,21 +17585,21 @@ func (x *FCVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.FSType = "" } else { - yyv17 := &x.FSType - yym18 := z.DecBinary() - _ = yym18 + yyv19 := &x.FSType + yym20 := z.DecBinary() + _ = yym20 if false { } else { - *((*string)(yyv17)) = r.DecodeString() + *((*string)(yyv19)) = r.DecodeString() } } - yyj12++ - if yyhl12 { - yyb12 = yyj12 > l + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l } else { - yyb12 = r.CheckBreak() + yyb14 = r.CheckBreak() } - if yyb12 { + if yyb14 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -17547,26 +17607,48 @@ func (x *FCVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ReadOnly = false } else { - yyv19 := &x.ReadOnly - yym20 := z.DecBinary() - _ = yym20 + yyv21 := &x.ReadOnly + yym22 := z.DecBinary() + _ = yym22 if false { } else { - *((*bool)(yyv19)) = r.DecodeBool() + *((*bool)(yyv21)) = r.DecodeBool() + } + } + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.WWIDs = nil + } else { + yyv23 := &x.WWIDs + yym24 := z.DecBinary() + _ = yym24 + if false { + } else { + z.F.DecSliceStringX(yyv23, false, d) } } for { - yyj12++ - if yyhl12 { - yyb12 = yyj12 > l + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l } else { - yyb12 = r.CheckBreak() + yyb14 = r.CheckBreak() } - if yyb12 { + if yyb14 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj12-1, "") + z.DecStructFieldNotFound(yyj14-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -43713,7 +43795,7 @@ func (x *ServiceSpec) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [11]bool + var yyq2 [12]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = len(x.Ports) != 0 @@ -43727,9 +43809,10 @@ func (x *ServiceSpec) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[8] = x.ExternalName != "" yyq2[9] = x.ExternalTrafficPolicy != "" yyq2[10] = x.HealthCheckNodePort != 0 + yyq2[11] = x.PublishNotReadyAddresses != false var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(11) + r.EncodeArrayStart(12) } else { yynn2 = 0 for _, b := range yyq2 { @@ -44017,6 +44100,31 @@ func (x *ServiceSpec) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[11] { + yym37 := z.EncBinary() + _ = yym37 + if false { + } else { + r.EncodeBool(bool(x.PublishNotReadyAddresses)) + } + } else { + r.EncodeBool(false) + } + } else { + if yyq2[11] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("publishNotReadyAddresses")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym38 := z.EncBinary() + _ = yym38 + if false { + } else { + r.EncodeBool(bool(x.PublishNotReadyAddresses)) + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -44195,6 +44303,18 @@ func (x *ServiceSpec) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { *((*int32)(yyv21)) = int32(r.DecodeInt(32)) } } + case "publishNotReadyAddresses": + if r.TryDecodeAsNil() { + x.PublishNotReadyAddresses = false + } else { + yyv23 := &x.PublishNotReadyAddresses + yym24 := z.DecBinary() + _ = yym24 + if false { + } else { + *((*bool)(yyv23)) = r.DecodeBool() + } + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -44206,16 +44326,16 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj23 int - var yyb23 bool - var yyhl23 bool = l >= 0 - yyj23++ - if yyhl23 { - yyb23 = yyj23 > l + var yyj25 int + var yyb25 bool + var yyhl25 bool = l >= 0 + yyj25++ + if yyhl25 { + yyb25 = yyj25 > l } else { - yyb23 = r.CheckBreak() + yyb25 = r.CheckBreak() } - if yyb23 { + if yyb25 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -44223,21 +44343,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Ports = nil } else { - yyv24 := &x.Ports - yym25 := z.DecBinary() - _ = yym25 + yyv26 := &x.Ports + yym27 := z.DecBinary() + _ = yym27 if false { } else { - h.decSliceServicePort((*[]ServicePort)(yyv24), d) + h.decSliceServicePort((*[]ServicePort)(yyv26), d) } } - yyj23++ - if yyhl23 { - yyb23 = yyj23 > l + yyj25++ + if yyhl25 { + yyb25 = yyj25 > l } else { - yyb23 = r.CheckBreak() + yyb25 = r.CheckBreak() } - if yyb23 { + if yyb25 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -44245,21 +44365,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Selector = nil } else { - yyv26 := &x.Selector - yym27 := z.DecBinary() - _ = yym27 + yyv28 := &x.Selector + yym29 := z.DecBinary() + _ = yym29 if false { } else { - z.F.DecMapStringStringX(yyv26, false, d) + z.F.DecMapStringStringX(yyv28, false, d) } } - yyj23++ - if yyhl23 { - yyb23 = yyj23 > l + yyj25++ + if yyhl25 { + yyb25 = yyj25 > l } else { - yyb23 = r.CheckBreak() + yyb25 = r.CheckBreak() } - if yyb23 { + if yyb25 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -44267,21 +44387,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ClusterIP = "" } else { - yyv28 := &x.ClusterIP - yym29 := z.DecBinary() - _ = yym29 + yyv30 := &x.ClusterIP + yym31 := z.DecBinary() + _ = yym31 if false { } else { - *((*string)(yyv28)) = r.DecodeString() + *((*string)(yyv30)) = r.DecodeString() } } - yyj23++ - if yyhl23 { - yyb23 = yyj23 > l + yyj25++ + if yyhl25 { + yyb25 = yyj25 > l } else { - yyb23 = r.CheckBreak() + yyb25 = r.CheckBreak() } - if yyb23 { + if yyb25 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -44289,16 +44409,16 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Type = "" } else { - yyv30 := &x.Type - yyv30.CodecDecodeSelf(d) + yyv32 := &x.Type + yyv32.CodecDecodeSelf(d) } - yyj23++ - if yyhl23 { - yyb23 = yyj23 > l + yyj25++ + if yyhl25 { + yyb25 = yyj25 > l } else { - yyb23 = r.CheckBreak() + yyb25 = r.CheckBreak() } - if yyb23 { + if yyb25 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -44306,21 +44426,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ExternalIPs = nil } else { - yyv31 := &x.ExternalIPs - yym32 := z.DecBinary() - _ = yym32 + yyv33 := &x.ExternalIPs + yym34 := z.DecBinary() + _ = yym34 if false { } else { - z.F.DecSliceStringX(yyv31, false, d) + z.F.DecSliceStringX(yyv33, false, d) } } - yyj23++ - if yyhl23 { - yyb23 = yyj23 > l + yyj25++ + if yyhl25 { + yyb25 = yyj25 > l } else { - yyb23 = r.CheckBreak() + yyb25 = r.CheckBreak() } - if yyb23 { + if yyb25 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -44328,16 +44448,16 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.SessionAffinity = "" } else { - yyv33 := &x.SessionAffinity - yyv33.CodecDecodeSelf(d) + yyv35 := &x.SessionAffinity + yyv35.CodecDecodeSelf(d) } - yyj23++ - if yyhl23 { - yyb23 = yyj23 > l + yyj25++ + if yyhl25 { + yyb25 = yyj25 > l } else { - yyb23 = r.CheckBreak() + yyb25 = r.CheckBreak() } - if yyb23 { + if yyb25 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -44345,21 +44465,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.LoadBalancerIP = "" } else { - yyv34 := &x.LoadBalancerIP - yym35 := z.DecBinary() - _ = yym35 + yyv36 := &x.LoadBalancerIP + yym37 := z.DecBinary() + _ = yym37 if false { } else { - *((*string)(yyv34)) = r.DecodeString() + *((*string)(yyv36)) = r.DecodeString() } } - yyj23++ - if yyhl23 { - yyb23 = yyj23 > l + yyj25++ + if yyhl25 { + yyb25 = yyj25 > l } else { - yyb23 = r.CheckBreak() + yyb25 = r.CheckBreak() } - if yyb23 { + if yyb25 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -44367,21 +44487,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.LoadBalancerSourceRanges = nil } else { - yyv36 := &x.LoadBalancerSourceRanges - yym37 := z.DecBinary() - _ = yym37 + yyv38 := &x.LoadBalancerSourceRanges + yym39 := z.DecBinary() + _ = yym39 if false { } else { - z.F.DecSliceStringX(yyv36, false, d) + z.F.DecSliceStringX(yyv38, false, d) } } - yyj23++ - if yyhl23 { - yyb23 = yyj23 > l + yyj25++ + if yyhl25 { + yyb25 = yyj25 > l } else { - yyb23 = r.CheckBreak() + yyb25 = r.CheckBreak() } - if yyb23 { + if yyb25 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -44389,21 +44509,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ExternalName = "" } else { - yyv38 := &x.ExternalName - yym39 := z.DecBinary() - _ = yym39 + yyv40 := &x.ExternalName + yym41 := z.DecBinary() + _ = yym41 if false { } else { - *((*string)(yyv38)) = r.DecodeString() + *((*string)(yyv40)) = r.DecodeString() } } - yyj23++ - if yyhl23 { - yyb23 = yyj23 > l + yyj25++ + if yyhl25 { + yyb25 = yyj25 > l } else { - yyb23 = r.CheckBreak() + yyb25 = r.CheckBreak() } - if yyb23 { + if yyb25 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -44411,16 +44531,16 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ExternalTrafficPolicy = "" } else { - yyv40 := &x.ExternalTrafficPolicy - yyv40.CodecDecodeSelf(d) + yyv42 := &x.ExternalTrafficPolicy + yyv42.CodecDecodeSelf(d) } - yyj23++ - if yyhl23 { - yyb23 = yyj23 > l + yyj25++ + if yyhl25 { + yyb25 = yyj25 > l } else { - yyb23 = r.CheckBreak() + yyb25 = r.CheckBreak() } - if yyb23 { + if yyb25 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -44428,26 +44548,48 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.HealthCheckNodePort = 0 } else { - yyv41 := &x.HealthCheckNodePort - yym42 := z.DecBinary() - _ = yym42 + yyv43 := &x.HealthCheckNodePort + yym44 := z.DecBinary() + _ = yym44 if false { } else { - *((*int32)(yyv41)) = int32(r.DecodeInt(32)) + *((*int32)(yyv43)) = int32(r.DecodeInt(32)) + } + } + yyj25++ + if yyhl25 { + yyb25 = yyj25 > l + } else { + yyb25 = r.CheckBreak() + } + if yyb25 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.PublishNotReadyAddresses = false + } else { + yyv45 := &x.PublishNotReadyAddresses + yym46 := z.DecBinary() + _ = yym46 + if false { + } else { + *((*bool)(yyv45)) = r.DecodeBool() } } for { - yyj23++ - if yyhl23 { - yyb23 = yyj23 > l + yyj25++ + if yyhl25 { + yyb25 = yyj25 > l } else { - yyb23 = r.CheckBreak() + yyb25 = r.CheckBreak() } - if yyb23 { + if yyb25 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj23-1, "") + z.DecStructFieldNotFound(yyj25-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -48225,7 +48367,7 @@ func (x *NodeSpec) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [5]bool + var yyq2 [6]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = x.PodCIDR != "" @@ -48233,9 +48375,10 @@ func (x *NodeSpec) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[2] = x.ProviderID != "" yyq2[3] = x.Unschedulable != false yyq2[4] = len(x.Taints) != 0 + yyq2[5] = x.ConfigSource != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(5) + r.EncodeArrayStart(6) } else { yynn2 = 0 for _, b := range yyq2 { @@ -48379,6 +48522,29 @@ func (x *NodeSpec) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[5] { + if x.ConfigSource == nil { + r.EncodeNil() + } else { + x.ConfigSource.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[5] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("configSource")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.ConfigSource == nil { + r.EncodeNil() + } else { + x.ConfigSource.CodecEncodeSelf(e) + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -48500,6 +48666,17 @@ func (x *NodeSpec) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { h.decSliceTaint((*[]Taint)(yyv12), d) } } + case "configSource": + if r.TryDecodeAsNil() { + if x.ConfigSource != nil { + x.ConfigSource = nil + } + } else { + if x.ConfigSource == nil { + x.ConfigSource = new(NodeConfigSource) + } + x.ConfigSource.CodecDecodeSelf(d) + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -48511,16 +48688,16 @@ func (x *NodeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj14 int - var yyb14 bool - var yyhl14 bool = l >= 0 - yyj14++ - if yyhl14 { - yyb14 = yyj14 > l + var yyj15 int + var yyb15 bool + var yyhl15 bool = l >= 0 + yyj15++ + if yyhl15 { + yyb15 = yyj15 > l } else { - yyb14 = r.CheckBreak() + yyb15 = r.CheckBreak() } - if yyb14 { + if yyb15 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -48528,21 +48705,21 @@ func (x *NodeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.PodCIDR = "" } else { - yyv15 := &x.PodCIDR - yym16 := z.DecBinary() - _ = yym16 + yyv16 := &x.PodCIDR + yym17 := z.DecBinary() + _ = yym17 if false { } else { - *((*string)(yyv15)) = r.DecodeString() + *((*string)(yyv16)) = r.DecodeString() } } - yyj14++ - if yyhl14 { - yyb14 = yyj14 > l + yyj15++ + if yyhl15 { + yyb15 = yyj15 > l } else { - yyb14 = r.CheckBreak() + yyb15 = r.CheckBreak() } - if yyb14 { + if yyb15 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -48550,21 +48727,21 @@ func (x *NodeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ExternalID = "" } else { - yyv17 := &x.ExternalID - yym18 := z.DecBinary() - _ = yym18 + yyv18 := &x.ExternalID + yym19 := z.DecBinary() + _ = yym19 if false { } else { - *((*string)(yyv17)) = r.DecodeString() + *((*string)(yyv18)) = r.DecodeString() } } - yyj14++ - if yyhl14 { - yyb14 = yyj14 > l + yyj15++ + if yyhl15 { + yyb15 = yyj15 > l } else { - yyb14 = r.CheckBreak() + yyb15 = r.CheckBreak() } - if yyb14 { + if yyb15 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -48572,21 +48749,21 @@ func (x *NodeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ProviderID = "" } else { - yyv19 := &x.ProviderID - yym20 := z.DecBinary() - _ = yym20 + yyv20 := &x.ProviderID + yym21 := z.DecBinary() + _ = yym21 if false { } else { - *((*string)(yyv19)) = r.DecodeString() + *((*string)(yyv20)) = r.DecodeString() } } - yyj14++ - if yyhl14 { - yyb14 = yyj14 > l + yyj15++ + if yyhl15 { + yyb15 = yyj15 > l } else { - yyb14 = r.CheckBreak() + yyb15 = r.CheckBreak() } - if yyb14 { + if yyb15 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -48594,21 +48771,21 @@ func (x *NodeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Unschedulable = false } else { - yyv21 := &x.Unschedulable - yym22 := z.DecBinary() - _ = yym22 + yyv22 := &x.Unschedulable + yym23 := z.DecBinary() + _ = yym23 if false { } else { - *((*bool)(yyv21)) = r.DecodeBool() + *((*bool)(yyv22)) = r.DecodeBool() } } - yyj14++ - if yyhl14 { - yyb14 = yyj14 > l + yyj15++ + if yyhl15 { + yyb15 = yyj15 > l } else { - yyb14 = r.CheckBreak() + yyb15 = r.CheckBreak() } - if yyb14 { + if yyb15 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -48616,26 +48793,344 @@ func (x *NodeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Taints = nil } else { - yyv23 := &x.Taints - yym24 := z.DecBinary() - _ = yym24 + yyv24 := &x.Taints + yym25 := z.DecBinary() + _ = yym25 if false { } else { - h.decSliceTaint((*[]Taint)(yyv23), d) + h.decSliceTaint((*[]Taint)(yyv24), d) } } - for { - yyj14++ - if yyhl14 { - yyb14 = yyj14 > l - } else { - yyb14 = r.CheckBreak() + yyj15++ + if yyhl15 { + yyb15 = yyj15 > l + } else { + yyb15 = r.CheckBreak() + } + if yyb15 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.ConfigSource != nil { + x.ConfigSource = nil } - if yyb14 { + } else { + if x.ConfigSource == nil { + x.ConfigSource = new(NodeConfigSource) + } + x.ConfigSource.CodecDecodeSelf(d) + } + for { + yyj15++ + if yyhl15 { + yyb15 = yyj15 > l + } else { + yyb15 = r.CheckBreak() + } + if yyb15 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj14-1, "") + z.DecStructFieldNotFound(yyj15-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x *NodeConfigSource) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [3]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[0] = x.Kind != "" + yyq2[1] = x.APIVersion != "" + yyq2[2] = x.ConfigMapRef != nil + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(3) + } else { + yynn2 = 0 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[0] { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("kind")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("apiVersion")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + if x.ConfigMapRef == nil { + r.EncodeNil() + } else { + x.ConfigMapRef.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("configMapRef")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.ConfigMapRef == nil { + r.EncodeNil() + } else { + x.ConfigMapRef.CodecEncodeSelf(e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *NodeConfigSource) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *NodeConfigSource) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "kind": + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv4 := &x.Kind + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "apiVersion": + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv6 := &x.APIVersion + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + case "configMapRef": + if r.TryDecodeAsNil() { + if x.ConfigMapRef != nil { + x.ConfigMapRef = nil + } + } else { + if x.ConfigMapRef == nil { + x.ConfigMapRef = new(ObjectReference) + } + x.ConfigMapRef.CodecDecodeSelf(d) + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *NodeConfigSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj9 int + var yyb9 bool + var yyhl9 bool = l >= 0 + yyj9++ + if yyhl9 { + yyb9 = yyj9 > l + } else { + yyb9 = r.CheckBreak() + } + if yyb9 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv10 := &x.Kind + yym11 := z.DecBinary() + _ = yym11 + if false { + } else { + *((*string)(yyv10)) = r.DecodeString() + } + } + yyj9++ + if yyhl9 { + yyb9 = yyj9 > l + } else { + yyb9 = r.CheckBreak() + } + if yyb9 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv12 := &x.APIVersion + yym13 := z.DecBinary() + _ = yym13 + if false { + } else { + *((*string)(yyv12)) = r.DecodeString() + } + } + yyj9++ + if yyhl9 { + yyb9 = yyj9 > l + } else { + yyb9 = r.CheckBreak() + } + if yyb9 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.ConfigMapRef != nil { + x.ConfigMapRef = nil + } + } else { + if x.ConfigMapRef == nil { + x.ConfigMapRef = new(ObjectReference) + } + x.ConfigMapRef.CodecDecodeSelf(d) + } + for { + yyj9++ + if yyhl9 { + yyb9 = yyj9 > l + } else { + yyb9 = r.CheckBreak() + } + if yyb9 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj9-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -75163,7 +75658,7 @@ func (x codecSelfer1234) decSliceNode(v *[]Node, d *codec1978.Decoder) { yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 664) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 672) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index c2c574e3446..2810a9636fd 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -1102,10 +1102,12 @@ type ISCSIVolumeSource struct { // Fibre Channel volumes can only be mounted as read/write once. // Fibre Channel volumes support ownership management and SELinux relabeling. type FCVolumeSource struct { - // Required: FC target worldwide names (WWNs) - TargetWWNs []string `json:"targetWWNs" protobuf:"bytes,1,rep,name=targetWWNs"` - // Required: FC target lun number - Lun *int32 `json:"lun" protobuf:"varint,2,opt,name=lun"` + // Optional: FC target worldwide names (WWNs) + // +optional + TargetWWNs []string `json:"targetWWNs,omitempty" protobuf:"bytes,1,rep,name=targetWWNs"` + // Optional: FC target lun number + // +optional + Lun *int32 `json:"lun,omitempty" protobuf:"varint,2,opt,name=lun"` // Filesystem type to mount. // Must be a filesystem type supported by the host operating system. // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. @@ -1116,6 +1118,10 @@ type FCVolumeSource struct { // the ReadOnly setting in VolumeMounts. // +optional ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,4,opt,name=readOnly"` + // Optional: FC volume world wide identifiers (wwids) + // Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously. + // +optional + WWIDs []string `json:"wwids,omitempty" protobuf:"bytes,5,rep,name=wwids"` } // AzureFile represents an Azure File Service mount on the host and bind mount to the pod. @@ -2162,6 +2168,7 @@ type PodAffinity struct { // podAffinityTerm are intersected, i.e. all terms must be satisfied. // +optional // RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:"requiredDuringSchedulingRequiredDuringExecution,omitempty"` + // If the affinity requirements specified by this field are not met at // scheduling time, the pod will not be scheduled onto the node. // If the affinity requirements specified by this field cease to be met @@ -2196,6 +2203,7 @@ type PodAntiAffinity struct { // podAffinityTerm are intersected, i.e. all terms must be satisfied. // +optional // RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:"requiredDuringSchedulingRequiredDuringExecution,omitempty"` + // If the anti-affinity requirements specified by this field are not met at // scheduling time, the pod will not be scheduled onto the node. // If the anti-affinity requirements specified by this field cease to be met @@ -3070,6 +3078,18 @@ type ServiceSpec struct { // and ExternalTrafficPolicy is set to Local. // +optional HealthCheckNodePort int32 `json:"healthCheckNodePort,omitempty" protobuf:"bytes,12,opt,name=healthCheckNodePort"` + + // publishNotReadyAddresses, when set to true, indicates that DNS implementations + // must publish the notReadyAddresses of subsets for the Endpoints associated with + // the Service. The default value is false. + // The primary use case for setting this field is to use a StatefulSet's Headless Service + // to propagate SRV records for its Pods without respect to their readiness for purpose + // of peer discovery. + // This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints + // when that annotation is deprecated and all clients have been converted to use this + // field. + // +optional + PublishNotReadyAddresses bool `json:"publishNotReadyAddresses,omitempty" protobuf:"varint,13,opt,name=publishNotReadyAddresses"` } // ServicePort contains information on service's port. @@ -3332,6 +3352,18 @@ type NodeSpec struct { // If specified, the node's taints. // +optional Taints []Taint `json:"taints,omitempty" protobuf:"bytes,5,opt,name=taints"` + // If specified, the source to get node configuration from + // The DynamicKubeletConfig feature gate must be enabled for the Kubelet to use this field + // +optional + ConfigSource *NodeConfigSource `json:"configSource,omitempty" protobuf:"bytes,6,opt,name=configSource"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil. +type NodeConfigSource struct { + metav1.TypeMeta `json:",inline"` + ConfigMapRef *ObjectReference `json:"configMapRef,omitempty" protobuf:"bytes,1,opt,name=configMapRef"` } // DaemonEndpoint contains information about a single Daemon endpoint. @@ -3510,8 +3542,6 @@ const ( NodeDiskPressure NodeConditionType = "DiskPressure" // NodeNetworkUnavailable means that network for the node is not correctly configured. NodeNetworkUnavailable NodeConditionType = "NetworkUnavailable" - // NodeInodePressure means the kubelet is under pressure due to insufficient available inodes. - NodeInodePressure NodeConditionType = "InodePressure" ) // NodeCondition contains condition information for a node. diff --git a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go index 365825019ef..1b71fa5dbe4 100644 --- a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -541,10 +541,11 @@ func (ExecAction) SwaggerDoc() map[string]string { var map_FCVolumeSource = map[string]string{ "": "Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write once. Fibre Channel volumes support ownership management and SELinux relabeling.", - "targetWWNs": "Required: FC target worldwide names (WWNs)", - "lun": "Required: FC target lun number", + "targetWWNs": "Optional: FC target worldwide names (WWNs)", + "lun": "Optional: FC target lun number", "fsType": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", "readOnly": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", + "wwids": "Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.", } func (FCVolumeSource) SwaggerDoc() map[string]string { @@ -899,6 +900,14 @@ func (NodeCondition) SwaggerDoc() map[string]string { return map_NodeCondition } +var map_NodeConfigSource = map[string]string{ + "": "NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.", +} + +func (NodeConfigSource) SwaggerDoc() map[string]string { + return map_NodeConfigSource +} + var map_NodeDaemonEndpoints = map[string]string{ "": "NodeDaemonEndpoints lists ports opened by daemons running on the Node.", "kubeletEndpoint": "Endpoint on which Kubelet is listening.", @@ -972,6 +981,7 @@ var map_NodeSpec = map[string]string{ "providerID": "ID of the node assigned by the cloud provider in the format: ://", "unschedulable": "Unschedulable controls node schedulability of new pods. By default, node is schedulable. More info: https://kubernetes.io/docs/concepts/nodes/node/#manual-node-administration", "taints": "If specified, the node's taints.", + "configSource": "If specified, the source to get node configuration from The DynamicKubeletConfig feature gate must be enabled for the Kubelet to use this field", } func (NodeSpec) SwaggerDoc() map[string]string { @@ -1215,7 +1225,7 @@ func (Pod) SwaggerDoc() map[string]string { var map_PodAffinity = map[string]string{ "": "Pod affinity is a group of inter pod affinity scheduling rules.", - "requiredDuringSchedulingIgnoredDuringExecution": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", + "requiredDuringSchedulingIgnoredDuringExecution": "If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", "preferredDuringSchedulingIgnoredDuringExecution": "The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.", } @@ -1236,7 +1246,7 @@ func (PodAffinityTerm) SwaggerDoc() map[string]string { var map_PodAntiAffinity = map[string]string{ "": "Pod anti affinity is a group of inter pod anti affinity scheduling rules.", - "requiredDuringSchedulingIgnoredDuringExecution": "NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented. If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system will try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:\"requiredDuringSchedulingRequiredDuringExecution,omitempty\"` If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", + "requiredDuringSchedulingIgnoredDuringExecution": "If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", "preferredDuringSchedulingIgnoredDuringExecution": "The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.", } @@ -1864,6 +1874,7 @@ var map_ServiceSpec = map[string]string{ "externalName": "externalName is the external reference that kubedns or equivalent will return as a CNAME record for this service. No proxying will be involved. Must be a valid DNS name and requires Type to be ExternalName.", "externalTrafficPolicy": "externalTrafficPolicy denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints. \"Local\" preserves the client source IP and avoids a second hop for LoadBalancer and Nodeport type services, but risks potentially imbalanced traffic spreading. \"Cluster\" obscures the client source IP and may cause a second hop to another node, but should have good overall load-spreading.", "healthCheckNodePort": "healthCheckNodePort specifies the healthcheck nodePort for the service. If not specified, HealthCheckNodePort is created by the service api backend with the allocated nodePort. Will use user-specified nodePort value if specified by the client. Only effects when Type is set to LoadBalancer and ExternalTrafficPolicy is set to Local.", + "publishNotReadyAddresses": "publishNotReadyAddresses, when set to true, indicates that DNS implementations must publish the notReadyAddresses of subsets for the Endpoints associated with the Service. The default value is false. The primary use case for setting this field is to use a StatefulSet's Headless Service to propagate SRV records for its Pods without respect to their readiness for purpose of peer discovery. This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints when that annotation is deprecated and all clients have been converted to use this field.", } func (ServiceSpec) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go index 981edd88f41..ea1542df8d6 100644 --- a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -350,6 +350,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*NodeCondition).DeepCopyInto(out.(*NodeCondition)) return nil }, InType: reflect.TypeOf(&NodeCondition{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*NodeConfigSource).DeepCopyInto(out.(*NodeConfigSource)) + return nil + }, InType: reflect.TypeOf(&NodeConfigSource{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*NodeDaemonEndpoints).DeepCopyInto(out.(*NodeDaemonEndpoints)) return nil @@ -2080,6 +2084,11 @@ func (in *FCVolumeSource) DeepCopyInto(out *FCVolumeSource) { **out = **in } } + if in.WWIDs != nil { + in, out := &in.WWIDs, &out.WWIDs + *out = make([]string, len(*in)) + copy(*out, *in) + } return } @@ -2881,6 +2890,41 @@ func (in *NodeCondition) DeepCopy() *NodeCondition { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeConfigSource) DeepCopyInto(out *NodeConfigSource) { + *out = *in + out.TypeMeta = in.TypeMeta + if in.ConfigMapRef != nil { + in, out := &in.ConfigMapRef, &out.ConfigMapRef + if *in == nil { + *out = nil + } else { + *out = new(ObjectReference) + **out = **in + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeConfigSource. +func (in *NodeConfigSource) DeepCopy() *NodeConfigSource { + if in == nil { + return nil + } + out := new(NodeConfigSource) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *NodeConfigSource) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } else { + return nil + } +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NodeDaemonEndpoints) DeepCopyInto(out *NodeDaemonEndpoints) { *out = *in @@ -3058,6 +3102,15 @@ func (in *NodeSpec) DeepCopyInto(out *NodeSpec) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.ConfigSource != nil { + in, out := &in.ConfigSource, &out.ConfigSource + if *in == nil { + *out = nil + } else { + *out = new(NodeConfigSource) + (*in).DeepCopyInto(*out) + } + } return } diff --git a/staging/src/k8s.io/api/extensions/v1beta1/BUILD b/staging/src/k8s.io/api/extensions/v1beta1/BUILD index 688fc138dcb..bb34e59f753 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/BUILD +++ b/staging/src/k8s.io/api/extensions/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", @@ -47,3 +44,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/extensions/v1beta1/generated.proto b/staging/src/k8s.io/api/extensions/v1beta1/generated.proto index 2f386667557..91510a4a33e 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/generated.proto +++ b/staging/src/k8s.io/api/extensions/v1beta1/generated.proto @@ -245,6 +245,7 @@ message DeploymentList { repeated Deployment items = 2; } +// DEPRECATED. // DeploymentRollback stores the information required to rollback a deployment. message DeploymentRollback { // Required: This must match the Name of a deployment. @@ -293,6 +294,7 @@ message DeploymentSpec { // +optional optional bool paused = 7; + // DEPRECATED. // The config this deployment is rolling back to. Will be cleared after rollback is done. // +optional optional RollbackConfig rollbackTo = 8; @@ -852,6 +854,7 @@ message ReplicaSetStatus { message ReplicationControllerDummy { } +// DEPRECATED. message RollbackConfig { // The revision to rollback to. If set to 0, rollback to the last revision. // +optional diff --git a/staging/src/k8s.io/api/extensions/v1beta1/types.go b/staging/src/k8s.io/api/extensions/v1beta1/types.go index d30a63121d9..98bd22488c5 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/types.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/types.go @@ -211,6 +211,7 @@ type DeploymentSpec struct { // +optional Paused bool `json:"paused,omitempty" protobuf:"varint,7,opt,name=paused"` + // DEPRECATED. // The config this deployment is rolling back to. Will be cleared after rollback is done. // +optional RollbackTo *RollbackConfig `json:"rollbackTo,omitempty" protobuf:"bytes,8,opt,name=rollbackTo"` @@ -227,6 +228,7 @@ type DeploymentSpec struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// DEPRECATED. // DeploymentRollback stores the information required to rollback a deployment. type DeploymentRollback struct { metav1.TypeMeta `json:",inline"` @@ -239,6 +241,7 @@ type DeploymentRollback struct { RollbackTo RollbackConfig `json:"rollbackTo" protobuf:"bytes,3,opt,name=rollbackTo"` } +// DEPRECATED. type RollbackConfig struct { // The revision to rollback to. If set to 0, rollback to the last revision. // +optional diff --git a/staging/src/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go index 7c5a8c56bf6..2a0259548c8 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go @@ -152,7 +152,7 @@ func (DeploymentList) SwaggerDoc() map[string]string { } var map_DeploymentRollback = map[string]string{ - "": "DeploymentRollback stores the information required to rollback a deployment.", + "": "DEPRECATED. DeploymentRollback stores the information required to rollback a deployment.", "name": "Required: This must match the Name of a deployment.", "updatedAnnotations": "The annotations to be updated to a deployment", "rollbackTo": "The config of this deployment rollback.", @@ -171,7 +171,7 @@ var map_DeploymentSpec = map[string]string{ "minReadySeconds": "Minimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)", "revisionHistoryLimit": "The number of old ReplicaSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified.", "paused": "Indicates that the deployment is paused and will not be processed by the deployment controller.", - "rollbackTo": "The config this deployment is rolling back to. Will be cleared after rollback is done.", + "rollbackTo": "DEPRECATED. The config this deployment is rolling back to. Will be cleared after rollback is done.", "progressDeadlineSeconds": "The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Once autoRollback is implemented, the deployment controller will automatically rollback failed deployments. Note that progress will not be estimated during the time a deployment is paused. This is not set by default.", } @@ -502,6 +502,7 @@ func (ReplicationControllerDummy) SwaggerDoc() map[string]string { } var map_RollbackConfig = map[string]string{ + "": "DEPRECATED.", "revision": "The revision to rollback to. If set to 0, rollback to the last revision.", } diff --git a/staging/src/k8s.io/api/imagepolicy/v1alpha1/BUILD b/staging/src/k8s.io/api/imagepolicy/v1alpha1/BUILD index 33f73ac3c72..2c4953766bb 100644 --- a/staging/src/k8s.io/api/imagepolicy/v1alpha1/BUILD +++ b/staging/src/k8s.io/api/imagepolicy/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", @@ -43,3 +40,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/networking/v1/BUILD b/staging/src/k8s.io/api/networking/v1/BUILD index 0f9426b44c6..7ca18208825 100644 --- a/staging/src/k8s.io/api/networking/v1/BUILD +++ b/staging/src/k8s.io/api/networking/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/ugorji/go/codec:go_default_library", @@ -44,3 +41,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/policy/v1beta1/BUILD b/staging/src/k8s.io/api/policy/v1beta1/BUILD index a9e5c276572..7ec32f79904 100644 --- a/staging/src/k8s.io/api/policy/v1beta1/BUILD +++ b/staging/src/k8s.io/api/policy/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", @@ -44,3 +41,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/rbac/v1/BUILD b/staging/src/k8s.io/api/rbac/v1/BUILD new file mode 100644 index 00000000000..f77e6881be0 --- /dev/null +++ b/staging/src/k8s.io/api/rbac/v1/BUILD @@ -0,0 +1,47 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = [ + "doc.go", + "generated.pb.go", + "register.go", + "types.generated.go", + "types.go", + "types_swagger_doc_generated.go", + "zz_generated.deepcopy.go", + ], + deps = [ + "//vendor/github.com/gogo/protobuf/proto:go_default_library", + "//vendor/github.com/ugorji/go/codec: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/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/rbac/v1/doc.go b/staging/src/k8s.io/api/rbac/v1/doc.go new file mode 100644 index 00000000000..737261a097f --- /dev/null +++ b/staging/src/k8s.io/api/rbac/v1/doc.go @@ -0,0 +1,21 @@ +/* +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. +*/ + +// +k8s:deepcopy-gen=package,register +// +k8s:openapi-gen=true + +// +groupName=rbac.authorization.k8s.io +package v1 // import "k8s.io/api/rbac/v1" diff --git a/staging/src/k8s.io/api/rbac/v1/generated.pb.go b/staging/src/k8s.io/api/rbac/v1/generated.pb.go new file mode 100644 index 00000000000..dba0ec95bef --- /dev/null +++ b/staging/src/k8s.io/api/rbac/v1/generated.pb.go @@ -0,0 +1,2555 @@ +/* +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. +*/ + +// Code generated by protoc-gen-gogo. +// source: k8s.io/kubernetes/vendor/k8s.io/api/rbac/v1/generated.proto +// DO NOT EDIT! + +/* + Package v1 is a generated protocol buffer package. + + It is generated from these files: + k8s.io/kubernetes/vendor/k8s.io/api/rbac/v1/generated.proto + + It has these top-level messages: + ClusterRole + ClusterRoleBinding + ClusterRoleBindingList + ClusterRoleList + PolicyRule + Role + RoleBinding + RoleBindingList + RoleList + RoleRef + Subject +*/ +package v1 + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +import strings "strings" +import reflect "reflect" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +func (m *ClusterRole) Reset() { *m = ClusterRole{} } +func (*ClusterRole) ProtoMessage() {} +func (*ClusterRole) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{0} } + +func (m *ClusterRoleBinding) Reset() { *m = ClusterRoleBinding{} } +func (*ClusterRoleBinding) ProtoMessage() {} +func (*ClusterRoleBinding) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{1} } + +func (m *ClusterRoleBindingList) Reset() { *m = ClusterRoleBindingList{} } +func (*ClusterRoleBindingList) ProtoMessage() {} +func (*ClusterRoleBindingList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{2} } + +func (m *ClusterRoleList) Reset() { *m = ClusterRoleList{} } +func (*ClusterRoleList) ProtoMessage() {} +func (*ClusterRoleList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{3} } + +func (m *PolicyRule) Reset() { *m = PolicyRule{} } +func (*PolicyRule) ProtoMessage() {} +func (*PolicyRule) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{4} } + +func (m *Role) Reset() { *m = Role{} } +func (*Role) ProtoMessage() {} +func (*Role) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{5} } + +func (m *RoleBinding) Reset() { *m = RoleBinding{} } +func (*RoleBinding) ProtoMessage() {} +func (*RoleBinding) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{6} } + +func (m *RoleBindingList) Reset() { *m = RoleBindingList{} } +func (*RoleBindingList) ProtoMessage() {} +func (*RoleBindingList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{7} } + +func (m *RoleList) Reset() { *m = RoleList{} } +func (*RoleList) ProtoMessage() {} +func (*RoleList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{8} } + +func (m *RoleRef) Reset() { *m = RoleRef{} } +func (*RoleRef) ProtoMessage() {} +func (*RoleRef) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{9} } + +func (m *Subject) Reset() { *m = Subject{} } +func (*Subject) ProtoMessage() {} +func (*Subject) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{10} } + +func init() { + proto.RegisterType((*ClusterRole)(nil), "k8s.io.api.rbac.v1.ClusterRole") + proto.RegisterType((*ClusterRoleBinding)(nil), "k8s.io.api.rbac.v1.ClusterRoleBinding") + proto.RegisterType((*ClusterRoleBindingList)(nil), "k8s.io.api.rbac.v1.ClusterRoleBindingList") + proto.RegisterType((*ClusterRoleList)(nil), "k8s.io.api.rbac.v1.ClusterRoleList") + proto.RegisterType((*PolicyRule)(nil), "k8s.io.api.rbac.v1.PolicyRule") + proto.RegisterType((*Role)(nil), "k8s.io.api.rbac.v1.Role") + proto.RegisterType((*RoleBinding)(nil), "k8s.io.api.rbac.v1.RoleBinding") + proto.RegisterType((*RoleBindingList)(nil), "k8s.io.api.rbac.v1.RoleBindingList") + proto.RegisterType((*RoleList)(nil), "k8s.io.api.rbac.v1.RoleList") + proto.RegisterType((*RoleRef)(nil), "k8s.io.api.rbac.v1.RoleRef") + proto.RegisterType((*Subject)(nil), "k8s.io.api.rbac.v1.Subject") +} +func (m *ClusterRole) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterRole) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) + n1, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + if len(m.Rules) > 0 { + for _, msg := range m.Rules { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *ClusterRoleBinding) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterRoleBinding) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) + n2, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + if len(m.Subjects) > 0 { + for _, msg := range m.Subjects { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.RoleRef.Size())) + n3, err := m.RoleRef.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + return i, nil +} + +func (m *ClusterRoleBindingList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterRoleBindingList) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) + n4, err := m.ListMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 + if len(m.Items) > 0 { + for _, msg := range m.Items { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *ClusterRoleList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterRoleList) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) + n5, err := m.ListMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 + if len(m.Items) > 0 { + for _, msg := range m.Items { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *PolicyRule) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PolicyRule) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Verbs) > 0 { + for _, s := range m.Verbs { + dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if len(m.APIGroups) > 0 { + for _, s := range m.APIGroups { + dAtA[i] = 0x12 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if len(m.Resources) > 0 { + for _, s := range m.Resources { + dAtA[i] = 0x1a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if len(m.ResourceNames) > 0 { + for _, s := range m.ResourceNames { + dAtA[i] = 0x22 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if len(m.NonResourceURLs) > 0 { + for _, s := range m.NonResourceURLs { + dAtA[i] = 0x2a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + +func (m *Role) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Role) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) + n6, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n6 + if len(m.Rules) > 0 { + for _, msg := range m.Rules { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *RoleBinding) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RoleBinding) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) + n7, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n7 + if len(m.Subjects) > 0 { + for _, msg := range m.Subjects { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.RoleRef.Size())) + n8, err := m.RoleRef.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n8 + return i, nil +} + +func (m *RoleBindingList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RoleBindingList) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) + n9, err := m.ListMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n9 + if len(m.Items) > 0 { + for _, msg := range m.Items { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *RoleList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RoleList) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) + n10, err := m.ListMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n10 + if len(m.Items) > 0 { + for _, msg := range m.Items { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *RoleRef) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RoleRef) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.APIGroup))) + i += copy(dAtA[i:], m.APIGroup) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Kind))) + i += copy(dAtA[i:], m.Kind) + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + return i, nil +} + +func (m *Subject) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Subject) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Kind))) + i += copy(dAtA[i:], m.Kind) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.APIGroup))) + i += copy(dAtA[i:], m.APIGroup) + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) + i += copy(dAtA[i:], m.Namespace) + return i, nil +} + +func encodeFixed64Generated(dAtA []byte, offset int, v uint64) int { + dAtA[offset] = uint8(v) + dAtA[offset+1] = uint8(v >> 8) + dAtA[offset+2] = uint8(v >> 16) + dAtA[offset+3] = uint8(v >> 24) + dAtA[offset+4] = uint8(v >> 32) + dAtA[offset+5] = uint8(v >> 40) + dAtA[offset+6] = uint8(v >> 48) + dAtA[offset+7] = uint8(v >> 56) + return offset + 8 +} +func encodeFixed32Generated(dAtA []byte, offset int, v uint32) int { + dAtA[offset] = uint8(v) + dAtA[offset+1] = uint8(v >> 8) + dAtA[offset+2] = uint8(v >> 16) + dAtA[offset+3] = uint8(v >> 24) + return offset + 4 +} +func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *ClusterRole) Size() (n int) { + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Rules) > 0 { + for _, e := range m.Rules { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ClusterRoleBinding) Size() (n int) { + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Subjects) > 0 { + for _, e := range m.Subjects { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = m.RoleRef.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ClusterRoleBindingList) Size() (n int) { + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ClusterRoleList) Size() (n int) { + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *PolicyRule) Size() (n int) { + var l int + _ = l + if len(m.Verbs) > 0 { + for _, s := range m.Verbs { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.APIGroups) > 0 { + for _, s := range m.APIGroups { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Resources) > 0 { + for _, s := range m.Resources { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.ResourceNames) > 0 { + for _, s := range m.ResourceNames { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.NonResourceURLs) > 0 { + for _, s := range m.NonResourceURLs { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *Role) Size() (n int) { + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Rules) > 0 { + for _, e := range m.Rules { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *RoleBinding) Size() (n int) { + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Subjects) > 0 { + for _, e := range m.Subjects { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = m.RoleRef.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *RoleBindingList) Size() (n int) { + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *RoleList) Size() (n int) { + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *RoleRef) Size() (n int) { + var l int + _ = l + l = len(m.APIGroup) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Kind) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *Subject) Size() (n int) { + var l int + _ = l + l = len(m.Kind) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.APIGroup) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Namespace) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func sovGenerated(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *ClusterRole) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ClusterRole{`, + `ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Rules:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Rules), "PolicyRule", "PolicyRule", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ClusterRoleBinding) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ClusterRoleBinding{`, + `ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Subjects:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Subjects), "Subject", "Subject", 1), `&`, ``, 1) + `,`, + `RoleRef:` + strings.Replace(strings.Replace(this.RoleRef.String(), "RoleRef", "RoleRef", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ClusterRoleBindingList) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ClusterRoleBindingList{`, + `ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "ClusterRoleBinding", "ClusterRoleBinding", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ClusterRoleList) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ClusterRoleList{`, + `ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "ClusterRole", "ClusterRole", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *PolicyRule) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PolicyRule{`, + `Verbs:` + fmt.Sprintf("%v", this.Verbs) + `,`, + `APIGroups:` + fmt.Sprintf("%v", this.APIGroups) + `,`, + `Resources:` + fmt.Sprintf("%v", this.Resources) + `,`, + `ResourceNames:` + fmt.Sprintf("%v", this.ResourceNames) + `,`, + `NonResourceURLs:` + fmt.Sprintf("%v", this.NonResourceURLs) + `,`, + `}`, + }, "") + return s +} +func (this *Role) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Role{`, + `ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Rules:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Rules), "PolicyRule", "PolicyRule", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *RoleBinding) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&RoleBinding{`, + `ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Subjects:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Subjects), "Subject", "Subject", 1), `&`, ``, 1) + `,`, + `RoleRef:` + strings.Replace(strings.Replace(this.RoleRef.String(), "RoleRef", "RoleRef", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *RoleBindingList) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&RoleBindingList{`, + `ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "RoleBinding", "RoleBinding", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *RoleList) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&RoleList{`, + `ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "Role", "Role", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *RoleRef) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&RoleRef{`, + `APIGroup:` + fmt.Sprintf("%v", this.APIGroup) + `,`, + `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `}`, + }, "") + return s +} +func (this *Subject) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Subject{`, + `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, + `APIGroup:` + fmt.Sprintf("%v", this.APIGroup) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, + `}`, + }, "") + return s +} +func valueToStringGenerated(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *ClusterRole) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterRole: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterRole: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Rules", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Rules = append(m.Rules, PolicyRule{}) + if err := m.Rules[len(m.Rules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterRoleBinding) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterRoleBinding: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterRoleBinding: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Subjects", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Subjects = append(m.Subjects, Subject{}) + if err := m.Subjects[len(m.Subjects)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RoleRef", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.RoleRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterRoleBindingList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterRoleBindingList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterRoleBindingList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, ClusterRoleBinding{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterRoleList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterRoleList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterRoleList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, ClusterRole{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PolicyRule) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PolicyRule: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PolicyRule: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Verbs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Verbs = append(m.Verbs, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field APIGroups", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.APIGroups = append(m.APIGroups, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resources = append(m.Resources, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceNames", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ResourceNames = append(m.ResourceNames, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NonResourceURLs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NonResourceURLs = append(m.NonResourceURLs, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Role) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Role: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Role: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Rules", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Rules = append(m.Rules, PolicyRule{}) + if err := m.Rules[len(m.Rules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RoleBinding) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RoleBinding: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RoleBinding: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Subjects", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Subjects = append(m.Subjects, Subject{}) + if err := m.Subjects[len(m.Subjects)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RoleRef", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.RoleRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RoleBindingList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RoleBindingList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RoleBindingList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, RoleBinding{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RoleList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RoleList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RoleList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, Role{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RoleRef) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RoleRef: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RoleRef: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field APIGroup", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.APIGroup = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Subject) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Subject: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Subject: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field APIGroup", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.APIGroup = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Namespace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenerated(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthGenerated + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipGenerated(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("k8s.io/kubernetes/vendor/k8s.io/api/rbac/v1/generated.proto", fileDescriptorGenerated) +} + +var fileDescriptorGenerated = []byte{ + // 751 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x94, 0xcd, 0x6e, 0xd3, 0x4a, + 0x14, 0xc7, 0xe3, 0x7c, 0x28, 0xf1, 0xe4, 0x46, 0xb9, 0xf5, 0x95, 0xee, 0xb5, 0x2a, 0x5d, 0x27, + 0x0a, 0x2c, 0x2a, 0x95, 0xda, 0xb4, 0x20, 0x60, 0x83, 0x04, 0x66, 0x01, 0x55, 0x4b, 0xa8, 0x06, + 0xc1, 0x02, 0xb1, 0x60, 0xe2, 0x4c, 0xd3, 0x21, 0xf1, 0x87, 0x66, 0xc6, 0x91, 0x2a, 0x36, 0x3c, + 0x00, 0x0b, 0x24, 0x5e, 0x83, 0x15, 0x3b, 0x78, 0x82, 0x2c, 0xbb, 0xec, 0x2a, 0xa2, 0xe6, 0x41, + 0x40, 0x33, 0xb6, 0xe3, 0xa4, 0x69, 0xda, 0xac, 0x22, 0x21, 0xb1, 0x4a, 0xe6, 0x9c, 0xdf, 0xf9, + 0x9f, 0x0f, 0xcf, 0x1c, 0xf0, 0xa0, 0x7f, 0x8f, 0x99, 0xc4, 0xb7, 0xfa, 0x61, 0x07, 0x53, 0x0f, + 0x73, 0xcc, 0xac, 0x21, 0xf6, 0xba, 0x3e, 0xb5, 0x12, 0x07, 0x0a, 0x88, 0x45, 0x3b, 0xc8, 0xb1, + 0x86, 0xdb, 0x1d, 0xcc, 0xd1, 0xb6, 0xd5, 0xc3, 0x1e, 0xa6, 0x88, 0xe3, 0xae, 0x19, 0x50, 0x9f, + 0xfb, 0xda, 0x7f, 0x31, 0x68, 0xa2, 0x80, 0x98, 0x02, 0x34, 0x13, 0x70, 0x7d, 0xab, 0x47, 0xf8, + 0x51, 0xd8, 0x31, 0x1d, 0xdf, 0xb5, 0x7a, 0x7e, 0xcf, 0xb7, 0x24, 0xdf, 0x09, 0x0f, 0xe5, 0x49, + 0x1e, 0xe4, 0xbf, 0x58, 0x67, 0xfd, 0x76, 0x96, 0xd0, 0x45, 0xce, 0x11, 0xf1, 0x30, 0x3d, 0xb6, + 0x82, 0x7e, 0x4f, 0x18, 0x98, 0xe5, 0x62, 0x8e, 0xac, 0xe1, 0x5c, 0xf6, 0x75, 0x6b, 0x51, 0x14, + 0x0d, 0x3d, 0x4e, 0x5c, 0x3c, 0x17, 0x70, 0xe7, 0xaa, 0x00, 0xe6, 0x1c, 0x61, 0x17, 0xcd, 0xc5, + 0xdd, 0x5a, 0x14, 0x17, 0x72, 0x32, 0xb0, 0x88, 0xc7, 0x19, 0xa7, 0xe7, 0x83, 0x5a, 0x5f, 0x15, + 0x50, 0x7d, 0x34, 0x08, 0x19, 0xc7, 0x14, 0xfa, 0x03, 0xac, 0xbd, 0x01, 0x15, 0xd1, 0x48, 0x17, + 0x71, 0xa4, 0x2b, 0x4d, 0x65, 0xa3, 0xba, 0x73, 0xd3, 0xcc, 0xc6, 0x37, 0xd1, 0x35, 0x83, 0x7e, + 0x4f, 0x18, 0x98, 0x29, 0x68, 0x73, 0xb8, 0x6d, 0x3e, 0xeb, 0xbc, 0xc5, 0x0e, 0x7f, 0x8a, 0x39, + 0xb2, 0xb5, 0xd1, 0xb8, 0x91, 0x8b, 0xc6, 0x0d, 0x90, 0xd9, 0xe0, 0x44, 0x55, 0x7b, 0x02, 0x4a, + 0x34, 0x1c, 0x60, 0xa6, 0xe7, 0x9b, 0x85, 0x8d, 0xea, 0xce, 0x35, 0x73, 0xc1, 0xd7, 0x31, 0x0f, + 0xfc, 0x01, 0x71, 0x8e, 0x61, 0x38, 0xc0, 0x76, 0x2d, 0x51, 0x2c, 0x89, 0x13, 0x83, 0xb1, 0x40, + 0xeb, 0x53, 0x1e, 0x68, 0x53, 0xb5, 0xdb, 0xc4, 0xeb, 0x12, 0xaf, 0xb7, 0x82, 0x16, 0xda, 0xa0, + 0xc2, 0x42, 0xe9, 0x48, 0xbb, 0x68, 0x2e, 0xec, 0xe2, 0x79, 0x0c, 0xda, 0x7f, 0x27, 0x8a, 0x95, + 0xc4, 0xc0, 0xe0, 0x44, 0x43, 0xdb, 0x03, 0x65, 0xea, 0x0f, 0x30, 0xc4, 0x87, 0x7a, 0x41, 0x16, + 0xbc, 0x58, 0x0e, 0xc6, 0x9c, 0x5d, 0x4f, 0xe4, 0xca, 0x89, 0x01, 0xa6, 0x0a, 0xad, 0x91, 0x02, + 0xfe, 0x9d, 0x9f, 0xca, 0x3e, 0x61, 0x5c, 0x7b, 0x3d, 0x37, 0x19, 0x73, 0xb9, 0xc9, 0x88, 0x68, + 0x39, 0x97, 0x49, 0x17, 0xa9, 0x65, 0x6a, 0x2a, 0x07, 0xa0, 0x44, 0x38, 0x76, 0xd3, 0x91, 0x6c, + 0x2e, 0xec, 0x61, 0xbe, 0xba, 0xec, 0x03, 0xef, 0x0a, 0x05, 0x18, 0x0b, 0xb5, 0xbe, 0x29, 0xa0, + 0x3e, 0x05, 0xaf, 0xa0, 0x87, 0xdd, 0xd9, 0x1e, 0xae, 0x2f, 0xd5, 0xc3, 0xc5, 0xc5, 0xff, 0x54, + 0x00, 0xc8, 0xae, 0xb0, 0xd6, 0x00, 0xa5, 0x21, 0xa6, 0x1d, 0xa6, 0x2b, 0xcd, 0xc2, 0x86, 0x6a, + 0xab, 0x82, 0x7f, 0x29, 0x0c, 0x30, 0xb6, 0x6b, 0x9b, 0x40, 0x45, 0x01, 0x79, 0x4c, 0xfd, 0x30, + 0x88, 0xd3, 0xab, 0x76, 0x2d, 0x1a, 0x37, 0xd4, 0x87, 0x07, 0xbb, 0xb1, 0x11, 0x66, 0x7e, 0x01, + 0x53, 0xcc, 0xfc, 0x90, 0x3a, 0x98, 0xe9, 0x85, 0x0c, 0x86, 0xa9, 0x11, 0x66, 0x7e, 0xed, 0x2e, + 0xa8, 0xa5, 0x87, 0x36, 0x72, 0x31, 0xd3, 0x8b, 0x32, 0x60, 0x2d, 0x1a, 0x37, 0x6a, 0x70, 0xda, + 0x01, 0x67, 0x39, 0xed, 0x3e, 0xa8, 0x7b, 0xbe, 0x97, 0x22, 0x2f, 0xe0, 0x3e, 0xd3, 0x4b, 0x32, + 0xf4, 0x9f, 0x68, 0xdc, 0xa8, 0xb7, 0x67, 0x5d, 0xf0, 0x3c, 0xdb, 0xfa, 0xa2, 0x80, 0xe2, 0x6f, + 0xb7, 0x54, 0x3e, 0xe4, 0x41, 0xf5, 0xcf, 0x36, 0x99, 0x6c, 0x13, 0xf1, 0x04, 0x57, 0xbb, 0x46, + 0x96, 0x7e, 0x82, 0x57, 0xef, 0x8f, 0xcf, 0x0a, 0xa8, 0xac, 0x68, 0x71, 0xd8, 0xb3, 0x55, 0xff, + 0x7f, 0x79, 0xd5, 0x17, 0x97, 0xfb, 0x0e, 0xa4, 0xf3, 0xd7, 0x6e, 0x80, 0x4a, 0xfa, 0xd8, 0x65, + 0xb1, 0x6a, 0x96, 0x3c, 0xdd, 0x07, 0x70, 0x42, 0x68, 0x4d, 0x50, 0xec, 0x13, 0xaf, 0xab, 0xe7, + 0x25, 0xf9, 0x57, 0x42, 0x16, 0xf7, 0x88, 0xd7, 0x85, 0xd2, 0x23, 0x08, 0x0f, 0xb9, 0x58, 0x5e, + 0x88, 0x29, 0x42, 0x3c, 0x73, 0x28, 0x3d, 0x62, 0x56, 0xe5, 0xe4, 0x32, 0x4d, 0xf4, 0x94, 0x85, + 0x7a, 0xd3, 0xf5, 0xe5, 0x97, 0xa9, 0xef, 0xf2, 0xec, 0x9a, 0x05, 0x54, 0xf1, 0xcb, 0x02, 0xe4, + 0x60, 0xbd, 0x28, 0xb1, 0xb5, 0x04, 0x53, 0xdb, 0xa9, 0x03, 0x66, 0x8c, 0xbd, 0x35, 0x3a, 0x33, + 0x72, 0x27, 0x67, 0x46, 0xee, 0xf4, 0xcc, 0xc8, 0xbd, 0x8f, 0x0c, 0x65, 0x14, 0x19, 0xca, 0x49, + 0x64, 0x28, 0xa7, 0x91, 0xa1, 0x7c, 0x8f, 0x0c, 0xe5, 0xe3, 0x0f, 0x23, 0xf7, 0xaa, 0x9c, 0x4c, + 0xfd, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0x74, 0x24, 0x6a, 0xfa, 0x45, 0x0a, 0x00, 0x00, +} diff --git a/staging/src/k8s.io/api/rbac/v1/generated.proto b/staging/src/k8s.io/api/rbac/v1/generated.proto new file mode 100644 index 00000000000..29aa3d5eebd --- /dev/null +++ b/staging/src/k8s.io/api/rbac/v1/generated.proto @@ -0,0 +1,182 @@ +/* +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. +*/ + + +// This file was autogenerated by go-to-protobuf. Do not edit it manually! + +syntax = 'proto2'; + +package k8s.io.api.rbac.v1; + +import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; +import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; + +// Package-wide variables from generator "generated". +option go_package = "v1"; + +// ClusterRole is a cluster level, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding or ClusterRoleBinding. +message ClusterRole { + // Standard object's metadata. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Rules holds all the PolicyRules for this ClusterRole + repeated PolicyRule rules = 2; +} + +// ClusterRoleBinding references a ClusterRole, but not contain it. It can reference a ClusterRole in the global namespace, +// and adds who information via Subject. +message ClusterRoleBinding { + // Standard object's metadata. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Subjects holds references to the objects the role applies to. + repeated Subject subjects = 2; + + // RoleRef can only reference a ClusterRole in the global namespace. + // If the RoleRef cannot be resolved, the Authorizer must return an error. + optional RoleRef roleRef = 3; +} + +// ClusterRoleBindingList is a collection of ClusterRoleBindings +message ClusterRoleBindingList { + // Standard object's metadata. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // Items is a list of ClusterRoleBindings + repeated ClusterRoleBinding items = 2; +} + +// ClusterRoleList is a collection of ClusterRoles +message ClusterRoleList { + // Standard object's metadata. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // Items is a list of ClusterRoles + repeated ClusterRole items = 2; +} + +// PolicyRule holds information that describes a policy rule, but does not contain information +// about who the rule applies to or which namespace the rule applies to. +message PolicyRule { + // Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds. + repeated string verbs = 1; + + // APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of + // the enumerated resources in any API group will be allowed. + // +optional + repeated string apiGroups = 2; + + // Resources is a list of resources this rule applies to. ResourceAll represents all resources. + // +optional + repeated string resources = 3; + + // ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. + // +optional + repeated string resourceNames = 4; + + // NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path + // Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. + // Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both. + // +optional + repeated string nonResourceURLs = 5; +} + +// Role is a namespaced, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding. +message Role { + // Standard object's metadata. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Rules holds all the PolicyRules for this Role + repeated PolicyRule rules = 2; +} + +// RoleBinding references a role, but does not contain it. It can reference a Role in the same namespace or a ClusterRole in the global namespace. +// It adds who information via Subjects and namespace information by which namespace it exists in. RoleBindings in a given +// namespace only have effect in that namespace. +message RoleBinding { + // Standard object's metadata. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Subjects holds references to the objects the role applies to. + repeated Subject subjects = 2; + + // RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. + // If the RoleRef cannot be resolved, the Authorizer must return an error. + optional RoleRef roleRef = 3; +} + +// RoleBindingList is a collection of RoleBindings +message RoleBindingList { + // Standard object's metadata. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // Items is a list of RoleBindings + repeated RoleBinding items = 2; +} + +// RoleList is a collection of Roles +message RoleList { + // Standard object's metadata. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // Items is a list of Roles + repeated Role items = 2; +} + +// RoleRef contains information that points to the role being used +message RoleRef { + // APIGroup is the group for the resource being referenced + optional string apiGroup = 1; + + // Kind is the type of resource being referenced + optional string kind = 2; + + // Name is the name of resource being referenced + optional string name = 3; +} + +// Subject contains a reference to the object or user identities a role binding applies to. This can either hold a direct API object reference, +// or a value for non-objects such as user and group names. +message Subject { + // Kind of object being referenced. Values defined by this API group are "User", "Group", and "ServiceAccount". + // If the Authorizer does not recognized the kind value, the Authorizer should report an error. + optional string kind = 1; + + // APIGroup holds the API group of the referenced subject. + // Defaults to "" for ServiceAccount subjects. + // Defaults to "rbac.authorization.k8s.io" for User and Group subjects. + // +optional + optional string apiGroup = 2; + + // Name of the object being referenced. + optional string name = 3; + + // Namespace of the referenced object. If the object kind is non-namespace, such as "User" or "Group", and this value is not empty + // the Authorizer should report an error. + // +optional + optional string namespace = 4; +} + diff --git a/staging/src/k8s.io/api/rbac/v1/register.go b/staging/src/k8s.io/api/rbac/v1/register.go new file mode 100644 index 00000000000..7336b5455e6 --- /dev/null +++ b/staging/src/k8s.io/api/rbac/v1/register.go @@ -0,0 +1,58 @@ +/* +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 v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +const GroupName = "rbac.authorization.k8s.io" + +// SchemeGroupVersion is group version used to register these objects +var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"} + +// Resource takes an unqualified resource and returns a Group qualified GroupResource +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +var ( + // TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. + // localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + localSchemeBuilder = &SchemeBuilder + AddToScheme = localSchemeBuilder.AddToScheme +) + +// Adds the list of known types to api.Scheme. +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &Role{}, + &RoleBinding{}, + &RoleBindingList{}, + &RoleList{}, + + &ClusterRole{}, + &ClusterRoleBinding{}, + &ClusterRoleBindingList{}, + &ClusterRoleList{}, + ) + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) + return nil +} diff --git a/staging/src/k8s.io/api/rbac/v1/types.generated.go b/staging/src/k8s.io/api/rbac/v1/types.generated.go new file mode 100644 index 00000000000..b24a993e2f8 --- /dev/null +++ b/staging/src/k8s.io/api/rbac/v1/types.generated.go @@ -0,0 +1,4879 @@ +/* +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. +*/ + +// ************************************************************ +// DO NOT EDIT. +// THIS FILE IS AUTO-GENERATED BY codecgen. +// ************************************************************ + +package v1 + +import ( + "errors" + "fmt" + codec1978 "github.com/ugorji/go/codec" + pkg1_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + pkg2_types "k8s.io/apimachinery/pkg/types" + "reflect" + "runtime" + time "time" +) + +const ( + // ----- content types ---- + codecSelferC_UTF81234 = 1 + codecSelferC_RAW1234 = 0 + // ----- value types used ---- + codecSelferValueTypeArray1234 = 10 + codecSelferValueTypeMap1234 = 9 + // ----- containerStateValues ---- + codecSelfer_containerMapKey1234 = 2 + codecSelfer_containerMapValue1234 = 3 + codecSelfer_containerMapEnd1234 = 4 + codecSelfer_containerArrayElem1234 = 6 + codecSelfer_containerArrayEnd1234 = 7 +) + +var ( + codecSelferBitsize1234 = uint8(reflect.TypeOf(uint(0)).Bits()) + codecSelferOnlyMapOrArrayEncodeToStructErr1234 = errors.New(`only encoded map or array can be decoded into a struct`) +) + +type codecSelfer1234 struct{} + +func init() { + if codec1978.GenVersion != 5 { + _, file, _, _ := runtime.Caller(0) + err := fmt.Errorf("codecgen version mismatch: current: %v, need %v. Re-generate file: %v", + 5, codec1978.GenVersion, file) + panic(err) + } + if false { // reference the types, but skip this branch at build/run time + var v0 pkg1_v1.TypeMeta + var v1 pkg2_types.UID + var v2 time.Time + _, _, _ = v0, v1, v2 + } +} + +func (x *PolicyRule) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [5]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[1] = len(x.APIGroups) != 0 + yyq2[2] = len(x.Resources) != 0 + yyq2[3] = len(x.ResourceNames) != 0 + yyq2[4] = len(x.NonResourceURLs) != 0 + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(5) + } else { + yynn2 = 1 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if x.Verbs == nil { + r.EncodeNil() + } else { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + z.F.EncSliceStringV(x.Verbs, false, e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("verbs")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Verbs == nil { + r.EncodeNil() + } else { + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + z.F.EncSliceStringV(x.Verbs, false, e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + if x.APIGroups == nil { + r.EncodeNil() + } else { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + z.F.EncSliceStringV(x.APIGroups, false, e) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("apiGroups")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.APIGroups == nil { + r.EncodeNil() + } else { + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + z.F.EncSliceStringV(x.APIGroups, false, e) + } + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + if x.Resources == nil { + r.EncodeNil() + } else { + yym10 := z.EncBinary() + _ = yym10 + if false { + } else { + z.F.EncSliceStringV(x.Resources, false, e) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("resources")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Resources == nil { + r.EncodeNil() + } else { + yym11 := z.EncBinary() + _ = yym11 + if false { + } else { + z.F.EncSliceStringV(x.Resources, false, e) + } + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[3] { + if x.ResourceNames == nil { + r.EncodeNil() + } else { + yym13 := z.EncBinary() + _ = yym13 + if false { + } else { + z.F.EncSliceStringV(x.ResourceNames, false, e) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[3] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("resourceNames")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.ResourceNames == nil { + r.EncodeNil() + } else { + yym14 := z.EncBinary() + _ = yym14 + if false { + } else { + z.F.EncSliceStringV(x.ResourceNames, false, e) + } + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[4] { + if x.NonResourceURLs == nil { + r.EncodeNil() + } else { + yym16 := z.EncBinary() + _ = yym16 + if false { + } else { + z.F.EncSliceStringV(x.NonResourceURLs, false, e) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[4] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("nonResourceURLs")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.NonResourceURLs == nil { + r.EncodeNil() + } else { + yym17 := z.EncBinary() + _ = yym17 + if false { + } else { + z.F.EncSliceStringV(x.NonResourceURLs, false, e) + } + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *PolicyRule) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *PolicyRule) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "verbs": + if r.TryDecodeAsNil() { + x.Verbs = nil + } else { + yyv4 := &x.Verbs + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + z.F.DecSliceStringX(yyv4, false, d) + } + } + case "apiGroups": + if r.TryDecodeAsNil() { + x.APIGroups = nil + } else { + yyv6 := &x.APIGroups + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + z.F.DecSliceStringX(yyv6, false, d) + } + } + case "resources": + if r.TryDecodeAsNil() { + x.Resources = nil + } else { + yyv8 := &x.Resources + yym9 := z.DecBinary() + _ = yym9 + if false { + } else { + z.F.DecSliceStringX(yyv8, false, d) + } + } + case "resourceNames": + if r.TryDecodeAsNil() { + x.ResourceNames = nil + } else { + yyv10 := &x.ResourceNames + yym11 := z.DecBinary() + _ = yym11 + if false { + } else { + z.F.DecSliceStringX(yyv10, false, d) + } + } + case "nonResourceURLs": + if r.TryDecodeAsNil() { + x.NonResourceURLs = nil + } else { + yyv12 := &x.NonResourceURLs + yym13 := z.DecBinary() + _ = yym13 + if false { + } else { + z.F.DecSliceStringX(yyv12, false, d) + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *PolicyRule) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj14 int + var yyb14 bool + var yyhl14 bool = l >= 0 + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Verbs = nil + } else { + yyv15 := &x.Verbs + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + z.F.DecSliceStringX(yyv15, false, d) + } + } + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.APIGroups = nil + } else { + yyv17 := &x.APIGroups + yym18 := z.DecBinary() + _ = yym18 + if false { + } else { + z.F.DecSliceStringX(yyv17, false, d) + } + } + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Resources = nil + } else { + yyv19 := &x.Resources + yym20 := z.DecBinary() + _ = yym20 + if false { + } else { + z.F.DecSliceStringX(yyv19, false, d) + } + } + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ResourceNames = nil + } else { + yyv21 := &x.ResourceNames + yym22 := z.DecBinary() + _ = yym22 + if false { + } else { + z.F.DecSliceStringX(yyv21, false, d) + } + } + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.NonResourceURLs = nil + } else { + yyv23 := &x.NonResourceURLs + yym24 := z.DecBinary() + _ = yym24 + if false { + } else { + z.F.DecSliceStringX(yyv23, false, d) + } + } + for { + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj14-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x *Subject) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [4]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[1] = x.APIGroup != "" + yyq2[3] = x.Namespace != "" + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(4) + } else { + yynn2 = 2 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("kind")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIGroup)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("apiGroup")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIGroup)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yym10 := z.EncBinary() + _ = yym10 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Name)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("name")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym11 := z.EncBinary() + _ = yym11 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Name)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[3] { + yym13 := z.EncBinary() + _ = yym13 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Namespace)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[3] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("namespace")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym14 := z.EncBinary() + _ = yym14 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Namespace)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *Subject) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *Subject) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "kind": + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv4 := &x.Kind + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "apiGroup": + if r.TryDecodeAsNil() { + x.APIGroup = "" + } else { + yyv6 := &x.APIGroup + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + case "name": + if r.TryDecodeAsNil() { + x.Name = "" + } else { + yyv8 := &x.Name + yym9 := z.DecBinary() + _ = yym9 + if false { + } else { + *((*string)(yyv8)) = r.DecodeString() + } + } + case "namespace": + if r.TryDecodeAsNil() { + x.Namespace = "" + } else { + yyv10 := &x.Namespace + yym11 := z.DecBinary() + _ = yym11 + if false { + } else { + *((*string)(yyv10)) = r.DecodeString() + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *Subject) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj12 int + var yyb12 bool + var yyhl12 bool = l >= 0 + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv13 := &x.Kind + yym14 := z.DecBinary() + _ = yym14 + if false { + } else { + *((*string)(yyv13)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.APIGroup = "" + } else { + yyv15 := &x.APIGroup + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + *((*string)(yyv15)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Name = "" + } else { + yyv17 := &x.Name + yym18 := z.DecBinary() + _ = yym18 + if false { + } else { + *((*string)(yyv17)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Namespace = "" + } else { + yyv19 := &x.Namespace + yym20 := z.DecBinary() + _ = yym20 + if false { + } else { + *((*string)(yyv19)) = r.DecodeString() + } + } + for { + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj12-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x *RoleRef) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [3]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(3) + } else { + yynn2 = 3 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIGroup)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("apiGroup")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIGroup)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("kind")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yym10 := z.EncBinary() + _ = yym10 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Name)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("name")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym11 := z.EncBinary() + _ = yym11 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Name)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *RoleRef) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *RoleRef) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "apiGroup": + if r.TryDecodeAsNil() { + x.APIGroup = "" + } else { + yyv4 := &x.APIGroup + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "kind": + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv6 := &x.Kind + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + case "name": + if r.TryDecodeAsNil() { + x.Name = "" + } else { + yyv8 := &x.Name + yym9 := z.DecBinary() + _ = yym9 + if false { + } else { + *((*string)(yyv8)) = r.DecodeString() + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *RoleRef) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj10 int + var yyb10 bool + var yyhl10 bool = l >= 0 + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.APIGroup = "" + } else { + yyv11 := &x.APIGroup + yym12 := z.DecBinary() + _ = yym12 + if false { + } else { + *((*string)(yyv11)) = r.DecodeString() + } + } + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv13 := &x.Kind + yym14 := z.DecBinary() + _ = yym14 + if false { + } else { + *((*string)(yyv13)) = r.DecodeString() + } + } + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Name = "" + } else { + yyv15 := &x.Name + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + *((*string)(yyv15)) = r.DecodeString() + } + } + for { + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj10-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x *Role) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [4]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[0] = x.Kind != "" + yyq2[1] = x.APIVersion != "" + yyq2[2] = true + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(4) + } else { + yynn2 = 1 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[0] { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("kind")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("apiVersion")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + yy10 := &x.ObjectMeta + yym11 := z.EncBinary() + _ = yym11 + if false { + } else if z.HasExtensions() && z.EncExt(yy10) { + } else { + z.EncFallback(yy10) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("metadata")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yy12 := &x.ObjectMeta + yym13 := z.EncBinary() + _ = yym13 + if false { + } else if z.HasExtensions() && z.EncExt(yy12) { + } else { + z.EncFallback(yy12) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if x.Rules == nil { + r.EncodeNil() + } else { + yym15 := z.EncBinary() + _ = yym15 + if false { + } else { + h.encSlicePolicyRule(([]PolicyRule)(x.Rules), e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("rules")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Rules == nil { + r.EncodeNil() + } else { + yym16 := z.EncBinary() + _ = yym16 + if false { + } else { + h.encSlicePolicyRule(([]PolicyRule)(x.Rules), e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *Role) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *Role) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "kind": + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv4 := &x.Kind + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "apiVersion": + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv6 := &x.APIVersion + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + case "metadata": + if r.TryDecodeAsNil() { + x.ObjectMeta = pkg1_v1.ObjectMeta{} + } else { + yyv8 := &x.ObjectMeta + yym9 := z.DecBinary() + _ = yym9 + if false { + } else if z.HasExtensions() && z.DecExt(yyv8) { + } else { + z.DecFallback(yyv8, false) + } + } + case "rules": + if r.TryDecodeAsNil() { + x.Rules = nil + } else { + yyv10 := &x.Rules + yym11 := z.DecBinary() + _ = yym11 + if false { + } else { + h.decSlicePolicyRule((*[]PolicyRule)(yyv10), d) + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *Role) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj12 int + var yyb12 bool + var yyhl12 bool = l >= 0 + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv13 := &x.Kind + yym14 := z.DecBinary() + _ = yym14 + if false { + } else { + *((*string)(yyv13)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv15 := &x.APIVersion + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + *((*string)(yyv15)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ObjectMeta = pkg1_v1.ObjectMeta{} + } else { + yyv17 := &x.ObjectMeta + yym18 := z.DecBinary() + _ = yym18 + if false { + } else if z.HasExtensions() && z.DecExt(yyv17) { + } else { + z.DecFallback(yyv17, false) + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Rules = nil + } else { + yyv19 := &x.Rules + yym20 := z.DecBinary() + _ = yym20 + if false { + } else { + h.decSlicePolicyRule((*[]PolicyRule)(yyv19), d) + } + } + for { + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj12-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x *RoleBinding) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [5]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[0] = x.Kind != "" + yyq2[1] = x.APIVersion != "" + yyq2[2] = true + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(5) + } else { + yynn2 = 2 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[0] { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("kind")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("apiVersion")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + yy10 := &x.ObjectMeta + yym11 := z.EncBinary() + _ = yym11 + if false { + } else if z.HasExtensions() && z.EncExt(yy10) { + } else { + z.EncFallback(yy10) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("metadata")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yy12 := &x.ObjectMeta + yym13 := z.EncBinary() + _ = yym13 + if false { + } else if z.HasExtensions() && z.EncExt(yy12) { + } else { + z.EncFallback(yy12) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if x.Subjects == nil { + r.EncodeNil() + } else { + yym15 := z.EncBinary() + _ = yym15 + if false { + } else { + h.encSliceSubject(([]Subject)(x.Subjects), e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("subjects")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Subjects == nil { + r.EncodeNil() + } else { + yym16 := z.EncBinary() + _ = yym16 + if false { + } else { + h.encSliceSubject(([]Subject)(x.Subjects), e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yy18 := &x.RoleRef + yy18.CodecEncodeSelf(e) + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("roleRef")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yy20 := &x.RoleRef + yy20.CodecEncodeSelf(e) + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *RoleBinding) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *RoleBinding) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "kind": + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv4 := &x.Kind + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "apiVersion": + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv6 := &x.APIVersion + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + case "metadata": + if r.TryDecodeAsNil() { + x.ObjectMeta = pkg1_v1.ObjectMeta{} + } else { + yyv8 := &x.ObjectMeta + yym9 := z.DecBinary() + _ = yym9 + if false { + } else if z.HasExtensions() && z.DecExt(yyv8) { + } else { + z.DecFallback(yyv8, false) + } + } + case "subjects": + if r.TryDecodeAsNil() { + x.Subjects = nil + } else { + yyv10 := &x.Subjects + yym11 := z.DecBinary() + _ = yym11 + if false { + } else { + h.decSliceSubject((*[]Subject)(yyv10), d) + } + } + case "roleRef": + if r.TryDecodeAsNil() { + x.RoleRef = RoleRef{} + } else { + yyv12 := &x.RoleRef + yyv12.CodecDecodeSelf(d) + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *RoleBinding) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj13 int + var yyb13 bool + var yyhl13 bool = l >= 0 + yyj13++ + if yyhl13 { + yyb13 = yyj13 > l + } else { + yyb13 = r.CheckBreak() + } + if yyb13 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv14 := &x.Kind + yym15 := z.DecBinary() + _ = yym15 + if false { + } else { + *((*string)(yyv14)) = r.DecodeString() + } + } + yyj13++ + if yyhl13 { + yyb13 = yyj13 > l + } else { + yyb13 = r.CheckBreak() + } + if yyb13 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv16 := &x.APIVersion + yym17 := z.DecBinary() + _ = yym17 + if false { + } else { + *((*string)(yyv16)) = r.DecodeString() + } + } + yyj13++ + if yyhl13 { + yyb13 = yyj13 > l + } else { + yyb13 = r.CheckBreak() + } + if yyb13 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ObjectMeta = pkg1_v1.ObjectMeta{} + } else { + yyv18 := &x.ObjectMeta + yym19 := z.DecBinary() + _ = yym19 + if false { + } else if z.HasExtensions() && z.DecExt(yyv18) { + } else { + z.DecFallback(yyv18, false) + } + } + yyj13++ + if yyhl13 { + yyb13 = yyj13 > l + } else { + yyb13 = r.CheckBreak() + } + if yyb13 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Subjects = nil + } else { + yyv20 := &x.Subjects + yym21 := z.DecBinary() + _ = yym21 + if false { + } else { + h.decSliceSubject((*[]Subject)(yyv20), d) + } + } + yyj13++ + if yyhl13 { + yyb13 = yyj13 > l + } else { + yyb13 = r.CheckBreak() + } + if yyb13 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.RoleRef = RoleRef{} + } else { + yyv22 := &x.RoleRef + yyv22.CodecDecodeSelf(d) + } + for { + yyj13++ + if yyhl13 { + yyb13 = yyj13 > l + } else { + yyb13 = r.CheckBreak() + } + if yyb13 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj13-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x *RoleBindingList) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [4]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[0] = x.Kind != "" + yyq2[1] = x.APIVersion != "" + yyq2[2] = true + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(4) + } else { + yynn2 = 1 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[0] { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("kind")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("apiVersion")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + yy10 := &x.ListMeta + yym11 := z.EncBinary() + _ = yym11 + if false { + } else if z.HasExtensions() && z.EncExt(yy10) { + } else { + z.EncFallback(yy10) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("metadata")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yy12 := &x.ListMeta + yym13 := z.EncBinary() + _ = yym13 + if false { + } else if z.HasExtensions() && z.EncExt(yy12) { + } else { + z.EncFallback(yy12) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if x.Items == nil { + r.EncodeNil() + } else { + yym15 := z.EncBinary() + _ = yym15 + if false { + } else { + h.encSliceRoleBinding(([]RoleBinding)(x.Items), e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("items")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Items == nil { + r.EncodeNil() + } else { + yym16 := z.EncBinary() + _ = yym16 + if false { + } else { + h.encSliceRoleBinding(([]RoleBinding)(x.Items), e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *RoleBindingList) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *RoleBindingList) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "kind": + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv4 := &x.Kind + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "apiVersion": + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv6 := &x.APIVersion + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + case "metadata": + if r.TryDecodeAsNil() { + x.ListMeta = pkg1_v1.ListMeta{} + } else { + yyv8 := &x.ListMeta + yym9 := z.DecBinary() + _ = yym9 + if false { + } else if z.HasExtensions() && z.DecExt(yyv8) { + } else { + z.DecFallback(yyv8, false) + } + } + case "items": + if r.TryDecodeAsNil() { + x.Items = nil + } else { + yyv10 := &x.Items + yym11 := z.DecBinary() + _ = yym11 + if false { + } else { + h.decSliceRoleBinding((*[]RoleBinding)(yyv10), d) + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *RoleBindingList) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj12 int + var yyb12 bool + var yyhl12 bool = l >= 0 + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv13 := &x.Kind + yym14 := z.DecBinary() + _ = yym14 + if false { + } else { + *((*string)(yyv13)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv15 := &x.APIVersion + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + *((*string)(yyv15)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ListMeta = pkg1_v1.ListMeta{} + } else { + yyv17 := &x.ListMeta + yym18 := z.DecBinary() + _ = yym18 + if false { + } else if z.HasExtensions() && z.DecExt(yyv17) { + } else { + z.DecFallback(yyv17, false) + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Items = nil + } else { + yyv19 := &x.Items + yym20 := z.DecBinary() + _ = yym20 + if false { + } else { + h.decSliceRoleBinding((*[]RoleBinding)(yyv19), d) + } + } + for { + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj12-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x *RoleList) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [4]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[0] = x.Kind != "" + yyq2[1] = x.APIVersion != "" + yyq2[2] = true + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(4) + } else { + yynn2 = 1 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[0] { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("kind")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("apiVersion")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + yy10 := &x.ListMeta + yym11 := z.EncBinary() + _ = yym11 + if false { + } else if z.HasExtensions() && z.EncExt(yy10) { + } else { + z.EncFallback(yy10) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("metadata")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yy12 := &x.ListMeta + yym13 := z.EncBinary() + _ = yym13 + if false { + } else if z.HasExtensions() && z.EncExt(yy12) { + } else { + z.EncFallback(yy12) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if x.Items == nil { + r.EncodeNil() + } else { + yym15 := z.EncBinary() + _ = yym15 + if false { + } else { + h.encSliceRole(([]Role)(x.Items), e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("items")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Items == nil { + r.EncodeNil() + } else { + yym16 := z.EncBinary() + _ = yym16 + if false { + } else { + h.encSliceRole(([]Role)(x.Items), e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *RoleList) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *RoleList) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "kind": + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv4 := &x.Kind + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "apiVersion": + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv6 := &x.APIVersion + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + case "metadata": + if r.TryDecodeAsNil() { + x.ListMeta = pkg1_v1.ListMeta{} + } else { + yyv8 := &x.ListMeta + yym9 := z.DecBinary() + _ = yym9 + if false { + } else if z.HasExtensions() && z.DecExt(yyv8) { + } else { + z.DecFallback(yyv8, false) + } + } + case "items": + if r.TryDecodeAsNil() { + x.Items = nil + } else { + yyv10 := &x.Items + yym11 := z.DecBinary() + _ = yym11 + if false { + } else { + h.decSliceRole((*[]Role)(yyv10), d) + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *RoleList) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj12 int + var yyb12 bool + var yyhl12 bool = l >= 0 + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv13 := &x.Kind + yym14 := z.DecBinary() + _ = yym14 + if false { + } else { + *((*string)(yyv13)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv15 := &x.APIVersion + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + *((*string)(yyv15)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ListMeta = pkg1_v1.ListMeta{} + } else { + yyv17 := &x.ListMeta + yym18 := z.DecBinary() + _ = yym18 + if false { + } else if z.HasExtensions() && z.DecExt(yyv17) { + } else { + z.DecFallback(yyv17, false) + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Items = nil + } else { + yyv19 := &x.Items + yym20 := z.DecBinary() + _ = yym20 + if false { + } else { + h.decSliceRole((*[]Role)(yyv19), d) + } + } + for { + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj12-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x *ClusterRole) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [4]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[0] = x.Kind != "" + yyq2[1] = x.APIVersion != "" + yyq2[2] = true + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(4) + } else { + yynn2 = 1 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[0] { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("kind")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("apiVersion")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + yy10 := &x.ObjectMeta + yym11 := z.EncBinary() + _ = yym11 + if false { + } else if z.HasExtensions() && z.EncExt(yy10) { + } else { + z.EncFallback(yy10) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("metadata")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yy12 := &x.ObjectMeta + yym13 := z.EncBinary() + _ = yym13 + if false { + } else if z.HasExtensions() && z.EncExt(yy12) { + } else { + z.EncFallback(yy12) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if x.Rules == nil { + r.EncodeNil() + } else { + yym15 := z.EncBinary() + _ = yym15 + if false { + } else { + h.encSlicePolicyRule(([]PolicyRule)(x.Rules), e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("rules")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Rules == nil { + r.EncodeNil() + } else { + yym16 := z.EncBinary() + _ = yym16 + if false { + } else { + h.encSlicePolicyRule(([]PolicyRule)(x.Rules), e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *ClusterRole) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *ClusterRole) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "kind": + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv4 := &x.Kind + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "apiVersion": + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv6 := &x.APIVersion + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + case "metadata": + if r.TryDecodeAsNil() { + x.ObjectMeta = pkg1_v1.ObjectMeta{} + } else { + yyv8 := &x.ObjectMeta + yym9 := z.DecBinary() + _ = yym9 + if false { + } else if z.HasExtensions() && z.DecExt(yyv8) { + } else { + z.DecFallback(yyv8, false) + } + } + case "rules": + if r.TryDecodeAsNil() { + x.Rules = nil + } else { + yyv10 := &x.Rules + yym11 := z.DecBinary() + _ = yym11 + if false { + } else { + h.decSlicePolicyRule((*[]PolicyRule)(yyv10), d) + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *ClusterRole) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj12 int + var yyb12 bool + var yyhl12 bool = l >= 0 + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv13 := &x.Kind + yym14 := z.DecBinary() + _ = yym14 + if false { + } else { + *((*string)(yyv13)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv15 := &x.APIVersion + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + *((*string)(yyv15)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ObjectMeta = pkg1_v1.ObjectMeta{} + } else { + yyv17 := &x.ObjectMeta + yym18 := z.DecBinary() + _ = yym18 + if false { + } else if z.HasExtensions() && z.DecExt(yyv17) { + } else { + z.DecFallback(yyv17, false) + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Rules = nil + } else { + yyv19 := &x.Rules + yym20 := z.DecBinary() + _ = yym20 + if false { + } else { + h.decSlicePolicyRule((*[]PolicyRule)(yyv19), d) + } + } + for { + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj12-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x *ClusterRoleBinding) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [5]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[0] = x.Kind != "" + yyq2[1] = x.APIVersion != "" + yyq2[2] = true + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(5) + } else { + yynn2 = 2 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[0] { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("kind")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("apiVersion")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + yy10 := &x.ObjectMeta + yym11 := z.EncBinary() + _ = yym11 + if false { + } else if z.HasExtensions() && z.EncExt(yy10) { + } else { + z.EncFallback(yy10) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("metadata")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yy12 := &x.ObjectMeta + yym13 := z.EncBinary() + _ = yym13 + if false { + } else if z.HasExtensions() && z.EncExt(yy12) { + } else { + z.EncFallback(yy12) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if x.Subjects == nil { + r.EncodeNil() + } else { + yym15 := z.EncBinary() + _ = yym15 + if false { + } else { + h.encSliceSubject(([]Subject)(x.Subjects), e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("subjects")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Subjects == nil { + r.EncodeNil() + } else { + yym16 := z.EncBinary() + _ = yym16 + if false { + } else { + h.encSliceSubject(([]Subject)(x.Subjects), e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yy18 := &x.RoleRef + yy18.CodecEncodeSelf(e) + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("roleRef")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yy20 := &x.RoleRef + yy20.CodecEncodeSelf(e) + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *ClusterRoleBinding) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *ClusterRoleBinding) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "kind": + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv4 := &x.Kind + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "apiVersion": + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv6 := &x.APIVersion + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + case "metadata": + if r.TryDecodeAsNil() { + x.ObjectMeta = pkg1_v1.ObjectMeta{} + } else { + yyv8 := &x.ObjectMeta + yym9 := z.DecBinary() + _ = yym9 + if false { + } else if z.HasExtensions() && z.DecExt(yyv8) { + } else { + z.DecFallback(yyv8, false) + } + } + case "subjects": + if r.TryDecodeAsNil() { + x.Subjects = nil + } else { + yyv10 := &x.Subjects + yym11 := z.DecBinary() + _ = yym11 + if false { + } else { + h.decSliceSubject((*[]Subject)(yyv10), d) + } + } + case "roleRef": + if r.TryDecodeAsNil() { + x.RoleRef = RoleRef{} + } else { + yyv12 := &x.RoleRef + yyv12.CodecDecodeSelf(d) + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *ClusterRoleBinding) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj13 int + var yyb13 bool + var yyhl13 bool = l >= 0 + yyj13++ + if yyhl13 { + yyb13 = yyj13 > l + } else { + yyb13 = r.CheckBreak() + } + if yyb13 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv14 := &x.Kind + yym15 := z.DecBinary() + _ = yym15 + if false { + } else { + *((*string)(yyv14)) = r.DecodeString() + } + } + yyj13++ + if yyhl13 { + yyb13 = yyj13 > l + } else { + yyb13 = r.CheckBreak() + } + if yyb13 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv16 := &x.APIVersion + yym17 := z.DecBinary() + _ = yym17 + if false { + } else { + *((*string)(yyv16)) = r.DecodeString() + } + } + yyj13++ + if yyhl13 { + yyb13 = yyj13 > l + } else { + yyb13 = r.CheckBreak() + } + if yyb13 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ObjectMeta = pkg1_v1.ObjectMeta{} + } else { + yyv18 := &x.ObjectMeta + yym19 := z.DecBinary() + _ = yym19 + if false { + } else if z.HasExtensions() && z.DecExt(yyv18) { + } else { + z.DecFallback(yyv18, false) + } + } + yyj13++ + if yyhl13 { + yyb13 = yyj13 > l + } else { + yyb13 = r.CheckBreak() + } + if yyb13 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Subjects = nil + } else { + yyv20 := &x.Subjects + yym21 := z.DecBinary() + _ = yym21 + if false { + } else { + h.decSliceSubject((*[]Subject)(yyv20), d) + } + } + yyj13++ + if yyhl13 { + yyb13 = yyj13 > l + } else { + yyb13 = r.CheckBreak() + } + if yyb13 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.RoleRef = RoleRef{} + } else { + yyv22 := &x.RoleRef + yyv22.CodecDecodeSelf(d) + } + for { + yyj13++ + if yyhl13 { + yyb13 = yyj13 > l + } else { + yyb13 = r.CheckBreak() + } + if yyb13 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj13-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x *ClusterRoleBindingList) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [4]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[0] = x.Kind != "" + yyq2[1] = x.APIVersion != "" + yyq2[2] = true + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(4) + } else { + yynn2 = 1 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[0] { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("kind")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("apiVersion")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + yy10 := &x.ListMeta + yym11 := z.EncBinary() + _ = yym11 + if false { + } else if z.HasExtensions() && z.EncExt(yy10) { + } else { + z.EncFallback(yy10) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("metadata")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yy12 := &x.ListMeta + yym13 := z.EncBinary() + _ = yym13 + if false { + } else if z.HasExtensions() && z.EncExt(yy12) { + } else { + z.EncFallback(yy12) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if x.Items == nil { + r.EncodeNil() + } else { + yym15 := z.EncBinary() + _ = yym15 + if false { + } else { + h.encSliceClusterRoleBinding(([]ClusterRoleBinding)(x.Items), e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("items")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Items == nil { + r.EncodeNil() + } else { + yym16 := z.EncBinary() + _ = yym16 + if false { + } else { + h.encSliceClusterRoleBinding(([]ClusterRoleBinding)(x.Items), e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *ClusterRoleBindingList) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *ClusterRoleBindingList) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "kind": + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv4 := &x.Kind + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "apiVersion": + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv6 := &x.APIVersion + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + case "metadata": + if r.TryDecodeAsNil() { + x.ListMeta = pkg1_v1.ListMeta{} + } else { + yyv8 := &x.ListMeta + yym9 := z.DecBinary() + _ = yym9 + if false { + } else if z.HasExtensions() && z.DecExt(yyv8) { + } else { + z.DecFallback(yyv8, false) + } + } + case "items": + if r.TryDecodeAsNil() { + x.Items = nil + } else { + yyv10 := &x.Items + yym11 := z.DecBinary() + _ = yym11 + if false { + } else { + h.decSliceClusterRoleBinding((*[]ClusterRoleBinding)(yyv10), d) + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *ClusterRoleBindingList) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj12 int + var yyb12 bool + var yyhl12 bool = l >= 0 + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv13 := &x.Kind + yym14 := z.DecBinary() + _ = yym14 + if false { + } else { + *((*string)(yyv13)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv15 := &x.APIVersion + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + *((*string)(yyv15)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ListMeta = pkg1_v1.ListMeta{} + } else { + yyv17 := &x.ListMeta + yym18 := z.DecBinary() + _ = yym18 + if false { + } else if z.HasExtensions() && z.DecExt(yyv17) { + } else { + z.DecFallback(yyv17, false) + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Items = nil + } else { + yyv19 := &x.Items + yym20 := z.DecBinary() + _ = yym20 + if false { + } else { + h.decSliceClusterRoleBinding((*[]ClusterRoleBinding)(yyv19), d) + } + } + for { + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj12-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x *ClusterRoleList) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [4]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[0] = x.Kind != "" + yyq2[1] = x.APIVersion != "" + yyq2[2] = true + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(4) + } else { + yynn2 = 1 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[0] { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("kind")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("apiVersion")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + yy10 := &x.ListMeta + yym11 := z.EncBinary() + _ = yym11 + if false { + } else if z.HasExtensions() && z.EncExt(yy10) { + } else { + z.EncFallback(yy10) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("metadata")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yy12 := &x.ListMeta + yym13 := z.EncBinary() + _ = yym13 + if false { + } else if z.HasExtensions() && z.EncExt(yy12) { + } else { + z.EncFallback(yy12) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if x.Items == nil { + r.EncodeNil() + } else { + yym15 := z.EncBinary() + _ = yym15 + if false { + } else { + h.encSliceClusterRole(([]ClusterRole)(x.Items), e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("items")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Items == nil { + r.EncodeNil() + } else { + yym16 := z.EncBinary() + _ = yym16 + if false { + } else { + h.encSliceClusterRole(([]ClusterRole)(x.Items), e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *ClusterRoleList) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *ClusterRoleList) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "kind": + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv4 := &x.Kind + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "apiVersion": + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv6 := &x.APIVersion + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + case "metadata": + if r.TryDecodeAsNil() { + x.ListMeta = pkg1_v1.ListMeta{} + } else { + yyv8 := &x.ListMeta + yym9 := z.DecBinary() + _ = yym9 + if false { + } else if z.HasExtensions() && z.DecExt(yyv8) { + } else { + z.DecFallback(yyv8, false) + } + } + case "items": + if r.TryDecodeAsNil() { + x.Items = nil + } else { + yyv10 := &x.Items + yym11 := z.DecBinary() + _ = yym11 + if false { + } else { + h.decSliceClusterRole((*[]ClusterRole)(yyv10), d) + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *ClusterRoleList) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj12 int + var yyb12 bool + var yyhl12 bool = l >= 0 + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + yyv13 := &x.Kind + yym14 := z.DecBinary() + _ = yym14 + if false { + } else { + *((*string)(yyv13)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + yyv15 := &x.APIVersion + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + *((*string)(yyv15)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ListMeta = pkg1_v1.ListMeta{} + } else { + yyv17 := &x.ListMeta + yym18 := z.DecBinary() + _ = yym18 + if false { + } else if z.HasExtensions() && z.DecExt(yyv17) { + } else { + z.DecFallback(yyv17, false) + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Items = nil + } else { + yyv19 := &x.Items + yym20 := z.DecBinary() + _ = yym20 + if false { + } else { + h.decSliceClusterRole((*[]ClusterRole)(yyv19), d) + } + } + for { + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj12-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x codecSelfer1234) encSlicePolicyRule(v []PolicyRule, e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + r.EncodeArrayStart(len(v)) + for _, yyv1 := range v { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yy2 := &yyv1 + yy2.CodecEncodeSelf(e) + } + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x codecSelfer1234) decSlicePolicyRule(v *[]PolicyRule, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + + yyv1 := *v + yyh1, yyl1 := z.DecSliceHelperStart() + var yyc1 bool + _ = yyc1 + if yyl1 == 0 { + if yyv1 == nil { + yyv1 = []PolicyRule{} + yyc1 = true + } else if len(yyv1) != 0 { + yyv1 = yyv1[:0] + yyc1 = true + } + } else if yyl1 > 0 { + var yyrr1, yyrl1 int + var yyrt1 bool + _, _ = yyrl1, yyrt1 + yyrr1 = yyl1 // len(yyv1) + if yyl1 > cap(yyv1) { + + yyrg1 := len(yyv1) > 0 + yyv21 := yyv1 + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 120) + if yyrt1 { + if yyrl1 <= cap(yyv1) { + yyv1 = yyv1[:yyrl1] + } else { + yyv1 = make([]PolicyRule, yyrl1) + } + } else { + yyv1 = make([]PolicyRule, yyrl1) + } + yyc1 = true + yyrr1 = len(yyv1) + if yyrg1 { + copy(yyv1, yyv21) + } + } else if yyl1 != len(yyv1) { + yyv1 = yyv1[:yyl1] + yyc1 = true + } + yyj1 := 0 + for ; yyj1 < yyrr1; yyj1++ { + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = PolicyRule{} + } else { + yyv2 := &yyv1[yyj1] + yyv2.CodecDecodeSelf(d) + } + + } + if yyrt1 { + for ; yyj1 < yyl1; yyj1++ { + yyv1 = append(yyv1, PolicyRule{}) + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = PolicyRule{} + } else { + yyv3 := &yyv1[yyj1] + yyv3.CodecDecodeSelf(d) + } + + } + } + + } else { + yyj1 := 0 + for ; !r.CheckBreak(); yyj1++ { + + if yyj1 >= len(yyv1) { + yyv1 = append(yyv1, PolicyRule{}) // var yyz1 PolicyRule + yyc1 = true + } + yyh1.ElemContainerState(yyj1) + if yyj1 < len(yyv1) { + if r.TryDecodeAsNil() { + yyv1[yyj1] = PolicyRule{} + } else { + yyv4 := &yyv1[yyj1] + yyv4.CodecDecodeSelf(d) + } + + } else { + z.DecSwallow() + } + + } + if yyj1 < len(yyv1) { + yyv1 = yyv1[:yyj1] + yyc1 = true + } else if yyj1 == 0 && yyv1 == nil { + yyv1 = []PolicyRule{} + yyc1 = true + } + } + yyh1.End() + if yyc1 { + *v = yyv1 + } +} + +func (x codecSelfer1234) encSliceSubject(v []Subject, e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + r.EncodeArrayStart(len(v)) + for _, yyv1 := range v { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yy2 := &yyv1 + yy2.CodecEncodeSelf(e) + } + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x codecSelfer1234) decSliceSubject(v *[]Subject, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + + yyv1 := *v + yyh1, yyl1 := z.DecSliceHelperStart() + var yyc1 bool + _ = yyc1 + if yyl1 == 0 { + if yyv1 == nil { + yyv1 = []Subject{} + yyc1 = true + } else if len(yyv1) != 0 { + yyv1 = yyv1[:0] + yyc1 = true + } + } else if yyl1 > 0 { + var yyrr1, yyrl1 int + var yyrt1 bool + _, _ = yyrl1, yyrt1 + yyrr1 = yyl1 // len(yyv1) + if yyl1 > cap(yyv1) { + + yyrg1 := len(yyv1) > 0 + yyv21 := yyv1 + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 64) + if yyrt1 { + if yyrl1 <= cap(yyv1) { + yyv1 = yyv1[:yyrl1] + } else { + yyv1 = make([]Subject, yyrl1) + } + } else { + yyv1 = make([]Subject, yyrl1) + } + yyc1 = true + yyrr1 = len(yyv1) + if yyrg1 { + copy(yyv1, yyv21) + } + } else if yyl1 != len(yyv1) { + yyv1 = yyv1[:yyl1] + yyc1 = true + } + yyj1 := 0 + for ; yyj1 < yyrr1; yyj1++ { + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = Subject{} + } else { + yyv2 := &yyv1[yyj1] + yyv2.CodecDecodeSelf(d) + } + + } + if yyrt1 { + for ; yyj1 < yyl1; yyj1++ { + yyv1 = append(yyv1, Subject{}) + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = Subject{} + } else { + yyv3 := &yyv1[yyj1] + yyv3.CodecDecodeSelf(d) + } + + } + } + + } else { + yyj1 := 0 + for ; !r.CheckBreak(); yyj1++ { + + if yyj1 >= len(yyv1) { + yyv1 = append(yyv1, Subject{}) // var yyz1 Subject + yyc1 = true + } + yyh1.ElemContainerState(yyj1) + if yyj1 < len(yyv1) { + if r.TryDecodeAsNil() { + yyv1[yyj1] = Subject{} + } else { + yyv4 := &yyv1[yyj1] + yyv4.CodecDecodeSelf(d) + } + + } else { + z.DecSwallow() + } + + } + if yyj1 < len(yyv1) { + yyv1 = yyv1[:yyj1] + yyc1 = true + } else if yyj1 == 0 && yyv1 == nil { + yyv1 = []Subject{} + yyc1 = true + } + } + yyh1.End() + if yyc1 { + *v = yyv1 + } +} + +func (x codecSelfer1234) encSliceRoleBinding(v []RoleBinding, e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + r.EncodeArrayStart(len(v)) + for _, yyv1 := range v { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yy2 := &yyv1 + yy2.CodecEncodeSelf(e) + } + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x codecSelfer1234) decSliceRoleBinding(v *[]RoleBinding, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + + yyv1 := *v + yyh1, yyl1 := z.DecSliceHelperStart() + var yyc1 bool + _ = yyc1 + if yyl1 == 0 { + if yyv1 == nil { + yyv1 = []RoleBinding{} + yyc1 = true + } else if len(yyv1) != 0 { + yyv1 = yyv1[:0] + yyc1 = true + } + } else if yyl1 > 0 { + var yyrr1, yyrl1 int + var yyrt1 bool + _, _ = yyrl1, yyrt1 + yyrr1 = yyl1 // len(yyv1) + if yyl1 > cap(yyv1) { + + yyrg1 := len(yyv1) > 0 + yyv21 := yyv1 + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 336) + if yyrt1 { + if yyrl1 <= cap(yyv1) { + yyv1 = yyv1[:yyrl1] + } else { + yyv1 = make([]RoleBinding, yyrl1) + } + } else { + yyv1 = make([]RoleBinding, yyrl1) + } + yyc1 = true + yyrr1 = len(yyv1) + if yyrg1 { + copy(yyv1, yyv21) + } + } else if yyl1 != len(yyv1) { + yyv1 = yyv1[:yyl1] + yyc1 = true + } + yyj1 := 0 + for ; yyj1 < yyrr1; yyj1++ { + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = RoleBinding{} + } else { + yyv2 := &yyv1[yyj1] + yyv2.CodecDecodeSelf(d) + } + + } + if yyrt1 { + for ; yyj1 < yyl1; yyj1++ { + yyv1 = append(yyv1, RoleBinding{}) + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = RoleBinding{} + } else { + yyv3 := &yyv1[yyj1] + yyv3.CodecDecodeSelf(d) + } + + } + } + + } else { + yyj1 := 0 + for ; !r.CheckBreak(); yyj1++ { + + if yyj1 >= len(yyv1) { + yyv1 = append(yyv1, RoleBinding{}) // var yyz1 RoleBinding + yyc1 = true + } + yyh1.ElemContainerState(yyj1) + if yyj1 < len(yyv1) { + if r.TryDecodeAsNil() { + yyv1[yyj1] = RoleBinding{} + } else { + yyv4 := &yyv1[yyj1] + yyv4.CodecDecodeSelf(d) + } + + } else { + z.DecSwallow() + } + + } + if yyj1 < len(yyv1) { + yyv1 = yyv1[:yyj1] + yyc1 = true + } else if yyj1 == 0 && yyv1 == nil { + yyv1 = []RoleBinding{} + yyc1 = true + } + } + yyh1.End() + if yyc1 { + *v = yyv1 + } +} + +func (x codecSelfer1234) encSliceRole(v []Role, e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + r.EncodeArrayStart(len(v)) + for _, yyv1 := range v { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yy2 := &yyv1 + yy2.CodecEncodeSelf(e) + } + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x codecSelfer1234) decSliceRole(v *[]Role, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + + yyv1 := *v + yyh1, yyl1 := z.DecSliceHelperStart() + var yyc1 bool + _ = yyc1 + if yyl1 == 0 { + if yyv1 == nil { + yyv1 = []Role{} + yyc1 = true + } else if len(yyv1) != 0 { + yyv1 = yyv1[:0] + yyc1 = true + } + } else if yyl1 > 0 { + var yyrr1, yyrl1 int + var yyrt1 bool + _, _ = yyrl1, yyrt1 + yyrr1 = yyl1 // len(yyv1) + if yyl1 > cap(yyv1) { + + yyrg1 := len(yyv1) > 0 + yyv21 := yyv1 + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 288) + if yyrt1 { + if yyrl1 <= cap(yyv1) { + yyv1 = yyv1[:yyrl1] + } else { + yyv1 = make([]Role, yyrl1) + } + } else { + yyv1 = make([]Role, yyrl1) + } + yyc1 = true + yyrr1 = len(yyv1) + if yyrg1 { + copy(yyv1, yyv21) + } + } else if yyl1 != len(yyv1) { + yyv1 = yyv1[:yyl1] + yyc1 = true + } + yyj1 := 0 + for ; yyj1 < yyrr1; yyj1++ { + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = Role{} + } else { + yyv2 := &yyv1[yyj1] + yyv2.CodecDecodeSelf(d) + } + + } + if yyrt1 { + for ; yyj1 < yyl1; yyj1++ { + yyv1 = append(yyv1, Role{}) + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = Role{} + } else { + yyv3 := &yyv1[yyj1] + yyv3.CodecDecodeSelf(d) + } + + } + } + + } else { + yyj1 := 0 + for ; !r.CheckBreak(); yyj1++ { + + if yyj1 >= len(yyv1) { + yyv1 = append(yyv1, Role{}) // var yyz1 Role + yyc1 = true + } + yyh1.ElemContainerState(yyj1) + if yyj1 < len(yyv1) { + if r.TryDecodeAsNil() { + yyv1[yyj1] = Role{} + } else { + yyv4 := &yyv1[yyj1] + yyv4.CodecDecodeSelf(d) + } + + } else { + z.DecSwallow() + } + + } + if yyj1 < len(yyv1) { + yyv1 = yyv1[:yyj1] + yyc1 = true + } else if yyj1 == 0 && yyv1 == nil { + yyv1 = []Role{} + yyc1 = true + } + } + yyh1.End() + if yyc1 { + *v = yyv1 + } +} + +func (x codecSelfer1234) encSliceClusterRoleBinding(v []ClusterRoleBinding, e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + r.EncodeArrayStart(len(v)) + for _, yyv1 := range v { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yy2 := &yyv1 + yy2.CodecEncodeSelf(e) + } + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x codecSelfer1234) decSliceClusterRoleBinding(v *[]ClusterRoleBinding, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + + yyv1 := *v + yyh1, yyl1 := z.DecSliceHelperStart() + var yyc1 bool + _ = yyc1 + if yyl1 == 0 { + if yyv1 == nil { + yyv1 = []ClusterRoleBinding{} + yyc1 = true + } else if len(yyv1) != 0 { + yyv1 = yyv1[:0] + yyc1 = true + } + } else if yyl1 > 0 { + var yyrr1, yyrl1 int + var yyrt1 bool + _, _ = yyrl1, yyrt1 + yyrr1 = yyl1 // len(yyv1) + if yyl1 > cap(yyv1) { + + yyrg1 := len(yyv1) > 0 + yyv21 := yyv1 + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 336) + if yyrt1 { + if yyrl1 <= cap(yyv1) { + yyv1 = yyv1[:yyrl1] + } else { + yyv1 = make([]ClusterRoleBinding, yyrl1) + } + } else { + yyv1 = make([]ClusterRoleBinding, yyrl1) + } + yyc1 = true + yyrr1 = len(yyv1) + if yyrg1 { + copy(yyv1, yyv21) + } + } else if yyl1 != len(yyv1) { + yyv1 = yyv1[:yyl1] + yyc1 = true + } + yyj1 := 0 + for ; yyj1 < yyrr1; yyj1++ { + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = ClusterRoleBinding{} + } else { + yyv2 := &yyv1[yyj1] + yyv2.CodecDecodeSelf(d) + } + + } + if yyrt1 { + for ; yyj1 < yyl1; yyj1++ { + yyv1 = append(yyv1, ClusterRoleBinding{}) + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = ClusterRoleBinding{} + } else { + yyv3 := &yyv1[yyj1] + yyv3.CodecDecodeSelf(d) + } + + } + } + + } else { + yyj1 := 0 + for ; !r.CheckBreak(); yyj1++ { + + if yyj1 >= len(yyv1) { + yyv1 = append(yyv1, ClusterRoleBinding{}) // var yyz1 ClusterRoleBinding + yyc1 = true + } + yyh1.ElemContainerState(yyj1) + if yyj1 < len(yyv1) { + if r.TryDecodeAsNil() { + yyv1[yyj1] = ClusterRoleBinding{} + } else { + yyv4 := &yyv1[yyj1] + yyv4.CodecDecodeSelf(d) + } + + } else { + z.DecSwallow() + } + + } + if yyj1 < len(yyv1) { + yyv1 = yyv1[:yyj1] + yyc1 = true + } else if yyj1 == 0 && yyv1 == nil { + yyv1 = []ClusterRoleBinding{} + yyc1 = true + } + } + yyh1.End() + if yyc1 { + *v = yyv1 + } +} + +func (x codecSelfer1234) encSliceClusterRole(v []ClusterRole, e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + r.EncodeArrayStart(len(v)) + for _, yyv1 := range v { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yy2 := &yyv1 + yy2.CodecEncodeSelf(e) + } + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x codecSelfer1234) decSliceClusterRole(v *[]ClusterRole, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + + yyv1 := *v + yyh1, yyl1 := z.DecSliceHelperStart() + var yyc1 bool + _ = yyc1 + if yyl1 == 0 { + if yyv1 == nil { + yyv1 = []ClusterRole{} + yyc1 = true + } else if len(yyv1) != 0 { + yyv1 = yyv1[:0] + yyc1 = true + } + } else if yyl1 > 0 { + var yyrr1, yyrl1 int + var yyrt1 bool + _, _ = yyrl1, yyrt1 + yyrr1 = yyl1 // len(yyv1) + if yyl1 > cap(yyv1) { + + yyrg1 := len(yyv1) > 0 + yyv21 := yyv1 + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 288) + if yyrt1 { + if yyrl1 <= cap(yyv1) { + yyv1 = yyv1[:yyrl1] + } else { + yyv1 = make([]ClusterRole, yyrl1) + } + } else { + yyv1 = make([]ClusterRole, yyrl1) + } + yyc1 = true + yyrr1 = len(yyv1) + if yyrg1 { + copy(yyv1, yyv21) + } + } else if yyl1 != len(yyv1) { + yyv1 = yyv1[:yyl1] + yyc1 = true + } + yyj1 := 0 + for ; yyj1 < yyrr1; yyj1++ { + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = ClusterRole{} + } else { + yyv2 := &yyv1[yyj1] + yyv2.CodecDecodeSelf(d) + } + + } + if yyrt1 { + for ; yyj1 < yyl1; yyj1++ { + yyv1 = append(yyv1, ClusterRole{}) + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = ClusterRole{} + } else { + yyv3 := &yyv1[yyj1] + yyv3.CodecDecodeSelf(d) + } + + } + } + + } else { + yyj1 := 0 + for ; !r.CheckBreak(); yyj1++ { + + if yyj1 >= len(yyv1) { + yyv1 = append(yyv1, ClusterRole{}) // var yyz1 ClusterRole + yyc1 = true + } + yyh1.ElemContainerState(yyj1) + if yyj1 < len(yyv1) { + if r.TryDecodeAsNil() { + yyv1[yyj1] = ClusterRole{} + } else { + yyv4 := &yyv1[yyj1] + yyv4.CodecDecodeSelf(d) + } + + } else { + z.DecSwallow() + } + + } + if yyj1 < len(yyv1) { + yyv1 = yyv1[:yyj1] + yyc1 = true + } else if yyj1 == 0 && yyv1 == nil { + yyv1 = []ClusterRole{} + yyc1 = true + } + } + yyh1.End() + if yyc1 { + *v = yyv1 + } +} diff --git a/staging/src/k8s.io/api/rbac/v1/types.go b/staging/src/k8s.io/api/rbac/v1/types.go new file mode 100644 index 00000000000..8dbd1a8b89a --- /dev/null +++ b/staging/src/k8s.io/api/rbac/v1/types.go @@ -0,0 +1,219 @@ +/* +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 v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// Authorization is calculated against +// 1. evaluation of ClusterRoleBindings - short circuit on match +// 2. evaluation of RoleBindings in the namespace requested - short circuit on match +// 3. deny by default + +const ( + APIGroupAll = "*" + ResourceAll = "*" + VerbAll = "*" + NonResourceAll = "*" + + GroupKind = "Group" + ServiceAccountKind = "ServiceAccount" + UserKind = "User" + + // AutoUpdateAnnotationKey is the name of an annotation which prevents reconciliation if set to "false" + AutoUpdateAnnotationKey = "rbac.authorization.kubernetes.io/autoupdate" +) + +// Authorization is calculated against +// 1. evaluation of ClusterRoleBindings - short circuit on match +// 2. evaluation of RoleBindings in the namespace requested - short circuit on match +// 3. deny by default + +// PolicyRule holds information that describes a policy rule, but does not contain information +// about who the rule applies to or which namespace the rule applies to. +type PolicyRule struct { + // Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds. + Verbs []string `json:"verbs" protobuf:"bytes,1,rep,name=verbs"` + + // APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of + // the enumerated resources in any API group will be allowed. + // +optional + APIGroups []string `json:"apiGroups,omitempty" protobuf:"bytes,2,rep,name=apiGroups"` + // Resources is a list of resources this rule applies to. ResourceAll represents all resources. + // +optional + Resources []string `json:"resources,omitempty" protobuf:"bytes,3,rep,name=resources"` + // ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. + // +optional + ResourceNames []string `json:"resourceNames,omitempty" protobuf:"bytes,4,rep,name=resourceNames"` + + // NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path + // Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. + // Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both. + // +optional + NonResourceURLs []string `json:"nonResourceURLs,omitempty" protobuf:"bytes,5,rep,name=nonResourceURLs"` +} + +// Subject contains a reference to the object or user identities a role binding applies to. This can either hold a direct API object reference, +// or a value for non-objects such as user and group names. +type Subject struct { + // Kind of object being referenced. Values defined by this API group are "User", "Group", and "ServiceAccount". + // If the Authorizer does not recognized the kind value, the Authorizer should report an error. + Kind string `json:"kind" protobuf:"bytes,1,opt,name=kind"` + // APIGroup holds the API group of the referenced subject. + // Defaults to "" for ServiceAccount subjects. + // Defaults to "rbac.authorization.k8s.io" for User and Group subjects. + // +optional + APIGroup string `json:"apiGroup,omitempty" protobuf:"bytes,2,opt.name=apiGroup"` + // Name of the object being referenced. + Name string `json:"name" protobuf:"bytes,3,opt,name=name"` + // Namespace of the referenced object. If the object kind is non-namespace, such as "User" or "Group", and this value is not empty + // the Authorizer should report an error. + // +optional + Namespace string `json:"namespace,omitempty" protobuf:"bytes,4,opt,name=namespace"` +} + +// RoleRef contains information that points to the role being used +type RoleRef struct { + // APIGroup is the group for the resource being referenced + APIGroup string `json:"apiGroup" protobuf:"bytes,1,opt,name=apiGroup"` + // Kind is the type of resource being referenced + Kind string `json:"kind" protobuf:"bytes,2,opt,name=kind"` + // Name is the name of resource being referenced + Name string `json:"name" protobuf:"bytes,3,opt,name=name"` +} + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Role is a namespaced, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding. +type Role struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Rules holds all the PolicyRules for this Role + Rules []PolicyRule `json:"rules" protobuf:"bytes,2,rep,name=rules"` +} + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// RoleBinding references a role, but does not contain it. It can reference a Role in the same namespace or a ClusterRole in the global namespace. +// It adds who information via Subjects and namespace information by which namespace it exists in. RoleBindings in a given +// namespace only have effect in that namespace. +type RoleBinding struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Subjects holds references to the objects the role applies to. + Subjects []Subject `json:"subjects" protobuf:"bytes,2,rep,name=subjects"` + + // RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. + // If the RoleRef cannot be resolved, the Authorizer must return an error. + RoleRef RoleRef `json:"roleRef" protobuf:"bytes,3,opt,name=roleRef"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// RoleBindingList is a collection of RoleBindings +type RoleBindingList struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Items is a list of RoleBindings + Items []RoleBinding `json:"items" protobuf:"bytes,2,rep,name=items"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// RoleList is a collection of Roles +type RoleList struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Items is a list of Roles + Items []Role `json:"items" protobuf:"bytes,2,rep,name=items"` +} + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ClusterRole is a cluster level, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding or ClusterRoleBinding. +type ClusterRole struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Rules holds all the PolicyRules for this ClusterRole + Rules []PolicyRule `json:"rules" protobuf:"bytes,2,rep,name=rules"` +} + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ClusterRoleBinding references a ClusterRole, but not contain it. It can reference a ClusterRole in the global namespace, +// and adds who information via Subject. +type ClusterRoleBinding struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Subjects holds references to the objects the role applies to. + Subjects []Subject `json:"subjects" protobuf:"bytes,2,rep,name=subjects"` + + // RoleRef can only reference a ClusterRole in the global namespace. + // If the RoleRef cannot be resolved, the Authorizer must return an error. + RoleRef RoleRef `json:"roleRef" protobuf:"bytes,3,opt,name=roleRef"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ClusterRoleBindingList is a collection of ClusterRoleBindings +type ClusterRoleBindingList struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Items is a list of ClusterRoleBindings + Items []ClusterRoleBinding `json:"items" protobuf:"bytes,2,rep,name=items"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ClusterRoleList is a collection of ClusterRoles +type ClusterRoleList struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Items is a list of ClusterRoles + Items []ClusterRole `json:"items" protobuf:"bytes,2,rep,name=items"` +} diff --git a/staging/src/k8s.io/api/rbac/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/rbac/v1/types_swagger_doc_generated.go new file mode 100644 index 00000000000..7770d4085b1 --- /dev/null +++ b/staging/src/k8s.io/api/rbac/v1/types_swagger_doc_generated.go @@ -0,0 +1,148 @@ +/* +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 v1 + +// This file contains a collection of methods that can be used from go-restful to +// generate Swagger API documentation for its models. Please read this PR for more +// information on the implementation: https://github.com/emicklei/go-restful/pull/215 +// +// TODOs are ignored from the parser (e.g. TODO(andronat):... || TODO:...) if and only if +// they are on one line! For multiple line or blocks that you want to ignore use ---. +// Any context after a --- is ignored. +// +// Those methods can be generated by using hack/update-generated-swagger-docs.sh + +// AUTO-GENERATED FUNCTIONS START HERE +var map_ClusterRole = map[string]string{ + "": "ClusterRole is a cluster level, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding or ClusterRoleBinding.", + "metadata": "Standard object's metadata.", + "rules": "Rules holds all the PolicyRules for this ClusterRole", +} + +func (ClusterRole) SwaggerDoc() map[string]string { + return map_ClusterRole +} + +var map_ClusterRoleBinding = map[string]string{ + "": "ClusterRoleBinding references a ClusterRole, but not contain it. It can reference a ClusterRole in the global namespace, and adds who information via Subject.", + "metadata": "Standard object's metadata.", + "subjects": "Subjects holds references to the objects the role applies to.", + "roleRef": "RoleRef can only reference a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error.", +} + +func (ClusterRoleBinding) SwaggerDoc() map[string]string { + return map_ClusterRoleBinding +} + +var map_ClusterRoleBindingList = map[string]string{ + "": "ClusterRoleBindingList is a collection of ClusterRoleBindings", + "metadata": "Standard object's metadata.", + "items": "Items is a list of ClusterRoleBindings", +} + +func (ClusterRoleBindingList) SwaggerDoc() map[string]string { + return map_ClusterRoleBindingList +} + +var map_ClusterRoleList = map[string]string{ + "": "ClusterRoleList is a collection of ClusterRoles", + "metadata": "Standard object's metadata.", + "items": "Items is a list of ClusterRoles", +} + +func (ClusterRoleList) SwaggerDoc() map[string]string { + return map_ClusterRoleList +} + +var map_PolicyRule = map[string]string{ + "": "PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to.", + "verbs": "Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds.", + "apiGroups": "APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed.", + "resources": "Resources is a list of resources this rule applies to. ResourceAll represents all resources.", + "resourceNames": "ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed.", + "nonResourceURLs": "NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as \"pods\" or \"secrets\") or non-resource URL paths (such as \"/api\"), but not both.", +} + +func (PolicyRule) SwaggerDoc() map[string]string { + return map_PolicyRule +} + +var map_Role = map[string]string{ + "": "Role is a namespaced, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding.", + "metadata": "Standard object's metadata.", + "rules": "Rules holds all the PolicyRules for this Role", +} + +func (Role) SwaggerDoc() map[string]string { + return map_Role +} + +var map_RoleBinding = map[string]string{ + "": "RoleBinding references a role, but does not contain it. It can reference a Role in the same namespace or a ClusterRole in the global namespace. It adds who information via Subjects and namespace information by which namespace it exists in. RoleBindings in a given namespace only have effect in that namespace.", + "metadata": "Standard object's metadata.", + "subjects": "Subjects holds references to the objects the role applies to.", + "roleRef": "RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error.", +} + +func (RoleBinding) SwaggerDoc() map[string]string { + return map_RoleBinding +} + +var map_RoleBindingList = map[string]string{ + "": "RoleBindingList is a collection of RoleBindings", + "metadata": "Standard object's metadata.", + "items": "Items is a list of RoleBindings", +} + +func (RoleBindingList) SwaggerDoc() map[string]string { + return map_RoleBindingList +} + +var map_RoleList = map[string]string{ + "": "RoleList is a collection of Roles", + "metadata": "Standard object's metadata.", + "items": "Items is a list of Roles", +} + +func (RoleList) SwaggerDoc() map[string]string { + return map_RoleList +} + +var map_RoleRef = map[string]string{ + "": "RoleRef contains information that points to the role being used", + "apiGroup": "APIGroup is the group for the resource being referenced", + "kind": "Kind is the type of resource being referenced", + "name": "Name is the name of resource being referenced", +} + +func (RoleRef) SwaggerDoc() map[string]string { + return map_RoleRef +} + +var map_Subject = map[string]string{ + "": "Subject contains a reference to the object or user identities a role binding applies to. This can either hold a direct API object reference, or a value for non-objects such as user and group names.", + "kind": "Kind of object being referenced. Values defined by this API group are \"User\", \"Group\", and \"ServiceAccount\". If the Authorizer does not recognized the kind value, the Authorizer should report an error.", + "apiGroup": "APIGroup holds the API group of the referenced subject. Defaults to \"\" for ServiceAccount subjects. Defaults to \"rbac.authorization.k8s.io\" for User and Group subjects.", + "name": "Name of the object being referenced.", + "namespace": "Namespace of the referenced object. If the object kind is non-namespace, such as \"User\" or \"Group\", and this value is not empty the Authorizer should report an error.", +} + +func (Subject) SwaggerDoc() map[string]string { + return map_Subject +} + +// AUTO-GENERATED FUNCTIONS END HERE diff --git a/staging/src/k8s.io/api/rbac/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/rbac/v1/zz_generated.deepcopy.go new file mode 100644 index 00000000000..7ffc81869d2 --- /dev/null +++ b/staging/src/k8s.io/api/rbac/v1/zz_generated.deepcopy.go @@ -0,0 +1,427 @@ +// +build !ignore_autogenerated + +/* +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. +*/ + +// This file was autogenerated by deepcopy-gen. Do not edit it manually! + +package v1 + +import ( + conversion "k8s.io/apimachinery/pkg/conversion" + runtime "k8s.io/apimachinery/pkg/runtime" + reflect "reflect" +) + +func init() { + SchemeBuilder.Register(RegisterDeepCopies) +} + +// RegisterDeepCopies adds deep-copy functions to the given scheme. Public +// to allow building arbitrary schemes. +// +// Deprecated: deepcopy registration will go away when static deepcopy is fully implemented. +func RegisterDeepCopies(scheme *runtime.Scheme) error { + return scheme.AddGeneratedDeepCopyFuncs( + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*ClusterRole).DeepCopyInto(out.(*ClusterRole)) + return nil + }, InType: reflect.TypeOf(&ClusterRole{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*ClusterRoleBinding).DeepCopyInto(out.(*ClusterRoleBinding)) + return nil + }, InType: reflect.TypeOf(&ClusterRoleBinding{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*ClusterRoleBindingList).DeepCopyInto(out.(*ClusterRoleBindingList)) + return nil + }, InType: reflect.TypeOf(&ClusterRoleBindingList{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*ClusterRoleList).DeepCopyInto(out.(*ClusterRoleList)) + return nil + }, InType: reflect.TypeOf(&ClusterRoleList{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*PolicyRule).DeepCopyInto(out.(*PolicyRule)) + return nil + }, InType: reflect.TypeOf(&PolicyRule{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*Role).DeepCopyInto(out.(*Role)) + return nil + }, InType: reflect.TypeOf(&Role{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*RoleBinding).DeepCopyInto(out.(*RoleBinding)) + return nil + }, InType: reflect.TypeOf(&RoleBinding{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*RoleBindingList).DeepCopyInto(out.(*RoleBindingList)) + return nil + }, InType: reflect.TypeOf(&RoleBindingList{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*RoleList).DeepCopyInto(out.(*RoleList)) + return nil + }, InType: reflect.TypeOf(&RoleList{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*RoleRef).DeepCopyInto(out.(*RoleRef)) + return nil + }, InType: reflect.TypeOf(&RoleRef{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*Subject).DeepCopyInto(out.(*Subject)) + return nil + }, InType: reflect.TypeOf(&Subject{})}, + ) +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterRole) DeepCopyInto(out *ClusterRole) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + if in.Rules != nil { + in, out := &in.Rules, &out.Rules + *out = make([]PolicyRule, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterRole. +func (in *ClusterRole) DeepCopy() *ClusterRole { + if in == nil { + return nil + } + out := new(ClusterRole) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ClusterRole) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } else { + return nil + } +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterRoleBinding) DeepCopyInto(out *ClusterRoleBinding) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + if in.Subjects != nil { + in, out := &in.Subjects, &out.Subjects + *out = make([]Subject, len(*in)) + copy(*out, *in) + } + out.RoleRef = in.RoleRef + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterRoleBinding. +func (in *ClusterRoleBinding) DeepCopy() *ClusterRoleBinding { + if in == nil { + return nil + } + out := new(ClusterRoleBinding) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ClusterRoleBinding) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } else { + return nil + } +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterRoleBindingList) DeepCopyInto(out *ClusterRoleBindingList) { + *out = *in + out.TypeMeta = in.TypeMeta + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ClusterRoleBinding, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterRoleBindingList. +func (in *ClusterRoleBindingList) DeepCopy() *ClusterRoleBindingList { + if in == nil { + return nil + } + out := new(ClusterRoleBindingList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ClusterRoleBindingList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } else { + return nil + } +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterRoleList) DeepCopyInto(out *ClusterRoleList) { + *out = *in + out.TypeMeta = in.TypeMeta + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ClusterRole, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterRoleList. +func (in *ClusterRoleList) DeepCopy() *ClusterRoleList { + if in == nil { + return nil + } + out := new(ClusterRoleList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ClusterRoleList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } else { + return nil + } +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PolicyRule) DeepCopyInto(out *PolicyRule) { + *out = *in + if in.Verbs != nil { + in, out := &in.Verbs, &out.Verbs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.APIGroups != nil { + in, out := &in.APIGroups, &out.APIGroups + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Resources != nil { + in, out := &in.Resources, &out.Resources + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ResourceNames != nil { + in, out := &in.ResourceNames, &out.ResourceNames + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.NonResourceURLs != nil { + in, out := &in.NonResourceURLs, &out.NonResourceURLs + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyRule. +func (in *PolicyRule) DeepCopy() *PolicyRule { + if in == nil { + return nil + } + out := new(PolicyRule) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Role) DeepCopyInto(out *Role) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + if in.Rules != nil { + in, out := &in.Rules, &out.Rules + *out = make([]PolicyRule, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Role. +func (in *Role) DeepCopy() *Role { + if in == nil { + return nil + } + out := new(Role) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Role) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } else { + return nil + } +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RoleBinding) DeepCopyInto(out *RoleBinding) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + if in.Subjects != nil { + in, out := &in.Subjects, &out.Subjects + *out = make([]Subject, len(*in)) + copy(*out, *in) + } + out.RoleRef = in.RoleRef + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RoleBinding. +func (in *RoleBinding) DeepCopy() *RoleBinding { + if in == nil { + return nil + } + out := new(RoleBinding) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *RoleBinding) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } else { + return nil + } +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RoleBindingList) DeepCopyInto(out *RoleBindingList) { + *out = *in + out.TypeMeta = in.TypeMeta + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]RoleBinding, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RoleBindingList. +func (in *RoleBindingList) DeepCopy() *RoleBindingList { + if in == nil { + return nil + } + out := new(RoleBindingList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *RoleBindingList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } else { + return nil + } +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RoleList) DeepCopyInto(out *RoleList) { + *out = *in + out.TypeMeta = in.TypeMeta + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Role, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RoleList. +func (in *RoleList) DeepCopy() *RoleList { + if in == nil { + return nil + } + out := new(RoleList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *RoleList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } else { + return nil + } +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RoleRef) DeepCopyInto(out *RoleRef) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RoleRef. +func (in *RoleRef) DeepCopy() *RoleRef { + if in == nil { + return nil + } + out := new(RoleRef) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Subject) DeepCopyInto(out *Subject) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Subject. +func (in *Subject) DeepCopy() *Subject { + if in == nil { + return nil + } + out := new(Subject) + in.DeepCopyInto(out) + return out +} diff --git a/staging/src/k8s.io/api/rbac/v1alpha1/BUILD b/staging/src/k8s.io/api/rbac/v1alpha1/BUILD index 9ca847dc73e..f77e6881be0 100644 --- a/staging/src/k8s.io/api/rbac/v1alpha1/BUILD +++ b/staging/src/k8s.io/api/rbac/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/ugorji/go/codec:go_default_library", @@ -42,3 +39,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/rbac/v1beta1/BUILD b/staging/src/k8s.io/api/rbac/v1beta1/BUILD index 9ca847dc73e..f77e6881be0 100644 --- a/staging/src/k8s.io/api/rbac/v1beta1/BUILD +++ b/staging/src/k8s.io/api/rbac/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/ugorji/go/codec:go_default_library", @@ -42,3 +39,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/scheduling/v1alpha1/BUILD b/staging/src/k8s.io/api/scheduling/v1alpha1/BUILD index 1876dcfa310..6a38064dd24 100644 --- a/staging/src/k8s.io/api/scheduling/v1alpha1/BUILD +++ b/staging/src/k8s.io/api/scheduling/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -39,3 +36,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/settings/v1alpha1/BUILD b/staging/src/k8s.io/api/settings/v1alpha1/BUILD index 6f674112ecf..4c374757b77 100644 --- a/staging/src/k8s.io/api/settings/v1alpha1/BUILD +++ b/staging/src/k8s.io/api/settings/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/ugorji/go/codec:go_default_library", @@ -44,3 +41,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/storage/v1/BUILD b/staging/src/k8s.io/api/storage/v1/BUILD index 33f73ac3c72..2c4953766bb 100644 --- a/staging/src/k8s.io/api/storage/v1/BUILD +++ b/staging/src/k8s.io/api/storage/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", @@ -43,3 +40,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/api/storage/v1beta1/BUILD b/staging/src/k8s.io/api/storage/v1beta1/BUILD index 33f73ac3c72..2c4953766bb 100644 --- a/staging/src/k8s.io/api/storage/v1beta1/BUILD +++ b/staging/src/k8s.io/api/storage/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", @@ -43,3 +40,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/apiextensions-apiserver/BUILD b/staging/src/k8s.io/apiextensions-apiserver/BUILD index b941c9a8250..d7a5b5dd325 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "apiextensions-apiserver", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json b/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json index 7170e656def..d55a95c8eaf 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json +++ b/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json @@ -162,10 +162,6 @@ "ImportPath": "github.com/golang/protobuf/ptypes/timestamp", "Rev": "4bd1920723d7b7c925de087aa32e2187708897f7" }, - { - "ImportPath": "github.com/google/btree", - "Rev": "7d79101e329e5a3adf994758c578dab82b90c017" - }, { "ImportPath": "github.com/google/gofuzz", "Rev": "44d81051d367757e1c7c6a5a86423ece9afcf63c" @@ -182,14 +178,6 @@ "ImportPath": "github.com/googleapis/gnostic/extensions", "Rev": "0c5108395e2debce0d731cf0287ddf7242066aba" }, - { - "ImportPath": "github.com/gregjones/httpcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" - }, - { - "ImportPath": "github.com/gregjones/httpcache/diskcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" - }, { "ImportPath": "github.com/grpc-ecosystem/go-grpc-prometheus", "Rev": "2500245aa6110c562d17020fb31a2c133d737799" @@ -254,10 +242,6 @@ "ImportPath": "github.com/pborman/uuid", "Rev": "ca53cad383cad2479bbba7f7a1a05797ec1386e4" }, - { - "ImportPath": "github.com/peterbourgon/diskv", - "Rev": "5dfcb07a075adbaaa4094cddfd160b1e1c77a043" - }, { "ImportPath": "github.com/pkg/errors", "Rev": "a22138067af1c4942683050411a841ade67fe1eb" diff --git a/staging/src/k8s.io/apiextensions-apiserver/examples/client-go/BUILD b/staging/src/k8s.io/apiextensions-apiserver/examples/client-go/BUILD index ce8614e5707..48552335b40 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/examples/client-go/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/examples/client-go/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/apis/cr/v1:go_default_library", @@ -28,7 +25,6 @@ go_library( go_binary( name = "client-go", library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apiextensions-apiserver/examples/client-go/apis/cr/v1/BUILD b/staging/src/k8s.io/apiextensions-apiserver/examples/client-go/apis/cr/v1/BUILD index 60bd9c857d0..83e0a3210a5 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/examples/client-go/apis/cr/v1/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/examples/client-go/apis/cr/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["roundtrip_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/testing/fuzzer:go_default_library", @@ -32,7 +29,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/examples/client-go/client/BUILD b/staging/src/k8s.io/apiextensions-apiserver/examples/client-go/client/BUILD index 52ecd2bf330..db64d4d5740 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/examples/client-go/client/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/examples/client-go/client/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "client.go", "cr.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/apis/cr/v1:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/examples/client-go/controller/BUILD b/staging/src/k8s.io/apiextensions-apiserver/examples/client-go/controller/BUILD index 0906976a92a..aef3026fb8a 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/examples/client-go/controller/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/examples/client-go/controller/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["controller.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/apis/cr/v1:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/BUILD index 3f55340ed96..64088c8a1b0 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", @@ -30,7 +27,6 @@ go_test( name = "go_default_test", srcs = ["helpers_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], ) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer/BUILD index 7a75920e3c8..8fe1450a9ba 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["fuzzer.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/BUILD index d28724cca65..33c068fd739 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["roundtrip_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip:go_default_library", @@ -22,7 +19,6 @@ go_test( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/BUILD index 11b877b0e86..60b91ad1f23 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", @@ -42,3 +39,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD index d8fe99fb9ee..53c042aeaf6 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/validation:go_default_library", @@ -24,7 +21,6 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD index 87ec28892fe..e14bf33317e 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "customresource_discovery_controller.go", "customresource_handler.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/BUILD index 2c504ae5653..494522755ca 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "clientset.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/BUILD index faf8c136584..5bd8e4be021 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/BUILD index de21ec8af2c..c37ee3f5c0a 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/BUILD index ca2a0ab0839..3cb4e1f6219 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "doc.go", "generated_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/BUILD index 85b3ba28981..d8a05477666 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_apiextensions_client.go", "fake_customresourcedefinition.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/BUILD index 361a160513e..97024ea635d 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "clientset.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/BUILD index 0583e88a7e6..fbcf55239aa 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/BUILD index 1f949dbff05..040a7fcdc48 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/BUILD index fc87fd7a59f..75584d5a391 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "doc.go", "generated_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/BUILD index 447459b3ed7..eae775984af 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_apiextensions_client.go", "fake_customresourcedefinition.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/BUILD index 1e3fde9d303..94f642a2c99 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "factory.go", "generic.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/BUILD index 1fbd021b96e..f8613a82dbf 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/BUILD index 85eecb9c391..69f89a94bfa 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "customresourcedefinition.go", "interface.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/BUILD index 58253221316..3c686edf473 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["factory_interfaces.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/BUILD index c88712e1b3e..3855ac6236b 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "factory.go", "generic.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/BUILD index 1857dab517f..3d8440cb118 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/BUILD index dab7e9d9ba8..ba99018061a 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "customresourcedefinition.go", "interface.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces/BUILD index b0ceecb7214..deda85345e4 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["factory_interfaces.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/BUILD index c83ce4ef61c..f76dfc119db 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "customresourcedefinition.go", "expansion_generated.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/BUILD index 74e8d86e675..9b69d966d55 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "customresourcedefinition.go", "expansion_generated.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/BUILD index b9d59e5a425..b4bbd16bcb5 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,12 +8,12 @@ load( go_library( name = "go_default_library", srcs = ["start.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/spf13/cobra:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/apiserver:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", "//vendor/k8s.io/apiserver/pkg/server:go_default_library", "//vendor/k8s.io/apiserver/pkg/server/options:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/start.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/start.go index a54bcd4c058..38c266e7073 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/start.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/start.go @@ -26,6 +26,7 @@ import ( "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apiextensions-apiserver/pkg/apiserver" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + utilerrors "k8s.io/apimachinery/pkg/util/errors" genericregistry "k8s.io/apiserver/pkg/registry/generic" genericapiserver "k8s.io/apiserver/pkg/server" genericoptions "k8s.io/apiserver/pkg/server/options" @@ -78,7 +79,9 @@ func NewCommandStartCustomResourceDefinitionsServer(out, errOut io.Writer, stopC } func (o CustomResourceDefinitionsServerOptions) Validate(args []string) error { - return nil + errors := []error{} + errors = append(errors, o.RecommendedOptions.Validate()...) + return utilerrors.NewAggregate(errors) } func (o *CustomResourceDefinitionsServerOptions) Complete() error { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD index e2e14cad00a..6bf81ab317c 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["crd_finalizer.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD index 8c543e8f89c..3ca71007cba 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["naming_controller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion:go_default_library", @@ -24,7 +21,6 @@ go_test( go_library( name = "go_default_library", srcs = ["naming_controller.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD index 0484eac7f99..e61b8f824c5 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "etcd.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/validation:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd.go index 138b05932fc..6abd528354b 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd.go @@ -40,8 +40,8 @@ func NewREST(resource schema.GroupResource, listKind schema.GroupVersionKind, co ret.SetGroupVersionKind(listKind) return ret }, - PredicateFunc: strategy.MatchCustomResourceDefinitionStorage, - QualifiedResource: resource, + PredicateFunc: strategy.MatchCustomResourceDefinitionStorage, + DefaultQualifiedResource: resource, CreateStrategy: strategy, UpdateStrategy: strategy, diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD index c0a1a2b053a..ff0bd54d2e0 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "etcd.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/etcd.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/etcd.go index f300dac285d..901406bfef2 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/etcd.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/etcd.go @@ -41,11 +41,11 @@ func NewREST(scheme *runtime.Scheme, optsGetter generic.RESTOptionsGetter) *REST strategy := NewStrategy(scheme) store := &genericregistry.Store{ - Copier: scheme, - NewFunc: func() runtime.Object { return &apiextensions.CustomResourceDefinition{} }, - NewListFunc: func() runtime.Object { return &apiextensions.CustomResourceDefinitionList{} }, - PredicateFunc: MatchCustomResourceDefinition, - QualifiedResource: apiextensions.Resource("customresourcedefinitions"), + Copier: scheme, + NewFunc: func() runtime.Object { return &apiextensions.CustomResourceDefinition{} }, + NewListFunc: func() runtime.Object { return &apiextensions.CustomResourceDefinitionList{} }, + PredicateFunc: MatchCustomResourceDefinition, + DefaultQualifiedResource: apiextensions.Resource("customresourcedefinitions"), CreateStrategy: strategy, UpdateStrategy: strategy, diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/BUILD b/staging/src/k8s.io/apiextensions-apiserver/test/integration/BUILD index 3c0c6c9b5f4..482ab94a39e 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -16,10 +14,7 @@ go_test( "registration_test.go", "validation_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//vendor/github.com/coreos/etcd/clientv3:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/testserver/BUILD b/staging/src/k8s.io/apiextensions-apiserver/test/integration/testserver/BUILD index 0a40f4f0497..484ddb50607 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/testserver/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/testserver/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "resources.go", "start.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/pborman/uuid:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/testserver/resources.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/testserver/resources.go index 2a5583a155b..a0efcb43da7 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/testserver/resources.go +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/testserver/resources.go @@ -35,7 +35,8 @@ import ( //NewRandomNameCustomResourceDefinition generates a CRD with random name to avoid name conflict in e2e tests func NewRandomNameCustomResourceDefinition(scope apiextensionsv1beta1.ResourceScope) *apiextensionsv1beta1.CustomResourceDefinition { - gName := names.SimpleNameGenerator.GenerateName("foo") + // ensure the singular doesn't end in an s for now + gName := names.SimpleNameGenerator.GenerateName("foo") + "a" return &apiextensionsv1beta1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{Name: gName + "s.mygroup.example.com"}, Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{ diff --git a/staging/src/k8s.io/apimachinery/pkg/api/equality/BUILD b/staging/src/k8s.io/apimachinery/pkg/api/equality/BUILD index 7fd917ab658..f4282535715 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/equality/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/api/equality/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["semantic.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/api/equality/semantic.go b/staging/src/k8s.io/apimachinery/pkg/api/equality/semantic.go index 3ebd8c719d0..f02fa8e4340 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/equality/semantic.go +++ b/staging/src/k8s.io/apimachinery/pkg/api/equality/semantic.go @@ -34,6 +34,9 @@ var Semantic = conversion.EqualitiesOrDie( // Uninitialized quantities are equivalent to 0 quantities. return a.Cmp(b) == 0 }, + func(a, b metav1.MicroTime) bool { + return a.UTC() == b.UTC() + }, func(a, b metav1.Time) bool { return a.UTC() == b.UTC() }, diff --git a/staging/src/k8s.io/apimachinery/pkg/api/errors/BUILD b/staging/src/k8s.io/apimachinery/pkg/api/errors/BUILD index a168759a0ea..bae266c4b12 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/errors/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/api/errors/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["errors_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", @@ -27,7 +24,6 @@ go_library( "doc.go", "errors.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/api/meta/BUILD b/staging/src/k8s.io/apimachinery/pkg/api/meta/BUILD index 78927152aa5..00d15de9c5f 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/meta/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/api/meta/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_test( "restmapper_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -43,7 +40,6 @@ go_library( "restmapper.go", "unstructured.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/api/resource/BUILD b/staging/src/k8s.io/apimachinery/pkg/api/resource/BUILD index 22ba0dcb723..840c575e747 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/resource/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/api/resource/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_test( "scale_int_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", @@ -37,7 +34,6 @@ go_library( "scale_int.go", "suffix.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/go-openapi/spec:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", @@ -50,7 +46,6 @@ go_library( go_test( name = "go_default_xtest", srcs = ["quantity_example_test.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library"], ) @@ -66,3 +61,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/apimachinery/pkg/api/testing/BUILD b/staging/src/k8s.io/apimachinery/pkg/api/testing/BUILD index 578a6d8405c..d906482c550 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/testing/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/api/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["codec.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/api/testing/fuzzer/BUILD b/staging/src/k8s.io/apimachinery/pkg/api/testing/fuzzer/BUILD index 4e1a1d66d69..a81c71a7554 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/testing/fuzzer/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/api/testing/fuzzer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["valuefuzz_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -21,7 +18,6 @@ go_library( "fuzzer.go", "valuefuzz.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/api/testing/roundtrip/BUILD b/staging/src/k8s.io/apimachinery/pkg/api/testing/roundtrip/BUILD index a6ff529a09a..927bace7361 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/testing/roundtrip/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/api/testing/roundtrip/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["roundtrip.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/davecgh/go-spew/spew:go_default_library", "//vendor/github.com/golang/protobuf/proto:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/api/validation/BUILD b/staging/src/k8s.io/apimachinery/pkg/api/validation/BUILD index 8f141158371..9de7826bc80 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/validation/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/api/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["objectmeta_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", @@ -26,7 +23,6 @@ go_library( "generic.go", "objectmeta.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/api/validation/path/BUILD b/staging/src/k8s.io/apimachinery/pkg/api/validation/path/BUILD index c635768fe07..1aff05d0513 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/validation/path/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/api/validation/path/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["name_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["name.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apimachinery/pkg/apimachinery/BUILD b/staging/src/k8s.io/apimachinery/pkg/apimachinery/BUILD index e6ca66ae058..fc983842e1b 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apimachinery/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/apimachinery/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["types_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library"], ) @@ -22,7 +19,6 @@ go_library( "doc.go", "types.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/apimachinery/announced/BUILD b/staging/src/k8s.io/apimachinery/pkg/apimachinery/announced/BUILD index 1bf36a27d29..466f86e1fdf 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apimachinery/announced/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/apimachinery/announced/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["announced_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library"], ) @@ -22,7 +19,6 @@ go_library( "announced.go", "group_factory.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/apimachinery/registered/BUILD b/staging/src/k8s.io/apimachinery/pkg/apimachinery/registered/BUILD index 766482bd26f..e4c6856471d 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apimachinery/registered/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/apimachinery/registered/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["registered_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", @@ -22,7 +19,6 @@ go_test( go_library( name = "go_default_library", srcs = ["registered.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/fuzzer/BUILD b/staging/src/k8s.io/apimachinery/pkg/apis/meta/fuzzer/BUILD index 598121b26c3..e91a7cbffc0 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/fuzzer/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/fuzzer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["fuzzer.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion/BUILD b/staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion/BUILD index 32638ce0dd6..20d435f1d9b 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "roundtrip_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer:go_default_library", @@ -33,7 +30,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD index 9bc45be79ce..d2915820d87 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -21,7 +19,6 @@ go_test( "types_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/github.com/ugorji/go/codec:go_default_library", @@ -53,7 +50,6 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/go-openapi/spec:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", @@ -89,3 +85,9 @@ filegroup( ], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go index b9a8fd02d5f..7049c9a33ba 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go @@ -39,6 +39,9 @@ func AddConversionFuncs(scheme *runtime.Scheme) error { Convert_unversioned_Time_To_unversioned_Time, + Convert_Pointer_v1_Duration_To_v1_Duration, + Convert_v1_Duration_To_Pointer_v1_Duration, + Convert_Slice_string_To_unversioned_Time, Convert_resource_Quantity_To_resource_Quantity, @@ -181,6 +184,21 @@ func Convert_unversioned_Time_To_unversioned_Time(in *Time, out *Time, s convers return nil } +func Convert_Pointer_v1_Duration_To_v1_Duration(in **Duration, out *Duration, s conversion.Scope) error { + if *in == nil { + *out = Duration{} // zero duration + return nil + } + *out = **in // copy + return nil +} + +func Convert_v1_Duration_To_Pointer_v1_Duration(in *Duration, out **Duration, s conversion.Scope) error { + temp := *in //copy + *out = &temp + return nil +} + // Convert_Slice_string_To_unversioned_Time allows converting a URL query parameter value func Convert_Slice_string_To_unversioned_Time(input *[]string, out *Time, s conversion.Scope) error { str := "" diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD index f9ef203ab11..0df8cd9c514 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["unstructured_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -21,7 +18,6 @@ go_library( "unstructured.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation/BUILD b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation/BUILD index 1e010ea5bd6..2544ce6e150 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,12 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library"], ) go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/BUILD b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/BUILD index 0988e6cbda5..e981dea096c 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,6 +8,7 @@ load( go_library( name = "go_default_library", srcs = [ + "conversion.go", "deepcopy.go", "doc.go", "generated.pb.go", @@ -19,7 +18,6 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -41,3 +39,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/conversion.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/conversion.go new file mode 100644 index 00000000000..f8ecc7c26cf --- /dev/null +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/conversion.go @@ -0,0 +1,27 @@ +/* +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 v1alpha1 + +import "k8s.io/apimachinery/pkg/conversion" + +// Convert_Slice_string_To_v1alpha1_IncludeObjectPolicy allows converting a URL query parameter value +func Convert_Slice_string_To_v1alpha1_IncludeObjectPolicy(input *[]string, out *IncludeObjectPolicy, s conversion.Scope) error { + if len(*input) > 0 { + *out = IncludeObjectPolicy((*input)[0]) + } + return nil +} diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/register.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/register.go index 89f08f3837e..dab66bf0887 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/register.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/register.go @@ -46,6 +46,12 @@ func init() { &PartialObjectMetadataList{}, ) + if err := scheme.AddConversionFuncs( + Convert_Slice_string_To_v1alpha1_IncludeObjectPolicy, + ); err != nil { + panic(err) + } + // register manually. This usually goes through the SchemeBuilder, which we cannot use here. //scheme.AddGeneratedDeepCopyFuncs(GetGeneratedDeepCopyFuncs()...) } diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/BUILD b/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/BUILD index 4fd1de4f439..33b3235a2e2 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/fuzzer/BUILD b/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/fuzzer/BUILD index 5d42bebd006..e54e95d843c 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/fuzzer/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/fuzzer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["fuzzer.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/testing:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/install/BUILD b/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/install/BUILD index 61beeb81727..c2abc2280bf 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/install/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", @@ -25,7 +22,6 @@ go_test( name = "go_default_test", srcs = ["roundtrip_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/testapigroup/fuzzer:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/v1/BUILD b/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/v1/BUILD index abc6cfd224d..4310cfb2aa8 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/v1/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -22,7 +20,6 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", @@ -48,3 +45,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/apimachinery/pkg/conversion/BUILD b/staging/src/k8s.io/apimachinery/pkg/conversion/BUILD index b9416540efa..eb7f1749660 100644 --- a/staging/src/k8s.io/apimachinery/pkg/conversion/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/conversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "helper_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", @@ -33,7 +30,6 @@ go_library( "doc.go", "helper.go", ], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/third_party/forked/golang/reflect:go_default_library"], ) diff --git a/staging/src/k8s.io/apimachinery/pkg/conversion/queryparams/BUILD b/staging/src/k8s.io/apimachinery/pkg/conversion/queryparams/BUILD index 82afd452f5b..e2beb3e0a10 100644 --- a/staging/src/k8s.io/apimachinery/pkg/conversion/queryparams/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/conversion/queryparams/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,13 +12,11 @@ go_library( "convert.go", "doc.go", ], - tags = ["automanaged"], ) go_test( name = "go_default_xtest", srcs = ["convert_test.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion/queryparams:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/conversion/unstructured/BUILD b/staging/src/k8s.io/apimachinery/pkg/conversion/unstructured/BUILD index 8bd6e789bea..a4de1a6f93e 100644 --- a/staging/src/k8s.io/apimachinery/pkg/conversion/unstructured/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/conversion/unstructured/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["converter_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", @@ -25,7 +22,6 @@ go_library( "converter.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/fields/BUILD b/staging/src/k8s.io/apimachinery/pkg/fields/BUILD index 5ccd2c4efd2..637ecc4bb01 100644 --- a/staging/src/k8s.io/apimachinery/pkg/fields/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/fields/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "selector_test.go", ], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -26,7 +23,6 @@ go_library( "requirements.go", "selector.go", ], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/selection:go_default_library"], ) diff --git a/staging/src/k8s.io/apimachinery/pkg/labels/BUILD b/staging/src/k8s.io/apimachinery/pkg/labels/BUILD index 6c22ad06dbb..f49d05a27d9 100644 --- a/staging/src/k8s.io/apimachinery/pkg/labels/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/labels/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "selector_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/selection:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", @@ -30,7 +27,6 @@ go_library( "selector.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/runtime/BUILD b/staging/src/k8s.io/apimachinery/pkg/runtime/BUILD index 9c33e113dd3..ef9dc9af6f9 100644 --- a/staging/src/k8s.io/apimachinery/pkg/runtime/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/runtime/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["swagger_doc_generator_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -36,7 +33,6 @@ go_library( "types_proto.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", @@ -54,7 +50,6 @@ go_test( "extension_test.go", "scheme_test.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", @@ -85,3 +80,9 @@ filegroup( ], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/apimachinery/pkg/runtime/schema/BUILD b/staging/src/k8s.io/apimachinery/pkg/runtime/schema/BUILD index 3c8593cfff8..07faa4dc5fe 100644 --- a/staging/src/k8s.io/apimachinery/pkg/runtime/schema/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/runtime/schema/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["group_version_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -22,7 +19,6 @@ go_library( "group_version.go", "interfaces.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/gogo/protobuf/proto:go_default_library"], ) @@ -38,3 +34,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/BUILD b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/BUILD index 052826b3fdb..4a0a8f812be 100644 --- a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["codec_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/github.com/google/gofuzz:go_default_library", @@ -33,7 +30,6 @@ go_library( "negotiated_codec.go", "protobuf_extension.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json/BUILD b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json/BUILD index 3d52f055c8d..0dd88529f37 100644 --- a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["meta_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -21,7 +18,6 @@ go_library( "json.go", "meta.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/github.com/ugorji/go/codec:go_default_library", @@ -36,7 +32,6 @@ go_library( go_test( name = "go_default_xtest", srcs = ["json_test.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/BUILD b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/BUILD index 86fa10a73c3..dba23107dc8 100644 --- a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "protobuf.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/BUILD b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/BUILD index 581648e128e..95239b02822 100644 --- a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["recognizer.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/testing/BUILD b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/testing/BUILD index bf2ac6133de..4e126bc8a84 100644 --- a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/testing/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -10,7 +8,6 @@ load( go_test( name = "go_default_test", srcs = ["recognizer_test.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming/BUILD b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming/BUILD index 41b79a95817..f3991e494a7 100644 --- a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["streaming_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", @@ -23,7 +20,6 @@ go_test( go_library( name = "go_default_library", srcs = ["streaming.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/testing/BUILD b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/testing/BUILD index cdc5d1a7d97..a92f1ba027a 100644 --- a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/testing/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning/BUILD b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning/BUILD index 0255c01b92f..f9406b4bce2 100644 --- a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["versioning_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", @@ -23,7 +20,6 @@ go_test( go_library( name = "go_default_library", srcs = ["versioning.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/yaml/BUILD b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/yaml/BUILD index 22483c98be2..7aa51ff4e2d 100644 --- a/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/yaml/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/runtime/serializer/yaml/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["yaml.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/runtime/testing/BUILD b/staging/src/k8s.io/apimachinery/pkg/runtime/testing/BUILD index cdc5d1a7d97..a92f1ba027a 100644 --- a/staging/src/k8s.io/apimachinery/pkg/runtime/testing/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/runtime/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/selection/BUILD b/staging/src/k8s.io/apimachinery/pkg/selection/BUILD index fbedd42bff2..29027a0b9ec 100644 --- a/staging/src/k8s.io/apimachinery/pkg/selection/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/selection/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["operator.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apimachinery/pkg/test/BUILD b/staging/src/k8s.io/apimachinery/pkg/test/BUILD index d0d74adc643..e5de3f43b43 100644 --- a/staging/src/k8s.io/apimachinery/pkg/test/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/test/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_test( "runtime_unversioned_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", @@ -43,7 +40,6 @@ go_library( "util.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/testapigroup:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/types/BUILD b/staging/src/k8s.io/apimachinery/pkg/types/BUILD index 7237a9c9270..63d4f6b15ab 100644 --- a/staging/src/k8s.io/apimachinery/pkg/types/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "patch.go", "uid.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apimachinery/pkg/util/cache/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/cache/BUILD index 9cfd39327b2..ecc2cd93bf7 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/cache/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/cache/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "lruexpirecache_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/groupcache/lru:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", @@ -28,7 +25,6 @@ go_library( "cache.go", "lruexpirecache.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/hashicorp/golang-lru:go_default_library"], ) diff --git a/staging/src/k8s.io/apimachinery/pkg/util/clock/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/clock/BUILD index 816c972f2a1..90d28c49076 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/clock/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/clock/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["clock_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["clock.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apimachinery/pkg/util/diff/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/diff/BUILD index 71abf544b8c..225d0b6f771 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/diff/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/diff/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["diff_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["diff.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/davecgh/go-spew/spew:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/util/errors/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/errors/BUILD index 150bb000725..8859a8e47d1 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/errors/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/errors/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["errors_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -21,7 +18,6 @@ go_library( "doc.go", "errors.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apimachinery/pkg/util/framer/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/framer/BUILD index a1be1de2017..7b682719519 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/framer/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/framer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["framer_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["framer.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apimachinery/pkg/util/httpstream/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/httpstream/BUILD index 57b1e3c43fc..fa913eb774c 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/httpstream/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/httpstream/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["httpstream_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -21,7 +18,6 @@ go_library( "doc.go", "httpstream.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy/BUILD index 644b8db8a64..3d82eb52621 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "upgrade_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/elazarl/goproxy:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", @@ -30,7 +27,6 @@ go_library( "roundtripper.go", "upgrade.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/docker/spdystream:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/util/intstr/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/intstr/BUILD index 729f86888bb..9eece8f8059 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/intstr/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/intstr/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["intstr_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/github.com/ghodss/yaml:go_default_library"], ) @@ -22,7 +19,6 @@ go_library( "generated.pb.go", "intstr.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/go-openapi/spec:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", @@ -44,3 +40,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/apimachinery/pkg/util/json/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/json/BUILD index 9b9a199640d..cc30f70404d 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/json/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/json/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,14 +9,12 @@ load( go_library( name = "go_default_library", srcs = ["json.go"], - tags = ["automanaged"], ) go_test( name = "go_default_test", srcs = ["json_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apimachinery/pkg/util/jsonmergepatch/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/jsonmergepatch/BUILD index 25c73f63026..147c659e59b 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/jsonmergepatch/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/jsonmergepatch/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["patch_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/davecgh/go-spew/spew:go_default_library", "//vendor/github.com/evanphx/json-patch:go_default_library", @@ -24,7 +21,6 @@ go_test( go_library( name = "go_default_library", srcs = ["patch.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/evanphx/json-patch:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/util/mergepatch/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/mergepatch/BUILD index 2e3ebf0c596..775b5b2b62e 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/mergepatch/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/mergepatch/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["util_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -21,7 +18,6 @@ go_library( "errors.go", "util.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/davecgh/go-spew/spew:go_default_library", "//vendor/github.com/ghodss/yaml:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/util/net/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/net/BUILD index b79d5021028..bdd086a61ed 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/net/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/net/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_test( "util_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/github.com/spf13/pflag:go_default_library"], ) @@ -31,7 +28,6 @@ go_library( "port_split.go", "util.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/golang.org/x/net/http2:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/util/net/http.go b/staging/src/k8s.io/apimachinery/pkg/util/net/http.go index adb80813be2..a48f16543c9 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/net/http.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/net/http.go @@ -277,6 +277,13 @@ func NewProxierWithNoProxyCIDR(delegate func(req *http.Request) (*url.URL, error } } +// DialerFunc implements Dialer for the provided function. +type DialerFunc func(req *http.Request) (net.Conn, error) + +func (fn DialerFunc) Dial(req *http.Request) (net.Conn, error) { + return fn(req) +} + // Dialer dials a host and writes a request to it. type Dialer interface { // Dial connects to the host specified by req's URL, writes the request to the connection, and diff --git a/staging/src/k8s.io/apimachinery/pkg/util/proxy/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/proxy/BUILD index fd105a3b69a..ff2aafdbaea 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/proxy/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/proxy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "upgradeaware_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", @@ -35,7 +32,6 @@ go_library( "transport.go", "upgradeaware.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/mxk/go-flowrate/flowrate:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/util/proxy/dial.go b/staging/src/k8s.io/apimachinery/pkg/util/proxy/dial.go index e7373190940..3da7e965f53 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/proxy/dial.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/proxy/dial.go @@ -32,7 +32,10 @@ import ( func DialURL(url *url.URL, transport http.RoundTripper) (net.Conn, error) { dialAddr := netutil.CanonicalAddr(url) - dialer, _ := utilnet.DialerFor(transport) + dialer, err := utilnet.DialerFor(transport) + if err != nil { + glog.V(5).Infof("Unable to unwrap transport %T to get dialer: %v", transport, err) + } switch url.Scheme { case "http": @@ -45,7 +48,10 @@ func DialURL(url *url.URL, transport http.RoundTripper) (net.Conn, error) { var tlsConfig *tls.Config var tlsConn *tls.Conn var err error - tlsConfig, _ = utilnet.TLSClientConfig(transport) + tlsConfig, err = utilnet.TLSClientConfig(transport) + if err != nil { + glog.V(5).Infof("Unable to unwrap transport %T to get at TLS config: %v", transport, err) + } if dialer != nil { // We have a dialer; use it to open the connection, then diff --git a/staging/src/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go b/staging/src/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go index ff04578e29a..d443915d889 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go @@ -39,18 +39,29 @@ import ( // UpgradeAwareHandler is a handler for proxy requests that may require an upgrade type UpgradeAwareHandler struct { + // UpgradeRequired will reject non-upgrade connections if true. UpgradeRequired bool - Location *url.URL + // Location is the location of the upstream proxy. It is used as the location to Dial on the upstream server + // for upgrade requests unless UseRequestLocationOnUpgrade is true. + Location *url.URL // Transport provides an optional round tripper to use to proxy. If nil, the default proxy transport is used Transport http.RoundTripper + // UpgradeTransport, if specified, will be used as the backend transport when upgrade requests are provided. + // This allows clients to disable HTTP/2. + UpgradeTransport http.RoundTripper // WrapTransport indicates whether the provided Transport should be wrapped with default proxy transport behavior (URL rewriting, X-Forwarded-* header setting) WrapTransport bool // InterceptRedirects determines whether the proxy should sniff backend responses for redirects, // following them as necessary. InterceptRedirects bool - FlushInterval time.Duration - MaxBytesPerSec int64 - Responder ErrorResponder + // UseRequestLocation will use the incoming request URL when talking to the backend server. + UseRequestLocation bool + // FlushInterval controls how often the standard HTTP proxy will flush content from the upstream. + FlushInterval time.Duration + // MaxBytesPerSec controls the maximum rate for an upstream connection. No rate is imposed if the value is zero. + MaxBytesPerSec int64 + // Responder is passed errors that occur while setting up proxying. + Responder ErrorResponder } const defaultFlushInterval = 200 * time.Millisecond @@ -58,9 +69,27 @@ const defaultFlushInterval = 200 * time.Millisecond // ErrorResponder abstracts error reporting to the proxy handler to remove the need to hardcode a particular // error format. type ErrorResponder interface { + Error(w http.ResponseWriter, req *http.Request, err error) +} + +// SimpleErrorResponder is the legacy implementation of ErrorResponder for callers that only +// service a single request/response per proxy. +type SimpleErrorResponder interface { Error(err error) } +func NewErrorResponder(r SimpleErrorResponder) ErrorResponder { + return simpleResponder{r} +} + +type simpleResponder struct { + responder SimpleErrorResponder +} + +func (r simpleResponder) Error(w http.ResponseWriter, req *http.Request, err error) { + r.responder.Error(err) +} + // NewUpgradeAwareHandler creates a new proxy handler with a default flush interval. Responder is required for returning // errors to the caller. func NewUpgradeAwareHandler(location *url.URL, transport http.RoundTripper, wrapTransport, upgradeRequired bool, responder ErrorResponder) *UpgradeAwareHandler { @@ -83,7 +112,7 @@ func (h *UpgradeAwareHandler) ServeHTTP(w http.ResponseWriter, req *http.Request return } if h.UpgradeRequired { - h.Responder.Error(errors.NewBadRequest("Upgrade request required")) + h.Responder.Error(w, req, errors.NewBadRequest("Upgrade request required")) return } @@ -117,7 +146,9 @@ func (h *UpgradeAwareHandler) ServeHTTP(w http.ResponseWriter, req *http.Request // WithContext creates a shallow clone of the request with the new context. newReq := req.WithContext(context.Background()) newReq.Header = utilnet.CloneHeader(req.Header) - newReq.URL = &loc + if !h.UseRequestLocation { + newReq.URL = &loc + } proxy := httputil.NewSingleHostReverseProxy(&url.URL{Scheme: h.Location.Scheme, Host: h.Location.Host}) proxy.Transport = h.Transport @@ -128,6 +159,7 @@ func (h *UpgradeAwareHandler) ServeHTTP(w http.ResponseWriter, req *http.Request // tryUpgrade returns true if the request was handled. func (h *UpgradeAwareHandler) tryUpgrade(w http.ResponseWriter, req *http.Request) bool { if !httpstream.IsUpgradeRequest(req) { + glog.V(6).Infof("Request was not an upgrade") return false } @@ -137,18 +169,28 @@ func (h *UpgradeAwareHandler) tryUpgrade(w http.ResponseWriter, req *http.Reques err error ) + location := *h.Location + if h.UseRequestLocation { + location = *req.URL + location.Scheme = h.Location.Scheme + location.Host = h.Location.Host + } + clone := utilnet.CloneRequest(req) // Only append X-Forwarded-For in the upgrade path, since httputil.NewSingleHostReverseProxy // handles this in the non-upgrade path. utilnet.AppendForwardedForHeader(clone) if h.InterceptRedirects { - backendConn, rawResponse, err = utilnet.ConnectWithRedirects(req.Method, h.Location, clone.Header, req.Body, h) + glog.V(6).Infof("Connecting to backend proxy (intercepting redirects) %s\n Headers: %v", &location, clone.Header) + backendConn, rawResponse, err = utilnet.ConnectWithRedirects(req.Method, &location, clone.Header, req.Body, utilnet.DialerFunc(h.DialForUpgrade)) } else { - clone.URL = h.Location - backendConn, err = h.Dial(clone) + glog.V(6).Infof("Connecting to backend proxy (direct dial) %s\n Headers: %v", &location, clone.Header) + clone.URL = &location + backendConn, err = h.DialForUpgrade(clone) } if err != nil { - h.Responder.Error(err) + glog.V(6).Infof("Proxy connection error: %v", err) + h.Responder.Error(w, req, err) return true } defer backendConn.Close() @@ -157,18 +199,21 @@ func (h *UpgradeAwareHandler) tryUpgrade(w http.ResponseWriter, req *http.Reques // hijacking should be the last step in the upgrade. requestHijacker, ok := w.(http.Hijacker) if !ok { - h.Responder.Error(fmt.Errorf("request connection cannot be hijacked: %T", w)) + glog.V(6).Infof("Unable to hijack response writer: %T", w) + h.Responder.Error(w, req, fmt.Errorf("request connection cannot be hijacked: %T", w)) return true } requestHijackedConn, _, err := requestHijacker.Hijack() if err != nil { - h.Responder.Error(fmt.Errorf("error hijacking request connection: %v", err)) + glog.V(6).Infof("Unable to hijack response: %v", err) + h.Responder.Error(w, req, fmt.Errorf("error hijacking connection: %v", err)) return true } defer requestHijackedConn.Close() // Forward raw response bytes back to client. if len(rawResponse) > 0 { + glog.V(6).Infof("Writing %d bytes to hijacked connection", len(rawResponse)) if _, err = requestHijackedConn.Write(rawResponse); err != nil { utilruntime.HandleError(fmt.Errorf("Error proxying response from backend to client: %v", err)) } @@ -210,9 +255,20 @@ func (h *UpgradeAwareHandler) tryUpgrade(w http.ResponseWriter, req *http.Reques return true } -// Dial dials the backend at req.URL and writes req to it. func (h *UpgradeAwareHandler) Dial(req *http.Request) (net.Conn, error) { - conn, err := DialURL(req.URL, h.Transport) + return dial(req, h.Transport) +} + +func (h *UpgradeAwareHandler) DialForUpgrade(req *http.Request) (net.Conn, error) { + if h.UpgradeTransport != nil { + return dial(req, h.UpgradeTransport) + } + return dial(req, h.Transport) +} + +// dial dials the backend at req.URL and writes req to it. +func dial(req *http.Request, transport http.RoundTripper) (net.Conn, error) { + conn, err := DialURL(req.URL, transport) if err != nil { return nil, fmt.Errorf("error dialing backend: %v", err) } diff --git a/staging/src/k8s.io/apimachinery/pkg/util/proxy/upgradeaware_test.go b/staging/src/k8s.io/apimachinery/pkg/util/proxy/upgradeaware_test.go index 3e6f11237d4..985d2208548 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/proxy/upgradeaware_test.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/proxy/upgradeaware_test.go @@ -55,18 +55,14 @@ type fakeResponder struct { w http.ResponseWriter } -func (r *fakeResponder) Error(err error) { +func (r *fakeResponder) Error(w http.ResponseWriter, req *http.Request, err error) { if r.called { r.t.Errorf("Error responder called again!\nprevious error: %v\nnew error: %v", r.err, err) } - if r.w != nil { - r.w.WriteHeader(fakeStatusCode) - _, writeErr := r.w.Write([]byte(err.Error())) - assert.NoError(r.t, writeErr) - } else { - r.t.Logf("No ResponseWriter set") - } + w.WriteHeader(fakeStatusCode) + _, writeErr := w.Write([]byte(err.Error())) + assert.NoError(r.t, writeErr) r.called = true r.err = err @@ -459,7 +455,7 @@ type noErrorsAllowed struct { t *testing.T } -func (r *noErrorsAllowed) Error(err error) { +func (r *noErrorsAllowed) Error(w http.ResponseWriter, req *http.Request, err error) { r.t.Error(err) } diff --git a/staging/src/k8s.io/apimachinery/pkg/util/rand/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/rand/BUILD index a5fdc2503f4..a92d241f9a2 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/rand/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/rand/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["rand_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["rand.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apimachinery/pkg/util/remotecommand/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/remotecommand/BUILD index 2e7136c0ffe..0293e0ddad3 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/remotecommand/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/remotecommand/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["constants.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], ) diff --git a/staging/src/k8s.io/apimachinery/pkg/util/runtime/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/runtime/BUILD index d2dd0a69c63..55109577d9c 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/runtime/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/runtime/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["runtime_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["runtime.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/glog:go_default_library"], ) diff --git a/staging/src/k8s.io/apimachinery/pkg/util/sets/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/sets/BUILD index 2cd9ecfd9e6..831606ed3be 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/sets/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/sets/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load("@io_kubernetes_build//defs:go.bzl", "go_genrule") load( "@io_bazel_rules_go//go:def.bzl", @@ -19,7 +17,6 @@ go_library( "int64.go", "string.go", ], - tags = ["automanaged"], ) go_genrule( @@ -54,7 +51,6 @@ go_test( name = "go_default_test", srcs = ["set_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apimachinery/pkg/util/sets/types/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/sets/types/BUILD index 6109f467f1a..f39b267a2f0 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/sets/types/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/sets/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["types.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/BUILD index 62f16b3ebc6..eebfbf69a75 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["patch_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/davecgh/go-spew/spew:go_default_library", "//vendor/github.com/ghodss/yaml:go_default_library", @@ -25,7 +22,6 @@ go_test( go_library( name = "go_default_library", srcs = ["patch.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/mergepatch:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go b/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go index 828df44351b..8884c738ed9 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go @@ -1138,7 +1138,7 @@ func mergePatchIntoOriginal(original, patch map[string]interface{}, t reflect.Ty return err } case !foundOriginal && !foundPatch: - return nil + continue } // Split all items into patch items and server-only items and then enforce the order. diff --git a/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/patch_test.go b/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/patch_test.go index 507c8cffa17..7f6372db6ad 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/patch_test.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/patch_test.go @@ -5966,6 +5966,75 @@ retainKeysMergingList: retainKeysMergingList: - name: bar - name: foo +`), + }, + }, + { + Description: "delete and reorder in one list, reorder in another", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: +- name: a + value: a +- name: b + value: b +mergeItemPtr: +- name: c + value: c +- name: d + value: d +`), + Current: []byte(` +mergingList: +- name: a + value: a +- name: b + value: b +mergeItemPtr: +- name: c + value: c +- name: d + value: d +`), + Modified: []byte(` +mergingList: +- name: b + value: b +mergeItemPtr: +- name: d + value: d +- name: c + value: c +`), + TwoWay: []byte(` +$setElementOrder/mergingList: +- name: b +$setElementOrder/mergeItemPtr: +- name: d +- name: c +mergingList: +- $patch: delete + name: a +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: +- name: b +$setElementOrder/mergeItemPtr: +- name: d +- name: c +mergingList: +- $patch: delete + name: a +`), + Result: []byte(` +mergingList: +- name: b + value: b +mergeItemPtr: +- name: d + value: d +- name: c + value: c `), }, }, @@ -5993,9 +6062,12 @@ func TestStrategicMergePatch(t *testing.T) { testThreeWayPatch(t, c) } - for _, c := range strategicMergePatchRawTestCases { - testTwoWayPatchForRawTestCase(t, c) - testThreeWayPatchForRawTestCase(t, c) + // run multiple times to exercise different map traversal orders + for i := 0; i < 10; i++ { + for _, c := range strategicMergePatchRawTestCases { + testTwoWayPatchForRawTestCase(t, c) + testThreeWayPatchForRawTestCase(t, c) + } } } diff --git a/staging/src/k8s.io/apimachinery/pkg/util/uuid/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/uuid/BUILD index 6bfc2e41e40..5ee2b075b7d 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/uuid/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/uuid/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["uuid.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/pborman/uuid:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/util/validation/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/validation/BUILD index c8bf5cc88f8..cd174f80082 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/validation/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apimachinery/pkg/util/validation/field/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/validation/field/BUILD index 39e6d7574a3..9138331856d 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/validation/field/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/validation/field/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "path_test.go", ], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -24,7 +21,6 @@ go_library( "errors.go", "path.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/util/validation/validation.go b/staging/src/k8s.io/apimachinery/pkg/util/validation/validation.go index b1fcc570812..1159a02573c 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/validation/validation.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/validation/validation.go @@ -126,7 +126,7 @@ func IsDNS1123Subdomain(value string) []string { } const dns1035LabelFmt string = "[a-z]([-a-z0-9]*[a-z0-9])?" -const dns1035LabelErrMsg string = "a DNS-1035 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character" +const dns1035LabelErrMsg string = "a DNS-1035 label must consist of lower case alphanumeric characters or '-', start with an alphabetic character, and end with an alphanumeric character" const DNS1035LabelMaxLength int = 63 var dns1035LabelRegexp = regexp.MustCompile("^" + dns1035LabelFmt + "$") @@ -277,6 +277,22 @@ func IsHTTPHeaderName(value string) []string { return nil } +const envVarNameFmt = "[-._a-zA-Z][-._a-zA-Z0-9]*" +const envVarNameFmtErrMsg string = "a valid environment variable name must consist of alphabetic characters, digits, '_', '-', or '.', and must not start with a digit" + +var envVarNameRegexp = regexp.MustCompile("^" + envVarNameFmt + "$") + +// IsEnvVarName tests if a string is a valid environment variable name. +func IsEnvVarName(value string) []string { + var errs []string + if !envVarNameRegexp.MatchString(value) { + errs = append(errs, RegexError(envVarNameFmtErrMsg, envVarNameFmt, "my.env-name", "MY_ENV.NAME", "MyEnvName1")) + } + + errs = append(errs, hasChDirPrefix(value)...) + return errs +} + const configMapKeyFmt = `[-._a-zA-Z0-9]+` const configMapKeyErrMsg string = "a valid config key must consist of alphanumeric characters, '-', '_' or '.'" @@ -291,13 +307,7 @@ func IsConfigMapKey(value string) []string { if !configMapKeyRegexp.MatchString(value) { errs = append(errs, RegexError(configMapKeyErrMsg, configMapKeyFmt, "key.name", "KEY_NAME", "key-name")) } - if value == "." { - errs = append(errs, `must not be '.'`) - } else if value == ".." { - errs = append(errs, `must not be '..'`) - } else if strings.HasPrefix(value, "..") { - errs = append(errs, `must not start with '..'`) - } + errs = append(errs, hasChDirPrefix(value)...) return errs } @@ -341,3 +351,16 @@ func prefixEach(msgs []string, prefix string) []string { func InclusiveRangeError(lo, hi int) string { return fmt.Sprintf(`must be between %d and %d, inclusive`, lo, hi) } + +func hasChDirPrefix(value string) []string { + var errs []string + switch { + case value == ".": + errs = append(errs, `must not be '.'`) + case value == "..": + errs = append(errs, `must not be '..'`) + case strings.HasPrefix(value, ".."): + errs = append(errs, `must not start with '..'`) + } + return errs +} diff --git a/staging/src/k8s.io/apimachinery/pkg/util/wait/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/wait/BUILD index f331310b7fe..dfbfb2a7c07 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/wait/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/wait/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["wait_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library"], ) @@ -22,7 +19,6 @@ go_library( "doc.go", "wait.go", ], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library"], ) diff --git a/staging/src/k8s.io/apimachinery/pkg/util/yaml/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/yaml/BUILD index 565cb8b52b1..433c3eacb6b 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/yaml/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/yaml/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["decoder_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["decoder.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/pkg/version/BUILD b/staging/src/k8s.io/apimachinery/pkg/version/BUILD index 11930993514..8a548064ae1 100644 --- a/staging/src/k8s.io/apimachinery/pkg/version/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/version/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "types.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apimachinery/pkg/watch/BUILD b/staging/src/k8s.io/apimachinery/pkg/watch/BUILD index 689b90d48e6..6285679f366 100644 --- a/staging/src/k8s.io/apimachinery/pkg/watch/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/watch/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "watch.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", @@ -39,7 +36,6 @@ go_test( "streamwatcher_test.go", "watch_test.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", @@ -52,7 +48,6 @@ go_test( name = "go_default_test", srcs = ["until_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/apimachinery/third_party/forked/golang/json/BUILD b/staging/src/k8s.io/apimachinery/third_party/forked/golang/json/BUILD index 8ecee4c4764..cf64e1f539a 100644 --- a/staging/src/k8s.io/apimachinery/third_party/forked/golang/json/BUILD +++ b/staging/src/k8s.io/apimachinery/third_party/forked/golang/json/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["fields.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apimachinery/third_party/forked/golang/netutil/BUILD b/staging/src/k8s.io/apimachinery/third_party/forked/golang/netutil/BUILD index 484ab572d3b..b48ba03127e 100644 --- a/staging/src/k8s.io/apimachinery/third_party/forked/golang/netutil/BUILD +++ b/staging/src/k8s.io/apimachinery/third_party/forked/golang/netutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["addr.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apimachinery/third_party/forked/golang/reflect/BUILD b/staging/src/k8s.io/apimachinery/third_party/forked/golang/reflect/BUILD index fdd0f894abd..b5f3d74658b 100644 --- a/staging/src/k8s.io/apimachinery/third_party/forked/golang/reflect/BUILD +++ b/staging/src/k8s.io/apimachinery/third_party/forked/golang/reflect/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["deep_equal_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["deep_equal.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apiserver/Godeps/Godeps.json b/staging/src/k8s.io/apiserver/Godeps/Godeps.json index f4579bc859e..a526d8d83dc 100644 --- a/staging/src/k8s.io/apiserver/Godeps/Godeps.json +++ b/staging/src/k8s.io/apiserver/Godeps/Godeps.json @@ -430,14 +430,6 @@ "ImportPath": "github.com/gophercloud/gophercloud/pagination", "Rev": "ed590d9afe113c6107cd60717b196155e6579e78" }, - { - "ImportPath": "github.com/gregjones/httpcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" - }, - { - "ImportPath": "github.com/gregjones/httpcache/diskcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" - }, { "ImportPath": "github.com/grpc-ecosystem/go-grpc-prometheus", "Rev": "2500245aa6110c562d17020fb31a2c133d737799" @@ -506,10 +498,6 @@ "ImportPath": "github.com/pborman/uuid", "Rev": "ca53cad383cad2479bbba7f7a1a05797ec1386e4" }, - { - "ImportPath": "github.com/peterbourgon/diskv", - "Rev": "5dfcb07a075adbaaa4094cddfd160b1e1c77a043" - }, { "ImportPath": "github.com/pkg/errors", "Rev": "a22138067af1c4942683050411a841ade67fe1eb" diff --git a/staging/src/k8s.io/apiserver/pkg/admission/BUILD b/staging/src/k8s.io/apiserver/pkg/admission/BUILD index 08dbf2f2723..8c380dd8892 100644 --- a/staging/src/k8s.io/apiserver/pkg/admission/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/admission/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "errors_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", @@ -35,7 +32,6 @@ go_library( "interfaces.go", "plugins.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/admission/initializer/BUILD b/staging/src/k8s.io/apiserver/pkg/admission/initializer/BUILD index 6f6e250f30d..2755ab09016 100644 --- a/staging/src/k8s.io/apiserver/pkg/admission/initializer/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/admission/initializer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "initializer.go", "interfaces.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", "//vendor/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", @@ -26,7 +23,6 @@ go_library( go_test( name = "go_default_xtest", srcs = ["initializer_test.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", "//vendor/k8s.io/apiserver/pkg/admission/initializer:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle/BUILD b/staging/src/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle/BUILD index 9ee41505667..96d15ce0833 100644 --- a/staging/src/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["admission.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -33,7 +30,6 @@ go_test( name = "go_default_test", srcs = ["admission_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/apis/apiserver/BUILD b/staging/src/k8s.io/apiserver/pkg/apis/apiserver/BUILD index 22a5bf72f02..d8709cb0f48 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/apiserver/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/apis/apiserver/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/apis/apiserver/install/BUILD b/staging/src/k8s.io/apiserver/pkg/apis/apiserver/install/BUILD index e17db8d48b7..b5236bef995 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/apiserver/install/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/apis/apiserver/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/BUILD b/staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/BUILD index b9b770fa563..a4d1b765943 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/apis/audit/BUILD b/staging/src/k8s.io/apiserver/pkg/apis/audit/BUILD index b2b1c995647..085a82ce5d5 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/audit/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/apis/audit/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/apis/audit/install/BUILD b/staging/src/k8s.io/apiserver/pkg/apis/audit/install/BUILD index 15cafb4ffc7..8f1d8076406 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/audit/install/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/apis/audit/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/apis/audit/types.go b/staging/src/k8s.io/apiserver/pkg/apis/audit/types.go index 0cb2069259a..cfea0550661 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/audit/types.go +++ b/staging/src/k8s.io/apiserver/pkg/apis/audit/types.go @@ -27,6 +27,13 @@ const ( // Header to hold the audit ID as the request is propagated through the serving hierarchy. The // Audit-ID header should be set by the first server to receive the request (e.g. the federation // server or kube-aggregator). + // + // Audit ID is also returned to client by http response header. + // It's not guaranteed Audit-Id http header is sent for all requests. When kube-apiserver didn't + // audit the events according to the audit policy, no Audit-ID is returned. Also, for request to + // pods/exec, pods/attach, pods/proxy, kube-apiserver works like a proxy and redirect the request + // to kubelet node, users will only get http headers sent from kubelet node, so no Audit-ID is + // sent when users run command like "kubectl exec" or "kubectl attach". HeaderAuditID = "Audit-ID" ) diff --git a/staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/BUILD b/staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/BUILD index 2991463db63..c9334d54184 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/ugorji/go/codec:go_default_library", @@ -45,3 +42,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/types.go b/staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/types.go index d64f6a8d49c..e2022656828 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/types.go +++ b/staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/types.go @@ -28,6 +28,13 @@ const ( // Header to hold the audit ID as the request is propagated through the serving hierarchy. The // Audit-ID header should be set by the first server to receive the request (e.g. the federation // server or kube-aggregator). + // + // Audit ID is also returned to client by http response header. + // It's not guaranteed Audit-Id http header is sent for all requests. When kube-apiserver didn't + // audit the events according to the audit policy, no Audit-ID is returned. Also, for request to + // pods/exec, pods/attach, pods/proxy, kube-apiserver works like a proxy and redirect the request + // to kubelet node, users will only get http headers sent from kubelet node, so no Audit-ID is + // sent when users run command like "kubectl exec" or "kubectl attach". HeaderAuditID = "Audit-ID" ) diff --git a/staging/src/k8s.io/apiserver/pkg/apis/audit/validation/BUILD b/staging/src/k8s.io/apiserver/pkg/apis/audit/validation/BUILD index 28e71c6ae11..38ab70d076c 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/audit/validation/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/apis/audit/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,12 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/apis/audit:go_default_library"], ) go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/apis/example/BUILD b/staging/src/k8s.io/apiserver/pkg/apis/example/BUILD index 21612137a08..e5b7b24b2df 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/example/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/apis/example/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/apis/example/fuzzer/BUILD b/staging/src/k8s.io/apiserver/pkg/apis/example/fuzzer/BUILD index 6c085202bc6..650230c7252 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/example/fuzzer/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/apis/example/fuzzer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["fuzzer.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/testing:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/apis/example/install/BUILD b/staging/src/k8s.io/apiserver/pkg/apis/example/install/BUILD index c919257e6aa..8a939e03e7d 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/example/install/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/apis/example/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", @@ -25,7 +22,6 @@ go_test( name = "go_default_test", srcs = ["roundtrip_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip:go_default_library", "//vendor/k8s.io/apiserver/pkg/apis/example/fuzzer:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/apis/example/v1/BUILD b/staging/src/k8s.io/apiserver/pkg/apis/example/v1/BUILD index 5797464f26c..4bcc5d5ae1a 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/example/v1/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/apis/example/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -22,7 +20,6 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", @@ -48,3 +45,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/apiserver/pkg/audit/BUILD b/staging/src/k8s.io/apiserver/pkg/audit/BUILD index 3c37acf74fa..9229b141bba 100644 --- a/staging/src/k8s.io/apiserver/pkg/audit/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/audit/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types.go", "union.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/pborman/uuid:go_default_library", @@ -41,7 +38,6 @@ go_test( name = "go_default_test", srcs = ["union_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apiserver/pkg/apis/audit:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/audit/policy/BUILD b/staging/src/k8s.io/apiserver/pkg/audit/policy/BUILD index 2c491504341..949a10af20c 100644 --- a/staging/src/k8s.io/apiserver/pkg/audit/policy/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/audit/policy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "reader_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", @@ -32,7 +29,6 @@ go_library( "checker.go", "reader.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/authenticator/BUILD b/staging/src/k8s.io/apiserver/pkg/authentication/authenticator/BUILD index bc46520f56b..e49523f2998 100644 --- a/staging/src/k8s.io/apiserver/pkg/authentication/authenticator/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/authentication/authenticator/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interfaces.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library"], ) diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/authenticatorfactory/BUILD b/staging/src/k8s.io/apiserver/pkg/authentication/authenticatorfactory/BUILD index 74d2671320c..19084bed46a 100644 --- a/staging/src/k8s.io/apiserver/pkg/authentication/authenticatorfactory/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/authentication/authenticatorfactory/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "loopback.go", "requestheader.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/go-openapi/spec:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/group/BUILD b/staging/src/k8s.io/apiserver/pkg/authentication/group/BUILD index d2485a55df7..bfe3ebdf46c 100644 --- a/staging/src/k8s.io/apiserver/pkg/authentication/group/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/authentication/group/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,9 +8,11 @@ load( go_test( name = "go_default_test", - srcs = ["group_adder_test.go"], + srcs = [ + "group_adder_test.go", + "token_group_adder_test.go", + ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", @@ -24,8 +24,8 @@ go_library( srcs = [ "authenticated_group_adder.go", "group_adder.go", + "token_group_adder.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/group/token_group_adder.go b/staging/src/k8s.io/apiserver/pkg/authentication/group/token_group_adder.go new file mode 100644 index 00000000000..4f60d522f76 --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/authentication/group/token_group_adder.go @@ -0,0 +1,48 @@ +/* +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 group + +import ( + "k8s.io/apiserver/pkg/authentication/authenticator" + "k8s.io/apiserver/pkg/authentication/user" +) + +// TokenGroupAdder adds groups to an authenticated user.Info +type TokenGroupAdder struct { + // Authenticator is delegated to make the authentication decision + Authenticator authenticator.Token + // Groups are additional groups to add to the user.Info from a successful authentication + Groups []string +} + +// NewTokenGroupAdder wraps a token authenticator, and adds the specified groups to the returned user when authentication succeeds +func NewTokenGroupAdder(auth authenticator.Token, groups []string) authenticator.Token { + return &TokenGroupAdder{auth, groups} +} + +func (g *TokenGroupAdder) AuthenticateToken(token string) (user.Info, bool, error) { + u, ok, err := g.Authenticator.AuthenticateToken(token) + if err != nil || !ok { + return nil, ok, err + } + return &user.DefaultInfo{ + Name: u.GetName(), + UID: u.GetUID(), + Groups: append(u.GetGroups(), g.Groups...), + Extra: u.GetExtra(), + }, true, nil +} diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/group/token_group_adder_test.go b/staging/src/k8s.io/apiserver/pkg/authentication/group/token_group_adder_test.go new file mode 100644 index 00000000000..cb5a0a65efe --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/authentication/group/token_group_adder_test.go @@ -0,0 +1,41 @@ +/* +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 group + +import ( + "reflect" + "testing" + + "k8s.io/apiserver/pkg/authentication/authenticator" + "k8s.io/apiserver/pkg/authentication/user" +) + +func TestTokenGroupAdder(t *testing.T) { + adder := authenticator.Token( + NewTokenGroupAdder( + authenticator.TokenFunc(func(token string) (user.Info, bool, error) { + return &user.DefaultInfo{Name: "user", Groups: []string{"original"}}, true, nil + }), + []string{"added"}, + ), + ) + + user, _, _ := adder.AuthenticateToken("") + if !reflect.DeepEqual(user.GetGroups(), []string{"original", "added"}) { + t.Errorf("Expected original,added groups, got %#v", user.GetGroups()) + } +} diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/request/anonymous/BUILD b/staging/src/k8s.io/apiserver/pkg/authentication/request/anonymous/BUILD index 51b222b6cf6..e0538757bc7 100644 --- a/staging/src/k8s.io/apiserver/pkg/authentication/request/anonymous/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/authentication/request/anonymous/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["anonymous_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", @@ -23,7 +20,6 @@ go_test( go_library( name = "go_default_library", srcs = ["anonymous.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/request/bearertoken/BUILD b/staging/src/k8s.io/apiserver/pkg/authentication/request/bearertoken/BUILD index 74041ead10f..37a5d33443d 100644 --- a/staging/src/k8s.io/apiserver/pkg/authentication/request/bearertoken/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/authentication/request/bearertoken/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["bearertoken_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", @@ -22,7 +19,6 @@ go_test( go_library( name = "go_default_library", srcs = ["bearertoken.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/request/headerrequest/BUILD b/staging/src/k8s.io/apiserver/pkg/authentication/request/headerrequest/BUILD index c176c64f59c..93a0164bf86 100644 --- a/staging/src/k8s.io/apiserver/pkg/authentication/request/headerrequest/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/authentication/request/headerrequest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,12 @@ go_test( name = "go_default_test", srcs = ["requestheader_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library"], ) go_library( name = "go_default_library", srcs = ["requestheader.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/request/union/BUILD b/staging/src/k8s.io/apiserver/pkg/authentication/request/union/BUILD index 7a6b23db96b..c3c0131e7e8 100644 --- a/staging/src/k8s.io/apiserver/pkg/authentication/request/union/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/authentication/request/union/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,12 @@ go_test( name = "go_default_test", srcs = ["unionauth_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library"], ) go_library( name = "go_default_library", srcs = ["union.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/request/websocket/BUILD b/staging/src/k8s.io/apiserver/pkg/authentication/request/websocket/BUILD index 64c74135a55..ccb9d742463 100644 --- a/staging/src/k8s.io/apiserver/pkg/authentication/request/websocket/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/authentication/request/websocket/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["protocol.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", @@ -23,7 +20,6 @@ go_test( name = "go_default_test", srcs = ["protocol_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/request/x509/BUILD b/staging/src/k8s.io/apiserver/pkg/authentication/request/x509/BUILD index 269620ca105..3f8a0d91c65 100644 --- a/staging/src/k8s.io/apiserver/pkg/authentication/request/x509/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/authentication/request/x509/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_test( "testdata/root.pem", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", @@ -32,7 +29,6 @@ go_library( "doc.go", "x509.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount/BUILD b/staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount/BUILD index 81a048f2a9f..9f63af9e36a 100644 --- a/staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["util_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/api/validation:go_default_library"], ) diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/BUILD b/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/BUILD new file mode 100644 index 00000000000..3384859f723 --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/BUILD @@ -0,0 +1,54 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = [ + "cache_test.go", + "cached_token_authenticator_test.go", + ], + library = ":go_default_library", + tags = ["automanaged"], + deps = [ + "//vendor/github.com/pborman/uuid:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", + "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", + ], +) + +go_library( + name = "go_default_library", + srcs = [ + "cache_simple.go", + "cache_striped.go", + "cached_token_authenticator.go", + ], + tags = ["automanaged"], + deps = [ + "//vendor/k8s.io/apimachinery/pkg/util/cache:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", + "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/cache_simple.go b/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/cache_simple.go new file mode 100644 index 00000000000..18d5692d7a7 --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/cache_simple.go @@ -0,0 +1,49 @@ +/* +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 cache + +import ( + "time" + + lrucache "k8s.io/apimachinery/pkg/util/cache" + "k8s.io/apimachinery/pkg/util/clock" +) + +type simpleCache struct { + lru *lrucache.LRUExpireCache +} + +func newSimpleCache(size int, clock clock.Clock) cache { + return &simpleCache{lru: lrucache.NewLRUExpireCacheWithClock(size, clock)} +} + +func (c *simpleCache) get(key string) (*cacheRecord, bool) { + record, ok := c.lru.Get(key) + if !ok { + return nil, false + } + value, ok := record.(*cacheRecord) + return value, ok +} + +func (c *simpleCache) set(key string, value *cacheRecord, ttl time.Duration) { + c.lru.Add(key, value, ttl) +} + +func (c *simpleCache) remove(key string) { + c.lru.Remove(key) +} diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/cache_striped.go b/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/cache_striped.go new file mode 100644 index 00000000000..b791260fc24 --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/cache_striped.go @@ -0,0 +1,60 @@ +/* +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 cache + +import ( + "hash/fnv" + "time" +) + +// split cache lookups across N striped caches +type stripedCache struct { + stripeCount uint32 + keyFunc func(string) uint32 + caches []cache +} + +type keyFunc func(string) uint32 +type newCacheFunc func() cache + +func newStripedCache(stripeCount int, keyFunc keyFunc, newCacheFunc newCacheFunc) cache { + caches := []cache{} + for i := 0; i < stripeCount; i++ { + caches = append(caches, newCacheFunc()) + } + return &stripedCache{ + stripeCount: uint32(stripeCount), + keyFunc: keyFunc, + caches: caches, + } +} + +func (c *stripedCache) get(key string) (*cacheRecord, bool) { + return c.caches[c.keyFunc(key)%c.stripeCount].get(key) +} +func (c *stripedCache) set(key string, value *cacheRecord, ttl time.Duration) { + c.caches[c.keyFunc(key)%c.stripeCount].set(key, value, ttl) +} +func (c *stripedCache) remove(key string) { + c.caches[c.keyFunc(key)%c.stripeCount].remove(key) +} + +func fnvKeyFunc(key string) uint32 { + f := fnv.New32() + f.Write([]byte(key)) + return f.Sum32() +} diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/cache_test.go b/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/cache_test.go new file mode 100644 index 00000000000..d4e9adff7a7 --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/cache_test.go @@ -0,0 +1,94 @@ +/* +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 cache + +import ( + "math/rand" + "testing" + "time" + + "k8s.io/apimachinery/pkg/util/clock" + "k8s.io/apiserver/pkg/authentication/user" + + "github.com/pborman/uuid" +) + +func TestSimpleCache(t *testing.T) { + testCache(newSimpleCache(4096, clock.RealClock{}), t) +} + +func BenchmarkSimpleCache(b *testing.B) { + benchmarkCache(newSimpleCache(4096, clock.RealClock{}), b) +} + +func TestStripedCache(t *testing.T) { + testCache(newStripedCache(32, fnvKeyFunc, func() cache { return newSimpleCache(128, clock.RealClock{}) }), t) +} + +func BenchmarkStripedCache(b *testing.B) { + benchmarkCache(newStripedCache(32, fnvKeyFunc, func() cache { return newSimpleCache(128, clock.RealClock{}) }), b) +} + +func benchmarkCache(cache cache, b *testing.B) { + keys := []string{} + for i := 0; i < b.N; i++ { + key := uuid.NewRandom().String() + keys = append(keys, key) + } + + b.ResetTimer() + + b.SetParallelism(500) + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + key := keys[rand.Intn(b.N)] + _, ok := cache.get(key) + if ok { + cache.remove(key) + } else { + cache.set(key, &cacheRecord{}, time.Second) + } + } + }) +} + +func testCache(cache cache, t *testing.T) { + if result, ok := cache.get("foo"); ok || result != nil { + t.Errorf("Expected null, false, got %#v, %v", result, ok) + } + + record1 := &cacheRecord{user: &user.DefaultInfo{Name: "bob"}} + record2 := &cacheRecord{user: &user.DefaultInfo{Name: "alice"}} + + // when empty, record is stored + cache.set("foo", record1, time.Hour) + if result, ok := cache.get("foo"); !ok || result != record1 { + t.Errorf("Expected %#v, true, got %#v, %v", record1, ok) + } + + // newer record overrides + cache.set("foo", record2, time.Hour) + if result, ok := cache.get("foo"); !ok || result != record2 { + t.Errorf("Expected %#v, true, got %#v, %v", record2, ok) + } + + // removing the current value removes + cache.remove("foo") + if result, ok := cache.get("foo"); ok || result != nil { + t.Errorf("Expected null, false, got %#v, %v", result, ok) + } +} diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/cached_token_authenticator.go b/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/cached_token_authenticator.go new file mode 100644 index 00000000000..d2fd28d2346 --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/cached_token_authenticator.go @@ -0,0 +1,82 @@ +/* +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 cache + +import ( + "time" + + utilclock "k8s.io/apimachinery/pkg/util/clock" + "k8s.io/apiserver/pkg/authentication/authenticator" + "k8s.io/apiserver/pkg/authentication/user" +) + +// cacheRecord holds the three return values of the authenticator.Token AuthenticateToken method +type cacheRecord struct { + user user.Info + ok bool + err error +} + +type cachedTokenAuthenticator struct { + authenticator authenticator.Token + + successTTL time.Duration + failureTTL time.Duration + + cache cache +} + +type cache interface { + // given a key, return the record, and whether or not it existed + get(key string) (value *cacheRecord, exists bool) + // caches the record for the key + set(key string, value *cacheRecord, ttl time.Duration) + // removes the record for the key + remove(key string) +} + +// New returns a token authenticator that caches the results of the specified authenticator. A ttl of 0 bypasses the cache. +func New(authenticator authenticator.Token, successTTL, failureTTL time.Duration) authenticator.Token { + return newWithClock(authenticator, successTTL, failureTTL, utilclock.RealClock{}) +} + +func newWithClock(authenticator authenticator.Token, successTTL, failureTTL time.Duration, clock utilclock.Clock) authenticator.Token { + return &cachedTokenAuthenticator{ + authenticator: authenticator, + successTTL: successTTL, + failureTTL: failureTTL, + cache: newStripedCache(32, fnvKeyFunc, func() cache { return newSimpleCache(128, clock) }), + } +} + +// AuthenticateToken implements authenticator.Token +func (a *cachedTokenAuthenticator) AuthenticateToken(token string) (user.Info, bool, error) { + if record, ok := a.cache.get(token); ok { + return record.user, record.ok, record.err + } + + user, ok, err := a.authenticator.AuthenticateToken(token) + + switch { + case ok && a.successTTL > 0: + a.cache.set(token, &cacheRecord{user: user, ok: ok, err: err}, a.successTTL) + case !ok && a.failureTTL > 0: + a.cache.set(token, &cacheRecord{user: user, ok: ok, err: err}, a.failureTTL) + } + + return user, ok, err +} diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/cached_token_authenticator_test.go b/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/cached_token_authenticator_test.go new file mode 100644 index 00000000000..200d1147841 --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/authentication/token/cache/cached_token_authenticator_test.go @@ -0,0 +1,105 @@ +/* +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 cache + +import ( + "reflect" + "testing" + "time" + + utilclock "k8s.io/apimachinery/pkg/util/clock" + "k8s.io/apiserver/pkg/authentication/authenticator" + "k8s.io/apiserver/pkg/authentication/user" +) + +func TestCachedTokenAuthenticator(t *testing.T) { + var ( + calledWithToken []string + + resultUsers map[string]user.Info + resultOk bool + resultErr error + ) + fakeAuth := authenticator.TokenFunc(func(token string) (user.Info, bool, error) { + calledWithToken = append(calledWithToken, token) + return resultUsers[token], resultOk, resultErr + }) + fakeClock := utilclock.NewFakeClock(time.Now()) + + a := newWithClock(fakeAuth, time.Minute, 0, fakeClock) + + calledWithToken, resultUsers, resultOk, resultErr = []string{}, nil, false, nil + a.AuthenticateToken("bad1") + a.AuthenticateToken("bad2") + a.AuthenticateToken("bad3") + a.AuthenticateToken("bad1") + a.AuthenticateToken("bad2") + a.AuthenticateToken("bad3") + if !reflect.DeepEqual(calledWithToken, []string{"bad1", "bad2", "bad3", "bad1", "bad2", "bad3"}) { + t.Errorf("Expected failing calls to bypass cache, got %v", calledWithToken) + } + + // reset calls, make the backend return success for three user tokens + calledWithToken = []string{} + resultUsers, resultOk, resultErr = map[string]user.Info{}, true, nil + resultUsers["usertoken1"] = &user.DefaultInfo{Name: "user1"} + resultUsers["usertoken2"] = &user.DefaultInfo{Name: "user2"} + resultUsers["usertoken3"] = &user.DefaultInfo{Name: "user3"} + + // populate cache + if user, ok, err := a.AuthenticateToken("usertoken1"); err != nil || !ok || user.GetName() != "user1" { + t.Errorf("Expected user1") + } + if user, ok, err := a.AuthenticateToken("usertoken2"); err != nil || !ok || user.GetName() != "user2" { + t.Errorf("Expected user2") + } + if user, ok, err := a.AuthenticateToken("usertoken3"); err != nil || !ok || user.GetName() != "user3" { + t.Errorf("Expected user3") + } + if !reflect.DeepEqual(calledWithToken, []string{"usertoken1", "usertoken2", "usertoken3"}) { + t.Errorf("Expected token calls, got %v", calledWithToken) + } + + // reset calls, make the backend return failures + calledWithToken = []string{} + resultUsers, resultOk, resultErr = nil, false, nil + + // authenticate calls still succeed and backend is not hit + if user, ok, err := a.AuthenticateToken("usertoken1"); err != nil || !ok || user.GetName() != "user1" { + t.Errorf("Expected user1") + } + if user, ok, err := a.AuthenticateToken("usertoken2"); err != nil || !ok || user.GetName() != "user2" { + t.Errorf("Expected user2") + } + if user, ok, err := a.AuthenticateToken("usertoken3"); err != nil || !ok || user.GetName() != "user3" { + t.Errorf("Expected user3") + } + if !reflect.DeepEqual(calledWithToken, []string{}) { + t.Errorf("Expected no token calls, got %v", calledWithToken) + } + + // skip forward in time + fakeClock.Step(2 * time.Minute) + + // backend is consulted again and fails + a.AuthenticateToken("usertoken1") + a.AuthenticateToken("usertoken2") + a.AuthenticateToken("usertoken3") + if !reflect.DeepEqual(calledWithToken, []string{"usertoken1", "usertoken2", "usertoken3"}) { + t.Errorf("Expected token calls, got %v", calledWithToken) + } +} diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/token/tokenfile/BUILD b/staging/src/k8s.io/apiserver/pkg/authentication/token/tokenfile/BUILD index 81616b5115e..f298f15b490 100644 --- a/staging/src/k8s.io/apiserver/pkg/authentication/token/tokenfile/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/authentication/token/tokenfile/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,12 @@ go_test( name = "go_default_test", srcs = ["tokenfile_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library"], ) go_library( name = "go_default_library", srcs = ["tokenfile.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/token/union/BUILD b/staging/src/k8s.io/apiserver/pkg/authentication/token/union/BUILD new file mode 100644 index 00000000000..7a6b23db96b --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/authentication/token/union/BUILD @@ -0,0 +1,41 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = ["unionauth_test.go"], + library = ":go_default_library", + tags = ["automanaged"], + deps = ["//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library"], +) + +go_library( + name = "go_default_library", + srcs = ["union.go"], + tags = ["automanaged"], + deps = [ + "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", + "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/token/union/union.go b/staging/src/k8s.io/apiserver/pkg/authentication/token/union/union.go new file mode 100644 index 00000000000..7cc391bc488 --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/authentication/token/union/union.go @@ -0,0 +1,70 @@ +/* +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 union + +import ( + utilerrors "k8s.io/apimachinery/pkg/util/errors" + "k8s.io/apiserver/pkg/authentication/authenticator" + "k8s.io/apiserver/pkg/authentication/user" +) + +// unionAuthTokenHandler authenticates tokens using a chain of authenticator.Token objects +type unionAuthTokenHandler struct { + // Handlers is a chain of request authenticators to delegate to + Handlers []authenticator.Token + // FailOnError determines whether an error returns short-circuits the chain + FailOnError bool +} + +// New returns a token authenticator that validates credentials using a chain of authenticator.Token objects. +// The entire chain is tried until one succeeds. If all fail, an aggregate error is returned. +func New(authTokenHandlers ...authenticator.Token) authenticator.Token { + if len(authTokenHandlers) == 1 { + return authTokenHandlers[0] + } + return &unionAuthTokenHandler{Handlers: authTokenHandlers, FailOnError: false} +} + +// NewFailOnError returns a token authenticator that validates credentials using a chain of authenticator.Token objects. +// The first error short-circuits the chain. +func NewFailOnError(authTokenHandlers ...authenticator.Token) authenticator.Token { + if len(authTokenHandlers) == 1 { + return authTokenHandlers[0] + } + return &unionAuthTokenHandler{Handlers: authTokenHandlers, FailOnError: true} +} + +// AuthenticateToken authenticates the token using a chain of authenticator.Token objects. +func (authHandler *unionAuthTokenHandler) AuthenticateToken(token string) (user.Info, bool, error) { + var errlist []error + for _, currAuthRequestHandler := range authHandler.Handlers { + info, ok, err := currAuthRequestHandler.AuthenticateToken(token) + if err != nil { + if authHandler.FailOnError { + return info, ok, err + } + errlist = append(errlist, err) + continue + } + + if ok { + return info, ok, err + } + } + + return nil, false, utilerrors.NewAggregate(errlist) +} diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/token/union/unionauth_test.go b/staging/src/k8s.io/apiserver/pkg/authentication/token/union/unionauth_test.go new file mode 100644 index 00000000000..1107c575467 --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/authentication/token/union/unionauth_test.go @@ -0,0 +1,158 @@ +/* +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 union + +import ( + "errors" + "reflect" + "strings" + "testing" + + "k8s.io/apiserver/pkg/authentication/user" +) + +type mockAuthRequestHandler struct { + returnUser user.Info + isAuthenticated bool + err error +} + +var ( + user1 = &user.DefaultInfo{Name: "fresh_ferret", UID: "alfa"} + user2 = &user.DefaultInfo{Name: "elegant_sheep", UID: "bravo"} +) + +func (mock *mockAuthRequestHandler) AuthenticateToken(token string) (user.Info, bool, error) { + return mock.returnUser, mock.isAuthenticated, mock.err +} + +func TestAuthenticateTokenSecondPasses(t *testing.T) { + handler1 := &mockAuthRequestHandler{returnUser: user1} + handler2 := &mockAuthRequestHandler{returnUser: user2, isAuthenticated: true} + authRequestHandler := New(handler1, handler2) + + authenticatedUser, isAuthenticated, err := authRequestHandler.AuthenticateToken("foo") + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + if !isAuthenticated { + t.Errorf("Unexpectedly unauthenticated: %v", isAuthenticated) + } + if !reflect.DeepEqual(user2, authenticatedUser) { + t.Errorf("Expected %v, got %v", user2, authenticatedUser) + } +} + +func TestAuthenticateTokenFirstPasses(t *testing.T) { + handler1 := &mockAuthRequestHandler{returnUser: user1, isAuthenticated: true} + handler2 := &mockAuthRequestHandler{returnUser: user2} + authRequestHandler := New(handler1, handler2) + + authenticatedUser, isAuthenticated, err := authRequestHandler.AuthenticateToken("foo") + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + if !isAuthenticated { + t.Errorf("Unexpectedly unauthenticated: %v", isAuthenticated) + } + if !reflect.DeepEqual(user1, authenticatedUser) { + t.Errorf("Expected %v, got %v", user1, authenticatedUser) + } +} + +func TestAuthenticateTokenSuppressUnnecessaryErrors(t *testing.T) { + handler1 := &mockAuthRequestHandler{err: errors.New("first")} + handler2 := &mockAuthRequestHandler{isAuthenticated: true} + authRequestHandler := New(handler1, handler2) + + _, isAuthenticated, err := authRequestHandler.AuthenticateToken("foo") + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + if !isAuthenticated { + t.Errorf("Unexpectedly unauthenticated: %v", isAuthenticated) + } +} + +func TestAuthenticateTokenNoAuthenticators(t *testing.T) { + authRequestHandler := New() + + authenticatedUser, isAuthenticated, err := authRequestHandler.AuthenticateToken("foo") + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + if isAuthenticated { + t.Errorf("Unexpectedly authenticated: %v", isAuthenticated) + } + if authenticatedUser != nil { + t.Errorf("Unexpected authenticatedUser: %v", authenticatedUser) + } +} + +func TestAuthenticateTokenNonePass(t *testing.T) { + handler1 := &mockAuthRequestHandler{} + handler2 := &mockAuthRequestHandler{} + authRequestHandler := New(handler1, handler2) + + _, isAuthenticated, err := authRequestHandler.AuthenticateToken("foo") + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + if isAuthenticated { + t.Errorf("Unexpectedly authenticated: %v", isAuthenticated) + } +} + +func TestAuthenticateTokenAdditiveErrors(t *testing.T) { + handler1 := &mockAuthRequestHandler{err: errors.New("first")} + handler2 := &mockAuthRequestHandler{err: errors.New("second")} + authRequestHandler := New(handler1, handler2) + + _, isAuthenticated, err := authRequestHandler.AuthenticateToken("foo") + if err == nil { + t.Errorf("Expected an error") + } + if !strings.Contains(err.Error(), "first") { + t.Errorf("Expected error containing %v, got %v", "first", err) + } + if !strings.Contains(err.Error(), "second") { + t.Errorf("Expected error containing %v, got %v", "second", err) + } + if isAuthenticated { + t.Errorf("Unexpectedly authenticated: %v", isAuthenticated) + } +} + +func TestAuthenticateTokenFailEarly(t *testing.T) { + handler1 := &mockAuthRequestHandler{err: errors.New("first")} + handler2 := &mockAuthRequestHandler{err: errors.New("second")} + authRequestHandler := NewFailOnError(handler1, handler2) + + _, isAuthenticated, err := authRequestHandler.AuthenticateToken("foo") + if err == nil { + t.Errorf("Expected an error") + } + if !strings.Contains(err.Error(), "first") { + t.Errorf("Expected error containing %v, got %v", "first", err) + } + if strings.Contains(err.Error(), "second") { + t.Errorf("Did not expect second error, got %v", err) + } + if isAuthenticated { + t.Errorf("Unexpectedly authenticated: %v", isAuthenticated) + } +} diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/user/BUILD b/staging/src/k8s.io/apiserver/pkg/authentication/user/BUILD index 86d32e96a60..8f8d940ea82 100644 --- a/staging/src/k8s.io/apiserver/pkg/authentication/user/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/authentication/user/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "user.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apiserver/pkg/authorization/authorizer/BUILD b/staging/src/k8s.io/apiserver/pkg/authorization/authorizer/BUILD index bc46520f56b..e49523f2998 100644 --- a/staging/src/k8s.io/apiserver/pkg/authorization/authorizer/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/authorization/authorizer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interfaces.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library"], ) diff --git a/staging/src/k8s.io/apiserver/pkg/authorization/authorizerfactory/BUILD b/staging/src/k8s.io/apiserver/pkg/authorization/authorizerfactory/BUILD index 1c36aa376d5..655342a6d22 100644 --- a/staging/src/k8s.io/apiserver/pkg/authorization/authorizerfactory/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/authorization/authorizerfactory/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["authz_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", "//vendor/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", @@ -25,7 +22,6 @@ go_library( "builtin.go", "delegating.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", "//vendor/k8s.io/apiserver/plugin/pkg/authorizer/webhook:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/authorization/union/BUILD b/staging/src/k8s.io/apiserver/pkg/authorization/union/BUILD index 094e44d1b6a..47d6f38b205 100644 --- a/staging/src/k8s.io/apiserver/pkg/authorization/union/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/authorization/union/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,12 @@ go_test( name = "go_default_test", srcs = ["union_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library"], ) go_library( name = "go_default_library", srcs = ["union.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/BUILD b/staging/src/k8s.io/apiserver/pkg/endpoints/BUILD index 248e5af2c7b..65996a8900f 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_test( "watch_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/emicklei/go-restful:go_default_library", "//vendor/golang.org/x/net/websocket:go_default_library", @@ -67,7 +64,6 @@ go_library( "groupversion.go", "installer.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/emicklei/go-restful:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/apiserver_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/apiserver_test.go index 361cb56d07b..5a4fe62ef8b 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/apiserver_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/apiserver_test.go @@ -1885,6 +1885,20 @@ func TestGetTable(t *testing.T) { }, }, }, + { + accept: runtime.ContentTypeJSON + ";as=Table;v=v1alpha1;g=meta.k8s.io", + params: url.Values{"includeObject": []string{"Metadata"}}, + expected: &metav1alpha1.Table{ + TypeMeta: metav1.TypeMeta{Kind: "Table", APIVersion: "meta.k8s.io/v1alpha1"}, + ColumnDefinitions: []metav1alpha1.TableColumnDefinition{ + {Name: "Name", Type: "string", Description: metaDoc["name"]}, + {Name: "Created At", Type: "date", Description: metaDoc["creationTimestamp"]}, + }, + Rows: []metav1alpha1.TableRow{ + {Cells: []interface{}{"foo1", now.Time.UTC().Format(time.RFC3339)}, Object: runtime.RawExtension{Raw: encodedBody}}, + }, + }, + }, } for i, test := range tests { u, err := url.Parse(server.URL + "/" + prefix + "/" + testGroupVersion.Group + "/" + testGroupVersion.Version + "/namespaces/default/simple/id") @@ -1901,18 +1915,20 @@ func TestGetTable(t *testing.T) { } if test.statusCode != 0 { if resp.StatusCode != test.statusCode { - t.Errorf("%d: unexpected response: %#v", resp) + t.Errorf("%d: unexpected response: %#v", i, resp) } continue } if resp.StatusCode != http.StatusOK { - t.Errorf("%d: unexpected response: %#v", resp) + t.Errorf("%d: unexpected response: %#v", i, resp) } var itemOut metav1alpha1.Table - if _, err = extractBody(resp, &itemOut); err != nil { + body, err := extractBody(resp, &itemOut) + if err != nil { t.Fatal(err) } if !reflect.DeepEqual(test.expected, &itemOut) { + t.Log(body) t.Errorf("%d: did not match: %s", i, diff.ObjectReflectDiff(test.expected, &itemOut)) } } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/discovery/BUILD b/staging/src/k8s.io/apiserver/pkg/endpoints/discovery/BUILD index 7983e4ff2ea..3623cd9e4a5 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/discovery/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/discovery/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "root_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", @@ -39,7 +36,6 @@ go_library( "util.go", "version.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/emicklei/go-restful:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/filters/BUILD b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/BUILD index 863bc9f2150..cbcb0833810 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/filters/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_test( "requestinfo_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/pborman/uuid:go_default_library", "//vendor/k8s.io/api/authentication/v1:go_default_library", @@ -55,7 +52,6 @@ go_library( "legacy_audit.go", "requestinfo.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/pborman/uuid:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/filters/audit.go b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/audit.go index 9ff9c45b9d0..ecad0c25933 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/filters/audit.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/audit.go @@ -107,6 +107,7 @@ func WithAudit(handler http.Handler, requestContextMapper request.RequestContext } // if no StageResponseStarted event was sent b/c neither a status code nor a body was sent, fake it here + // But Audit-Id http header will only be sent when http.ResponseWriter.WriteHeader is called. fakedSuccessStatus := &metav1.Status{ Code: http.StatusOK, Status: metav1.StatusSuccess, @@ -162,6 +163,10 @@ type auditResponseWriter struct { sink audit.Sink } +func (a *auditResponseWriter) setHttpHeader() { + a.ResponseWriter.Header().Set(auditinternal.HeaderAuditID, string(a.event.AuditID)) +} + func (a *auditResponseWriter) processCode(code int) { a.once.Do(func() { if a.event.ResponseStatus == nil { @@ -177,12 +182,16 @@ func (a *auditResponseWriter) processCode(code int) { } func (a *auditResponseWriter) Write(bs []byte) (int, error) { - a.processCode(http.StatusOK) // the Go library calls WriteHeader internally if no code was written yet. But this will go unnoticed for us + // the Go library calls WriteHeader internally if no code was written yet. But this will go unnoticed for us + a.processCode(http.StatusOK) + a.setHttpHeader() + return a.ResponseWriter.Write(bs) } func (a *auditResponseWriter) WriteHeader(code int) { a.processCode(code) + a.setHttpHeader() a.ResponseWriter.WriteHeader(code) } @@ -204,6 +213,13 @@ func (f *fancyResponseWriterDelegator) Flush() { func (f *fancyResponseWriterDelegator) Hijack() (net.Conn, *bufio.ReadWriter, error) { // fake a response status before protocol switch happens f.processCode(http.StatusSwitchingProtocols) + + // This will be ignored if WriteHeader() function has aready been called. + // It's not guaranteed Audit-ID http header is sent for all requests. + // For example, when user run "kubectl exec", apiserver uses a proxy handler + // to deal with the request, users can only get http headers returned by kubelet node. + f.setHttpHeader() + return f.ResponseWriter.(http.Hijacker).Hijack() } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/filters/audit_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/audit_test.go index 16cd752c478..0987f34d6de 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/filters/audit_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/audit_test.go @@ -436,12 +436,13 @@ func TestAuditJson(t *testing.T) { delay := 500 * time.Millisecond for _, test := range []struct { - desc string - path string - verb string - auditID string - handler func(http.ResponseWriter, *http.Request) - expected []auditv1alpha1.Event + desc string + path string + verb string + auditID string + handler func(http.ResponseWriter, *http.Request) + expected []auditv1alpha1.Event + respHeader bool }{ // short running requests with read-only verb { @@ -463,13 +464,16 @@ func TestAuditJson(t *testing.T) { ResponseStatus: &metav1.Status{Code: 200}, }, }, + false, }, { "short running with auditID", shortRunningPath, "GET", uuid.NewRandom().String(), - func(http.ResponseWriter, *http.Request) {}, + func(w http.ResponseWriter, req *http.Request) { + w.Write([]byte("foo")) + }, []auditv1alpha1.Event{ { Stage: auditinternal.StageRequestReceived, @@ -483,6 +487,7 @@ func TestAuditJson(t *testing.T) { ResponseStatus: &metav1.Status{Code: 200}, }, }, + true, }, { "read-only panic", @@ -505,6 +510,7 @@ func TestAuditJson(t *testing.T) { ResponseStatus: &metav1.Status{Code: 500}, }, }, + false, }, // short running request with non-read-only verb { @@ -526,13 +532,15 @@ func TestAuditJson(t *testing.T) { ResponseStatus: &metav1.Status{Code: 200}, }, }, + false, }, { "writing sleep", shortRunningPath, "PUT", "", - func(http.ResponseWriter, *http.Request) { + func(w http.ResponseWriter, req *http.Request) { + w.Write([]byte("foo")) time.Sleep(delay) }, []auditv1alpha1.Event{ @@ -548,6 +556,7 @@ func TestAuditJson(t *testing.T) { ResponseStatus: &metav1.Status{Code: 200}, }, }, + true, }, { "writing 403+write", @@ -571,6 +580,7 @@ func TestAuditJson(t *testing.T) { ResponseStatus: &metav1.Status{Code: 403}, }, }, + true, }, { "writing panic", @@ -593,6 +603,7 @@ func TestAuditJson(t *testing.T) { ResponseStatus: &metav1.Status{Code: 500}, }, }, + false, }, { "writing write+panic", @@ -616,6 +627,7 @@ func TestAuditJson(t *testing.T) { ResponseStatus: &metav1.Status{Code: 500}, }, }, + true, }, // long running requests { @@ -643,13 +655,16 @@ func TestAuditJson(t *testing.T) { ResponseStatus: &metav1.Status{Code: 200}, }, }, + false, }, { - "empty longrunning", + "empty longrunning with audit id", longRunningPath, "GET", uuid.NewRandom().String(), - func(http.ResponseWriter, *http.Request) {}, + func(w http.ResponseWriter, req *http.Request) { + w.Write([]byte("foo")) + }, []auditv1alpha1.Event{ { Stage: auditinternal.StageRequestReceived, @@ -669,6 +684,7 @@ func TestAuditJson(t *testing.T) { ResponseStatus: &metav1.Status{Code: 200}, }, }, + true, }, { "sleep longrunning", @@ -697,6 +713,7 @@ func TestAuditJson(t *testing.T) { ResponseStatus: &metav1.Status{Code: 200}, }, }, + false, }, { "sleep+403 longrunning", @@ -726,6 +743,7 @@ func TestAuditJson(t *testing.T) { ResponseStatus: &metav1.Status{Code: 403}, }, }, + true, }, { "write longrunning", @@ -754,6 +772,7 @@ func TestAuditJson(t *testing.T) { ResponseStatus: &metav1.Status{Code: 200}, }, }, + true, }, { "403+write longrunning", @@ -783,6 +802,7 @@ func TestAuditJson(t *testing.T) { ResponseStatus: &metav1.Status{Code: 403}, }, }, + true, }, { "panic longrunning", @@ -805,6 +825,7 @@ func TestAuditJson(t *testing.T) { ResponseStatus: &metav1.Status{Code: 500}, }, }, + false, }, { "write+panic longrunning", @@ -834,6 +855,7 @@ func TestAuditJson(t *testing.T) { ResponseStatus: &metav1.Status{Code: 500}, }, }, + true, }, } { var buf bytes.Buffer @@ -852,11 +874,12 @@ func TestAuditJson(t *testing.T) { } req.RemoteAddr = "127.0.0.1" + w := httptest.NewRecorder() func() { defer func() { recover() }() - handler.ServeHTTP(httptest.NewRecorder(), req) + handler.ServeHTTP(w, req) }() t.Logf("[%s] audit log: %v", test.desc, buf.String()) @@ -887,6 +910,11 @@ func TestAuditJson(t *testing.T) { if event.RequestURI != expect.RequestURI { t.Errorf("[%s] Unexpected RequestURI: %s", test.desc, event.RequestURI) } + resp := w.Result() + if test.respHeader && string(event.AuditID) != resp.Header.Get("Audit-Id") { + t.Errorf("[%s] Unexpected Audit-Id http response header, Audit-Id http response header should be the same with AuditID in log %v xx %v", test.desc, event.AuditID, w.HeaderMap.Get("Audit-Id")) + } + if test.auditID != "" && event.AuditID != types.UID(test.auditID) { t.Errorf("[%s] Unexpected AuditID in audit event, AuditID should be the same with Audit-ID http header", test.desc) } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/BUILD b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/BUILD index d6d39bbe484..f60cf7b6462 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,13 +8,17 @@ load( go_test( name = "go_default_test", - srcs = ["rest_test.go"], + srcs = [ + "namer_test.go", + "rest_test.go", + ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/evanphx/json-patch: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/errors:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", @@ -42,7 +44,6 @@ go_library( "rest.go", "watch.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/evanphx/json-patch:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/namer_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/namer_test.go new file mode 100644 index 00000000000..15c88189313 --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/namer_test.go @@ -0,0 +1,116 @@ +/* +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 handlers + +import ( + "testing" + + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apiserver/pkg/endpoints/request" +) + +func TestGenerateLink(t *testing.T) { + testCases := []struct { + name string + requestInfo *request.RequestInfo + obj runtime.Object + expect string + expectErr bool + clusterScoped bool + }{ + { + name: "obj has more priority than requestInfo", + requestInfo: &request.RequestInfo{ + Name: "should-not-use", + Namespace: "should-not-use", + Resource: "pod", + }, + obj: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "should-use", Namespace: "should-use"}}, + expect: "/api/v1/should-use/pod/should-use", + expectErr: false, + clusterScoped: false, + }, + { + name: "hit errEmptyName", + requestInfo: &request.RequestInfo{ + Name: "should-use", + Namespace: "should-use", + Resource: "pod", + }, + obj: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: "should-not-use"}}, + expect: "/api/v1/should-use/pod/should-use", + expectErr: false, + clusterScoped: false, + }, + { + name: "use namespace of requestInfo if obj namespace is empty", + requestInfo: &request.RequestInfo{ + Name: "should-not-use", + Namespace: "should-use", + Resource: "pod", + }, + obj: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "should-use"}}, + expect: "/api/v1/should-use/pod/should-use", + expectErr: false, + clusterScoped: false, + }, + { + name: "hit error", + requestInfo: &request.RequestInfo{ + Name: "", + Namespace: "", + Resource: "pod", + }, + obj: &v1.Pod{ObjectMeta: metav1.ObjectMeta{}}, + expect: "name must be provided", + expectErr: true, + clusterScoped: false, + }, + { + name: "cluster scoped", + requestInfo: &request.RequestInfo{ + Name: "only-name", + Namespace: "should-not-use", + Resource: "pod", + }, + obj: &v1.Pod{ObjectMeta: metav1.ObjectMeta{}}, + expect: "/api/v1/only-name", + expectErr: false, + clusterScoped: true, + }, + } + + for _, test := range testCases { + n := ContextBasedNaming{ + SelfLinker: meta.NewAccessor(), + SelfLinkPathPrefix: "/api/v1/", + ClusterScoped: test.clusterScoped, + } + uri, err := n.GenerateLink(test.requestInfo, test.obj) + + if uri != test.expect && err.Error() != test.expect { + if test.expectErr { + t.Fatalf("%s: unexpected non-error: %v", test.name, err) + } else { + t.Fatalf("%s: expected: %v, but got: %v", test.name, test.expect, uri) + } + } + } +} diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/BUILD b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/BUILD index 692647768e2..aed172285db 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["negotiate_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", @@ -26,7 +23,6 @@ go_library( "errors.go", "negotiate.go", ], - tags = ["automanaged"], deps = [ "//vendor/bitbucket.org/ww/goautoneg:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/BUILD b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/BUILD index 74152d88c0c..4ee001070e4 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "status_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -36,7 +33,6 @@ go_library( "status.go", "writers.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/metrics/BUILD b/staging/src/k8s.io/apiserver/pkg/endpoints/metrics/BUILD index f1bfdc25fed..bcc239904e7 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/metrics/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/metrics/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["metrics_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["metrics.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/emicklei/go-restful:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/openapi/BUILD b/staging/src/k8s.io/apiserver/pkg/endpoints/openapi/BUILD index a0bc92953d2..619e36e2582 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/openapi/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/openapi/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["openapi_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/go-openapi/spec:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -24,7 +21,6 @@ go_test( go_library( name = "go_default_library", srcs = ["openapi.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/emicklei/go-restful:go_default_library", "//vendor/github.com/go-openapi/spec:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/openapi/testing/BUILD b/staging/src/k8s.io/apiserver/pkg/endpoints/openapi/testing/BUILD index 4767a45109d..06990fb5b8c 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/openapi/testing/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/openapi/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/request/BUILD b/staging/src/k8s.io/apiserver/pkg/endpoints/request/BUILD index 96ce44c3774..a9fff53ccd7 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/request/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/request/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["requestinfo_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library"], ) @@ -24,7 +21,6 @@ go_library( "requestcontext.go", "requestinfo.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", @@ -38,7 +34,6 @@ go_library( go_test( name = "go_default_xtest", srcs = ["context_test.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/testing/BUILD b/staging/src/k8s.io/apiserver/pkg/endpoints/testing/BUILD index fe102025ed3..0ccbb0641a2 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/testing/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/ugorji/go/codec:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/features/BUILD b/staging/src/k8s.io/apiserver/pkg/features/BUILD index d4be1b81aa9..3b415effc45 100644 --- a/staging/src/k8s.io/apiserver/pkg/features/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/features/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["kube_features.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library"], ) diff --git a/staging/src/k8s.io/apiserver/pkg/registry/BUILD b/staging/src/k8s.io/apiserver/pkg/registry/BUILD index a0e86d14358..27c000a76e4 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/registry/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apiserver/pkg/registry/generic/BUILD b/staging/src/k8s.io/apiserver/pkg/registry/generic/BUILD index c993628f479..8d2212a4d8a 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/generic/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/registry/generic/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "options.go", "storage_decorator.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/BUILD b/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/BUILD index b45da7fb9c3..82da56630c5 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "store_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", @@ -53,7 +50,6 @@ go_library( "storage_factory.go", "store.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store.go b/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store.go index ef1bd068f38..fd352123627 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store.go +++ b/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store.go @@ -37,6 +37,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apimachinery/pkg/watch" + "k8s.io/apiserver/pkg/endpoints/request" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" @@ -51,6 +52,14 @@ import ( // object. type ObjectFunc func(obj runtime.Object) error +// GenericStore interface can be used for type assertions when we need to access the underlying strategies. +type GenericStore interface { + GetCreateStrategy() rest.RESTCreateStrategy + GetUpdateStrategy() rest.RESTUpdateStrategy + GetDeleteStrategy() rest.RESTDeleteStrategy + GetExportStrategy() rest.RESTExportStrategy +} + // Store implements pkg/api/rest.StandardStorage. It's intended to be // embeddable and allows the consumer to implement any non-generic functions // that are required. This object is intended to be copyable so that it can be @@ -82,8 +91,10 @@ type Store struct { // curl GET /apis/group/version/namespaces/my-ns/myresource NewListFunc func() runtime.Object - // QualifiedResource is the pluralized name of the resource. - QualifiedResource schema.GroupResource + // DefaultQualifiedResource is the pluralized name of the resource. + // This field is used if there is no request info present in the context. + // See qualifiedResourceFromContext for details. + DefaultQualifiedResource schema.GroupResource // KeyRootFunc returns the root etcd key for this resource; should not // include trailing "/". This is used for operations that work on the @@ -174,6 +185,7 @@ type Store struct { var _ rest.StandardStorage = &Store{} var _ rest.Exporter = &Store{} var _ rest.TableConvertor = &Store{} +var _ GenericStore = &Store{} const OptimisticLockErrorMsg = "the object has been modified; please apply your changes to the latest version and try again" @@ -230,6 +242,26 @@ func (e *Store) NewList() runtime.Object { return e.NewListFunc() } +// GetCreateStrategy implements GenericStore. +func (e *Store) GetCreateStrategy() rest.RESTCreateStrategy { + return e.CreateStrategy +} + +// GetUpdateStrategy implements GenericStore. +func (e *Store) GetUpdateStrategy() rest.RESTUpdateStrategy { + return e.UpdateStrategy +} + +// GetDeleteStrategy implements GenericStore. +func (e *Store) GetDeleteStrategy() rest.RESTDeleteStrategy { + return e.DeleteStrategy +} + +// GetExportStrategy implements GenericStore. +func (e *Store) GetExportStrategy() rest.RESTExportStrategy { + return e.ExportStrategy +} + // List returns a list of items matching labels and field according to the // store's PredicateFunc. func (e *Store) List(ctx genericapirequest.Context, options *metainternalversion.ListOptions) (runtime.Object, error) { @@ -262,16 +294,17 @@ func (e *Store) ListPredicate(ctx genericapirequest.Context, p storage.Selection } p.IncludeUninitialized = options.IncludeUninitialized list := e.NewListFunc() + qualifiedResource := e.qualifiedResourceFromContext(ctx) if name, ok := p.MatchesSingle(); ok { if key, err := e.KeyFunc(ctx, name); err == nil { err := e.Storage.GetToList(ctx, key, options.ResourceVersion, p, list) - return list, storeerr.InterpretListError(err, e.QualifiedResource) + return list, storeerr.InterpretListError(err, qualifiedResource) } // if we cannot extract a key based on the current context, the optimization is skipped } err := e.Storage.List(ctx, e.KeyRootFunc(ctx), options.ResourceVersion, p, list) - return list, storeerr.InterpretListError(err, e.QualifiedResource) + return list, storeerr.InterpretListError(err, qualifiedResource) } // Create inserts a new item according to the unique key from the object. @@ -287,13 +320,14 @@ func (e *Store) Create(ctx genericapirequest.Context, obj runtime.Object, includ if err != nil { return nil, err } + qualifiedResource := e.qualifiedResourceFromContext(ctx) ttl, err := e.calculateTTL(obj, 0, false) if err != nil { return nil, err } out := e.NewFunc() if err := e.Storage.Create(ctx, key, obj, out, ttl); err != nil { - err = storeerr.InterpretCreateError(err, e.QualifiedResource, name) + err = storeerr.InterpretCreateError(err, qualifiedResource, name) err = rest.CheckGeneratedNameError(e.CreateStrategy, err, obj) if !kubeerr.IsAlreadyExists(err) { return nil, err @@ -327,6 +361,8 @@ func (e *Store) Create(ctx genericapirequest.Context, obj runtime.Object, includ return out, nil } +// WaitForInitialized holds until the object is initialized, or returns an error if the default limit expires. +// This method is exposed publicly for consumers of generic rest tooling. func (e *Store) WaitForInitialized(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { // return early if we don't have initializers, or if they've completed already accessor, err := meta.Accessor(obj) @@ -345,6 +381,7 @@ func (e *Store) WaitForInitialized(ctx genericapirequest.Context, obj runtime.Ob if err != nil { return nil, err } + qualifiedResource := e.qualifiedResourceFromContext(ctx) w, err := e.Storage.Watch(ctx, key, accessor.GetResourceVersion(), storage.SelectionPredicate{ Label: labels.Everything(), Field: fields.Everything(), @@ -363,7 +400,7 @@ func (e *Store) WaitForInitialized(ctx genericapirequest.Context, obj runtime.Ob case event, ok := <-ch: if !ok { msg := fmt.Sprintf("server has timed out waiting for the initialization of %s %s", - e.QualifiedResource.String(), accessor.GetName()) + qualifiedResource.String(), accessor.GetName()) return nil, kubeerr.NewTimeoutError(msg, 0) } switch event.Type { @@ -448,15 +485,15 @@ func (e *Store) deleteWithoutFinalizers(ctx genericapirequest.Context, name, key // requests to remove all finalizers from the object, so we // ignore the NotFound error. if storage.IsNotFound(err) { - _, err := e.finalizeDelete(obj, true) + _, err := e.finalizeDelete(ctx, obj, true) // clients are expecting an updated object if a PUT succeeded, // but finalizeDelete returns a metav1.Status, so return // the object in the request instead. return obj, false, err } - return nil, false, storeerr.InterpretDeleteError(err, e.QualifiedResource, name) + return nil, false, storeerr.InterpretDeleteError(err, e.qualifiedResourceFromContext(ctx), name) } - _, err := e.finalizeDelete(out, true) + _, err := e.finalizeDelete(ctx, out, true) // clients are expecting an updated object if a PUT succeeded, but // finalizeDelete returns a metav1.Status, so return the object in // the request instead. @@ -477,6 +514,7 @@ func (e *Store) Update(ctx genericapirequest.Context, name string, objInfo rest. creating = false ) + qualifiedResource := e.qualifiedResourceFromContext(ctx) storagePreconditions := &storage.Preconditions{} if preconditions := objInfo.Preconditions(); preconditions != nil { storagePreconditions.UID = preconditions.UID @@ -508,7 +546,7 @@ func (e *Store) Update(ctx genericapirequest.Context, name string, objInfo rest. } if version == 0 { if !e.UpdateStrategy.AllowCreateOnUpdate() { - return nil, nil, kubeerr.NewNotFound(e.QualifiedResource, name) + return nil, nil, kubeerr.NewNotFound(qualifiedResource, name) } creating = true creatingObj = obj @@ -542,12 +580,12 @@ func (e *Store) Update(ctx genericapirequest.Context, name string, objInfo rest. // TODO: The Invalid error should have a field for Resource. // After that field is added, we should fill the Resource and // leave the Kind field empty. See the discussion in #18526. - qualifiedKind := schema.GroupKind{Group: e.QualifiedResource.Group, Kind: e.QualifiedResource.Resource} + qualifiedKind := schema.GroupKind{Group: qualifiedResource.Group, Kind: qualifiedResource.Resource} fieldErrList := field.ErrorList{field.Invalid(field.NewPath("metadata").Child("resourceVersion"), newVersion, "must be specified for an update")} return nil, nil, kubeerr.NewInvalid(qualifiedKind, name, fieldErrList) } if newVersion != version { - return nil, nil, kubeerr.NewConflict(e.QualifiedResource, name, fmt.Errorf(OptimisticLockErrorMsg)) + return nil, nil, kubeerr.NewConflict(qualifiedResource, name, fmt.Errorf(OptimisticLockErrorMsg)) } } if err := rest.BeforeUpdate(e.UpdateStrategy, ctx, obj, existing); err != nil { @@ -573,10 +611,10 @@ func (e *Store) Update(ctx genericapirequest.Context, name string, objInfo rest. return e.deleteWithoutFinalizers(ctx, name, key, deleteObj, storagePreconditions) } if creating { - err = storeerr.InterpretCreateError(err, e.QualifiedResource, name) + err = storeerr.InterpretCreateError(err, qualifiedResource, name) err = rest.CheckGeneratedNameError(e.CreateStrategy, err, creatingObj) } else { - err = storeerr.InterpretUpdateError(err, e.QualifiedResource, name) + err = storeerr.InterpretUpdateError(err, qualifiedResource, name) } return nil, false, err } @@ -614,7 +652,7 @@ func (e *Store) Get(ctx genericapirequest.Context, name string, options *metav1. return nil, err } if err := e.Storage.Get(ctx, key, options.ResourceVersion, obj, false); err != nil { - return nil, storeerr.InterpretGetError(err, e.QualifiedResource, name) + return nil, storeerr.InterpretGetError(err, e.qualifiedResourceFromContext(ctx), name) } if e.Decorator != nil { if err := e.Decorator(obj); err != nil { @@ -624,6 +662,16 @@ func (e *Store) Get(ctx genericapirequest.Context, name string, options *metav1. return obj, nil } +// qualifiedResourceFromContext attempts to retrieve a GroupResource from the context's request info. +// If the context has no request info, DefaultQualifiedResource is used. +func (e *Store) qualifiedResourceFromContext(ctx genericapirequest.Context) schema.GroupResource { + if info, ok := request.RequestInfoFrom(ctx); ok { + return schema.GroupResource{Group: info.APIGroup, Resource: info.Resource} + } + // some implementations access storage directly and thus the context has no RequestInfo + return e.DefaultQualifiedResource +} + var ( errAlreadyDeleting = fmt.Errorf("abort delete") errDeleteNow = fmt.Errorf("delete now") @@ -827,10 +875,10 @@ func (e *Store) updateForGracefulDeletion(ctx genericapirequest.Context, name, k // we should fall through and truly delete the object. return nil, false, true, out, lastExisting case errAlreadyDeleting: - out, err = e.finalizeDelete(in, true) + out, err = e.finalizeDelete(ctx, in, true) return err, false, false, out, lastExisting default: - return storeerr.InterpretUpdateError(err, e.QualifiedResource, name), false, false, out, lastExisting + return storeerr.InterpretUpdateError(err, e.qualifiedResourceFromContext(ctx), name), false, false, out, lastExisting } } @@ -918,10 +966,10 @@ func (e *Store) updateForGracefulDeletionAndFinalizers(ctx genericapirequest.Con // we should fall through and truly delete the object. return nil, false, true, out, lastExisting case errAlreadyDeleting: - out, err = e.finalizeDelete(in, true) + out, err = e.finalizeDelete(ctx, in, true) return err, false, false, out, lastExisting default: - return storeerr.InterpretUpdateError(err, e.QualifiedResource, name), false, false, out, lastExisting + return storeerr.InterpretUpdateError(err, e.qualifiedResourceFromContext(ctx), name), false, false, out, lastExisting } } @@ -931,10 +979,10 @@ func (e *Store) Delete(ctx genericapirequest.Context, name string, options *meta if err != nil { return nil, false, err } - obj := e.NewFunc() + qualifiedResource := e.qualifiedResourceFromContext(ctx) if err := e.Storage.Get(ctx, key, "", obj, false); err != nil { - return nil, false, storeerr.InterpretDeleteError(err, e.QualifiedResource, name) + return nil, false, storeerr.InterpretDeleteError(err, qualifiedResource, name) } // support older consumers of delete by treating "nil" as delete immediately if options == nil { @@ -950,7 +998,7 @@ func (e *Store) Delete(ctx genericapirequest.Context, name string, options *meta } // this means finalizers cannot be updated via DeleteOptions if a deletion is already pending if pendingGraceful { - out, err := e.finalizeDelete(obj, false) + out, err := e.finalizeDelete(ctx, obj, false) return out, false, err } // check if obj has pending finalizers @@ -991,12 +1039,12 @@ func (e *Store) Delete(ctx genericapirequest.Context, name string, options *meta if storage.IsNotFound(err) && ignoreNotFound && lastExisting != nil { // The lastExisting object may not be the last state of the object // before its deletion, but it's the best approximation. - out, err := e.finalizeDelete(lastExisting, true) + out, err := e.finalizeDelete(ctx, lastExisting, true) return out, true, err } - return nil, false, storeerr.InterpretDeleteError(err, e.QualifiedResource, name) + return nil, false, storeerr.InterpretDeleteError(err, qualifiedResource, name) } - out, err = e.finalizeDelete(out, true) + out, err = e.finalizeDelete(ctx, out, true) return out, true, err } @@ -1098,7 +1146,7 @@ func (e *Store) DeleteCollection(ctx genericapirequest.Context, options *metav1. // finalizeDelete runs the Store's AfterDelete hook if runHooks is set and // returns the decorated deleted object if appropriate. -func (e *Store) finalizeDelete(obj runtime.Object, runHooks bool) (runtime.Object, error) { +func (e *Store) finalizeDelete(ctx genericapirequest.Context, obj runtime.Object, runHooks bool) (runtime.Object, error) { if runHooks && e.AfterDelete != nil { if err := e.AfterDelete(obj); err != nil { return nil, err @@ -1118,10 +1166,11 @@ func (e *Store) finalizeDelete(obj runtime.Object, runHooks bool) (runtime.Objec if err != nil { return nil, err } + qualifiedResource := e.qualifiedResourceFromContext(ctx) details := &metav1.StatusDetails{ Name: accessor.GetName(), - Group: e.QualifiedResource.Group, - Kind: e.QualifiedResource.Resource, // Yes we set Kind field to resource. + Group: qualifiedResource.Group, + Kind: qualifiedResource.Resource, // Yes we set Kind field to resource. UID: accessor.GetUID(), } status := &metav1.Status{Status: metav1.StatusSuccess, Details: details} @@ -1238,17 +1287,17 @@ func (e *Store) Export(ctx genericapirequest.Context, name string, opts metav1.E // CompleteWithOptions updates the store with the provided options and // defaults common fields. func (e *Store) CompleteWithOptions(options *generic.StoreOptions) error { - if e.QualifiedResource.Empty() { + if e.DefaultQualifiedResource.Empty() { return fmt.Errorf("store %#v must have a non-empty qualified resource", e) } if e.NewFunc == nil { - return fmt.Errorf("store for %s must have NewFunc set", e.QualifiedResource.String()) + return fmt.Errorf("store for %s must have NewFunc set", e.DefaultQualifiedResource.String()) } if e.NewListFunc == nil { - return fmt.Errorf("store for %s must have NewListFunc set", e.QualifiedResource.String()) + return fmt.Errorf("store for %s must have NewListFunc set", e.DefaultQualifiedResource.String()) } if (e.KeyRootFunc == nil) != (e.KeyFunc == nil) { - return fmt.Errorf("store for %s must set both KeyRootFunc and KeyFunc or neither", e.QualifiedResource.String()) + return fmt.Errorf("store for %s must set both KeyRootFunc and KeyFunc or neither", e.DefaultQualifiedResource.String()) } var isNamespaced bool @@ -1258,15 +1307,15 @@ func (e *Store) CompleteWithOptions(options *generic.StoreOptions) error { case e.UpdateStrategy != nil: isNamespaced = e.UpdateStrategy.NamespaceScoped() default: - return fmt.Errorf("store for %s must have CreateStrategy or UpdateStrategy set", e.QualifiedResource.String()) + return fmt.Errorf("store for %s must have CreateStrategy or UpdateStrategy set", e.DefaultQualifiedResource.String()) } if e.DeleteStrategy == nil { - return fmt.Errorf("store for %s must have DeleteStrategy set", e.QualifiedResource.String()) + return fmt.Errorf("store for %s must have DeleteStrategy set", e.DefaultQualifiedResource.String()) } if options.RESTOptions == nil { - return fmt.Errorf("options for %s must have RESTOptions set", e.QualifiedResource.String()) + return fmt.Errorf("options for %s must have RESTOptions set", e.DefaultQualifiedResource.String()) } attrFunc := options.AttrFunc @@ -1287,7 +1336,7 @@ func (e *Store) CompleteWithOptions(options *generic.StoreOptions) error { } } - opts, err := options.RESTOptions.GetRESTOptions(e.QualifiedResource) + opts, err := options.RESTOptions.GetRESTOptions(e.DefaultQualifiedResource) if err != nil { return err } @@ -1298,7 +1347,7 @@ func (e *Store) CompleteWithOptions(options *generic.StoreOptions) error { prefix = "/" + prefix } if prefix == "/" { - return fmt.Errorf("store for %s has an invalid prefix %q", e.QualifiedResource.String(), opts.ResourcePrefix) + return fmt.Errorf("store for %s has an invalid prefix %q", e.DefaultQualifiedResource.String(), opts.ResourcePrefix) } // Set the default behavior for storage key generation @@ -1377,5 +1426,5 @@ func (e *Store) ConvertToTable(ctx genericapirequest.Context, object runtime.Obj if e.TableConvertor != nil { return e.TableConvertor.ConvertToTable(ctx, object, tableOptions) } - return rest.NewDefaultTableConvertor(e.QualifiedResource).ConvertToTable(ctx, object, tableOptions) + return rest.NewDefaultTableConvertor(e.qualifiedResourceFromContext(ctx)).ConvertToTable(ctx, object, tableOptions) } diff --git a/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store_test.go b/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store_test.go index fa61ac97b9d..800d1b257c4 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store_test.go +++ b/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store_test.go @@ -42,6 +42,7 @@ import ( "k8s.io/apimachinery/pkg/watch" "k8s.io/apiserver/pkg/apis/example" examplev1 "k8s.io/apiserver/pkg/apis/example/v1" + "k8s.io/apiserver/pkg/endpoints/request" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" @@ -381,6 +382,13 @@ func isInitialized(obj metav1.Object) bool { return obj.GetInitializers() == nil } +func isQualifiedResource(err error, kind, group string) bool { + if err.(errors.APIStatus).Status().Details.Kind != kind || err.(errors.APIStatus).Status().Details.Group != group { + return false + } + return true +} + func TestStoreCreateInitialized(t *testing.T) { podA := &example.Pod{ ObjectMeta: metav1.ObjectMeta{ @@ -1801,13 +1809,13 @@ func newTestGenericStoreRegistry(t *testing.T, scheme *runtime.Scheme, hasCacheE } return destroyFunc, &Store{ - Copier: scheme, - NewFunc: func() runtime.Object { return &example.Pod{} }, - NewListFunc: func() runtime.Object { return &example.PodList{} }, - QualifiedResource: example.Resource("pods"), - CreateStrategy: strategy, - UpdateStrategy: strategy, - DeleteStrategy: strategy, + Copier: scheme, + NewFunc: func() runtime.Object { return &example.Pod{} }, + NewListFunc: func() runtime.Object { return &example.PodList{} }, + DefaultQualifiedResource: example.Resource("pods"), + CreateStrategy: strategy, + UpdateStrategy: strategy, + DeleteStrategy: strategy, KeyRootFunc: func(ctx genericapirequest.Context) string { return podPrefix }, @@ -1842,7 +1850,7 @@ func TestFinalizeDelete(t *testing.T) { obj := &example.Pod{ ObjectMeta: metav1.ObjectMeta{Name: "foo", UID: "random-uid"}, } - result, err := s.finalizeDelete(obj, false) + result, err := s.finalizeDelete(genericapirequest.NewContext(), obj, false) if err != nil { t.Fatalf("unexpected err: %s", err) } @@ -1852,8 +1860,8 @@ func TestFinalizeDelete(t *testing.T) { Status: metav1.StatusSuccess, Details: &metav1.StatusDetails{ Name: "foo", - Group: s.QualifiedResource.Group, - Kind: s.QualifiedResource.Resource, + Group: s.DefaultQualifiedResource.Group, + Kind: s.DefaultQualifiedResource.Resource, UID: "random-uid", }, } @@ -1861,3 +1869,82 @@ func TestFinalizeDelete(t *testing.T) { t.Errorf("unexpected obj. expected %#v, got %#v", expectedObj, returnedObj) } } + +func fakeRequestInfo(resource, apiGroup string) *request.RequestInfo { + return &request.RequestInfo{ + IsResourceRequest: true, + Path: "/api/v1/test", + Verb: "test", + APIPrefix: "api", + APIGroup: apiGroup, + APIVersion: "v1", + Namespace: "", + Resource: resource, + Subresource: "", + Name: "", + Parts: []string{"test"}, + } +} + +func TestQualifiedResource(t *testing.T) { + podA := &example.Pod{ + ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "test"}, + Spec: example.PodSpec{NodeName: "machine"}, + } + + qualifiedKind := "pod" + qualifiedGroup := "test" + testContext := genericapirequest.WithNamespace(genericapirequest.NewContext(), "test") + testContext = genericapirequest.WithRequestInfo(testContext, fakeRequestInfo(qualifiedKind, qualifiedGroup)) + + destroyFunc, registry := NewTestGenericStoreRegistry(t) + defer destroyFunc() + + // update a non-exist object + _, _, err := registry.Update(testContext, podA.Name, rest.DefaultUpdatedObjectInfo(podA, scheme)) + if !errors.IsNotFound(err) { + t.Fatalf("Unexpected error: %v", err) + } + + if !isQualifiedResource(err, qualifiedKind, qualifiedGroup) { + t.Fatalf("Unexpected error: %#v", err) + } + + // get a non-exist object + _, err = registry.Get(testContext, podA.Name, &metav1.GetOptions{}) + + if !errors.IsNotFound(err) { + t.Fatalf("Unexpected error: %v", err) + } + + if !isQualifiedResource(err, qualifiedKind, qualifiedGroup) { + t.Fatalf("Unexpected error: %#v", err) + } + + // delete a non-exist object + _, _, err = registry.Delete(testContext, podA.Name, nil) + + if !errors.IsNotFound(err) { + t.Fatalf("Unexpected error: %v", err) + } + + if !isQualifiedResource(err, qualifiedKind, qualifiedGroup) { + t.Fatalf("Unexpected error: %#v", err) + } + + // create a non-exist object + _, err = registry.Create(testContext, podA, false) + if err != nil { + t.Fatal(err) + } + + // create a exist object will fail + _, err = registry.Create(testContext, podA, false) + if !errors.IsAlreadyExists(err) { + t.Fatalf("Unexpected error: %v", err) + } + + if !isQualifiedResource(err, qualifiedKind, qualifiedGroup) { + t.Fatalf("Unexpected error: %#v", err) + } +} diff --git a/staging/src/k8s.io/apiserver/pkg/registry/generic/rest/BUILD b/staging/src/k8s.io/apiserver/pkg/registry/generic/rest/BUILD index 6b5e59a98ce..06fb0e46e08 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/generic/rest/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/registry/generic/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "streamer_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", @@ -30,7 +27,6 @@ go_library( "response_checker.go", "streamer.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/registry/rest/BUILD b/staging/src/k8s.io/apiserver/pkg/registry/rest/BUILD index db848ab5618..3e5b4d5781d 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/rest/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/registry/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["meta_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -35,7 +32,6 @@ go_library( "update.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/registry/rest/rest.go b/staging/src/k8s.io/apiserver/pkg/registry/rest/rest.go index e7e9259a9aa..99a2fbe0f18 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/rest/rest.go +++ b/staging/src/k8s.io/apiserver/pkg/registry/rest/rest.go @@ -86,7 +86,9 @@ type Lister interface { List(ctx genericapirequest.Context, options *metainternalversion.ListOptions) (runtime.Object, error) } -// Exporter is an object that knows how to strip a RESTful resource for export +// Exporter is an object that knows how to strip a RESTful resource for export. A store should implement this interface +// if export is generally supported for that type. Errors can still be returned during the actual Export when certain +// instances of the type are not exportable. type Exporter interface { // Export an object. Fields that are not user specified (e.g. Status, ObjectMeta.ResourceVersion) are stripped out // Returns the stripped object. If 'exact' is true, fields that are specific to the cluster (e.g. namespace) are diff --git a/staging/src/k8s.io/apiserver/pkg/registry/rest/resttest/BUILD b/staging/src/k8s.io/apiserver/pkg/registry/rest/resttest/BUILD index 5a17d220ed9..75f8952f52c 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/rest/resttest/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/registry/rest/resttest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["resttest.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/server/BUILD b/staging/src/k8s.io/apiserver/pkg/server/BUILD index 3ab937e0f0a..7e3433955f0 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/server/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "genericapiserver_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", @@ -56,7 +53,6 @@ go_library( "plugins.go", "serve.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/go-systemd/daemon:go_default_library", "//vendor/github.com/emicklei/go-restful:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/server/filters/BUILD b/staging/src/k8s.io/apiserver/pkg/server/filters/BUILD index ac14d153d67..a4051a5edc3 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/filters/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/server/filters/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_test( "timeout_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -41,7 +38,6 @@ go_library( "timeout.go", "wrap.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/emicklei/go-restful:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/server/healthz/BUILD b/staging/src/k8s.io/apiserver/pkg/server/healthz/BUILD index 7cbe5d9beb5..a0c5ecadb2e 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/healthz/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/server/healthz/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["healthz_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -21,7 +18,6 @@ go_library( "doc.go", "healthz.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apiserver/pkg/server/httplog/BUILD b/staging/src/k8s.io/apiserver/pkg/server/httplog/BUILD index f4d0572e6b0..92c63dcadf6 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/httplog/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/server/httplog/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["httplog_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -21,7 +18,6 @@ go_library( "doc.go", "httplog.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/glog:go_default_library"], ) diff --git a/staging/src/k8s.io/apiserver/pkg/server/mux/BUILD b/staging/src/k8s.io/apiserver/pkg/server/mux/BUILD index 581ec8e5462..acbbf22cce3 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/mux/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/server/mux/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["pathrecorder_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], ) @@ -22,7 +19,6 @@ go_library( "doc.go", "pathrecorder.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/BUILD b/staging/src/k8s.io/apiserver/pkg/server/options/BUILD index 0c3d4fe6320..0f6d6e8c606 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/server/options/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,8 +9,8 @@ load( go_test( name = "go_default_test", srcs = ["serving_test.go"], + data = glob(["testdata/**"]), library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", @@ -40,7 +38,6 @@ go_library( "server_run_options.go", "serving.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/pborman/uuid:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/admission.go b/staging/src/k8s.io/apiserver/pkg/server/options/admission.go index 760f4fc3da7..5604681825f 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/admission.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/admission.go @@ -89,3 +89,8 @@ func (a *AdmissionOptions) ApplyTo(serverCfg *server.Config, pluginInitializers serverCfg.AdmissionControl = admissionChain return nil } + +func (a *AdmissionOptions) Validate() []error { + errs := []error{} + return errs +} diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/encryptionconfig/BUILD b/staging/src/k8s.io/apiserver/pkg/server/options/encryptionconfig/BUILD index f47fce7e959..442550bb97f 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/encryptionconfig/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/server/options/encryptionconfig/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "plugins.go", "types.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/github.com/golang/glog:go_default_library", @@ -32,7 +29,6 @@ go_test( name = "go_default_test", srcs = ["encryptionconfig_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/value:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/feature.go b/staging/src/k8s.io/apiserver/pkg/server/options/feature.go index d99a73495ff..cd62c7c67f7 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/feature.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/feature.go @@ -55,3 +55,8 @@ func (o *FeatureOptions) ApplyTo(c *server.Config) error { return nil } + +func (o *FeatureOptions) Validate() []error { + errs := []error{} + return errs +} diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go b/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go index 92ec3e8e22f..a0efcb49a52 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go @@ -77,3 +77,15 @@ func (o *RecommendedOptions) ApplyTo(config *server.Config) error { return nil } + +func (o *RecommendedOptions) Validate() []error { + errors := []error{} + errors = append(errors, o.Etcd.Validate()...) + errors = append(errors, o.SecureServing.Validate()...) + errors = append(errors, o.Authentication.Validate()...) + errors = append(errors, o.Authorization.Validate()...) + errors = append(errors, o.Audit.Validate()...) + errors = append(errors, o.Features.Validate()...) + + return errors +} diff --git a/staging/src/k8s.io/apiserver/pkg/server/routes/BUILD b/staging/src/k8s.io/apiserver/pkg/server/routes/BUILD index 127954d2f4b..bf0f862403a 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/routes/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/server/routes/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "swaggerui.go", "version.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/elazarl/go-bindata-assetfs:go_default_library", "//vendor/github.com/emicklei/go-restful:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/server/routes/data/swagger/BUILD b/staging/src/k8s.io/apiserver/pkg/server/routes/data/swagger/BUILD index 785a73744d3..1b6d661a2e6 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/routes/data/swagger/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/server/routes/data/swagger/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["datafile.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apiserver/pkg/server/storage/BUILD b/staging/src/k8s.io/apiserver/pkg/server/storage/BUILD index 699e4ca3348..18b12853c09 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/storage/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/server/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "storage_factory_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", @@ -39,7 +36,6 @@ go_library( "storage_codec.go", "storage_factory.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/storage/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/BUILD index a8f485b331a..c8ea98ab703 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_test( "watch_cache_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", @@ -50,7 +47,6 @@ go_library( "util.go", "watch_cache.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/storage/errors/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/errors/BUILD index dd618740b29..41f19e21bc1 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/errors/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/errors/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "storage.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/storage/etcd/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/etcd/BUILD index bce7125b7f0..c1f36633edc 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/etcd/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/etcd/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "etcd_watcher_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/client:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", @@ -49,7 +46,6 @@ go_library( "etcd_helper.go", "etcd_watcher.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/client:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/storage/etcd/etcdtest/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/etcd/etcdtest/BUILD index 4a0207e32b0..cd32ea1a4cf 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/etcd/etcdtest/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/etcd/etcdtest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "etcdtest.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apiserver/pkg/storage/etcd/metrics/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/etcd/metrics/BUILD index afa45b34f36..b9badf163a2 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/etcd/metrics/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/etcd/metrics/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["metrics.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/prometheus/client_golang/prometheus:go_default_library"], ) diff --git a/staging/src/k8s.io/apiserver/pkg/storage/etcd/testing/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/etcd/testing/BUILD index 00f126dfb2a..0f089ee9b48 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/etcd/testing/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/etcd/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["utils.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/client:go_default_library", "//vendor/github.com/coreos/etcd/clientv3:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/storage/etcd/testing/testingcert/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/etcd/testing/testingcert/BUILD index 74c28551b8b..910ddd53711 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/etcd/testing/testingcert/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/etcd/testing/testingcert/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["certificates.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apiserver/pkg/storage/etcd/util/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/etcd/util/BUILD index b8f79fe2f7f..935b7faebcf 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/etcd/util/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/etcd/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["etcd_util_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/client:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", @@ -25,7 +22,6 @@ go_library( "doc.go", "etcd_util.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/coreos/etcd/client:go_default_library"], ) diff --git a/staging/src/k8s.io/apiserver/pkg/storage/etcd3/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/etcd3/BUILD index 34a77665fdf..51496d936e1 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/etcd3/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/etcd3/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "watcher_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/clientv3:go_default_library", "//vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes:go_default_library", @@ -48,7 +45,6 @@ go_library( "store.go", "watcher.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/clientv3:go_default_library", "//vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/storage/etcd3/preflight/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/etcd3/preflight/BUILD index 77c42c7d053..b1392aa408d 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/etcd3/preflight/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/etcd3/preflight/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,14 +9,12 @@ load( go_library( name = "go_default_library", srcs = ["checks.go"], - tags = ["automanaged"], ) go_test( name = "go_default_test", srcs = ["checks_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library"], ) diff --git a/staging/src/k8s.io/apiserver/pkg/storage/names/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/names/BUILD index 3ae8dbfd393..88ee18bb157 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/names/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/names/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["generate_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["generate.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/util/rand:go_default_library"], ) diff --git a/staging/src/k8s.io/apiserver/pkg/storage/storagebackend/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/storagebackend/BUILD index e5989675a02..1609b74c2b9 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/storagebackend/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/storagebackend/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["config.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/value:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/storage/storagebackend/factory/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/storagebackend/factory/BUILD index af489d57dd8..38f9bb64105 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/storagebackend/factory/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/storagebackend/factory/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["tls_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/integration:go_default_library", "//vendor/github.com/coreos/etcd/pkg/transport:go_default_library", @@ -35,7 +32,6 @@ go_library( "etcd3.go", "factory.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/client:go_default_library", "//vendor/github.com/coreos/etcd/clientv3:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/storage/testing/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/testing/BUILD index 64c93ef7e75..45c465a4f81 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/testing/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "utils.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/ugorji/go/codec:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/storage/tests/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/tests/BUILD index 10f83fc54c0..7299f0438b4 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/tests/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/tests/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["cacher_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/context:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", @@ -41,7 +38,6 @@ go_test( go_library( name = "go_default_library", srcs = ["utils.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/apis/example:go_default_library"], ) diff --git a/staging/src/k8s.io/apiserver/pkg/storage/value/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/value/BUILD index 89b52f15592..0933e97415b 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/value/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/value/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["transformer_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["transformer.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/aes/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/aes/BUILD index efefabb1acf..430d6438de9 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/aes/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/aes/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,12 @@ go_test( name = "go_default_test", srcs = ["aes_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/storage/value:go_default_library"], ) go_library( name = "go_default_library", srcs = ["aes.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/storage/value:go_default_library"], ) diff --git a/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/BUILD index bf2f85cca56..3d45be121cf 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["envelope.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/hashicorp/golang-lru:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/value:go_default_library", @@ -22,7 +19,6 @@ go_test( name = "go_default_test", srcs = ["envelope_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/storage/value:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/value/encrypt/aes:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/identity/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/identity/BUILD index 2d12da38202..57040228990 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/identity/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/identity/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["identity.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/storage/value:go_default_library"], ) diff --git a/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/secretbox/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/secretbox/BUILD index 745542e14ff..79308921a35 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/secretbox/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/secretbox/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,12 @@ go_test( name = "go_default_test", srcs = ["secretbox_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/storage/value:go_default_library"], ) go_library( name = "go_default_library", srcs = ["secretbox.go"], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/crypto/nacl/secretbox:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/value:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/util/feature/BUILD b/staging/src/k8s.io/apiserver/pkg/util/feature/BUILD index da7d815abb9..582bf86bd58 100644 --- a/staging/src/k8s.io/apiserver/pkg/util/feature/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/util/feature/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,12 @@ go_test( name = "go_default_test", srcs = ["feature_gate_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/github.com/spf13/pflag:go_default_library"], ) go_library( name = "go_default_library", srcs = ["feature_gate.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/util/flag/BUILD b/staging/src/k8s.io/apiserver/pkg/util/flag/BUILD index 6cf46b7ae9f..83a353d935d 100644 --- a/staging/src/k8s.io/apiserver/pkg/util/flag/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/util/flag/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["namedcertkey_flag_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/github.com/spf13/pflag:go_default_library"], ) @@ -25,7 +22,6 @@ go_library( "string_flag.go", "tristate.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/util/flushwriter/BUILD b/staging/src/k8s.io/apiserver/pkg/util/flushwriter/BUILD index bef30aa9dfb..5e62223522d 100644 --- a/staging/src/k8s.io/apiserver/pkg/util/flushwriter/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/util/flushwriter/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["writer_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -21,7 +18,6 @@ go_library( "doc.go", "writer.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apiserver/pkg/util/logs/BUILD b/staging/src/k8s.io/apiserver/pkg/util/logs/BUILD index 24d392a4862..08392d469d0 100644 --- a/staging/src/k8s.io/apiserver/pkg/util/logs/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/util/logs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["logs.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/util/proxy/BUILD b/staging/src/k8s.io/apiserver/pkg/util/proxy/BUILD index 050581f07eb..b411276dab2 100644 --- a/staging/src/k8s.io/apiserver/pkg/util/proxy/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/util/proxy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["proxy_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -25,7 +22,6 @@ go_test( go_library( name = "go_default_library", srcs = ["proxy.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/util/trace/BUILD b/staging/src/k8s.io/apiserver/pkg/util/trace/BUILD index 8bf4aac38a4..89cc2f56925 100644 --- a/staging/src/k8s.io/apiserver/pkg/util/trace/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/util/trace/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["trace.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/glog:go_default_library"], ) diff --git a/staging/src/k8s.io/apiserver/pkg/util/webhook/BUILD b/staging/src/k8s.io/apiserver/pkg/util/webhook/BUILD index b371660f6b5..91689975615 100644 --- a/staging/src/k8s.io/apiserver/pkg/util/webhook/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/util/webhook/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["webhook.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", @@ -31,7 +28,6 @@ go_test( "webhook_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/util/wsstream/BUILD b/staging/src/k8s.io/apiserver/pkg/util/wsstream/BUILD index 385016536a4..da0546b3a44 100644 --- a/staging/src/k8s.io/apiserver/pkg/util/wsstream/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/util/wsstream/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "stream_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/golang.org/x/net/websocket:go_default_library"], ) @@ -26,7 +23,6 @@ go_library( "doc.go", "stream.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/golang.org/x/net/websocket:go_default_library", diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/audit/BUILD b/staging/src/k8s.io/apiserver/plugin/pkg/audit/BUILD index fe0e008d10d..e4d6e83958e 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/audit/BUILD +++ b/staging/src/k8s.io/apiserver/plugin/pkg/audit/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/audit/log/BUILD b/staging/src/k8s.io/apiserver/plugin/pkg/audit/log/BUILD index 32c12d180c8..2c038e88226 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/audit/log/BUILD +++ b/staging/src/k8s.io/apiserver/plugin/pkg/audit/log/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["backend.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apiserver/pkg/apis/audit:go_default_library", diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/audit/webhook/BUILD b/staging/src/k8s.io/apiserver/plugin/pkg/audit/webhook/BUILD index 11893b0b526..3fc7cd48af5 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/audit/webhook/BUILD +++ b/staging/src/k8s.io/apiserver/plugin/pkg/audit/webhook/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["webhook_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", @@ -28,7 +25,6 @@ go_test( go_library( name = "go_default_library", srcs = ["webhook.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/BUILD b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/BUILD index 256e29292c7..20838b6181a 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/BUILD +++ b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/password/BUILD b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/password/BUILD index 0b98a9cd9a7..3721a3d5695 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/password/BUILD +++ b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/password/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/password/allow/BUILD b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/password/allow/BUILD index 50384195940..d80a6fe7120 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/password/allow/BUILD +++ b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/password/allow/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["allow_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["allow.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/password/keystone/BUILD b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/password/keystone/BUILD index f0c9a280458..b25b06144f4 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/password/keystone/BUILD +++ b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/password/keystone/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "keystone.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/gophercloud/gophercloud:go_default_library", diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/password/passwordfile/BUILD b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/password/passwordfile/BUILD index 32724a8e8fd..667355f60c5 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/password/passwordfile/BUILD +++ b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/password/passwordfile/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,12 @@ go_test( name = "go_default_test", srcs = ["passwordfile_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library"], ) go_library( name = "go_default_library", srcs = ["passwordfile.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/request/basicauth/BUILD b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/request/basicauth/BUILD index fc7366015a9..087b6df169f 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/request/basicauth/BUILD +++ b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/request/basicauth/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["basicauth_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", @@ -22,7 +19,6 @@ go_test( go_library( name = "go_default_library", srcs = ["basicauth.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/BUILD b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/BUILD index ea95b492396..8bbb5ceccea 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/BUILD +++ b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["oidc_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/go-oidc/jose:go_default_library", "//vendor/github.com/coreos/go-oidc/oidc:go_default_library", @@ -24,7 +21,6 @@ go_test( go_library( name = "go_default_library", srcs = ["oidc.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/go-oidc/jose:go_default_library", "//vendor/github.com/coreos/go-oidc/oidc:go_default_library", diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/testing/BUILD b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/testing/BUILD index 67cf5c04084..06edbb1c5e7 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/testing/BUILD +++ b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["provider.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/go-oidc/jose:go_default_library", "//vendor/github.com/coreos/go-oidc/key:go_default_library", diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/tokentest/BUILD b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/tokentest/BUILD index 3ee0258cdf9..7c579805ef0 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/tokentest/BUILD +++ b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/tokentest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["tokentest.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library"], ) diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook/BUILD b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook/BUILD index f3afa8f9f6d..75718d6ee8c 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook/BUILD +++ b/staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "webhook_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/authentication/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -27,7 +24,6 @@ go_test( go_library( name = "go_default_library", srcs = ["webhook.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/authentication/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/authorizer/webhook/BUILD b/staging/src/k8s.io/apiserver/plugin/pkg/authorizer/webhook/BUILD index 796283b7f73..92d2a388fb1 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/authorizer/webhook/BUILD +++ b/staging/src/k8s.io/apiserver/plugin/pkg/authorizer/webhook/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "webhook_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/authorization/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -29,7 +26,6 @@ go_test( go_library( name = "go_default_library", srcs = ["webhook.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/authorization/v1beta1:go_default_library", diff --git a/staging/src/k8s.io/client-go/Godeps/Godeps.json b/staging/src/k8s.io/client-go/Godeps/Godeps.json index 25134d60444..c72a9d07672 100644 --- a/staging/src/k8s.io/client-go/Godeps/Godeps.json +++ b/staging/src/k8s.io/client-go/Godeps/Godeps.json @@ -154,10 +154,6 @@ "ImportPath": "github.com/golang/protobuf/ptypes/timestamp", "Rev": "4bd1920723d7b7c925de087aa32e2187708897f7" }, - { - "ImportPath": "github.com/google/btree", - "Rev": "7d79101e329e5a3adf994758c578dab82b90c017" - }, { "ImportPath": "github.com/google/gofuzz", "Rev": "44d81051d367757e1c7c6a5a86423ece9afcf63c" @@ -175,12 +171,32 @@ "Rev": "0c5108395e2debce0d731cf0287ddf7242066aba" }, { - "ImportPath": "github.com/gregjones/httpcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" + "ImportPath": "github.com/gophercloud/gophercloud", + "Rev": "ed590d9afe113c6107cd60717b196155e6579e78" }, { - "ImportPath": "github.com/gregjones/httpcache/diskcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" + "ImportPath": "github.com/gophercloud/gophercloud/openstack", + "Rev": "ed590d9afe113c6107cd60717b196155e6579e78" + }, + { + "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v2/tenants", + "Rev": "ed590d9afe113c6107cd60717b196155e6579e78" + }, + { + "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens", + "Rev": "ed590d9afe113c6107cd60717b196155e6579e78" + }, + { + "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v3/tokens", + "Rev": "ed590d9afe113c6107cd60717b196155e6579e78" + }, + { + "ImportPath": "github.com/gophercloud/gophercloud/openstack/utils", + "Rev": "ed590d9afe113c6107cd60717b196155e6579e78" + }, + { + "ImportPath": "github.com/gophercloud/gophercloud/pagination", + "Rev": "ed590d9afe113c6107cd60717b196155e6579e78" }, { "ImportPath": "github.com/hashicorp/golang-lru", @@ -218,10 +234,6 @@ "ImportPath": "github.com/mailru/easyjson/jwriter", "Rev": "d5b7844b561a7bc640052f1b935f7b800330d7e0" }, - { - "ImportPath": "github.com/peterbourgon/diskv", - "Rev": "5dfcb07a075adbaaa4094cddfd160b1e1c77a043" - }, { "ImportPath": "github.com/pmezard/go-difflib/difflib", "Rev": "d8ed2627bdf02c080bf22230dbb337003b7aba2d" diff --git a/staging/src/k8s.io/client-go/discovery/BUILD b/staging/src/k8s.io/client-go/discovery/BUILD index 7e7a0618aff..81135dded85 100644 --- a/staging/src/k8s.io/client-go/discovery/BUILD +++ b/staging/src/k8s.io/client-go/discovery/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "restmapper.go", "unstructured.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/emicklei/go-restful-swagger12:go_default_library", "//vendor/github.com/golang/glog:go_default_library", @@ -43,7 +40,6 @@ go_test( "helper_blackbox_test.go", "restmapper_test.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/emicklei/go-restful-swagger12:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", diff --git a/staging/src/k8s.io/client-go/discovery/cached/BUILD b/staging/src/k8s.io/client-go/discovery/cached/BUILD index b67906b9394..a1d030d4de4 100644 --- a/staging/src/k8s.io/client-go/discovery/cached/BUILD +++ b/staging/src/k8s.io/client-go/discovery/cached/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["memcache_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/client-go/discovery/fake:go_default_library", @@ -22,7 +19,6 @@ go_test( go_library( name = "go_default_library", srcs = ["memcache.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/emicklei/go-restful-swagger12:go_default_library", "//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library", diff --git a/staging/src/k8s.io/client-go/discovery/discovery_client.go b/staging/src/k8s.io/client-go/discovery/discovery_client.go index 26f7e01c749..59c69680980 100644 --- a/staging/src/k8s.io/client-go/discovery/discovery_client.go +++ b/staging/src/k8s.io/client-go/discovery/discovery_client.go @@ -423,7 +423,7 @@ func NewDiscoveryClientForConfig(c *restclient.Config) (*DiscoveryClient, error) return &DiscoveryClient{restClient: client, LegacyPrefix: "/api"}, err } -// NewDiscoveryClientForConfig creates a new DiscoveryClient for the given config. If +// NewDiscoveryClientForConfigOrDie creates a new DiscoveryClient for the given config. If // there is an error, it panics. func NewDiscoveryClientForConfigOrDie(c *restclient.Config) *DiscoveryClient { client, err := NewDiscoveryClientForConfig(c) @@ -434,7 +434,7 @@ func NewDiscoveryClientForConfigOrDie(c *restclient.Config) *DiscoveryClient { } -// New creates a new DiscoveryClient for the given RESTClient. +// NewDiscoveryClient returns a new DiscoveryClient for the given RESTClient. func NewDiscoveryClient(c restclient.Interface) *DiscoveryClient { return &DiscoveryClient{restClient: c, LegacyPrefix: "/api"} } diff --git a/staging/src/k8s.io/client-go/discovery/fake/BUILD b/staging/src/k8s.io/client-go/discovery/fake/BUILD index df523bb1d42..ac28a2244a7 100644 --- a/staging/src/k8s.io/client-go/discovery/fake/BUILD +++ b/staging/src/k8s.io/client-go/discovery/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["discovery.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/emicklei/go-restful-swagger12:go_default_library", "//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library", diff --git a/staging/src/k8s.io/client-go/dynamic/BUILD b/staging/src/k8s.io/client-go/dynamic/BUILD index 033b61aa3d2..788462039df 100644 --- a/staging/src/k8s.io/client-go/dynamic/BUILD +++ b/staging/src/k8s.io/client-go/dynamic/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "dynamic_util_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", @@ -36,7 +33,6 @@ go_library( "client_pool.go", "dynamic_util.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", diff --git a/staging/src/k8s.io/client-go/dynamic/fake/BUILD b/staging/src/k8s.io/client-go/dynamic/fake/BUILD index c66f13a9e21..9c281e0411e 100644 --- a/staging/src/k8s.io/client-go/dynamic/fake/BUILD +++ b/staging/src/k8s.io/client-go/dynamic/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "client.go", "client_pool.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", diff --git a/staging/src/k8s.io/client-go/examples/create-update-delete-deployment/BUILD b/staging/src/k8s.io/client-go/examples/create-update-delete-deployment/BUILD index 1c2cee6838e..891f853077f 100644 --- a/staging/src/k8s.io/client-go/examples/create-update-delete-deployment/BUILD +++ b/staging/src/k8s.io/client-go/examples/create-update-delete-deployment/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "create-update-delete-deployment", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/apps/v1beta1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/examples/in-cluster-client-configuration/BUILD b/staging/src/k8s.io/client-go/examples/in-cluster-client-configuration/BUILD index 1437159514e..0cfa979e0eb 100644 --- a/staging/src/k8s.io/client-go/examples/in-cluster-client-configuration/BUILD +++ b/staging/src/k8s.io/client-go/examples/in-cluster-client-configuration/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "in-cluster-client-configuration", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/examples/out-of-cluster-client-configuration/BUILD b/staging/src/k8s.io/client-go/examples/out-of-cluster-client-configuration/BUILD index 5f10df3179c..f502df56a30 100644 --- a/staging/src/k8s.io/client-go/examples/out-of-cluster-client-configuration/BUILD +++ b/staging/src/k8s.io/client-go/examples/out-of-cluster-client-configuration/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "out-of-cluster-client-configuration", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/examples/workqueue/BUILD b/staging/src/k8s.io/client-go/examples/workqueue/BUILD index e92b4ced046..9d539cdb449 100644 --- a/staging/src/k8s.io/client-go/examples/workqueue/BUILD +++ b/staging/src/k8s.io/client-go/examples/workqueue/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "workqueue", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/BUILD b/staging/src/k8s.io/client-go/informers/BUILD index 8a757b8c4e3..f796eda8655 100644 --- a/staging/src/k8s.io/client-go/informers/BUILD +++ b/staging/src/k8s.io/client-go/informers/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "factory.go", "generic.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", "//vendor/k8s.io/api/apps/v1beta1:go_default_library", @@ -27,6 +24,7 @@ go_library( "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", "//vendor/k8s.io/api/networking/v1:go_default_library", "//vendor/k8s.io/api/policy/v1beta1:go_default_library", + "//vendor/k8s.io/api/rbac/v1:go_default_library", "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/admissionregistration/BUILD b/staging/src/k8s.io/client-go/informers/admissionregistration/BUILD index f4089a21d93..28360513098 100644 --- a/staging/src/k8s.io/client-go/informers/admissionregistration/BUILD +++ b/staging/src/k8s.io/client-go/informers/admissionregistration/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1:go_default_library", "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/admissionregistration/v1alpha1/BUILD b/staging/src/k8s.io/client-go/informers/admissionregistration/v1alpha1/BUILD index 30d853e7230..8f405a3a5a8 100644 --- a/staging/src/k8s.io/client-go/informers/admissionregistration/v1alpha1/BUILD +++ b/staging/src/k8s.io/client-go/informers/admissionregistration/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "initializerconfiguration.go", "interface.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/apps/BUILD b/staging/src/k8s.io/client-go/informers/apps/BUILD index b1549ec1ece..f7c0d1151dc 100644 --- a/staging/src/k8s.io/client-go/informers/apps/BUILD +++ b/staging/src/k8s.io/client-go/informers/apps/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/client-go/informers/apps/v1beta1:go_default_library", "//vendor/k8s.io/client-go/informers/apps/v1beta2:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/apps/v1beta1/BUILD b/staging/src/k8s.io/client-go/informers/apps/v1beta1/BUILD index 5843df8f28f..c6eaee5e3ab 100644 --- a/staging/src/k8s.io/client-go/informers/apps/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/informers/apps/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "interface.go", "statefulset.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/apps/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/apps/v1beta2/BUILD b/staging/src/k8s.io/client-go/informers/apps/v1beta2/BUILD index 88d2a7608d6..9cbb3e30285 100644 --- a/staging/src/k8s.io/client-go/informers/apps/v1beta2/BUILD +++ b/staging/src/k8s.io/client-go/informers/apps/v1beta2/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "replicaset.go", "statefulset.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/apps/v1beta2:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/autoscaling/BUILD b/staging/src/k8s.io/client-go/informers/autoscaling/BUILD index 56f092d18ca..4169b35026d 100644 --- a/staging/src/k8s.io/client-go/informers/autoscaling/BUILD +++ b/staging/src/k8s.io/client-go/informers/autoscaling/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/client-go/informers/autoscaling/v1:go_default_library", "//vendor/k8s.io/client-go/informers/autoscaling/v2alpha1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/autoscaling/v1/BUILD b/staging/src/k8s.io/client-go/informers/autoscaling/v1/BUILD index cac296b69aa..b9b49874398 100644 --- a/staging/src/k8s.io/client-go/informers/autoscaling/v1/BUILD +++ b/staging/src/k8s.io/client-go/informers/autoscaling/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "horizontalpodautoscaler.go", "interface.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/autoscaling/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/autoscaling/v2alpha1/BUILD b/staging/src/k8s.io/client-go/informers/autoscaling/v2alpha1/BUILD index 7466c8ea9a0..f28447c3934 100644 --- a/staging/src/k8s.io/client-go/informers/autoscaling/v2alpha1/BUILD +++ b/staging/src/k8s.io/client-go/informers/autoscaling/v2alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "horizontalpodautoscaler.go", "interface.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/autoscaling/v2alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/batch/BUILD b/staging/src/k8s.io/client-go/informers/batch/BUILD index d87f565e950..90335d5c03d 100644 --- a/staging/src/k8s.io/client-go/informers/batch/BUILD +++ b/staging/src/k8s.io/client-go/informers/batch/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/client-go/informers/batch/v1:go_default_library", "//vendor/k8s.io/client-go/informers/batch/v2alpha1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/batch/v1/BUILD b/staging/src/k8s.io/client-go/informers/batch/v1/BUILD index 63ee55a14c1..b5c3bcd56c2 100644 --- a/staging/src/k8s.io/client-go/informers/batch/v1/BUILD +++ b/staging/src/k8s.io/client-go/informers/batch/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "interface.go", "job.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/batch/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/batch/v2alpha1/BUILD b/staging/src/k8s.io/client-go/informers/batch/v2alpha1/BUILD index 57c8a5bf5de..74c94faea84 100644 --- a/staging/src/k8s.io/client-go/informers/batch/v2alpha1/BUILD +++ b/staging/src/k8s.io/client-go/informers/batch/v2alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "cronjob.go", "interface.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/certificates/BUILD b/staging/src/k8s.io/client-go/informers/certificates/BUILD index 0942b60098a..d87e8883afd 100644 --- a/staging/src/k8s.io/client-go/informers/certificates/BUILD +++ b/staging/src/k8s.io/client-go/informers/certificates/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/client-go/informers/certificates/v1beta1:go_default_library", "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/certificates/v1beta1/BUILD b/staging/src/k8s.io/client-go/informers/certificates/v1beta1/BUILD index b437158d7e1..eee6b25088d 100644 --- a/staging/src/k8s.io/client-go/informers/certificates/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/informers/certificates/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "certificatesigningrequest.go", "interface.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/core/BUILD b/staging/src/k8s.io/client-go/informers/core/BUILD index 6d28684cb01..1b4345ea631 100644 --- a/staging/src/k8s.io/client-go/informers/core/BUILD +++ b/staging/src/k8s.io/client-go/informers/core/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/client-go/informers/core/v1:go_default_library", "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/core/v1/BUILD b/staging/src/k8s.io/client-go/informers/core/v1/BUILD index e920eb86864..697caaf139c 100644 --- a/staging/src/k8s.io/client-go/informers/core/v1/BUILD +++ b/staging/src/k8s.io/client-go/informers/core/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -28,7 +26,6 @@ go_library( "service.go", "serviceaccount.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/extensions/BUILD b/staging/src/k8s.io/client-go/informers/extensions/BUILD index d6787769193..214883a11bf 100644 --- a/staging/src/k8s.io/client-go/informers/extensions/BUILD +++ b/staging/src/k8s.io/client-go/informers/extensions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/client-go/informers/extensions/v1beta1:go_default_library", "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/extensions/v1beta1/BUILD b/staging/src/k8s.io/client-go/informers/extensions/v1beta1/BUILD index 8d2cd9a605a..195f023eadf 100644 --- a/staging/src/k8s.io/client-go/informers/extensions/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/informers/extensions/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "replicaset.go", "thirdpartyresource.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/generic.go b/staging/src/k8s.io/client-go/informers/generic.go index dd41f2df0c1..2a0096e2d32 100644 --- a/staging/src/k8s.io/client-go/informers/generic.go +++ b/staging/src/k8s.io/client-go/informers/generic.go @@ -32,6 +32,7 @@ import ( extensions_v1beta1 "k8s.io/api/extensions/v1beta1" networking_v1 "k8s.io/api/networking/v1" policy_v1beta1 "k8s.io/api/policy/v1beta1" + rbac_v1 "k8s.io/api/rbac/v1" rbac_v1alpha1 "k8s.io/api/rbac/v1alpha1" rbac_v1beta1 "k8s.io/api/rbac/v1beta1" scheduling_v1alpha1 "k8s.io/api/scheduling/v1alpha1" @@ -168,6 +169,16 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource case policy_v1beta1.SchemeGroupVersion.WithResource("poddisruptionbudgets"): return &genericInformer{resource: resource.GroupResource(), informer: f.Policy().V1beta1().PodDisruptionBudgets().Informer()}, nil + // Group=Rbac, Version=V1 + case rbac_v1.SchemeGroupVersion.WithResource("clusterroles"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1().ClusterRoles().Informer()}, nil + case rbac_v1.SchemeGroupVersion.WithResource("clusterrolebindings"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1().ClusterRoleBindings().Informer()}, nil + case rbac_v1.SchemeGroupVersion.WithResource("roles"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1().Roles().Informer()}, nil + case rbac_v1.SchemeGroupVersion.WithResource("rolebindings"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1().RoleBindings().Informer()}, nil + // Group=Rbac, Version=V1alpha1 case rbac_v1alpha1.SchemeGroupVersion.WithResource("clusterroles"): return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1alpha1().ClusterRoles().Informer()}, nil diff --git a/staging/src/k8s.io/client-go/informers/internalinterfaces/BUILD b/staging/src/k8s.io/client-go/informers/internalinterfaces/BUILD index 701bea76011..1f3323abcce 100644 --- a/staging/src/k8s.io/client-go/informers/internalinterfaces/BUILD +++ b/staging/src/k8s.io/client-go/informers/internalinterfaces/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["factory_interfaces.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/networking/BUILD b/staging/src/k8s.io/client-go/informers/networking/BUILD index d5575b74246..89809fa6c34 100644 --- a/staging/src/k8s.io/client-go/informers/networking/BUILD +++ b/staging/src/k8s.io/client-go/informers/networking/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", "//vendor/k8s.io/client-go/informers/networking/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/networking/v1/BUILD b/staging/src/k8s.io/client-go/informers/networking/v1/BUILD index d506008003d..43d2bbf8375 100644 --- a/staging/src/k8s.io/client-go/informers/networking/v1/BUILD +++ b/staging/src/k8s.io/client-go/informers/networking/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "interface.go", "networkpolicy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/networking/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/policy/BUILD b/staging/src/k8s.io/client-go/informers/policy/BUILD index f3260390635..66dc7d48b7b 100644 --- a/staging/src/k8s.io/client-go/informers/policy/BUILD +++ b/staging/src/k8s.io/client-go/informers/policy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", "//vendor/k8s.io/client-go/informers/policy/v1beta1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/policy/v1beta1/BUILD b/staging/src/k8s.io/client-go/informers/policy/v1beta1/BUILD index 389d6de73c8..a1d03643232 100644 --- a/staging/src/k8s.io/client-go/informers/policy/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/informers/policy/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "interface.go", "poddisruptionbudget.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/policy/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/rbac/BUILD b/staging/src/k8s.io/client-go/informers/rbac/BUILD index 0da9a778ee8..107e22b2d02 100644 --- a/staging/src/k8s.io/client-go/informers/rbac/BUILD +++ b/staging/src/k8s.io/client-go/informers/rbac/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,9 +8,9 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//vendor/k8s.io/client-go/informers/rbac/v1:go_default_library", "//vendor/k8s.io/client-go/informers/rbac/v1alpha1:go_default_library", "//vendor/k8s.io/client-go/informers/rbac/v1beta1:go_default_library", ], @@ -29,6 +27,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//staging/src/k8s.io/client-go/informers/rbac/v1:all-srcs", "//staging/src/k8s.io/client-go/informers/rbac/v1alpha1:all-srcs", "//staging/src/k8s.io/client-go/informers/rbac/v1beta1:all-srcs", ], diff --git a/staging/src/k8s.io/client-go/informers/rbac/interface.go b/staging/src/k8s.io/client-go/informers/rbac/interface.go index 5bd1f29d95d..dfa6fcb4c89 100644 --- a/staging/src/k8s.io/client-go/informers/rbac/interface.go +++ b/staging/src/k8s.io/client-go/informers/rbac/interface.go @@ -20,12 +20,15 @@ package rbac import ( internalinterfaces "k8s.io/client-go/informers/internalinterfaces" + v1 "k8s.io/client-go/informers/rbac/v1" v1alpha1 "k8s.io/client-go/informers/rbac/v1alpha1" v1beta1 "k8s.io/client-go/informers/rbac/v1beta1" ) // Interface provides access to each of this group's versions. type Interface interface { + // V1 provides access to shared informers for resources in V1. + V1() v1.Interface // V1alpha1 provides access to shared informers for resources in V1alpha1. V1alpha1() v1alpha1.Interface // V1beta1 provides access to shared informers for resources in V1beta1. @@ -41,6 +44,11 @@ func New(f internalinterfaces.SharedInformerFactory) Interface { return &group{f} } +// V1 returns a new v1.Interface. +func (g *group) V1() v1.Interface { + return v1.New(g.SharedInformerFactory) +} + // V1alpha1 returns a new v1alpha1.Interface. func (g *group) V1alpha1() v1alpha1.Interface { return v1alpha1.New(g.SharedInformerFactory) diff --git a/staging/src/k8s.io/client-go/informers/rbac/v1/BUILD b/staging/src/k8s.io/client-go/informers/rbac/v1/BUILD new file mode 100644 index 00000000000..6a5ef536f0f --- /dev/null +++ b/staging/src/k8s.io/client-go/informers/rbac/v1/BUILD @@ -0,0 +1,40 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = [ + "clusterrole.go", + "clusterrolebinding.go", + "interface.go", + "role.go", + "rolebinding.go", + ], + deps = [ + "//vendor/k8s.io/api/rbac/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", + "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/listers/rbac/v1:go_default_library", + "//vendor/k8s.io/client-go/tools/cache:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/staging/src/k8s.io/client-go/informers/rbac/v1/clusterrole.go b/staging/src/k8s.io/client-go/informers/rbac/v1/clusterrole.go new file mode 100644 index 00000000000..1d1f9340425 --- /dev/null +++ b/staging/src/k8s.io/client-go/informers/rbac/v1/clusterrole.go @@ -0,0 +1,73 @@ +/* +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. +*/ + +// This file was automatically generated by informer-gen + +package v1 + +import ( + rbac_v1 "k8s.io/api/rbac/v1" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" + kubernetes "k8s.io/client-go/kubernetes" + v1 "k8s.io/client-go/listers/rbac/v1" + cache "k8s.io/client-go/tools/cache" + time "time" +) + +// ClusterRoleInformer provides access to a shared informer and lister for +// ClusterRoles. +type ClusterRoleInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1.ClusterRoleLister +} + +type clusterRoleInformer struct { + factory internalinterfaces.SharedInformerFactory +} + +// NewClusterRoleInformer constructs a new informer for ClusterRole type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewClusterRoleInformer(client kubernetes.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + return client.RbacV1().ClusterRoles().List(options) + }, + WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + return client.RbacV1().ClusterRoles().Watch(options) + }, + }, + &rbac_v1.ClusterRole{}, + resyncPeriod, + indexers, + ) +} + +func defaultClusterRoleInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewClusterRoleInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) +} + +func (f *clusterRoleInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&rbac_v1.ClusterRole{}, defaultClusterRoleInformer) +} + +func (f *clusterRoleInformer) Lister() v1.ClusterRoleLister { + return v1.NewClusterRoleLister(f.Informer().GetIndexer()) +} diff --git a/staging/src/k8s.io/client-go/informers/rbac/v1/clusterrolebinding.go b/staging/src/k8s.io/client-go/informers/rbac/v1/clusterrolebinding.go new file mode 100644 index 00000000000..1c8cdda8965 --- /dev/null +++ b/staging/src/k8s.io/client-go/informers/rbac/v1/clusterrolebinding.go @@ -0,0 +1,73 @@ +/* +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. +*/ + +// This file was automatically generated by informer-gen + +package v1 + +import ( + rbac_v1 "k8s.io/api/rbac/v1" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" + kubernetes "k8s.io/client-go/kubernetes" + v1 "k8s.io/client-go/listers/rbac/v1" + cache "k8s.io/client-go/tools/cache" + time "time" +) + +// ClusterRoleBindingInformer provides access to a shared informer and lister for +// ClusterRoleBindings. +type ClusterRoleBindingInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1.ClusterRoleBindingLister +} + +type clusterRoleBindingInformer struct { + factory internalinterfaces.SharedInformerFactory +} + +// NewClusterRoleBindingInformer constructs a new informer for ClusterRoleBinding type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewClusterRoleBindingInformer(client kubernetes.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + return client.RbacV1().ClusterRoleBindings().List(options) + }, + WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + return client.RbacV1().ClusterRoleBindings().Watch(options) + }, + }, + &rbac_v1.ClusterRoleBinding{}, + resyncPeriod, + indexers, + ) +} + +func defaultClusterRoleBindingInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewClusterRoleBindingInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) +} + +func (f *clusterRoleBindingInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&rbac_v1.ClusterRoleBinding{}, defaultClusterRoleBindingInformer) +} + +func (f *clusterRoleBindingInformer) Lister() v1.ClusterRoleBindingLister { + return v1.NewClusterRoleBindingLister(f.Informer().GetIndexer()) +} diff --git a/staging/src/k8s.io/client-go/informers/rbac/v1/interface.go b/staging/src/k8s.io/client-go/informers/rbac/v1/interface.go new file mode 100644 index 00000000000..38900ef1e2e --- /dev/null +++ b/staging/src/k8s.io/client-go/informers/rbac/v1/interface.go @@ -0,0 +1,64 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// This file was automatically generated by informer-gen + +package v1 + +import ( + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" +) + +// Interface provides access to all the informers in this group version. +type Interface interface { + // ClusterRoles returns a ClusterRoleInformer. + ClusterRoles() ClusterRoleInformer + // ClusterRoleBindings returns a ClusterRoleBindingInformer. + ClusterRoleBindings() ClusterRoleBindingInformer + // Roles returns a RoleInformer. + Roles() RoleInformer + // RoleBindings returns a RoleBindingInformer. + RoleBindings() RoleBindingInformer +} + +type version struct { + internalinterfaces.SharedInformerFactory +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory) Interface { + return &version{f} +} + +// ClusterRoles returns a ClusterRoleInformer. +func (v *version) ClusterRoles() ClusterRoleInformer { + return &clusterRoleInformer{factory: v.SharedInformerFactory} +} + +// ClusterRoleBindings returns a ClusterRoleBindingInformer. +func (v *version) ClusterRoleBindings() ClusterRoleBindingInformer { + return &clusterRoleBindingInformer{factory: v.SharedInformerFactory} +} + +// Roles returns a RoleInformer. +func (v *version) Roles() RoleInformer { + return &roleInformer{factory: v.SharedInformerFactory} +} + +// RoleBindings returns a RoleBindingInformer. +func (v *version) RoleBindings() RoleBindingInformer { + return &roleBindingInformer{factory: v.SharedInformerFactory} +} diff --git a/staging/src/k8s.io/client-go/informers/rbac/v1/role.go b/staging/src/k8s.io/client-go/informers/rbac/v1/role.go new file mode 100644 index 00000000000..79f33eabc3b --- /dev/null +++ b/staging/src/k8s.io/client-go/informers/rbac/v1/role.go @@ -0,0 +1,73 @@ +/* +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. +*/ + +// This file was automatically generated by informer-gen + +package v1 + +import ( + rbac_v1 "k8s.io/api/rbac/v1" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" + kubernetes "k8s.io/client-go/kubernetes" + v1 "k8s.io/client-go/listers/rbac/v1" + cache "k8s.io/client-go/tools/cache" + time "time" +) + +// RoleInformer provides access to a shared informer and lister for +// Roles. +type RoleInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1.RoleLister +} + +type roleInformer struct { + factory internalinterfaces.SharedInformerFactory +} + +// NewRoleInformer constructs a new informer for Role type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewRoleInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + return client.RbacV1().Roles(namespace).List(options) + }, + WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + return client.RbacV1().Roles(namespace).Watch(options) + }, + }, + &rbac_v1.Role{}, + resyncPeriod, + indexers, + ) +} + +func defaultRoleInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewRoleInformer(client, meta_v1.NamespaceAll, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) +} + +func (f *roleInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&rbac_v1.Role{}, defaultRoleInformer) +} + +func (f *roleInformer) Lister() v1.RoleLister { + return v1.NewRoleLister(f.Informer().GetIndexer()) +} diff --git a/staging/src/k8s.io/client-go/informers/rbac/v1/rolebinding.go b/staging/src/k8s.io/client-go/informers/rbac/v1/rolebinding.go new file mode 100644 index 00000000000..71548e1a372 --- /dev/null +++ b/staging/src/k8s.io/client-go/informers/rbac/v1/rolebinding.go @@ -0,0 +1,73 @@ +/* +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. +*/ + +// This file was automatically generated by informer-gen + +package v1 + +import ( + rbac_v1 "k8s.io/api/rbac/v1" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" + kubernetes "k8s.io/client-go/kubernetes" + v1 "k8s.io/client-go/listers/rbac/v1" + cache "k8s.io/client-go/tools/cache" + time "time" +) + +// RoleBindingInformer provides access to a shared informer and lister for +// RoleBindings. +type RoleBindingInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1.RoleBindingLister +} + +type roleBindingInformer struct { + factory internalinterfaces.SharedInformerFactory +} + +// NewRoleBindingInformer constructs a new informer for RoleBinding type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewRoleBindingInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + return client.RbacV1().RoleBindings(namespace).List(options) + }, + WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + return client.RbacV1().RoleBindings(namespace).Watch(options) + }, + }, + &rbac_v1.RoleBinding{}, + resyncPeriod, + indexers, + ) +} + +func defaultRoleBindingInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewRoleBindingInformer(client, meta_v1.NamespaceAll, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) +} + +func (f *roleBindingInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&rbac_v1.RoleBinding{}, defaultRoleBindingInformer) +} + +func (f *roleBindingInformer) Lister() v1.RoleBindingLister { + return v1.NewRoleBindingLister(f.Informer().GetIndexer()) +} diff --git a/staging/src/k8s.io/client-go/informers/rbac/v1alpha1/BUILD b/staging/src/k8s.io/client-go/informers/rbac/v1alpha1/BUILD index b833fa12a28..52d662231a3 100644 --- a/staging/src/k8s.io/client-go/informers/rbac/v1alpha1/BUILD +++ b/staging/src/k8s.io/client-go/informers/rbac/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "role.go", "rolebinding.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/rbac/v1beta1/BUILD b/staging/src/k8s.io/client-go/informers/rbac/v1beta1/BUILD index 03db95a8cf3..229b451e4f8 100644 --- a/staging/src/k8s.io/client-go/informers/rbac/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/informers/rbac/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "role.go", "rolebinding.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/scheduling/BUILD b/staging/src/k8s.io/client-go/informers/scheduling/BUILD index 4052e1b91b4..dec09ae459e 100644 --- a/staging/src/k8s.io/client-go/informers/scheduling/BUILD +++ b/staging/src/k8s.io/client-go/informers/scheduling/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", "//vendor/k8s.io/client-go/informers/scheduling/v1alpha1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/scheduling/v1alpha1/BUILD b/staging/src/k8s.io/client-go/informers/scheduling/v1alpha1/BUILD index 6f456567d5c..34676949cff 100644 --- a/staging/src/k8s.io/client-go/informers/scheduling/v1alpha1/BUILD +++ b/staging/src/k8s.io/client-go/informers/scheduling/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "interface.go", "priorityclass.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/settings/BUILD b/staging/src/k8s.io/client-go/informers/settings/BUILD index 180901d81bb..4c84b1758c8 100644 --- a/staging/src/k8s.io/client-go/informers/settings/BUILD +++ b/staging/src/k8s.io/client-go/informers/settings/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", "//vendor/k8s.io/client-go/informers/settings/v1alpha1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/settings/v1alpha1/BUILD b/staging/src/k8s.io/client-go/informers/settings/v1alpha1/BUILD index 1f0e9d1fb23..c09df485dca 100644 --- a/staging/src/k8s.io/client-go/informers/settings/v1alpha1/BUILD +++ b/staging/src/k8s.io/client-go/informers/settings/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "interface.go", "podpreset.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/settings/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/storage/BUILD b/staging/src/k8s.io/client-go/informers/storage/BUILD index 5f1d30046ae..550a51e6c93 100644 --- a/staging/src/k8s.io/client-go/informers/storage/BUILD +++ b/staging/src/k8s.io/client-go/informers/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", "//vendor/k8s.io/client-go/informers/storage/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/storage/v1/BUILD b/staging/src/k8s.io/client-go/informers/storage/v1/BUILD index 4c420af01de..5868626b186 100644 --- a/staging/src/k8s.io/client-go/informers/storage/v1/BUILD +++ b/staging/src/k8s.io/client-go/informers/storage/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "interface.go", "storageclass.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/storage/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/informers/storage/v1beta1/BUILD b/staging/src/k8s.io/client-go/informers/storage/v1beta1/BUILD index 9d7080f5ca6..dd0a1ca1fcf 100644 --- a/staging/src/k8s.io/client-go/informers/storage/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/informers/storage/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "interface.go", "storageclass.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/storage/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/BUILD b/staging/src/k8s.io/client-go/kubernetes/BUILD index 5e9ee80ab55..a171aa1e935 100644 --- a/staging/src/k8s.io/client-go/kubernetes/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "import.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/client-go/discovery:go_default_library", @@ -34,6 +31,7 @@ go_library( "//vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/networking/v1:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1:go_default_library", @@ -74,6 +72,7 @@ filegroup( "//staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/networking/v1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1:all-srcs", + "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1:all-srcs", diff --git a/staging/src/k8s.io/client-go/kubernetes/clientset.go b/staging/src/k8s.io/client-go/kubernetes/clientset.go index a22cf6534fe..00a0358e840 100644 --- a/staging/src/k8s.io/client-go/kubernetes/clientset.go +++ b/staging/src/k8s.io/client-go/kubernetes/clientset.go @@ -35,6 +35,7 @@ import ( extensionsv1beta1 "k8s.io/client-go/kubernetes/typed/extensions/v1beta1" networkingv1 "k8s.io/client-go/kubernetes/typed/networking/v1" policyv1beta1 "k8s.io/client-go/kubernetes/typed/policy/v1beta1" + rbacv1 "k8s.io/client-go/kubernetes/typed/rbac/v1" rbacv1alpha1 "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1" rbacv1beta1 "k8s.io/client-go/kubernetes/typed/rbac/v1beta1" schedulingv1alpha1 "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1" @@ -85,9 +86,10 @@ type Interface interface { PolicyV1beta1() policyv1beta1.PolicyV1beta1Interface // Deprecated: please explicitly pick a version if possible. Policy() policyv1beta1.PolicyV1beta1Interface - RbacV1beta1() rbacv1beta1.RbacV1beta1Interface + RbacV1() rbacv1.RbacV1Interface // Deprecated: please explicitly pick a version if possible. - Rbac() rbacv1beta1.RbacV1beta1Interface + Rbac() rbacv1.RbacV1Interface + RbacV1beta1() rbacv1beta1.RbacV1beta1Interface RbacV1alpha1() rbacv1alpha1.RbacV1alpha1Interface SchedulingV1alpha1() schedulingv1alpha1.SchedulingV1alpha1Interface // Deprecated: please explicitly pick a version if possible. @@ -121,6 +123,7 @@ type Clientset struct { extensionsV1beta1 *extensionsv1beta1.ExtensionsV1beta1Client networkingV1 *networkingv1.NetworkingV1Client policyV1beta1 *policyv1beta1.PolicyV1beta1Client + rbacV1 *rbacv1.RbacV1Client rbacV1beta1 *rbacv1beta1.RbacV1beta1Client rbacV1alpha1 *rbacv1alpha1.RbacV1alpha1Client schedulingV1alpha1 *schedulingv1alpha1.SchedulingV1alpha1Client @@ -275,14 +278,19 @@ func (c *Clientset) Policy() policyv1beta1.PolicyV1beta1Interface { return c.policyV1beta1 } -// RbacV1beta1 retrieves the RbacV1beta1Client -func (c *Clientset) RbacV1beta1() rbacv1beta1.RbacV1beta1Interface { - return c.rbacV1beta1 +// RbacV1 retrieves the RbacV1Client +func (c *Clientset) RbacV1() rbacv1.RbacV1Interface { + return c.rbacV1 } // Deprecated: Rbac retrieves the default version of RbacClient. // Please explicitly pick a version. -func (c *Clientset) Rbac() rbacv1beta1.RbacV1beta1Interface { +func (c *Clientset) Rbac() rbacv1.RbacV1Interface { + return c.rbacV1 +} + +// RbacV1beta1 retrieves the RbacV1beta1Client +func (c *Clientset) RbacV1beta1() rbacv1beta1.RbacV1beta1Interface { return c.rbacV1beta1 } @@ -409,6 +417,10 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { if err != nil { return nil, err } + cs.rbacV1, err = rbacv1.NewForConfig(&configShallowCopy) + if err != nil { + return nil, err + } cs.rbacV1beta1, err = rbacv1beta1.NewForConfig(&configShallowCopy) if err != nil { return nil, err @@ -462,6 +474,7 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { cs.extensionsV1beta1 = extensionsv1beta1.NewForConfigOrDie(c) cs.networkingV1 = networkingv1.NewForConfigOrDie(c) cs.policyV1beta1 = policyv1beta1.NewForConfigOrDie(c) + cs.rbacV1 = rbacv1.NewForConfigOrDie(c) cs.rbacV1beta1 = rbacv1beta1.NewForConfigOrDie(c) cs.rbacV1alpha1 = rbacv1alpha1.NewForConfigOrDie(c) cs.schedulingV1alpha1 = schedulingv1alpha1.NewForConfigOrDie(c) @@ -492,6 +505,7 @@ func New(c rest.Interface) *Clientset { cs.extensionsV1beta1 = extensionsv1beta1.New(c) cs.networkingV1 = networkingv1.New(c) cs.policyV1beta1 = policyv1beta1.New(c) + cs.rbacV1 = rbacv1.New(c) cs.rbacV1beta1 = rbacv1beta1.New(c) cs.rbacV1alpha1 = rbacv1alpha1.New(c) cs.schedulingV1alpha1 = schedulingv1alpha1.New(c) diff --git a/staging/src/k8s.io/client-go/kubernetes/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/fake/BUILD index 4bc21a52178..40c29f640a0 100644 --- a/staging/src/k8s.io/client-go/kubernetes/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", "//vendor/k8s.io/api/apps/v1beta1:go_default_library", @@ -32,6 +29,7 @@ go_library( "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", "//vendor/k8s.io/api/networking/v1:go_default_library", "//vendor/k8s.io/api/policy/v1beta1:go_default_library", + "//vendor/k8s.io/api/rbac/v1:go_default_library", "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", @@ -78,6 +76,8 @@ go_library( "//vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/fake/clientset_generated.go b/staging/src/k8s.io/client-go/kubernetes/fake/clientset_generated.go index f72305948af..f9c7cacf14f 100644 --- a/staging/src/k8s.io/client-go/kubernetes/fake/clientset_generated.go +++ b/staging/src/k8s.io/client-go/kubernetes/fake/clientset_generated.go @@ -54,6 +54,8 @@ import ( fakenetworkingv1 "k8s.io/client-go/kubernetes/typed/networking/v1/fake" policyv1beta1 "k8s.io/client-go/kubernetes/typed/policy/v1beta1" fakepolicyv1beta1 "k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake" + rbacv1 "k8s.io/client-go/kubernetes/typed/rbac/v1" + fakerbacv1 "k8s.io/client-go/kubernetes/typed/rbac/v1/fake" rbacv1alpha1 "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1" fakerbacv1alpha1 "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake" rbacv1beta1 "k8s.io/client-go/kubernetes/typed/rbac/v1beta1" @@ -237,13 +239,18 @@ func (c *Clientset) Policy() policyv1beta1.PolicyV1beta1Interface { return &fakepolicyv1beta1.FakePolicyV1beta1{Fake: &c.Fake} } -// RbacV1beta1 retrieves the RbacV1beta1Client -func (c *Clientset) RbacV1beta1() rbacv1beta1.RbacV1beta1Interface { - return &fakerbacv1beta1.FakeRbacV1beta1{Fake: &c.Fake} +// RbacV1 retrieves the RbacV1Client +func (c *Clientset) RbacV1() rbacv1.RbacV1Interface { + return &fakerbacv1.FakeRbacV1{Fake: &c.Fake} } -// Rbac retrieves the RbacV1beta1Client -func (c *Clientset) Rbac() rbacv1beta1.RbacV1beta1Interface { +// Rbac retrieves the RbacV1Client +func (c *Clientset) Rbac() rbacv1.RbacV1Interface { + return &fakerbacv1.FakeRbacV1{Fake: &c.Fake} +} + +// RbacV1beta1 retrieves the RbacV1beta1Client +func (c *Clientset) RbacV1beta1() rbacv1beta1.RbacV1beta1Interface { return &fakerbacv1beta1.FakeRbacV1beta1{Fake: &c.Fake} } diff --git a/staging/src/k8s.io/client-go/kubernetes/fake/register.go b/staging/src/k8s.io/client-go/kubernetes/fake/register.go index dda0c855820..3cec690586c 100644 --- a/staging/src/k8s.io/client-go/kubernetes/fake/register.go +++ b/staging/src/k8s.io/client-go/kubernetes/fake/register.go @@ -33,6 +33,7 @@ import ( extensionsv1beta1 "k8s.io/api/extensions/v1beta1" networkingv1 "k8s.io/api/networking/v1" policyv1beta1 "k8s.io/api/policy/v1beta1" + rbacv1 "k8s.io/api/rbac/v1" rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" rbacv1beta1 "k8s.io/api/rbac/v1beta1" schedulingv1alpha1 "k8s.io/api/scheduling/v1alpha1" @@ -85,6 +86,7 @@ func AddToScheme(scheme *runtime.Scheme) { extensionsv1beta1.AddToScheme(scheme) networkingv1.AddToScheme(scheme) policyv1beta1.AddToScheme(scheme) + rbacv1.AddToScheme(scheme) rbacv1beta1.AddToScheme(scheme) rbacv1alpha1.AddToScheme(scheme) schedulingv1alpha1.AddToScheme(scheme) diff --git a/staging/src/k8s.io/client-go/kubernetes/scheme/BUILD b/staging/src/k8s.io/client-go/kubernetes/scheme/BUILD index c6e316f0cd3..753abcd9d1a 100644 --- a/staging/src/k8s.io/client-go/kubernetes/scheme/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/scheme/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", "//vendor/k8s.io/api/apps/v1beta1:go_default_library", @@ -31,6 +28,7 @@ go_library( "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", "//vendor/k8s.io/api/networking/v1:go_default_library", "//vendor/k8s.io/api/policy/v1beta1:go_default_library", + "//vendor/k8s.io/api/rbac/v1:go_default_library", "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/scheme/register.go b/staging/src/k8s.io/client-go/kubernetes/scheme/register.go index 15ed880a586..57fe2e0ef8b 100644 --- a/staging/src/k8s.io/client-go/kubernetes/scheme/register.go +++ b/staging/src/k8s.io/client-go/kubernetes/scheme/register.go @@ -33,6 +33,7 @@ import ( extensionsv1beta1 "k8s.io/api/extensions/v1beta1" networkingv1 "k8s.io/api/networking/v1" policyv1beta1 "k8s.io/api/policy/v1beta1" + rbacv1 "k8s.io/api/rbac/v1" rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" rbacv1beta1 "k8s.io/api/rbac/v1beta1" schedulingv1alpha1 "k8s.io/api/scheduling/v1alpha1" @@ -85,6 +86,7 @@ func AddToScheme(scheme *runtime.Scheme) { extensionsv1beta1.AddToScheme(scheme) networkingv1.AddToScheme(scheme) policyv1beta1.AddToScheme(scheme) + rbacv1.AddToScheme(scheme) rbacv1beta1.AddToScheme(scheme) rbacv1alpha1.AddToScheme(scheme) schedulingv1alpha1.AddToScheme(scheme) diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/BUILD index 712e70c41f0..f2b50573128 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "generated_expansion.go", "initializerconfiguration.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/BUILD index 6e1ed324a8a..0f404bf5b66 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "fake_externaladmissionhookconfiguration.go", "fake_initializerconfiguration.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1/BUILD index 2b1e7e46519..5b620a0bba9 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "scale.go", "statefulset.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/apps/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/BUILD index a0d3cad0198..4269dabb93a 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "fake_scale.go", "fake_statefulset.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/apps/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta2/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta2/BUILD index aace0faeae5..a109e0f0ba2 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta2/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta2/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "scale.go", "statefulset.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/apps/v1beta2:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/BUILD index f22a2f27a0a..824dd7287c0 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "fake_scale.go", "fake_statefulset.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/apps/v1beta2:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1/BUILD index 99bfe3c7692..8b47c107931 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "tokenreview.go", "tokenreview_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/authentication/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/BUILD index 299d3aee222..acd8739a033 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "fake_tokenreview.go", "fake_tokenreview_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/authentication/v1:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/authentication/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/BUILD index 2b753feace0..29b88edf5ac 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "tokenreview.go", "tokenreview_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/authentication/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/BUILD index 6240cb9f9e0..cce5471e04e 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "fake_tokenreview.go", "fake_tokenreview_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/authentication/v1beta1:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1/BUILD index 64502d2630c..ab5f2454af5 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -20,7 +18,6 @@ go_library( "subjectaccessreview.go", "subjectaccessreview_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/authorization/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/BUILD index da1b140433d..8fe5bebd438 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "fake_subjectaccessreview.go", "fake_subjectaccessreview_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/authorization/v1:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/authorization/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/BUILD index 48bec8f763d..1fa7e72282c 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -20,7 +18,6 @@ go_library( "subjectaccessreview.go", "subjectaccessreview_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/authorization/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/BUILD index 0d3641921cf..eb9a8b32050 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -20,7 +18,6 @@ go_library( "fake_subjectaccessreview.go", "fake_subjectaccessreview_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/authorization/v1beta1:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1/BUILD index dcf4433396c..c9f72448330 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "generated_expansion.go", "horizontalpodautoscaler.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/autoscaling/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/BUILD index 657bdb6f062..1793ee4db65 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_autoscaling_client.go", "fake_horizontalpodautoscaler.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/autoscaling/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2alpha1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2alpha1/BUILD index 6a71e53fbe1..e47c20df576 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2alpha1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "generated_expansion.go", "horizontalpodautoscaler.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/autoscaling/v2alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2alpha1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2alpha1/fake/BUILD index 8391b55fce3..a326e8b07ed 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2alpha1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2alpha1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_autoscaling_client.go", "fake_horizontalpodautoscaler.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/autoscaling/v2alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/batch/v1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/batch/v1/BUILD index 50f36e324ed..ff1e7ea69c3 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/batch/v1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/batch/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "generated_expansion.go", "job.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/batch/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/batch/v1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/batch/v1/fake/BUILD index b51d6824766..dfcaf27927a 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/batch/v1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/batch/v1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_batch_client.go", "fake_job.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/batch/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/BUILD index 726f06f09f0..83e35ab4ec7 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "doc.go", "generated_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/BUILD index b5eb0ce09df..2e041d51bed 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_batch_client.go", "fake_cronjob.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/BUILD index e2a32bfe6d6..ba36b676103 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "doc.go", "generated_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/BUILD index 0fbc9f1d81e..e7d923d9c6e 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "fake_certificatesigningrequest.go", "fake_certificatesigningrequest_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/core/v1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/core/v1/BUILD index d374833a552..76b65f92289 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/core/v1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/core/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -35,7 +33,6 @@ go_library( "service_expansion.go", "serviceaccount.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/policy/v1beta1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/core/v1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/core/v1/fake/BUILD index f4519891f26..8b2920948d0 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/core/v1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/core/v1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -34,7 +32,6 @@ go_library( "fake_service_expansion.go", "fake_serviceaccount.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/policy/v1beta1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/BUILD index 97b18bf6f5d..af61bbeffdc 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -23,7 +21,6 @@ go_library( "scale_expansion.go", "thirdpartyresource.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/BUILD index b75917a3c40..45985b8deb6 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -22,7 +20,6 @@ go_library( "fake_scale_expansion.go", "fake_thirdpartyresource.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/networking/v1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/networking/v1/BUILD index e9e962b234c..275b2fea5fb 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/networking/v1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/networking/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "networking_client.go", "networkpolicy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/networking/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/networking/v1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/networking/v1/fake/BUILD index e206b748202..00d8314680c 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/networking/v1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/networking/v1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_networking_client.go", "fake_networkpolicy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/networking/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1/BUILD index 37ffeb110da..be2393905eb 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "poddisruptionbudget.go", "policy_client.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/policy/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/BUILD index 22cd9c86916..3f984dc1f66 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "fake_poddisruptionbudget.go", "fake_policy_client.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/policy/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/BUILD new file mode 100644 index 00000000000..436c9713089 --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/BUILD @@ -0,0 +1,44 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = [ + "clusterrole.go", + "clusterrolebinding.go", + "doc.go", + "generated_expansion.go", + "rbac_client.go", + "role.go", + "rolebinding.go", + ], + deps = [ + "//vendor/k8s.io/api/rbac/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//vendor/k8s.io/client-go/rest:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake:all-srcs", + ], + tags = ["automanaged"], +) diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrole.go b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrole.go new file mode 100644 index 00000000000..e0ea45148e0 --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrole.go @@ -0,0 +1,145 @@ +/* +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 v1 + +import ( + v1 "k8s.io/api/rbac/v1" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + scheme "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +// ClusterRolesGetter has a method to return a ClusterRoleInterface. +// A group's client should implement this interface. +type ClusterRolesGetter interface { + ClusterRoles() ClusterRoleInterface +} + +// ClusterRoleInterface has methods to work with ClusterRole resources. +type ClusterRoleInterface interface { + Create(*v1.ClusterRole) (*v1.ClusterRole, error) + Update(*v1.ClusterRole) (*v1.ClusterRole, error) + Delete(name string, options *meta_v1.DeleteOptions) error + DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error + Get(name string, options meta_v1.GetOptions) (*v1.ClusterRole, error) + List(opts meta_v1.ListOptions) (*v1.ClusterRoleList, error) + Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.ClusterRole, err error) + ClusterRoleExpansion +} + +// clusterRoles implements ClusterRoleInterface +type clusterRoles struct { + client rest.Interface +} + +// newClusterRoles returns a ClusterRoles +func newClusterRoles(c *RbacV1Client) *clusterRoles { + return &clusterRoles{ + client: c.RESTClient(), + } +} + +// Get takes name of the clusterRole, and returns the corresponding clusterRole object, and an error if there is any. +func (c *clusterRoles) Get(name string, options meta_v1.GetOptions) (result *v1.ClusterRole, err error) { + result = &v1.ClusterRole{} + err = c.client.Get(). + Resource("clusterroles"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of ClusterRoles that match those selectors. +func (c *clusterRoles) List(opts meta_v1.ListOptions) (result *v1.ClusterRoleList, err error) { + result = &v1.ClusterRoleList{} + err = c.client.Get(). + Resource("clusterroles"). + VersionedParams(&opts, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested clusterRoles. +func (c *clusterRoles) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { + opts.Watch = true + return c.client.Get(). + Resource("clusterroles"). + VersionedParams(&opts, scheme.ParameterCodec). + Watch() +} + +// Create takes the representation of a clusterRole and creates it. Returns the server's representation of the clusterRole, and an error, if there is any. +func (c *clusterRoles) Create(clusterRole *v1.ClusterRole) (result *v1.ClusterRole, err error) { + result = &v1.ClusterRole{} + err = c.client.Post(). + Resource("clusterroles"). + Body(clusterRole). + Do(). + Into(result) + return +} + +// Update takes the representation of a clusterRole and updates it. Returns the server's representation of the clusterRole, and an error, if there is any. +func (c *clusterRoles) Update(clusterRole *v1.ClusterRole) (result *v1.ClusterRole, err error) { + result = &v1.ClusterRole{} + err = c.client.Put(). + Resource("clusterroles"). + Name(clusterRole.Name). + Body(clusterRole). + Do(). + Into(result) + return +} + +// Delete takes name of the clusterRole and deletes it. Returns an error if one occurs. +func (c *clusterRoles) Delete(name string, options *meta_v1.DeleteOptions) error { + return c.client.Delete(). + Resource("clusterroles"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *clusterRoles) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { + return c.client.Delete(). + Resource("clusterroles"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched clusterRole. +func (c *clusterRoles) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.ClusterRole, err error) { + result = &v1.ClusterRole{} + err = c.client.Patch(pt). + Resource("clusterroles"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrolebinding.go b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrolebinding.go new file mode 100644 index 00000000000..11b2e216533 --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrolebinding.go @@ -0,0 +1,145 @@ +/* +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 v1 + +import ( + v1 "k8s.io/api/rbac/v1" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + scheme "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +// ClusterRoleBindingsGetter has a method to return a ClusterRoleBindingInterface. +// A group's client should implement this interface. +type ClusterRoleBindingsGetter interface { + ClusterRoleBindings() ClusterRoleBindingInterface +} + +// ClusterRoleBindingInterface has methods to work with ClusterRoleBinding resources. +type ClusterRoleBindingInterface interface { + Create(*v1.ClusterRoleBinding) (*v1.ClusterRoleBinding, error) + Update(*v1.ClusterRoleBinding) (*v1.ClusterRoleBinding, error) + Delete(name string, options *meta_v1.DeleteOptions) error + DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error + Get(name string, options meta_v1.GetOptions) (*v1.ClusterRoleBinding, error) + List(opts meta_v1.ListOptions) (*v1.ClusterRoleBindingList, error) + Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.ClusterRoleBinding, err error) + ClusterRoleBindingExpansion +} + +// clusterRoleBindings implements ClusterRoleBindingInterface +type clusterRoleBindings struct { + client rest.Interface +} + +// newClusterRoleBindings returns a ClusterRoleBindings +func newClusterRoleBindings(c *RbacV1Client) *clusterRoleBindings { + return &clusterRoleBindings{ + client: c.RESTClient(), + } +} + +// Get takes name of the clusterRoleBinding, and returns the corresponding clusterRoleBinding object, and an error if there is any. +func (c *clusterRoleBindings) Get(name string, options meta_v1.GetOptions) (result *v1.ClusterRoleBinding, err error) { + result = &v1.ClusterRoleBinding{} + err = c.client.Get(). + Resource("clusterrolebindings"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of ClusterRoleBindings that match those selectors. +func (c *clusterRoleBindings) List(opts meta_v1.ListOptions) (result *v1.ClusterRoleBindingList, err error) { + result = &v1.ClusterRoleBindingList{} + err = c.client.Get(). + Resource("clusterrolebindings"). + VersionedParams(&opts, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested clusterRoleBindings. +func (c *clusterRoleBindings) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { + opts.Watch = true + return c.client.Get(). + Resource("clusterrolebindings"). + VersionedParams(&opts, scheme.ParameterCodec). + Watch() +} + +// Create takes the representation of a clusterRoleBinding and creates it. Returns the server's representation of the clusterRoleBinding, and an error, if there is any. +func (c *clusterRoleBindings) Create(clusterRoleBinding *v1.ClusterRoleBinding) (result *v1.ClusterRoleBinding, err error) { + result = &v1.ClusterRoleBinding{} + err = c.client.Post(). + Resource("clusterrolebindings"). + Body(clusterRoleBinding). + Do(). + Into(result) + return +} + +// Update takes the representation of a clusterRoleBinding and updates it. Returns the server's representation of the clusterRoleBinding, and an error, if there is any. +func (c *clusterRoleBindings) Update(clusterRoleBinding *v1.ClusterRoleBinding) (result *v1.ClusterRoleBinding, err error) { + result = &v1.ClusterRoleBinding{} + err = c.client.Put(). + Resource("clusterrolebindings"). + Name(clusterRoleBinding.Name). + Body(clusterRoleBinding). + Do(). + Into(result) + return +} + +// Delete takes name of the clusterRoleBinding and deletes it. Returns an error if one occurs. +func (c *clusterRoleBindings) Delete(name string, options *meta_v1.DeleteOptions) error { + return c.client.Delete(). + Resource("clusterrolebindings"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *clusterRoleBindings) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { + return c.client.Delete(). + Resource("clusterrolebindings"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched clusterRoleBinding. +func (c *clusterRoleBindings) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.ClusterRoleBinding, err error) { + result = &v1.ClusterRoleBinding{} + err = c.client.Patch(pt). + Resource("clusterrolebindings"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/doc.go b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/doc.go new file mode 100644 index 00000000000..54673bfa738 --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/doc.go @@ -0,0 +1,20 @@ +/* +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. +*/ + +// This package is generated by client-gen with custom arguments. + +// This package has the automatically generated typed clients. +package v1 diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/BUILD new file mode 100644 index 00000000000..0ee621cda29 --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/BUILD @@ -0,0 +1,42 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = [ + "doc.go", + "fake_clusterrole.go", + "fake_clusterrolebinding.go", + "fake_rbac_client.go", + "fake_role.go", + "fake_rolebinding.go", + ], + deps = [ + "//vendor/k8s.io/api/rbac/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/labels:go_default_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/watch:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1:go_default_library", + "//vendor/k8s.io/client-go/rest:go_default_library", + "//vendor/k8s.io/client-go/testing:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/doc.go b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/doc.go new file mode 100644 index 00000000000..c6548330a0d --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/doc.go @@ -0,0 +1,20 @@ +/* +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. +*/ + +// This package is generated by client-gen with custom arguments. + +// Package fake has the automatically generated clients. +package fake diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrole.go b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrole.go new file mode 100644 index 00000000000..645126f2c81 --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrole.go @@ -0,0 +1,118 @@ +/* +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 fake + +import ( + rbac_v1 "k8s.io/api/rbac/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakeClusterRoles implements ClusterRoleInterface +type FakeClusterRoles struct { + Fake *FakeRbacV1 +} + +var clusterrolesResource = schema.GroupVersionResource{Group: "rbac.authorization.k8s.io", Version: "v1", Resource: "clusterroles"} + +var clusterrolesKind = schema.GroupVersionKind{Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "ClusterRole"} + +// Get takes name of the clusterRole, and returns the corresponding clusterRole object, and an error if there is any. +func (c *FakeClusterRoles) Get(name string, options v1.GetOptions) (result *rbac_v1.ClusterRole, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootGetAction(clusterrolesResource, name), &rbac_v1.ClusterRole{}) + if obj == nil { + return nil, err + } + return obj.(*rbac_v1.ClusterRole), err +} + +// List takes label and field selectors, and returns the list of ClusterRoles that match those selectors. +func (c *FakeClusterRoles) List(opts v1.ListOptions) (result *rbac_v1.ClusterRoleList, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootListAction(clusterrolesResource, clusterrolesKind, opts), &rbac_v1.ClusterRoleList{}) + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &rbac_v1.ClusterRoleList{} + for _, item := range obj.(*rbac_v1.ClusterRoleList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested clusterRoles. +func (c *FakeClusterRoles) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewRootWatchAction(clusterrolesResource, opts)) +} + +// Create takes the representation of a clusterRole and creates it. Returns the server's representation of the clusterRole, and an error, if there is any. +func (c *FakeClusterRoles) Create(clusterRole *rbac_v1.ClusterRole) (result *rbac_v1.ClusterRole, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootCreateAction(clusterrolesResource, clusterRole), &rbac_v1.ClusterRole{}) + if obj == nil { + return nil, err + } + return obj.(*rbac_v1.ClusterRole), err +} + +// Update takes the representation of a clusterRole and updates it. Returns the server's representation of the clusterRole, and an error, if there is any. +func (c *FakeClusterRoles) Update(clusterRole *rbac_v1.ClusterRole) (result *rbac_v1.ClusterRole, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootUpdateAction(clusterrolesResource, clusterRole), &rbac_v1.ClusterRole{}) + if obj == nil { + return nil, err + } + return obj.(*rbac_v1.ClusterRole), err +} + +// Delete takes name of the clusterRole and deletes it. Returns an error if one occurs. +func (c *FakeClusterRoles) Delete(name string, options *v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewRootDeleteAction(clusterrolesResource, name), &rbac_v1.ClusterRole{}) + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeClusterRoles) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + action := testing.NewRootDeleteCollectionAction(clusterrolesResource, listOptions) + + _, err := c.Fake.Invokes(action, &rbac_v1.ClusterRoleList{}) + return err +} + +// Patch applies the patch and returns the patched clusterRole. +func (c *FakeClusterRoles) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *rbac_v1.ClusterRole, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(clusterrolesResource, name, data, subresources...), &rbac_v1.ClusterRole{}) + if obj == nil { + return nil, err + } + return obj.(*rbac_v1.ClusterRole), err +} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrolebinding.go b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrolebinding.go new file mode 100644 index 00000000000..a9c0bb08917 --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrolebinding.go @@ -0,0 +1,118 @@ +/* +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 fake + +import ( + rbac_v1 "k8s.io/api/rbac/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakeClusterRoleBindings implements ClusterRoleBindingInterface +type FakeClusterRoleBindings struct { + Fake *FakeRbacV1 +} + +var clusterrolebindingsResource = schema.GroupVersionResource{Group: "rbac.authorization.k8s.io", Version: "v1", Resource: "clusterrolebindings"} + +var clusterrolebindingsKind = schema.GroupVersionKind{Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "ClusterRoleBinding"} + +// Get takes name of the clusterRoleBinding, and returns the corresponding clusterRoleBinding object, and an error if there is any. +func (c *FakeClusterRoleBindings) Get(name string, options v1.GetOptions) (result *rbac_v1.ClusterRoleBinding, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootGetAction(clusterrolebindingsResource, name), &rbac_v1.ClusterRoleBinding{}) + if obj == nil { + return nil, err + } + return obj.(*rbac_v1.ClusterRoleBinding), err +} + +// List takes label and field selectors, and returns the list of ClusterRoleBindings that match those selectors. +func (c *FakeClusterRoleBindings) List(opts v1.ListOptions) (result *rbac_v1.ClusterRoleBindingList, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootListAction(clusterrolebindingsResource, clusterrolebindingsKind, opts), &rbac_v1.ClusterRoleBindingList{}) + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &rbac_v1.ClusterRoleBindingList{} + for _, item := range obj.(*rbac_v1.ClusterRoleBindingList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested clusterRoleBindings. +func (c *FakeClusterRoleBindings) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewRootWatchAction(clusterrolebindingsResource, opts)) +} + +// Create takes the representation of a clusterRoleBinding and creates it. Returns the server's representation of the clusterRoleBinding, and an error, if there is any. +func (c *FakeClusterRoleBindings) Create(clusterRoleBinding *rbac_v1.ClusterRoleBinding) (result *rbac_v1.ClusterRoleBinding, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootCreateAction(clusterrolebindingsResource, clusterRoleBinding), &rbac_v1.ClusterRoleBinding{}) + if obj == nil { + return nil, err + } + return obj.(*rbac_v1.ClusterRoleBinding), err +} + +// Update takes the representation of a clusterRoleBinding and updates it. Returns the server's representation of the clusterRoleBinding, and an error, if there is any. +func (c *FakeClusterRoleBindings) Update(clusterRoleBinding *rbac_v1.ClusterRoleBinding) (result *rbac_v1.ClusterRoleBinding, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootUpdateAction(clusterrolebindingsResource, clusterRoleBinding), &rbac_v1.ClusterRoleBinding{}) + if obj == nil { + return nil, err + } + return obj.(*rbac_v1.ClusterRoleBinding), err +} + +// Delete takes name of the clusterRoleBinding and deletes it. Returns an error if one occurs. +func (c *FakeClusterRoleBindings) Delete(name string, options *v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewRootDeleteAction(clusterrolebindingsResource, name), &rbac_v1.ClusterRoleBinding{}) + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeClusterRoleBindings) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + action := testing.NewRootDeleteCollectionAction(clusterrolebindingsResource, listOptions) + + _, err := c.Fake.Invokes(action, &rbac_v1.ClusterRoleBindingList{}) + return err +} + +// Patch applies the patch and returns the patched clusterRoleBinding. +func (c *FakeClusterRoleBindings) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *rbac_v1.ClusterRoleBinding, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(clusterrolebindingsResource, name, data, subresources...), &rbac_v1.ClusterRoleBinding{}) + if obj == nil { + return nil, err + } + return obj.(*rbac_v1.ClusterRoleBinding), err +} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rbac_client.go b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rbac_client.go new file mode 100644 index 00000000000..cddaf6d5067 --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rbac_client.go @@ -0,0 +1,50 @@ +/* +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 fake + +import ( + v1 "k8s.io/client-go/kubernetes/typed/rbac/v1" + rest "k8s.io/client-go/rest" + testing "k8s.io/client-go/testing" +) + +type FakeRbacV1 struct { + *testing.Fake +} + +func (c *FakeRbacV1) ClusterRoles() v1.ClusterRoleInterface { + return &FakeClusterRoles{c} +} + +func (c *FakeRbacV1) ClusterRoleBindings() v1.ClusterRoleBindingInterface { + return &FakeClusterRoleBindings{c} +} + +func (c *FakeRbacV1) Roles(namespace string) v1.RoleInterface { + return &FakeRoles{c, namespace} +} + +func (c *FakeRbacV1) RoleBindings(namespace string) v1.RoleBindingInterface { + return &FakeRoleBindings{c, namespace} +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *FakeRbacV1) RESTClient() rest.Interface { + var ret *rest.RESTClient + return ret +} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_role.go b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_role.go new file mode 100644 index 00000000000..f64ede63897 --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_role.go @@ -0,0 +1,126 @@ +/* +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 fake + +import ( + rbac_v1 "k8s.io/api/rbac/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakeRoles implements RoleInterface +type FakeRoles struct { + Fake *FakeRbacV1 + ns string +} + +var rolesResource = schema.GroupVersionResource{Group: "rbac.authorization.k8s.io", Version: "v1", Resource: "roles"} + +var rolesKind = schema.GroupVersionKind{Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "Role"} + +// Get takes name of the role, and returns the corresponding role object, and an error if there is any. +func (c *FakeRoles) Get(name string, options v1.GetOptions) (result *rbac_v1.Role, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(rolesResource, c.ns, name), &rbac_v1.Role{}) + + if obj == nil { + return nil, err + } + return obj.(*rbac_v1.Role), err +} + +// List takes label and field selectors, and returns the list of Roles that match those selectors. +func (c *FakeRoles) List(opts v1.ListOptions) (result *rbac_v1.RoleList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(rolesResource, rolesKind, c.ns, opts), &rbac_v1.RoleList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &rbac_v1.RoleList{} + for _, item := range obj.(*rbac_v1.RoleList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested roles. +func (c *FakeRoles) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(rolesResource, c.ns, opts)) + +} + +// Create takes the representation of a role and creates it. Returns the server's representation of the role, and an error, if there is any. +func (c *FakeRoles) Create(role *rbac_v1.Role) (result *rbac_v1.Role, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(rolesResource, c.ns, role), &rbac_v1.Role{}) + + if obj == nil { + return nil, err + } + return obj.(*rbac_v1.Role), err +} + +// Update takes the representation of a role and updates it. Returns the server's representation of the role, and an error, if there is any. +func (c *FakeRoles) Update(role *rbac_v1.Role) (result *rbac_v1.Role, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(rolesResource, c.ns, role), &rbac_v1.Role{}) + + if obj == nil { + return nil, err + } + return obj.(*rbac_v1.Role), err +} + +// Delete takes name of the role and deletes it. Returns an error if one occurs. +func (c *FakeRoles) Delete(name string, options *v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(rolesResource, c.ns, name), &rbac_v1.Role{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeRoles) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(rolesResource, c.ns, listOptions) + + _, err := c.Fake.Invokes(action, &rbac_v1.RoleList{}) + return err +} + +// Patch applies the patch and returns the patched role. +func (c *FakeRoles) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *rbac_v1.Role, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(rolesResource, c.ns, name, data, subresources...), &rbac_v1.Role{}) + + if obj == nil { + return nil, err + } + return obj.(*rbac_v1.Role), err +} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rolebinding.go b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rolebinding.go new file mode 100644 index 00000000000..e499cf95b31 --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rolebinding.go @@ -0,0 +1,126 @@ +/* +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 fake + +import ( + rbac_v1 "k8s.io/api/rbac/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakeRoleBindings implements RoleBindingInterface +type FakeRoleBindings struct { + Fake *FakeRbacV1 + ns string +} + +var rolebindingsResource = schema.GroupVersionResource{Group: "rbac.authorization.k8s.io", Version: "v1", Resource: "rolebindings"} + +var rolebindingsKind = schema.GroupVersionKind{Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "RoleBinding"} + +// Get takes name of the roleBinding, and returns the corresponding roleBinding object, and an error if there is any. +func (c *FakeRoleBindings) Get(name string, options v1.GetOptions) (result *rbac_v1.RoleBinding, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(rolebindingsResource, c.ns, name), &rbac_v1.RoleBinding{}) + + if obj == nil { + return nil, err + } + return obj.(*rbac_v1.RoleBinding), err +} + +// List takes label and field selectors, and returns the list of RoleBindings that match those selectors. +func (c *FakeRoleBindings) List(opts v1.ListOptions) (result *rbac_v1.RoleBindingList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(rolebindingsResource, rolebindingsKind, c.ns, opts), &rbac_v1.RoleBindingList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &rbac_v1.RoleBindingList{} + for _, item := range obj.(*rbac_v1.RoleBindingList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested roleBindings. +func (c *FakeRoleBindings) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(rolebindingsResource, c.ns, opts)) + +} + +// Create takes the representation of a roleBinding and creates it. Returns the server's representation of the roleBinding, and an error, if there is any. +func (c *FakeRoleBindings) Create(roleBinding *rbac_v1.RoleBinding) (result *rbac_v1.RoleBinding, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(rolebindingsResource, c.ns, roleBinding), &rbac_v1.RoleBinding{}) + + if obj == nil { + return nil, err + } + return obj.(*rbac_v1.RoleBinding), err +} + +// Update takes the representation of a roleBinding and updates it. Returns the server's representation of the roleBinding, and an error, if there is any. +func (c *FakeRoleBindings) Update(roleBinding *rbac_v1.RoleBinding) (result *rbac_v1.RoleBinding, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(rolebindingsResource, c.ns, roleBinding), &rbac_v1.RoleBinding{}) + + if obj == nil { + return nil, err + } + return obj.(*rbac_v1.RoleBinding), err +} + +// Delete takes name of the roleBinding and deletes it. Returns an error if one occurs. +func (c *FakeRoleBindings) Delete(name string, options *v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(rolebindingsResource, c.ns, name), &rbac_v1.RoleBinding{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeRoleBindings) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(rolebindingsResource, c.ns, listOptions) + + _, err := c.Fake.Invokes(action, &rbac_v1.RoleBindingList{}) + return err +} + +// Patch applies the patch and returns the patched roleBinding. +func (c *FakeRoleBindings) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *rbac_v1.RoleBinding, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(rolebindingsResource, c.ns, name, data, subresources...), &rbac_v1.RoleBinding{}) + + if obj == nil { + return nil, err + } + return obj.(*rbac_v1.RoleBinding), err +} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/generated_expansion.go b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/generated_expansion.go new file mode 100644 index 00000000000..aa3df0df2fc --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/generated_expansion.go @@ -0,0 +1,25 @@ +/* +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 v1 + +type ClusterRoleExpansion interface{} + +type ClusterRoleBindingExpansion interface{} + +type RoleExpansion interface{} + +type RoleBindingExpansion interface{} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/rbac_client.go b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/rbac_client.go new file mode 100644 index 00000000000..dd0a0cb0dc5 --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/rbac_client.go @@ -0,0 +1,103 @@ +/* +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 v1 + +import ( + v1 "k8s.io/api/rbac/v1" + serializer "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +type RbacV1Interface interface { + RESTClient() rest.Interface + ClusterRolesGetter + ClusterRoleBindingsGetter + RolesGetter + RoleBindingsGetter +} + +// RbacV1Client is used to interact with features provided by the rbac.authorization.k8s.io group. +type RbacV1Client struct { + restClient rest.Interface +} + +func (c *RbacV1Client) ClusterRoles() ClusterRoleInterface { + return newClusterRoles(c) +} + +func (c *RbacV1Client) ClusterRoleBindings() ClusterRoleBindingInterface { + return newClusterRoleBindings(c) +} + +func (c *RbacV1Client) Roles(namespace string) RoleInterface { + return newRoles(c, namespace) +} + +func (c *RbacV1Client) RoleBindings(namespace string) RoleBindingInterface { + return newRoleBindings(c, namespace) +} + +// NewForConfig creates a new RbacV1Client for the given config. +func NewForConfig(c *rest.Config) (*RbacV1Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + client, err := rest.RESTClientFor(&config) + if err != nil { + return nil, err + } + return &RbacV1Client{client}, nil +} + +// NewForConfigOrDie creates a new RbacV1Client for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *RbacV1Client { + client, err := NewForConfig(c) + if err != nil { + panic(err) + } + return client +} + +// New creates a new RbacV1Client for the given RESTClient. +func New(c rest.Interface) *RbacV1Client { + return &RbacV1Client{c} +} + +func setConfigDefaults(config *rest.Config) error { + gv := v1.SchemeGroupVersion + config.GroupVersion = &gv + config.APIPath = "/apis" + config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} + + if config.UserAgent == "" { + config.UserAgent = rest.DefaultKubernetesUserAgent() + } + + return nil +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *RbacV1Client) RESTClient() rest.Interface { + if c == nil { + return nil + } + return c.restClient +} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/role.go b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/role.go new file mode 100644 index 00000000000..d83e722b734 --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/role.go @@ -0,0 +1,155 @@ +/* +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 v1 + +import ( + v1 "k8s.io/api/rbac/v1" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + scheme "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +// RolesGetter has a method to return a RoleInterface. +// A group's client should implement this interface. +type RolesGetter interface { + Roles(namespace string) RoleInterface +} + +// RoleInterface has methods to work with Role resources. +type RoleInterface interface { + Create(*v1.Role) (*v1.Role, error) + Update(*v1.Role) (*v1.Role, error) + Delete(name string, options *meta_v1.DeleteOptions) error + DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error + Get(name string, options meta_v1.GetOptions) (*v1.Role, error) + List(opts meta_v1.ListOptions) (*v1.RoleList, error) + Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Role, err error) + RoleExpansion +} + +// roles implements RoleInterface +type roles struct { + client rest.Interface + ns string +} + +// newRoles returns a Roles +func newRoles(c *RbacV1Client, namespace string) *roles { + return &roles{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the role, and returns the corresponding role object, and an error if there is any. +func (c *roles) Get(name string, options meta_v1.GetOptions) (result *v1.Role, err error) { + result = &v1.Role{} + err = c.client.Get(). + Namespace(c.ns). + Resource("roles"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of Roles that match those selectors. +func (c *roles) List(opts meta_v1.ListOptions) (result *v1.RoleList, err error) { + result = &v1.RoleList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("roles"). + VersionedParams(&opts, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested roles. +func (c *roles) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("roles"). + VersionedParams(&opts, scheme.ParameterCodec). + Watch() +} + +// Create takes the representation of a role and creates it. Returns the server's representation of the role, and an error, if there is any. +func (c *roles) Create(role *v1.Role) (result *v1.Role, err error) { + result = &v1.Role{} + err = c.client.Post(). + Namespace(c.ns). + Resource("roles"). + Body(role). + Do(). + Into(result) + return +} + +// Update takes the representation of a role and updates it. Returns the server's representation of the role, and an error, if there is any. +func (c *roles) Update(role *v1.Role) (result *v1.Role, err error) { + result = &v1.Role{} + err = c.client.Put(). + Namespace(c.ns). + Resource("roles"). + Name(role.Name). + Body(role). + Do(). + Into(result) + return +} + +// Delete takes name of the role and deletes it. Returns an error if one occurs. +func (c *roles) Delete(name string, options *meta_v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("roles"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *roles) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("roles"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched role. +func (c *roles) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Role, err error) { + result = &v1.Role{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("roles"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/rolebinding.go b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/rolebinding.go new file mode 100644 index 00000000000..a424365807f --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/rolebinding.go @@ -0,0 +1,155 @@ +/* +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 v1 + +import ( + v1 "k8s.io/api/rbac/v1" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + scheme "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +// RoleBindingsGetter has a method to return a RoleBindingInterface. +// A group's client should implement this interface. +type RoleBindingsGetter interface { + RoleBindings(namespace string) RoleBindingInterface +} + +// RoleBindingInterface has methods to work with RoleBinding resources. +type RoleBindingInterface interface { + Create(*v1.RoleBinding) (*v1.RoleBinding, error) + Update(*v1.RoleBinding) (*v1.RoleBinding, error) + Delete(name string, options *meta_v1.DeleteOptions) error + DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error + Get(name string, options meta_v1.GetOptions) (*v1.RoleBinding, error) + List(opts meta_v1.ListOptions) (*v1.RoleBindingList, error) + Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.RoleBinding, err error) + RoleBindingExpansion +} + +// roleBindings implements RoleBindingInterface +type roleBindings struct { + client rest.Interface + ns string +} + +// newRoleBindings returns a RoleBindings +func newRoleBindings(c *RbacV1Client, namespace string) *roleBindings { + return &roleBindings{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the roleBinding, and returns the corresponding roleBinding object, and an error if there is any. +func (c *roleBindings) Get(name string, options meta_v1.GetOptions) (result *v1.RoleBinding, err error) { + result = &v1.RoleBinding{} + err = c.client.Get(). + Namespace(c.ns). + Resource("rolebindings"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of RoleBindings that match those selectors. +func (c *roleBindings) List(opts meta_v1.ListOptions) (result *v1.RoleBindingList, err error) { + result = &v1.RoleBindingList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("rolebindings"). + VersionedParams(&opts, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested roleBindings. +func (c *roleBindings) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("rolebindings"). + VersionedParams(&opts, scheme.ParameterCodec). + Watch() +} + +// Create takes the representation of a roleBinding and creates it. Returns the server's representation of the roleBinding, and an error, if there is any. +func (c *roleBindings) Create(roleBinding *v1.RoleBinding) (result *v1.RoleBinding, err error) { + result = &v1.RoleBinding{} + err = c.client.Post(). + Namespace(c.ns). + Resource("rolebindings"). + Body(roleBinding). + Do(). + Into(result) + return +} + +// Update takes the representation of a roleBinding and updates it. Returns the server's representation of the roleBinding, and an error, if there is any. +func (c *roleBindings) Update(roleBinding *v1.RoleBinding) (result *v1.RoleBinding, err error) { + result = &v1.RoleBinding{} + err = c.client.Put(). + Namespace(c.ns). + Resource("rolebindings"). + Name(roleBinding.Name). + Body(roleBinding). + Do(). + Into(result) + return +} + +// Delete takes name of the roleBinding and deletes it. Returns an error if one occurs. +func (c *roleBindings) Delete(name string, options *meta_v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("rolebindings"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *roleBindings) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("rolebindings"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched roleBinding. +func (c *roleBindings) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.RoleBinding, err error) { + result = &v1.RoleBinding{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("rolebindings"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/BUILD index 48b1ee1f6a4..c61acfed0d8 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "role.go", "rolebinding.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/BUILD index 4c1cb329f5e..eb119bb8ecd 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "fake_role.go", "fake_rolebinding.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/BUILD index d47d4022401..4d29cb8cda9 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "role.go", "rolebinding.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/BUILD index 77f842fbbd7..335e84a513b 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "fake_role.go", "fake_rolebinding.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/BUILD index 1460afa609c..e1879101710 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "priorityclass.go", "scheduling_client.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/BUILD index ebe1632848f..3054049f0e5 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_priorityclass.go", "fake_scheduling_client.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/BUILD index d38d4d2966e..a4304afd3c7 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "podpreset.go", "settings_client.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/settings/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/BUILD index 0a379fd4668..9c6c59609ab 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_podpreset.go", "fake_settings_client.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/settings/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1/BUILD index 3a13f4e0d56..6d26ca505e6 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "storage_client.go", "storageclass.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/storage/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1/fake/BUILD index 980b0789c97..b53cee2e6f9 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_storage_client.go", "fake_storageclass.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/storage/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1/BUILD index 35611336aed..9bee7a36ff7 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "storage_client.go", "storageclass.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/storage/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/BUILD b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/BUILD index 5d7683827cc..95b3f2149d3 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/BUILD +++ b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_storage_client.go", "fake_storageclass.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/storage/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/admissionregistration/v1alpha1/BUILD b/staging/src/k8s.io/client-go/listers/admissionregistration/v1alpha1/BUILD index d1798368ba6..cdc0c6e4aef 100644 --- a/staging/src/k8s.io/client-go/listers/admissionregistration/v1alpha1/BUILD +++ b/staging/src/k8s.io/client-go/listers/admissionregistration/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "externaladmissionhookconfiguration.go", "initializerconfiguration.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/apps/v1beta1/BUILD b/staging/src/k8s.io/client-go/listers/apps/v1beta1/BUILD index 724d4473cb3..586e116fd35 100644 --- a/staging/src/k8s.io/client-go/listers/apps/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/listers/apps/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "statefulset.go", "statefulset_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/apps/v1beta1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/apps/v1beta2/BUILD b/staging/src/k8s.io/client-go/listers/apps/v1beta2/BUILD index 918433303be..eda475f3a1f 100644 --- a/staging/src/k8s.io/client-go/listers/apps/v1beta2/BUILD +++ b/staging/src/k8s.io/client-go/listers/apps/v1beta2/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "scale.go", "statefulset.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/apps/v1beta2:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/authentication/v1/BUILD b/staging/src/k8s.io/client-go/listers/authentication/v1/BUILD index 39abc7dc9f3..3085d144914 100644 --- a/staging/src/k8s.io/client-go/listers/authentication/v1/BUILD +++ b/staging/src/k8s.io/client-go/listers/authentication/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "tokenreview.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/authentication/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/authentication/v1beta1/BUILD b/staging/src/k8s.io/client-go/listers/authentication/v1beta1/BUILD index 546f5c1ded5..9c074127bb6 100644 --- a/staging/src/k8s.io/client-go/listers/authentication/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/listers/authentication/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "tokenreview.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/authentication/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/authorization/v1/BUILD b/staging/src/k8s.io/client-go/listers/authorization/v1/BUILD index c98163e89cf..3c77a5e3583 100644 --- a/staging/src/k8s.io/client-go/listers/authorization/v1/BUILD +++ b/staging/src/k8s.io/client-go/listers/authorization/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "selfsubjectaccessreview.go", "subjectaccessreview.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/authorization/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/authorization/v1beta1/BUILD b/staging/src/k8s.io/client-go/listers/authorization/v1beta1/BUILD index c333188f935..7fca960f7c6 100644 --- a/staging/src/k8s.io/client-go/listers/authorization/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/listers/authorization/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "selfsubjectaccessreview.go", "subjectaccessreview.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/authorization/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/autoscaling/v1/BUILD b/staging/src/k8s.io/client-go/listers/autoscaling/v1/BUILD index 869d3817a01..f52b549ec1d 100644 --- a/staging/src/k8s.io/client-go/listers/autoscaling/v1/BUILD +++ b/staging/src/k8s.io/client-go/listers/autoscaling/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "horizontalpodautoscaler.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/autoscaling/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/autoscaling/v2alpha1/BUILD b/staging/src/k8s.io/client-go/listers/autoscaling/v2alpha1/BUILD index 72250b413aa..29131c9cbc1 100644 --- a/staging/src/k8s.io/client-go/listers/autoscaling/v2alpha1/BUILD +++ b/staging/src/k8s.io/client-go/listers/autoscaling/v2alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "horizontalpodautoscaler.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/autoscaling/v2alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/batch/v1/BUILD b/staging/src/k8s.io/client-go/listers/batch/v1/BUILD index 16b4524a4c2..8a188ac0922 100644 --- a/staging/src/k8s.io/client-go/listers/batch/v1/BUILD +++ b/staging/src/k8s.io/client-go/listers/batch/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "job.go", "job_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/batch/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/batch/v2alpha1/BUILD b/staging/src/k8s.io/client-go/listers/batch/v2alpha1/BUILD index 98488e85ad8..d4b630172c5 100644 --- a/staging/src/k8s.io/client-go/listers/batch/v2alpha1/BUILD +++ b/staging/src/k8s.io/client-go/listers/batch/v2alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "cronjob.go", "expansion_generated.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/certificates/v1beta1/BUILD b/staging/src/k8s.io/client-go/listers/certificates/v1beta1/BUILD index 09c7548b579..a3a11915cc5 100644 --- a/staging/src/k8s.io/client-go/listers/certificates/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/listers/certificates/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "certificatesigningrequest.go", "expansion_generated.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/core/v1/BUILD b/staging/src/k8s.io/client-go/listers/core/v1/BUILD index 0563a81f9c3..beb7e6635cc 100644 --- a/staging/src/k8s.io/client-go/listers/core/v1/BUILD +++ b/staging/src/k8s.io/client-go/listers/core/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -31,7 +29,6 @@ go_library( "service_expansion.go", "serviceaccount.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/extensions/v1beta1/BUILD b/staging/src/k8s.io/client-go/listers/extensions/v1beta1/BUILD index be474995673..9dec1ff0711 100644 --- a/staging/src/k8s.io/client-go/listers/extensions/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/listers/extensions/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -23,7 +21,6 @@ go_library( "scale.go", "thirdpartyresource.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/apps/v1beta1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -39,7 +36,6 @@ go_test( name = "go_default_test", srcs = ["daemonset_expansion_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/imagepolicy/v1alpha1/BUILD b/staging/src/k8s.io/client-go/listers/imagepolicy/v1alpha1/BUILD index c1e68939693..49bac986b2c 100644 --- a/staging/src/k8s.io/client-go/listers/imagepolicy/v1alpha1/BUILD +++ b/staging/src/k8s.io/client-go/listers/imagepolicy/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "imagereview.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/imagepolicy/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/networking/v1/BUILD b/staging/src/k8s.io/client-go/listers/networking/v1/BUILD index b1dbfa2a7d8..4b6e2183239 100644 --- a/staging/src/k8s.io/client-go/listers/networking/v1/BUILD +++ b/staging/src/k8s.io/client-go/listers/networking/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "networkpolicy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/networking/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/policy/v1beta1/BUILD b/staging/src/k8s.io/client-go/listers/policy/v1beta1/BUILD index 82eb2787008..8bcde940c23 100644 --- a/staging/src/k8s.io/client-go/listers/policy/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/listers/policy/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "poddisruptionbudget.go", "poddisruptionbudget_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/rbac/v1/BUILD b/staging/src/k8s.io/client-go/listers/rbac/v1/BUILD new file mode 100644 index 00000000000..d3c5e2e38e8 --- /dev/null +++ b/staging/src/k8s.io/client-go/listers/rbac/v1/BUILD @@ -0,0 +1,37 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = [ + "clusterrole.go", + "clusterrolebinding.go", + "expansion_generated.go", + "role.go", + "rolebinding.go", + ], + deps = [ + "//vendor/k8s.io/api/rbac/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", + "//vendor/k8s.io/client-go/tools/cache:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/staging/src/k8s.io/client-go/listers/rbac/v1/clusterrole.go b/staging/src/k8s.io/client-go/listers/rbac/v1/clusterrole.go new file mode 100644 index 00000000000..f95d063bef3 --- /dev/null +++ b/staging/src/k8s.io/client-go/listers/rbac/v1/clusterrole.go @@ -0,0 +1,67 @@ +/* +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. +*/ + +// This file was automatically generated by lister-gen + +package v1 + +import ( + v1 "k8s.io/api/rbac/v1" + "k8s.io/apimachinery/pkg/api/errors" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// ClusterRoleLister helps list ClusterRoles. +type ClusterRoleLister interface { + // List lists all ClusterRoles in the indexer. + List(selector labels.Selector) (ret []*v1.ClusterRole, err error) + // Get retrieves the ClusterRole from the index for a given name. + Get(name string) (*v1.ClusterRole, error) + ClusterRoleListerExpansion +} + +// clusterRoleLister implements the ClusterRoleLister interface. +type clusterRoleLister struct { + indexer cache.Indexer +} + +// NewClusterRoleLister returns a new ClusterRoleLister. +func NewClusterRoleLister(indexer cache.Indexer) ClusterRoleLister { + return &clusterRoleLister{indexer: indexer} +} + +// List lists all ClusterRoles in the indexer. +func (s *clusterRoleLister) List(selector labels.Selector) (ret []*v1.ClusterRole, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1.ClusterRole)) + }) + return ret, err +} + +// Get retrieves the ClusterRole from the index for a given name. +func (s *clusterRoleLister) Get(name string) (*v1.ClusterRole, error) { + key := &v1.ClusterRole{ObjectMeta: meta_v1.ObjectMeta{Name: name}} + obj, exists, err := s.indexer.Get(key) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1.Resource("clusterrole"), name) + } + return obj.(*v1.ClusterRole), nil +} diff --git a/staging/src/k8s.io/client-go/listers/rbac/v1/clusterrolebinding.go b/staging/src/k8s.io/client-go/listers/rbac/v1/clusterrolebinding.go new file mode 100644 index 00000000000..cce8a0f4870 --- /dev/null +++ b/staging/src/k8s.io/client-go/listers/rbac/v1/clusterrolebinding.go @@ -0,0 +1,67 @@ +/* +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. +*/ + +// This file was automatically generated by lister-gen + +package v1 + +import ( + v1 "k8s.io/api/rbac/v1" + "k8s.io/apimachinery/pkg/api/errors" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// ClusterRoleBindingLister helps list ClusterRoleBindings. +type ClusterRoleBindingLister interface { + // List lists all ClusterRoleBindings in the indexer. + List(selector labels.Selector) (ret []*v1.ClusterRoleBinding, err error) + // Get retrieves the ClusterRoleBinding from the index for a given name. + Get(name string) (*v1.ClusterRoleBinding, error) + ClusterRoleBindingListerExpansion +} + +// clusterRoleBindingLister implements the ClusterRoleBindingLister interface. +type clusterRoleBindingLister struct { + indexer cache.Indexer +} + +// NewClusterRoleBindingLister returns a new ClusterRoleBindingLister. +func NewClusterRoleBindingLister(indexer cache.Indexer) ClusterRoleBindingLister { + return &clusterRoleBindingLister{indexer: indexer} +} + +// List lists all ClusterRoleBindings in the indexer. +func (s *clusterRoleBindingLister) List(selector labels.Selector) (ret []*v1.ClusterRoleBinding, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1.ClusterRoleBinding)) + }) + return ret, err +} + +// Get retrieves the ClusterRoleBinding from the index for a given name. +func (s *clusterRoleBindingLister) Get(name string) (*v1.ClusterRoleBinding, error) { + key := &v1.ClusterRoleBinding{ObjectMeta: meta_v1.ObjectMeta{Name: name}} + obj, exists, err := s.indexer.Get(key) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1.Resource("clusterrolebinding"), name) + } + return obj.(*v1.ClusterRoleBinding), nil +} diff --git a/staging/src/k8s.io/client-go/listers/rbac/v1/expansion_generated.go b/staging/src/k8s.io/client-go/listers/rbac/v1/expansion_generated.go new file mode 100644 index 00000000000..4d9872d3e25 --- /dev/null +++ b/staging/src/k8s.io/client-go/listers/rbac/v1/expansion_generated.go @@ -0,0 +1,43 @@ +/* +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. +*/ + +// This file was automatically generated by lister-gen + +package v1 + +// ClusterRoleListerExpansion allows custom methods to be added to +// ClusterRoleLister. +type ClusterRoleListerExpansion interface{} + +// ClusterRoleBindingListerExpansion allows custom methods to be added to +// ClusterRoleBindingLister. +type ClusterRoleBindingListerExpansion interface{} + +// RoleListerExpansion allows custom methods to be added to +// RoleLister. +type RoleListerExpansion interface{} + +// RoleNamespaceListerExpansion allows custom methods to be added to +// RoleNamespaceLister. +type RoleNamespaceListerExpansion interface{} + +// RoleBindingListerExpansion allows custom methods to be added to +// RoleBindingLister. +type RoleBindingListerExpansion interface{} + +// RoleBindingNamespaceListerExpansion allows custom methods to be added to +// RoleBindingNamespaceLister. +type RoleBindingNamespaceListerExpansion interface{} diff --git a/staging/src/k8s.io/client-go/listers/rbac/v1/role.go b/staging/src/k8s.io/client-go/listers/rbac/v1/role.go new file mode 100644 index 00000000000..8d7625dbe30 --- /dev/null +++ b/staging/src/k8s.io/client-go/listers/rbac/v1/role.go @@ -0,0 +1,94 @@ +/* +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. +*/ + +// This file was automatically generated by lister-gen + +package v1 + +import ( + v1 "k8s.io/api/rbac/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// RoleLister helps list Roles. +type RoleLister interface { + // List lists all Roles in the indexer. + List(selector labels.Selector) (ret []*v1.Role, err error) + // Roles returns an object that can list and get Roles. + Roles(namespace string) RoleNamespaceLister + RoleListerExpansion +} + +// roleLister implements the RoleLister interface. +type roleLister struct { + indexer cache.Indexer +} + +// NewRoleLister returns a new RoleLister. +func NewRoleLister(indexer cache.Indexer) RoleLister { + return &roleLister{indexer: indexer} +} + +// List lists all Roles in the indexer. +func (s *roleLister) List(selector labels.Selector) (ret []*v1.Role, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1.Role)) + }) + return ret, err +} + +// Roles returns an object that can list and get Roles. +func (s *roleLister) Roles(namespace string) RoleNamespaceLister { + return roleNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// RoleNamespaceLister helps list and get Roles. +type RoleNamespaceLister interface { + // List lists all Roles in the indexer for a given namespace. + List(selector labels.Selector) (ret []*v1.Role, err error) + // Get retrieves the Role from the indexer for a given namespace and name. + Get(name string) (*v1.Role, error) + RoleNamespaceListerExpansion +} + +// roleNamespaceLister implements the RoleNamespaceLister +// interface. +type roleNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all Roles in the indexer for a given namespace. +func (s roleNamespaceLister) List(selector labels.Selector) (ret []*v1.Role, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1.Role)) + }) + return ret, err +} + +// Get retrieves the Role from the indexer for a given namespace and name. +func (s roleNamespaceLister) Get(name string) (*v1.Role, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1.Resource("role"), name) + } + return obj.(*v1.Role), nil +} diff --git a/staging/src/k8s.io/client-go/listers/rbac/v1/rolebinding.go b/staging/src/k8s.io/client-go/listers/rbac/v1/rolebinding.go new file mode 100644 index 00000000000..b8209d85120 --- /dev/null +++ b/staging/src/k8s.io/client-go/listers/rbac/v1/rolebinding.go @@ -0,0 +1,94 @@ +/* +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. +*/ + +// This file was automatically generated by lister-gen + +package v1 + +import ( + v1 "k8s.io/api/rbac/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// RoleBindingLister helps list RoleBindings. +type RoleBindingLister interface { + // List lists all RoleBindings in the indexer. + List(selector labels.Selector) (ret []*v1.RoleBinding, err error) + // RoleBindings returns an object that can list and get RoleBindings. + RoleBindings(namespace string) RoleBindingNamespaceLister + RoleBindingListerExpansion +} + +// roleBindingLister implements the RoleBindingLister interface. +type roleBindingLister struct { + indexer cache.Indexer +} + +// NewRoleBindingLister returns a new RoleBindingLister. +func NewRoleBindingLister(indexer cache.Indexer) RoleBindingLister { + return &roleBindingLister{indexer: indexer} +} + +// List lists all RoleBindings in the indexer. +func (s *roleBindingLister) List(selector labels.Selector) (ret []*v1.RoleBinding, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1.RoleBinding)) + }) + return ret, err +} + +// RoleBindings returns an object that can list and get RoleBindings. +func (s *roleBindingLister) RoleBindings(namespace string) RoleBindingNamespaceLister { + return roleBindingNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// RoleBindingNamespaceLister helps list and get RoleBindings. +type RoleBindingNamespaceLister interface { + // List lists all RoleBindings in the indexer for a given namespace. + List(selector labels.Selector) (ret []*v1.RoleBinding, err error) + // Get retrieves the RoleBinding from the indexer for a given namespace and name. + Get(name string) (*v1.RoleBinding, error) + RoleBindingNamespaceListerExpansion +} + +// roleBindingNamespaceLister implements the RoleBindingNamespaceLister +// interface. +type roleBindingNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all RoleBindings in the indexer for a given namespace. +func (s roleBindingNamespaceLister) List(selector labels.Selector) (ret []*v1.RoleBinding, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1.RoleBinding)) + }) + return ret, err +} + +// Get retrieves the RoleBinding from the indexer for a given namespace and name. +func (s roleBindingNamespaceLister) Get(name string) (*v1.RoleBinding, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1.Resource("rolebinding"), name) + } + return obj.(*v1.RoleBinding), nil +} diff --git a/staging/src/k8s.io/client-go/listers/rbac/v1alpha1/BUILD b/staging/src/k8s.io/client-go/listers/rbac/v1alpha1/BUILD index 0934d827733..c497f2966b1 100644 --- a/staging/src/k8s.io/client-go/listers/rbac/v1alpha1/BUILD +++ b/staging/src/k8s.io/client-go/listers/rbac/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "role.go", "rolebinding.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/rbac/v1beta1/BUILD b/staging/src/k8s.io/client-go/listers/rbac/v1beta1/BUILD index 47f5b0b3d31..85de3ea1928 100644 --- a/staging/src/k8s.io/client-go/listers/rbac/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/listers/rbac/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "role.go", "rolebinding.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/scheduling/v1alpha1/BUILD b/staging/src/k8s.io/client-go/listers/scheduling/v1alpha1/BUILD index 89c8472aaf3..163c965a32d 100644 --- a/staging/src/k8s.io/client-go/listers/scheduling/v1alpha1/BUILD +++ b/staging/src/k8s.io/client-go/listers/scheduling/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "priorityclass.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/settings/v1alpha1/BUILD b/staging/src/k8s.io/client-go/listers/settings/v1alpha1/BUILD index 6f90ea1900d..436fa356c17 100644 --- a/staging/src/k8s.io/client-go/listers/settings/v1alpha1/BUILD +++ b/staging/src/k8s.io/client-go/listers/settings/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "podpreset.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/settings/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/storage/v1/BUILD b/staging/src/k8s.io/client-go/listers/storage/v1/BUILD index 9c0063288a7..4bf813e3b20 100644 --- a/staging/src/k8s.io/client-go/listers/storage/v1/BUILD +++ b/staging/src/k8s.io/client-go/listers/storage/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "storageclass.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/storage/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/listers/storage/v1beta1/BUILD b/staging/src/k8s.io/client-go/listers/storage/v1beta1/BUILD index 8339735a9b0..57fcd37c698 100644 --- a/staging/src/k8s.io/client-go/listers/storage/v1beta1/BUILD +++ b/staging/src/k8s.io/client-go/listers/storage/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "storageclass.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/storage/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/pkg/version/BUILD b/staging/src/k8s.io/client-go/pkg/version/BUILD index e54fcdc2ec9..2bb94c6e225 100644 --- a/staging/src/k8s.io/client-go/pkg/version/BUILD +++ b/staging/src/k8s.io/client-go/pkg/version/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "version.go", ], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/version:go_default_library"], ) diff --git a/staging/src/k8s.io/client-go/plugin/pkg/auth/authenticator/token/oidc/testing/BUILD b/staging/src/k8s.io/client-go/plugin/pkg/auth/authenticator/token/oidc/testing/BUILD index 67cf5c04084..06edbb1c5e7 100644 --- a/staging/src/k8s.io/client-go/plugin/pkg/auth/authenticator/token/oidc/testing/BUILD +++ b/staging/src/k8s.io/client-go/plugin/pkg/auth/authenticator/token/oidc/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["provider.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/go-oidc/jose:go_default_library", "//vendor/github.com/coreos/go-oidc/key:go_default_library", diff --git a/staging/src/k8s.io/client-go/plugin/pkg/client/auth/BUILD b/staging/src/k8s.io/client-go/plugin/pkg/client/auth/BUILD index b0c9df62f56..c4ed1de5aab 100644 --- a/staging/src/k8s.io/client-go/plugin/pkg/client/auth/BUILD +++ b/staging/src/k8s.io/client-go/plugin/pkg/client/auth/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,11 +8,11 @@ load( go_library( name = "go_default_library", srcs = ["plugins.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/client-go/plugin/pkg/client/auth/azure:go_default_library", "//vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp:go_default_library", "//vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc:go_default_library", + "//vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack:go_default_library", ], ) @@ -32,6 +30,7 @@ filegroup( "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/azure:all-srcs", "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/gcp:all-srcs", "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/oidc:all-srcs", + "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/openstack:all-srcs", ], tags = ["automanaged"], ) diff --git a/staging/src/k8s.io/client-go/plugin/pkg/client/auth/azure/BUILD b/staging/src/k8s.io/client-go/plugin/pkg/client/auth/azure/BUILD index ab4630e5a19..2c928c71f84 100644 --- a/staging/src/k8s.io/client-go/plugin/pkg/client/auth/azure/BUILD +++ b/staging/src/k8s.io/client-go/plugin/pkg/client/auth/azure/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,12 @@ go_test( name = "go_default_test", srcs = ["azure_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/github.com/Azure/go-autorest/autorest/adal:go_default_library"], ) go_library( name = "go_default_library", srcs = ["azure.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", "//vendor/github.com/Azure/go-autorest/autorest/adal:go_default_library", diff --git a/staging/src/k8s.io/client-go/plugin/pkg/client/auth/gcp/BUILD b/staging/src/k8s.io/client-go/plugin/pkg/client/auth/gcp/BUILD index 9939f6cfcec..adba877c62d 100644 --- a/staging/src/k8s.io/client-go/plugin/pkg/client/auth/gcp/BUILD +++ b/staging/src/k8s.io/client-go/plugin/pkg/client/auth/gcp/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,12 @@ go_test( name = "go_default_test", srcs = ["gcp_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/golang.org/x/oauth2:go_default_library"], ) go_library( name = "go_default_library", srcs = ["gcp.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", diff --git a/staging/src/k8s.io/client-go/plugin/pkg/client/auth/oidc/BUILD b/staging/src/k8s.io/client-go/plugin/pkg/client/auth/oidc/BUILD index 924a6842cf1..c65bfe9dabe 100644 --- a/staging/src/k8s.io/client-go/plugin/pkg/client/auth/oidc/BUILD +++ b/staging/src/k8s.io/client-go/plugin/pkg/client/auth/oidc/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["oidc_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["oidc.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/golang.org/x/oauth2:go_default_library", diff --git a/staging/src/k8s.io/client-go/plugin/pkg/client/auth/openstack/BUILD b/staging/src/k8s.io/client-go/plugin/pkg/client/auth/openstack/BUILD new file mode 100644 index 00000000000..211e390e600 --- /dev/null +++ b/staging/src/k8s.io/client-go/plugin/pkg/client/auth/openstack/BUILD @@ -0,0 +1,36 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = ["openstack_test.go"], + library = ":go_default_library", +) + +go_library( + name = "go_default_library", + srcs = ["openstack.go"], + deps = [ + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/github.com/gophercloud/gophercloud/openstack:go_default_library", + "//vendor/k8s.io/client-go/rest:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/staging/src/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack.go b/staging/src/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack.go new file mode 100644 index 00000000000..9df94913122 --- /dev/null +++ b/staging/src/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack.go @@ -0,0 +1,161 @@ +/* +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 openstack + +import ( + "fmt" + "net/http" + "sync" + "time" + + "github.com/golang/glog" + "github.com/gophercloud/gophercloud/openstack" + + restclient "k8s.io/client-go/rest" +) + +func init() { + if err := restclient.RegisterAuthProviderPlugin("openstack", newOpenstackAuthProvider); err != nil { + glog.Fatalf("Failed to register openstack auth plugin: %s", err) + } +} + +// DefaultTTLDuration is the time before a token gets expired. +const DefaultTTLDuration = 10 * time.Minute + +// openstackAuthProvider is an authprovider for openstack. this provider reads +// the environment variables to determine the client identity, and generates a +// token which will be inserted into the request header later. +type openstackAuthProvider struct { + ttl time.Duration + + tokenGetter TokenGetter +} + +// TokenGetter returns a bearer token that can be inserted into request. +type TokenGetter interface { + Token() (string, error) +} + +type tokenGetter struct{} + +// Token creates a token by authenticate with keystone. +func (*tokenGetter) Token() (string, error) { + options, err := openstack.AuthOptionsFromEnv() + if err != nil { + return "", fmt.Errorf("failed to read openstack env vars: %s", err) + } + client, err := openstack.AuthenticatedClient(options) + if err != nil { + return "", fmt.Errorf("authentication failed: %s", err) + } + return client.TokenID, nil +} + +// cachedGetter caches a token until it gets expired, after the expiration, it will +// generate another token and cache it. +type cachedGetter struct { + mutex sync.Mutex + tokenGetter TokenGetter + + token string + born time.Time + ttl time.Duration +} + +// Token returns the current available token, create a new one if expired. +func (c *cachedGetter) Token() (string, error) { + c.mutex.Lock() + defer c.mutex.Unlock() + + var err error + // no token or exceeds the TTL + if c.token == "" || time.Now().Sub(c.born) > c.ttl { + c.token, err = c.tokenGetter.Token() + if err != nil { + return "", fmt.Errorf("failed to get token: %s", err) + } + c.born = time.Now() + } + return c.token, nil +} + +// tokenRoundTripper implements the RoundTripper interface: adding the bearer token +// into the request header. +type tokenRoundTripper struct { + http.RoundTripper + + tokenGetter TokenGetter +} + +// RoundTrip adds the bearer token into the request. +func (t *tokenRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + // if the authorization header already present, use it. + if req.Header.Get("Authorization") != "" { + return t.RoundTripper.RoundTrip(req) + } + + token, err := t.tokenGetter.Token() + if err == nil { + req.Header.Set("Authorization", "Bearer "+token) + } else { + glog.V(4).Infof("failed to get token: %s", err) + } + + return t.RoundTripper.RoundTrip(req) +} + +// newOpenstackAuthProvider creates an auth provider which works with openstack +// environment. +func newOpenstackAuthProvider(clusterAddress string, config map[string]string, persister restclient.AuthProviderConfigPersister) (restclient.AuthProvider, error) { + var ttlDuration time.Duration + var err error + + ttl, found := config["ttl"] + if !found { + ttlDuration = DefaultTTLDuration + // persist to config + config["ttl"] = ttlDuration.String() + if err = persister.Persist(config); err != nil { + return nil, fmt.Errorf("failed to persist config: %s", err) + } + } else { + ttlDuration, err = time.ParseDuration(ttl) + if err != nil { + return nil, fmt.Errorf("failed to parse ttl config: %s", err) + } + } + + // TODO: read/persist client configuration(OS_XXX env vars) in config + + return &openstackAuthProvider{ + ttl: ttlDuration, + tokenGetter: &tokenGetter{}, + }, nil +} + +func (oap *openstackAuthProvider) WrapTransport(rt http.RoundTripper) http.RoundTripper { + return &tokenRoundTripper{ + RoundTripper: rt, + tokenGetter: &cachedGetter{ + tokenGetter: oap.tokenGetter, + ttl: oap.ttl, + }, + } +} + +func (oap *openstackAuthProvider) Login() error { return nil } diff --git a/staging/src/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack_test.go b/staging/src/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack_test.go new file mode 100644 index 00000000000..411bec70f7f --- /dev/null +++ b/staging/src/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack_test.go @@ -0,0 +1,116 @@ +/* +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 openstack + +import ( + "math/rand" + "net/http" + "testing" + "time" +) + +// testTokenGetter is a simple random token getter. +type testTokenGetter struct{} + +const LetterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + +func RandStringBytes(n int) string { + b := make([]byte, n) + for i := range b { + b[i] = LetterBytes[rand.Intn(len(LetterBytes))] + } + return string(b) +} + +func (*testTokenGetter) Token() (string, error) { + return RandStringBytes(32), nil +} + +// testRoundTripper is mocked roundtripper which responds with unauthorized when +// there is no authorization header, otherwise returns status ok. +type testRoundTripper struct{} + +func (trt *testRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + authHeader := req.Header.Get("Authorization") + if authHeader == "" || authHeader == "Bearer " { + return &http.Response{ + StatusCode: http.StatusUnauthorized, + }, nil + } + return &http.Response{StatusCode: http.StatusOK}, nil +} + +func TestOpenstackAuthProvider(t *testing.T) { + trt := &tokenRoundTripper{ + RoundTripper: &testRoundTripper{}, + } + + tests := []struct { + name string + ttl time.Duration + interval time.Duration + same bool + }{ + { + name: "normal", + ttl: 2 * time.Second, + interval: 1 * time.Second, + same: true, + }, + { + name: "expire", + ttl: 1 * time.Second, + interval: 2 * time.Second, + same: false, + }, + } + + for _, test := range tests { + trt.tokenGetter = &cachedGetter{ + tokenGetter: &testTokenGetter{}, + ttl: test.ttl, + } + + req, err := http.NewRequest(http.MethodPost, "https://test-api-server.com", nil) + if err != nil { + t.Errorf("failed to new request: %s", err) + } + trt.RoundTrip(req) + header := req.Header.Get("Authorization") + if header == "" { + t.Errorf("expect to see token in header, but is absent") + } + + time.Sleep(test.interval) + + req, err = http.NewRequest(http.MethodPost, "https://test-api-server.com", nil) + if err != nil { + t.Errorf("failed to new request: %s", err) + } + trt.RoundTrip(req) + newHeader := req.Header.Get("Authorization") + if newHeader == "" { + t.Errorf("expect to see token in header, but is absent") + } + + same := newHeader == header + if same != test.same { + t.Errorf("expect to get %t when compare header, but saw %t", test.same, same) + } + } + +} diff --git a/staging/src/k8s.io/client-go/plugin/pkg/client/auth/plugins.go b/staging/src/k8s.io/client-go/plugin/pkg/client/auth/plugins.go index 0328fbd8e7f..42085d7ae15 100644 --- a/staging/src/k8s.io/client-go/plugin/pkg/client/auth/plugins.go +++ b/staging/src/k8s.io/client-go/plugin/pkg/client/auth/plugins.go @@ -21,4 +21,5 @@ import ( _ "k8s.io/client-go/plugin/pkg/client/auth/azure" _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" _ "k8s.io/client-go/plugin/pkg/client/auth/oidc" + _ "k8s.io/client-go/plugin/pkg/client/auth/openstack" ) diff --git a/staging/src/k8s.io/client-go/rest/BUILD b/staging/src/k8s.io/client-go/rest/BUILD index d0047406c0b..ee877febc13 100644 --- a/staging/src/k8s.io/client-go/rest/BUILD +++ b/staging/src/k8s.io/client-go/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_test( "urlbackoff_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", @@ -59,7 +56,6 @@ go_library( "versions.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/rest/config.go b/staging/src/k8s.io/client-go/rest/config.go index 627a9cc9672..dca7333dd00 100644 --- a/staging/src/k8s.io/client-go/rest/config.go +++ b/staging/src/k8s.io/client-go/rest/config.go @@ -71,10 +71,6 @@ type Config struct { // TODO: demonstrate an OAuth2 compatible client. BearerToken string - // CacheDir is the directory where we'll store HTTP cached responses. - // If set to empty string, no caching mechanism will be used. - CacheDir string - // Impersonate is the configuration that RESTClient will use for impersonation. Impersonate ImpersonationConfig diff --git a/staging/src/k8s.io/client-go/rest/config_test.go b/staging/src/k8s.io/client-go/rest/config_test.go index f20ed722dd6..f04135a4288 100644 --- a/staging/src/k8s.io/client-go/rest/config_test.go +++ b/staging/src/k8s.io/client-go/rest/config_test.go @@ -249,7 +249,6 @@ func TestAnonymousConfig(t *testing.T) { expected.BearerToken = "" expected.Username = "" expected.Password = "" - expected.CacheDir = "" expected.AuthProvider = nil expected.AuthConfigPersister = nil expected.TLSClientConfig.CertData = nil diff --git a/staging/src/k8s.io/client-go/rest/fake/BUILD b/staging/src/k8s.io/client-go/rest/fake/BUILD index 0304f04b9ce..9b013d3e4c2 100644 --- a/staging/src/k8s.io/client-go/rest/fake/BUILD +++ b/staging/src/k8s.io/client-go/rest/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["fake.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/client-go/rest/transport.go b/staging/src/k8s.io/client-go/rest/transport.go index 4c5b1648e96..ba43752bc93 100644 --- a/staging/src/k8s.io/client-go/rest/transport.go +++ b/staging/src/k8s.io/client-go/rest/transport.go @@ -89,7 +89,6 @@ func (c *Config) TransportConfig() (*transport.Config, error) { }, Username: c.Username, Password: c.Password, - CacheDir: c.CacheDir, BearerToken: c.BearerToken, Impersonate: transport.ImpersonationConfig{ UserName: c.Impersonate.UserName, diff --git a/staging/src/k8s.io/client-go/rest/watch/BUILD b/staging/src/k8s.io/client-go/rest/watch/BUILD index cd3937362d3..9e0082cc276 100644 --- a/staging/src/k8s.io/client-go/rest/watch/BUILD +++ b/staging/src/k8s.io/client-go/rest/watch/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "decoder.go", "encoder.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", @@ -29,7 +26,6 @@ go_test( "decoder_test.go", "encoder_test.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", diff --git a/staging/src/k8s.io/client-go/testing/BUILD b/staging/src/k8s.io/client-go/testing/BUILD index b7f5df644fb..3eb2728b3b9 100644 --- a/staging/src/k8s.io/client-go/testing/BUILD +++ b/staging/src/k8s.io/client-go/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake.go", "fixture.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", diff --git a/staging/src/k8s.io/client-go/third_party/forked/golang/template/BUILD b/staging/src/k8s.io/client-go/third_party/forked/golang/template/BUILD index 1c022b63430..26dd36f17ed 100644 --- a/staging/src/k8s.io/client-go/third_party/forked/golang/template/BUILD +++ b/staging/src/k8s.io/client-go/third_party/forked/golang/template/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "exec.go", "funcs.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/client-go/tools/auth/BUILD b/staging/src/k8s.io/client-go/tools/auth/BUILD index 79673a00e2e..5f5238bb52f 100644 --- a/staging/src/k8s.io/client-go/tools/auth/BUILD +++ b/staging/src/k8s.io/client-go/tools/auth/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,14 +9,12 @@ load( go_library( name = "go_default_library", srcs = ["clientauth.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/client-go/rest:go_default_library"], ) go_test( name = "go_default_xtest", srcs = ["clientauth_test.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/client-go/tools/auth:go_default_library"], ) diff --git a/staging/src/k8s.io/client-go/tools/cache/BUILD b/staging/src/k8s.io/client-go/tools/cache/BUILD index 684d3dca628..e79cce629cc 100644 --- a/staging/src/k8s.io/client-go/tools/cache/BUILD +++ b/staging/src/k8s.io/client-go/tools/cache/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,6 +13,7 @@ go_test( "delta_fifo_test.go", "expiration_cache_test.go", "fifo_test.go", + "heap_test.go", "index_test.go", "mutation_detector_test.go", "processor_listener_test.go", @@ -24,7 +23,6 @@ go_test( "undelta_store_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -50,6 +48,7 @@ go_library( "expiration_cache_fakes.go", "fake_custom_store.go", "fifo.go", + "heap.go", "index.go", "listers.go", "listwatch.go", @@ -62,7 +61,6 @@ go_library( "thread_safe_store.go", "undelta_store.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/tools/cache/heap.go b/staging/src/k8s.io/client-go/tools/cache/heap.go new file mode 100644 index 00000000000..78e492455ea --- /dev/null +++ b/staging/src/k8s.io/client-go/tools/cache/heap.go @@ -0,0 +1,323 @@ +/* +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. +*/ + +// This file implements a heap data structure. + +package cache + +import ( + "container/heap" + "fmt" + "sync" +) + +const ( + closedMsg = "heap is closed" +) + +type LessFunc func(interface{}, interface{}) bool +type heapItem struct { + obj interface{} // The object which is stored in the heap. + index int // The index of the object's key in the Heap.queue. +} + +type itemKeyValue struct { + key string + obj interface{} +} + +// heapData is an internal struct that implements the standard heap interface +// and keeps the data stored in the heap. +type heapData struct { + // items is a map from key of the objects to the objects and their index. + // We depend on the property that items in the map are in the queue and vice versa. + items map[string]*heapItem + // queue implements a heap data structure and keeps the order of elements + // according to the heap invariant. The queue keeps the keys of objects stored + // in "items". + queue []string + + // keyFunc is used to make the key used for queued item insertion and retrieval, and + // should be deterministic. + keyFunc KeyFunc + // lessFunc is used to compare two objects in the heap. + lessFunc LessFunc +} + +var ( + _ = heap.Interface(&heapData{}) // heapData is a standard heap +) + +// Less compares two objects and returns true if the first one should go +// in front of the second one in the heap. +func (h *heapData) Less(i, j int) bool { + if i > len(h.queue) || j > len(h.queue) { + return false + } + itemi, ok := h.items[h.queue[i]] + if !ok { + return false + } + itemj, ok := h.items[h.queue[j]] + if !ok { + return false + } + return h.lessFunc(itemi.obj, itemj.obj) +} + +// Len returns the number of items in the Heap. +func (h *heapData) Len() int { return len(h.queue) } + +// Swap implements swapping of two elements in the heap. This is a part of standard +// heap interface and should never be called directly. +func (h *heapData) Swap(i, j int) { + h.queue[i], h.queue[j] = h.queue[j], h.queue[i] + item := h.items[h.queue[i]] + item.index = i + item = h.items[h.queue[j]] + item.index = j +} + +// Push is supposed to be called by heap.Push only. +func (h *heapData) Push(kv interface{}) { + keyValue := kv.(*itemKeyValue) + n := len(h.queue) + h.items[keyValue.key] = &heapItem{keyValue.obj, n} + h.queue = append(h.queue, keyValue.key) +} + +// Pop is supposed to be called by heap.Pop only. +func (h *heapData) Pop() interface{} { + key := h.queue[len(h.queue)-1] + h.queue = h.queue[0 : len(h.queue)-1] + item, ok := h.items[key] + if !ok { + // This is an error + return nil + } + delete(h.items, key) + return item.obj +} + +// Heap is a thread-safe producer/consumer queue that implements a heap data structure. +// It can be used to implement priority queues and similar data structures. +type Heap struct { + lock sync.RWMutex + cond sync.Cond + + // data stores objects and has a queue that keeps their ordering according + // to the heap invariant. + data *heapData + + // closed indicates that the queue is closed. + // It is mainly used to let Pop() exit its control loop while waiting for an item. + closed bool +} + +// Close the Heap and signals condition variables that may be waiting to pop +// items from the heap. +func (h *Heap) Close() { + h.lock.Lock() + defer h.lock.Unlock() + h.closed = true + h.cond.Broadcast() +} + +// Add inserts an item, and puts it in the queue. The item is updated if it +// already exists. +func (h *Heap) Add(obj interface{}) error { + key, err := h.data.keyFunc(obj) + if err != nil { + return KeyError{obj, err} + } + h.lock.Lock() + defer h.lock.Unlock() + if h.closed { + return fmt.Errorf(closedMsg) + } + if _, exists := h.data.items[key]; exists { + h.data.items[key].obj = obj + heap.Fix(h.data, h.data.items[key].index) + } else { + h.addIfNotPresentLocked(key, obj) + } + h.cond.Broadcast() + return nil +} + +// Adds all the items in the list to the queue and then signals the condition +// variable. It is useful when the caller would like to add all of the items +// to the queue before consumer starts processing them. +func (h *Heap) BulkAdd(list []interface{}) error { + h.lock.Lock() + defer h.lock.Unlock() + if h.closed { + return fmt.Errorf(closedMsg) + } + for _, obj := range list { + key, err := h.data.keyFunc(obj) + if err != nil { + return KeyError{obj, err} + } + if _, exists := h.data.items[key]; exists { + h.data.items[key].obj = obj + heap.Fix(h.data, h.data.items[key].index) + } else { + h.addIfNotPresentLocked(key, obj) + } + } + h.cond.Broadcast() + return nil +} + +// AddIfNotPresent inserts an item, and puts it in the queue. If an item with +// the key is present in the map, no changes is made to the item. +// +// This is useful in a single producer/consumer scenario so that the consumer can +// safely retry items without contending with the producer and potentially enqueueing +// stale items. +func (h *Heap) AddIfNotPresent(obj interface{}) error { + id, err := h.data.keyFunc(obj) + if err != nil { + return KeyError{obj, err} + } + h.lock.Lock() + defer h.lock.Unlock() + if h.closed { + return fmt.Errorf(closedMsg) + } + h.addIfNotPresentLocked(id, obj) + h.cond.Broadcast() + return nil +} + +// addIfNotPresentLocked assumes the lock is already held and adds the the provided +// item to the queue if it does not already exist. +func (h *Heap) addIfNotPresentLocked(key string, obj interface{}) { + if _, exists := h.data.items[key]; exists { + return + } + heap.Push(h.data, &itemKeyValue{key, obj}) +} + +// Update is the same as Add in this implementation. When the item does not +// exist, it is added. +func (h *Heap) Update(obj interface{}) error { + return h.Add(obj) +} + +// Delete removes an item. +func (h *Heap) Delete(obj interface{}) error { + key, err := h.data.keyFunc(obj) + if err != nil { + return KeyError{obj, err} + } + h.lock.Lock() + defer h.lock.Unlock() + if item, ok := h.data.items[key]; ok { + heap.Remove(h.data, item.index) + return nil + } + return fmt.Errorf("object not found") +} + +// Pop waits until an item is ready. If multiple items are +// ready, they are returned in the order given by Heap.data.lessFunc. +func (h *Heap) Pop() (interface{}, error) { + h.lock.Lock() + defer h.lock.Unlock() + for len(h.data.queue) == 0 { + // When the queue is empty, invocation of Pop() is blocked until new item is enqueued. + // When Close() is called, the h.closed is set and the condition is broadcast, + // which causes this loop to continue and return from the Pop(). + if h.closed { + return nil, fmt.Errorf("heap is closed") + } + h.cond.Wait() + } + obj := heap.Pop(h.data) + if obj != nil { + return obj, nil + } else { + return nil, fmt.Errorf("object was removed from heap data") + } +} + +// List returns a list of all the items. +func (h *Heap) List() []interface{} { + h.lock.RLock() + defer h.lock.RUnlock() + list := make([]interface{}, 0, len(h.data.items)) + for _, item := range h.data.items { + list = append(list, item.obj) + } + return list +} + +// ListKeys returns a list of all the keys of the objects currently in the Heap. +func (h *Heap) ListKeys() []string { + h.lock.RLock() + defer h.lock.RUnlock() + list := make([]string, 0, len(h.data.items)) + for key := range h.data.items { + list = append(list, key) + } + return list +} + +// Get returns the requested item, or sets exists=false. +func (h *Heap) Get(obj interface{}) (interface{}, bool, error) { + key, err := h.data.keyFunc(obj) + if err != nil { + return nil, false, KeyError{obj, err} + } + return h.GetByKey(key) +} + +// GetByKey returns the requested item, or sets exists=false. +func (h *Heap) GetByKey(key string) (interface{}, bool, error) { + h.lock.RLock() + defer h.lock.RUnlock() + item, exists := h.data.items[key] + if !exists { + return nil, false, nil + } + return item.obj, true, nil +} + +// IsClosed returns true if the queue is closed. +func (h *Heap) IsClosed() bool { + h.lock.RLock() + defer h.lock.RUnlock() + if h.closed { + return true + } + return false +} + +// NewHeap returns a Heap which can be used to queue up items to process. +func NewHeap(keyFn KeyFunc, lessFn LessFunc) *Heap { + h := &Heap{ + data: &heapData{ + items: map[string]*heapItem{}, + queue: []string{}, + keyFunc: keyFn, + lessFunc: lessFn, + }, + } + h.cond.L = &h.lock + return h +} diff --git a/staging/src/k8s.io/client-go/tools/cache/heap_test.go b/staging/src/k8s.io/client-go/tools/cache/heap_test.go new file mode 100644 index 00000000000..c2e476988f7 --- /dev/null +++ b/staging/src/k8s.io/client-go/tools/cache/heap_test.go @@ -0,0 +1,382 @@ +/* +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 cache + +import ( + "sync" + "testing" + "time" +) + +func testHeapObjectKeyFunc(obj interface{}) (string, error) { + return obj.(testHeapObject).name, nil +} + +type testHeapObject struct { + name string + val interface{} +} + +func mkHeapObj(name string, val interface{}) testHeapObject { + return testHeapObject{name: name, val: val} +} + +func compareInts(val1 interface{}, val2 interface{}) bool { + first := val1.(testHeapObject).val.(int) + second := val2.(testHeapObject).val.(int) + return first < second +} + +// TestHeapBasic tests Heap invariant and synchronization. +func TestHeapBasic(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + var wg sync.WaitGroup + wg.Add(2) + const amount = 500 + var i, u int + // Insert items in the heap in opposite orders in two go routines. + go func() { + for i = amount; i > 0; i-- { + h.Add(mkHeapObj(string([]rune{'a', rune(i)}), i)) + } + wg.Done() + }() + go func() { + for u = 0; u < amount; u++ { + h.Add(mkHeapObj(string([]rune{'b', rune(u)}), u+1)) + } + wg.Done() + }() + // Wait for the two go routines to finish. + wg.Wait() + // Make sure that the numbers are popped in ascending order. + prevNum := 0 + for i := 0; i < amount*2; i++ { + obj, err := h.Pop() + num := obj.(testHeapObject).val.(int) + // All the items must be sorted. + if err != nil || prevNum > num { + t.Errorf("got %v out of order, last was %v", obj, prevNum) + } + prevNum = num + } +} + +// Tests Heap.Add and ensures that heap invariant is preserved after adding items. +func TestHeap_Add(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + h.Add(mkHeapObj("foo", 10)) + h.Add(mkHeapObj("bar", 1)) + h.Add(mkHeapObj("baz", 11)) + h.Add(mkHeapObj("zab", 30)) + h.Add(mkHeapObj("foo", 13)) // This updates "foo". + + item, err := h.Pop() + if e, a := 1, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + item, err = h.Pop() + if e, a := 11, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + h.Delete(mkHeapObj("baz", 11)) // Nothing is deleted. + h.Add(mkHeapObj("foo", 14)) // foo is updated. + item, err = h.Pop() + if e, a := 14, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + item, err = h.Pop() + if e, a := 30, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } +} + +// TestHeap_BulkAdd tests Heap.BulkAdd functionality and ensures that all the +// items given to BulkAdd are added to the queue before Pop reads them. +func TestHeap_BulkAdd(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + const amount = 500 + // Insert items in the heap in opposite orders in a go routine. + go func() { + l := []interface{}{} + for i := amount; i > 0; i-- { + l = append(l, mkHeapObj(string([]rune{'a', rune(i)}), i)) + } + h.BulkAdd(l) + }() + prevNum := -1 + for i := 0; i < amount; i++ { + obj, err := h.Pop() + num := obj.(testHeapObject).val.(int) + // All the items must be sorted. + if err != nil || prevNum >= num { + t.Errorf("got %v out of order, last was %v", obj, prevNum) + } + prevNum = num + } +} + +// TestHeapEmptyPop tests that pop returns properly after heap is closed. +func TestHeapEmptyPop(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + go func() { + time.Sleep(1 * time.Second) + h.Close() + }() + _, err := h.Pop() + if err == nil || err.Error() != closedMsg { + t.Errorf("pop should have returned heap closed error: %v", err) + } +} + +// TestHeap_AddIfNotPresent tests Heap.AddIfNotPresent and ensures that heap +// invariant is preserved after adding items. +func TestHeap_AddIfNotPresent(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + h.AddIfNotPresent(mkHeapObj("foo", 10)) + h.AddIfNotPresent(mkHeapObj("bar", 1)) + h.AddIfNotPresent(mkHeapObj("baz", 11)) + h.AddIfNotPresent(mkHeapObj("zab", 30)) + h.AddIfNotPresent(mkHeapObj("foo", 13)) // This is not added. + + if len := len(h.data.items); len != 4 { + t.Errorf("unexpected number of items: %d", len) + } + if val := h.data.items["foo"].obj.(testHeapObject).val; val != 10 { + t.Errorf("unexpected value: %d", val) + } + item, err := h.Pop() + if e, a := 1, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + item, err = h.Pop() + if e, a := 10, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + // bar is already popped. Let's add another one. + h.AddIfNotPresent(mkHeapObj("bar", 14)) + item, err = h.Pop() + if e, a := 11, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + item, err = h.Pop() + if e, a := 14, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } +} + +// TestHeap_Delete tests Heap.Delete and ensures that heap invariant is +// preserved after deleting items. +func TestHeap_Delete(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + h.Add(mkHeapObj("foo", 10)) + h.Add(mkHeapObj("bar", 1)) + h.Add(mkHeapObj("bal", 31)) + h.Add(mkHeapObj("baz", 11)) + + // Delete head. Delete should work with "key" and doesn't care about the value. + if err := h.Delete(mkHeapObj("bar", 200)); err != nil { + t.Fatalf("Failed to delete head.") + } + item, err := h.Pop() + if e, a := 10, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + h.Add(mkHeapObj("zab", 30)) + h.Add(mkHeapObj("faz", 30)) + len := h.data.Len() + // Delete non-existing item. + if err = h.Delete(mkHeapObj("non-existent", 10)); err == nil || len != h.data.Len() { + t.Fatalf("Didn't expect any item removal") + } + // Delete tail. + if err = h.Delete(mkHeapObj("bal", 31)); err != nil { + t.Fatalf("Failed to delete tail.") + } + // Delete one of the items with value 30. + if err = h.Delete(mkHeapObj("zab", 30)); err != nil { + t.Fatalf("Failed to delete item.") + } + item, err = h.Pop() + if e, a := 11, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + item, err = h.Pop() + if e, a := 30, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + if h.data.Len() != 0 { + t.Fatalf("expected an empty heap.") + } +} + +// TestHeap_Update tests Heap.Update and ensures that heap invariant is +// preserved after adding items. +func TestHeap_Update(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + h.Add(mkHeapObj("foo", 10)) + h.Add(mkHeapObj("bar", 1)) + h.Add(mkHeapObj("bal", 31)) + h.Add(mkHeapObj("baz", 11)) + + // Update an item to a value that should push it to the head. + h.Update(mkHeapObj("baz", 0)) + if h.data.queue[0] != "baz" || h.data.items["baz"].index != 0 { + t.Fatalf("expected baz to be at the head") + } + item, err := h.Pop() + if e, a := 0, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + // Update bar to push it farther back in the queue. + h.Update(mkHeapObj("bar", 100)) + if h.data.queue[0] != "foo" || h.data.items["foo"].index != 0 { + t.Fatalf("expected foo to be at the head") + } +} + +// TestHeap_Get tests Heap.Get. +func TestHeap_Get(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + h.Add(mkHeapObj("foo", 10)) + h.Add(mkHeapObj("bar", 1)) + h.Add(mkHeapObj("bal", 31)) + h.Add(mkHeapObj("baz", 11)) + + // Get works with the key. + obj, exists, err := h.Get(mkHeapObj("baz", 0)) + if err != nil || exists == false || obj.(testHeapObject).val != 11 { + t.Fatalf("unexpected error in getting element") + } + // Get non-existing object. + _, exists, err = h.Get(mkHeapObj("non-existing", 0)) + if err != nil || exists == true { + t.Fatalf("didn't expect to get any object") + } +} + +// TestHeap_GetByKey tests Heap.GetByKey and is very similar to TestHeap_Get. +func TestHeap_GetByKey(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + h.Add(mkHeapObj("foo", 10)) + h.Add(mkHeapObj("bar", 1)) + h.Add(mkHeapObj("bal", 31)) + h.Add(mkHeapObj("baz", 11)) + + obj, exists, err := h.GetByKey("baz") + if err != nil || exists == false || obj.(testHeapObject).val != 11 { + t.Fatalf("unexpected error in getting element") + } + // Get non-existing object. + _, exists, err = h.GetByKey("non-existing") + if err != nil || exists == true { + t.Fatalf("didn't expect to get any object") + } +} + +// TestHeap_Close tests Heap.Close and Heap.IsClosed functions. +func TestHeap_Close(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + h.Add(mkHeapObj("foo", 10)) + h.Add(mkHeapObj("bar", 1)) + + if h.IsClosed() { + t.Fatalf("didn't expect heap to be closed") + } + h.Close() + if !h.IsClosed() { + t.Fatalf("expect heap to be closed") + } +} + +// TestHeap_List tests Heap.List function. +func TestHeap_List(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + list := h.List() + if len(list) != 0 { + t.Errorf("expected an empty list") + } + + items := map[string]int{ + "foo": 10, + "bar": 1, + "bal": 30, + "baz": 11, + "faz": 30, + } + for k, v := range items { + h.Add(mkHeapObj(k, v)) + } + list = h.List() + if len(list) != len(items) { + t.Errorf("expected %d items, got %d", len(items), len(list)) + } + for _, obj := range list { + heapObj := obj.(testHeapObject) + v, ok := items[heapObj.name] + if !ok || v != heapObj.val { + t.Errorf("unexpected item in the list: %v", heapObj) + } + } +} + +// TestHeap_ListKeys tests Heap.ListKeys function. Scenario is the same as +// TestHeap_list. +func TestHeap_ListKeys(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + list := h.ListKeys() + if len(list) != 0 { + t.Errorf("expected an empty list") + } + + items := map[string]int{ + "foo": 10, + "bar": 1, + "bal": 30, + "baz": 11, + "faz": 30, + } + for k, v := range items { + h.Add(mkHeapObj(k, v)) + } + list = h.ListKeys() + if len(list) != len(items) { + t.Errorf("expected %d items, got %d", len(items), len(list)) + } + for _, key := range list { + _, ok := items[key] + if !ok { + t.Errorf("unexpected item in the list: %v", key) + } + } +} + +// TestHeapAddAfterClose tests that heap returns an error if anything is added +// after it is closed. +func TestHeapAddAfterClose(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + h.Close() + if err := h.Add(mkHeapObj("test", 1)); err == nil || err.Error() != closedMsg { + t.Errorf("expected heap closed error") + } + if err := h.AddIfNotPresent(mkHeapObj("test", 1)); err == nil || err.Error() != closedMsg { + t.Errorf("expected heap closed error") + } + if err := h.BulkAdd([]interface{}{mkHeapObj("test", 1)}); err == nil || err.Error() != closedMsg { + t.Errorf("expected heap closed error") + } +} diff --git a/staging/src/k8s.io/client-go/tools/cache/testing/BUILD b/staging/src/k8s.io/client-go/tools/cache/testing/BUILD index 0129c9620bf..0372461300c 100644 --- a/staging/src/k8s.io/client-go/tools/cache/testing/BUILD +++ b/staging/src/k8s.io/client-go/tools/cache/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["fake_controller_source_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -23,7 +20,6 @@ go_test( go_library( name = "go_default_library", srcs = ["fake_controller_source.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", diff --git a/staging/src/k8s.io/client-go/tools/clientcmd/BUILD b/staging/src/k8s.io/client-go/tools/clientcmd/BUILD index 4965aed03ec..c91b688e24d 100644 --- a/staging/src/k8s.io/client-go/tools/clientcmd/BUILD +++ b/staging/src/k8s.io/client-go/tools/clientcmd/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_test( "validation_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/github.com/imdario/mergo:go_default_library", @@ -42,7 +39,6 @@ go_library( "overrides.go", "validation.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/howeyc/gopass:go_default_library", diff --git a/staging/src/k8s.io/client-go/tools/clientcmd/api/BUILD b/staging/src/k8s.io/client-go/tools/clientcmd/api/BUILD index a686970765d..443b31f7939 100644 --- a/staging/src/k8s.io/client-go/tools/clientcmd/api/BUILD +++ b/staging/src/k8s.io/client-go/tools/clientcmd/api/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "types_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/github.com/ghodss/yaml:go_default_library"], ) @@ -28,7 +25,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/client-go/tools/clientcmd/api/latest/BUILD b/staging/src/k8s.io/client-go/tools/clientcmd/api/latest/BUILD index 9cf03565347..deab93e06c9 100644 --- a/staging/src/k8s.io/client-go/tools/clientcmd/api/latest/BUILD +++ b/staging/src/k8s.io/client-go/tools/clientcmd/api/latest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["latest.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/client-go/tools/clientcmd/api/v1/BUILD b/staging/src/k8s.io/client-go/tools/clientcmd/api/v1/BUILD index c41006cccba..f95ee400e13 100644 --- a/staging/src/k8s.io/client-go/tools/clientcmd/api/v1/BUILD +++ b/staging/src/k8s.io/client-go/tools/clientcmd/api/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/client-go/tools/clientcmd/client_config.go b/staging/src/k8s.io/client-go/tools/clientcmd/client_config.go index 9646c6b7c24..a8698af2432 100644 --- a/staging/src/k8s.io/client-go/tools/clientcmd/client_config.go +++ b/staging/src/k8s.io/client-go/tools/clientcmd/client_config.go @@ -22,7 +22,6 @@ import ( "io/ioutil" "net/url" "os" - "path/filepath" "strings" "github.com/golang/glog" @@ -32,19 +31,16 @@ import ( restclient "k8s.io/client-go/rest" clientauth "k8s.io/client-go/tools/auth" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - "k8s.io/client-go/util/homedir" ) var ( // ClusterDefaults has the same behavior as the old EnvVar and DefaultCluster fields // DEPRECATED will be replaced ClusterDefaults = clientcmdapi.Cluster{Server: getDefaultServer()} - cacheDirDefault = filepath.Join(homedir.HomeDir(), ".kube", "http-cache") // DefaultClientConfig represents the legacy behavior of this package for defaulting // DEPRECATED will be replace DefaultClientConfig = DirectClientConfig{*clientcmdapi.NewConfig(), "", &ConfigOverrides{ ClusterDefaults: ClusterDefaults, - CacheDir: cacheDirDefault, }, nil, NewDefaultClientConfigLoadingRules(), promptedCredentials{}} ) @@ -135,7 +131,6 @@ func (config *DirectClientConfig) ClientConfig() (*restclient.Config, error) { clientConfig := &restclient.Config{} clientConfig.Host = configClusterInfo.Server - clientConfig.CacheDir = config.overrides.CacheDir if len(config.overrides.Timeout) > 0 { timeout, err := ParseTimeout(config.overrides.Timeout) diff --git a/staging/src/k8s.io/client-go/tools/clientcmd/overrides.go b/staging/src/k8s.io/client-go/tools/clientcmd/overrides.go index 25ab1ea1aa6..963ac8fae9b 100644 --- a/staging/src/k8s.io/client-go/tools/clientcmd/overrides.go +++ b/staging/src/k8s.io/client-go/tools/clientcmd/overrides.go @@ -17,13 +17,11 @@ limitations under the License. package clientcmd import ( - "path/filepath" "strconv" "github.com/spf13/pflag" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - "k8s.io/client-go/util/homedir" ) // ConfigOverrides holds values that should override whatever information is pulled from the actual Config object. You can't @@ -36,7 +34,6 @@ type ConfigOverrides struct { Context clientcmdapi.Context CurrentContext string Timeout string - CacheDir string } // ConfigOverrideFlags holds the flag names to be used for binding command line flags. Notice that this structure tightly @@ -47,7 +44,6 @@ type ConfigOverrideFlags struct { ContextOverrideFlags ContextOverrideFlags CurrentContext FlagInfo Timeout FlagInfo - CacheDir FlagInfo } // AuthOverrideFlags holds the flag names to be used for binding command line flags for AuthInfo objects @@ -150,12 +146,10 @@ const ( FlagUsername = "username" FlagPassword = "password" FlagTimeout = "request-timeout" - FlagCacheDir = "cachedir" ) // RecommendedConfigOverrideFlags is a convenience method to return recommended flag names prefixed with a string of your choosing func RecommendedConfigOverrideFlags(prefix string) ConfigOverrideFlags { - defaultCacheDir := filepath.Join(homedir.HomeDir(), ".kube", "http-cache") return ConfigOverrideFlags{ AuthOverrideFlags: RecommendedAuthOverrideFlags(prefix), ClusterOverrideFlags: RecommendedClusterOverrideFlags(prefix), @@ -163,7 +157,6 @@ func RecommendedConfigOverrideFlags(prefix string) ConfigOverrideFlags { CurrentContext: FlagInfo{prefix + FlagContext, "", "", "The name of the kubeconfig context to use"}, Timeout: FlagInfo{prefix + FlagTimeout, "", "0", "The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests."}, - CacheDir: FlagInfo{prefix + FlagCacheDir, "", defaultCacheDir, "Path to http-cache directory"}, } } @@ -205,7 +198,6 @@ func BindOverrideFlags(overrides *ConfigOverrides, flags *pflag.FlagSet, flagNam BindContextFlags(&overrides.Context, flags, flagNames.ContextOverrideFlags) flagNames.CurrentContext.BindStringFlag(flags, &overrides.CurrentContext) flagNames.Timeout.BindStringFlag(flags, &overrides.Timeout) - flagNames.CacheDir.BindStringFlag(flags, &overrides.CacheDir) } // BindAuthInfoFlags is a convenience method to bind the specified flags to their associated variables diff --git a/staging/src/k8s.io/client-go/tools/leaderelection/BUILD b/staging/src/k8s.io/client-go/tools/leaderelection/BUILD index a2589cc13c1..103c0c5a183 100644 --- a/staging/src/k8s.io/client-go/tools/leaderelection/BUILD +++ b/staging/src/k8s.io/client-go/tools/leaderelection/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["leaderelection.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", @@ -26,7 +23,6 @@ go_test( name = "go_default_test", srcs = ["leaderelection_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/client-go/tools/leaderelection/resourcelock/BUILD b/staging/src/k8s.io/client-go/tools/leaderelection/resourcelock/BUILD index 942577aabdb..51a814e350a 100644 --- a/staging/src/k8s.io/client-go/tools/leaderelection/resourcelock/BUILD +++ b/staging/src/k8s.io/client-go/tools/leaderelection/resourcelock/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "endpointslock.go", "interface.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/tools/metrics/BUILD b/staging/src/k8s.io/client-go/tools/metrics/BUILD index b4549da6b46..8a0344488be 100644 --- a/staging/src/k8s.io/client-go/tools/metrics/BUILD +++ b/staging/src/k8s.io/client-go/tools/metrics/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["metrics.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/client-go/tools/portforward/BUILD b/staging/src/k8s.io/client-go/tools/portforward/BUILD index 460f3e8e25e..cea870f5f64 100644 --- a/staging/src/k8s.io/client-go/tools/portforward/BUILD +++ b/staging/src/k8s.io/client-go/tools/portforward/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["portforward_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library"], ) @@ -22,7 +19,6 @@ go_library( "doc.go", "portforward.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", diff --git a/staging/src/k8s.io/client-go/tools/record/BUILD b/staging/src/k8s.io/client-go/tools/record/BUILD index 0414b1b0a53..de3160d2c85 100644 --- a/staging/src/k8s.io/client-go/tools/record/BUILD +++ b/staging/src/k8s.io/client-go/tools/record/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "events_cache_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", @@ -38,7 +35,6 @@ go_library( "events_cache.go", "fake.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/golang/groupcache/lru:go_default_library", diff --git a/staging/src/k8s.io/client-go/tools/reference/BUILD b/staging/src/k8s.io/client-go/tools/reference/BUILD index 8e8b3c0ff45..50176ff6ddb 100644 --- a/staging/src/k8s.io/client-go/tools/reference/BUILD +++ b/staging/src/k8s.io/client-go/tools/reference/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["ref.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", diff --git a/staging/src/k8s.io/client-go/tools/remotecommand/BUILD b/staging/src/k8s.io/client-go/tools/remotecommand/BUILD index a196f79bb6b..9d061ed0687 100644 --- a/staging/src/k8s.io/client-go/tools/remotecommand/BUILD +++ b/staging/src/k8s.io/client-go/tools/remotecommand/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "v4_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", @@ -35,7 +32,6 @@ go_library( "v3.go", "v4.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/staging/src/k8s.io/client-go/transport/BUILD b/staging/src/k8s.io/client-go/transport/BUILD index c17299d5355..56b6256c9a0 100644 --- a/staging/src/k8s.io/client-go/transport/BUILD +++ b/staging/src/k8s.io/client-go/transport/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "transport_test.go", ], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -27,12 +24,8 @@ go_library( "round_trippers.go", "transport.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/gregjones/httpcache:go_default_library", - "//vendor/github.com/gregjones/httpcache/diskcache:go_default_library", - "//vendor/github.com/peterbourgon/diskv:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", ], ) diff --git a/staging/src/k8s.io/client-go/transport/config.go b/staging/src/k8s.io/client-go/transport/config.go index e34d6e8c774..820594ba354 100644 --- a/staging/src/k8s.io/client-go/transport/config.go +++ b/staging/src/k8s.io/client-go/transport/config.go @@ -34,10 +34,6 @@ type Config struct { // Bearer token for authentication BearerToken string - // CacheDir is the directory where we'll store HTTP cached responses. - // If set to empty string, no caching mechanism will be used. - CacheDir string - // Impersonate is the config that this Config will impersonate using Impersonate ImpersonationConfig diff --git a/staging/src/k8s.io/client-go/transport/round_trippers.go b/staging/src/k8s.io/client-go/transport/round_trippers.go index 2394c42c9b0..c728b18775f 100644 --- a/staging/src/k8s.io/client-go/transport/round_trippers.go +++ b/staging/src/k8s.io/client-go/transport/round_trippers.go @@ -23,9 +23,6 @@ import ( "time" "github.com/golang/glog" - "github.com/gregjones/httpcache" - "github.com/gregjones/httpcache/diskcache" - "github.com/peterbourgon/diskv" utilnet "k8s.io/apimachinery/pkg/util/net" ) @@ -59,9 +56,6 @@ func HTTPWrappersForConfig(config *Config, rt http.RoundTripper) (http.RoundTrip len(config.Impersonate.Extra) > 0 { rt = NewImpersonatingRoundTripper(config.Impersonate, rt) } - if len(config.CacheDir) > 0 { - rt = NewCacheRoundTripper(config.CacheDir, rt) - } return rt, nil } @@ -93,17 +87,6 @@ type authProxyRoundTripper struct { rt http.RoundTripper } -// NewCacheRoundTripper creates a roundtripper that reads the ETag on -// response headers and send the If-None-Match header on subsequent -// corresponding requests. -func NewCacheRoundTripper(cacheDir string, rt http.RoundTripper) http.RoundTripper { - d := diskv.New(diskv.Options{BasePath: cacheDir}) - t := httpcache.NewTransport(diskcache.NewWithDiskv(d)) - t.Transport = rt - - return t -} - // NewAuthProxyRoundTripper provides a roundtripper which will add auth proxy fields to requests for // authentication terminating proxy cases // assuming you pull the user from the context: diff --git a/staging/src/k8s.io/client-go/transport/round_trippers_test.go b/staging/src/k8s.io/client-go/transport/round_trippers_test.go index c1e30c3f208..d5ffc6bde30 100644 --- a/staging/src/k8s.io/client-go/transport/round_trippers_test.go +++ b/staging/src/k8s.io/client-go/transport/round_trippers_test.go @@ -17,11 +17,7 @@ limitations under the License. package transport import ( - "bytes" - "io/ioutil" "net/http" - "net/url" - "os" "reflect" "strings" "testing" @@ -220,60 +216,3 @@ func TestAuthProxyRoundTripper(t *testing.T) { } } } - -func TestCacheRoundTripper(t *testing.T) { - rt := &testRoundTripper{} - cacheDir, err := ioutil.TempDir("", "cache-rt") - defer os.RemoveAll(cacheDir) - if err != nil { - t.Fatal(err) - } - cache := NewCacheRoundTripper(cacheDir, rt) - - // First call, caches the response - req := &http.Request{ - Method: http.MethodGet, - URL: &url.URL{Host: "localhost"}, - } - rt.Response = &http.Response{ - Header: http.Header{"ETag": []string{`"123456"`}}, - Body: ioutil.NopCloser(bytes.NewReader([]byte("Content"))), - StatusCode: http.StatusOK, - } - resp, err := cache.RoundTrip(req) - if err != nil { - t.Fatal(err) - } - content, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - if string(content) != "Content" { - t.Errorf(`Expected Body to be "Content", got %q`, string(content)) - } - - // Second call, returns cached response - req = &http.Request{ - Method: http.MethodGet, - URL: &url.URL{Host: "localhost"}, - } - rt.Response = &http.Response{ - StatusCode: http.StatusNotModified, - Body: ioutil.NopCloser(bytes.NewReader([]byte("Other Content"))), - } - - resp, err = cache.RoundTrip(req) - if err != nil { - t.Fatal(err) - } - - // Read body and make sure we have the initial content - content, err = ioutil.ReadAll(resp.Body) - resp.Body.Close() - if err != nil { - t.Fatal(err) - } - if string(content) != "Content" { - t.Errorf("Invalid content read from cache %q", string(content)) - } -} diff --git a/staging/src/k8s.io/client-go/transport/spdy/BUILD b/staging/src/k8s.io/client-go/transport/spdy/BUILD index 425d1234301..7e5145c990e 100644 --- a/staging/src/k8s.io/client-go/transport/spdy/BUILD +++ b/staging/src/k8s.io/client-go/transport/spdy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["spdy.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy:go_default_library", diff --git a/staging/src/k8s.io/client-go/util/cert/BUILD b/staging/src/k8s.io/client-go/util/cert/BUILD index 7da56bb01ce..d8076548ce8 100644 --- a/staging/src/k8s.io/client-go/util/cert/BUILD +++ b/staging/src/k8s.io/client-go/util/cert/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,8 +12,8 @@ go_test( "csr_test.go", "pem_test.go", ], + data = glob(["testdata/**"]), library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -29,7 +27,6 @@ go_library( data = [ "testdata/dontUseThisKey.pem", ], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/client-go/util/cert/triple/BUILD b/staging/src/k8s.io/client-go/util/cert/triple/BUILD index 84bf438a0f1..1bed9cd4318 100644 --- a/staging/src/k8s.io/client-go/util/cert/triple/BUILD +++ b/staging/src/k8s.io/client-go/util/cert/triple/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["triple.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/client-go/util/cert:go_default_library"], ) diff --git a/staging/src/k8s.io/client-go/util/exec/BUILD b/staging/src/k8s.io/client-go/util/exec/BUILD index 8189e6e24c7..396658dc5b4 100644 --- a/staging/src/k8s.io/client-go/util/exec/BUILD +++ b/staging/src/k8s.io/client-go/util/exec/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["exec.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/client-go/util/flowcontrol/BUILD b/staging/src/k8s.io/client-go/util/flowcontrol/BUILD index a8a70a2d141..ff03657a420 100644 --- a/staging/src/k8s.io/client-go/util/flowcontrol/BUILD +++ b/staging/src/k8s.io/client-go/util/flowcontrol/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "throttle_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library"], ) @@ -25,7 +22,6 @@ go_library( "backoff.go", "throttle.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/juju/ratelimit:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", diff --git a/staging/src/k8s.io/client-go/util/homedir/BUILD b/staging/src/k8s.io/client-go/util/homedir/BUILD index 3454c2c0a88..255d866b8b5 100644 --- a/staging/src/k8s.io/client-go/util/homedir/BUILD +++ b/staging/src/k8s.io/client-go/util/homedir/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["homedir.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/client-go/util/integer/BUILD b/staging/src/k8s.io/client-go/util/integer/BUILD index f2e6c8b0833..25e7d7f94a8 100644 --- a/staging/src/k8s.io/client-go/util/integer/BUILD +++ b/staging/src/k8s.io/client-go/util/integer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["integer_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["integer.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/client-go/util/jsonpath/BUILD b/staging/src/k8s.io/client-go/util/jsonpath/BUILD index 633523807c5..8cd93e1c9bc 100644 --- a/staging/src/k8s.io/client-go/util/jsonpath/BUILD +++ b/staging/src/k8s.io/client-go/util/jsonpath/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_test( "parser_test.go", ], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -26,7 +23,6 @@ go_library( "node.go", "parser.go", ], - tags = ["automanaged"], deps = ["//vendor/k8s.io/client-go/third_party/forked/golang/template:go_default_library"], ) diff --git a/staging/src/k8s.io/client-go/util/jsonpath/jsonpath.go b/staging/src/k8s.io/client-go/util/jsonpath/jsonpath.go index cc2fbb2a7cc..6633ca0d651 100644 --- a/staging/src/k8s.io/client-go/util/jsonpath/jsonpath.go +++ b/staging/src/k8s.io/client-go/util/jsonpath/jsonpath.go @@ -29,8 +29,8 @@ import ( type JSONPath struct { name string parser *Parser - stack [][]reflect.Value //push and pop values in different scopes - cur []reflect.Value //current scope values + stack [][]reflect.Value // push and pop values in different scopes + cur []reflect.Value // current scope values beginRange int inRange int endRange int @@ -38,6 +38,7 @@ type JSONPath struct { allowMissingKeys bool } +// New creates a new JSONPath with the given name. func New(name string) *JSONPath { return &JSONPath{ name: name, @@ -54,13 +55,14 @@ func (j *JSONPath) AllowMissingKeys(allow bool) *JSONPath { return j } -// Parse parse the given template, return error -func (j *JSONPath) Parse(text string) (err error) { +// Parse parses the given template and returns an error. +func (j *JSONPath) Parse(text string) error { + var err error j.parser, err = Parse(j.name, text) - return + return err } -// Execute bounds data into template and write the result +// Execute bounds data into template and writes the result. func (j *JSONPath) Execute(wr io.Writer, data interface{}) error { fullResults, err := j.FindResults(data) if err != nil { @@ -89,12 +91,12 @@ func (j *JSONPath) FindResults(data interface{}) ([][]reflect.Value, error) { return nil, err } - //encounter an end node, break the current block + // encounter an end node, break the current block if j.endRange > 0 && j.endRange <= j.inRange { j.endRange -= 1 break } - //encounter a range node, start a range loop + // encounter a range node, start a range loop if j.beginRange > 0 { j.beginRange -= 1 j.inRange += 1 @@ -116,7 +118,7 @@ func (j *JSONPath) FindResults(data interface{}) ([][]reflect.Value, error) { return fullResult, nil } -// PrintResults write the results into writer +// PrintResults writes the results into writer func (j *JSONPath) PrintResults(wr io.Writer, results []reflect.Value) error { for i, r := range results { text, err := j.evalToText(r) @@ -214,7 +216,7 @@ func (j *JSONPath) evalIdentifier(input []reflect.Value, node *IdentifierNode) ( j.beginRange += 1 results = input case "end": - if j.endRange < j.inRange { //inside a loop, break the current block + if j.endRange < j.inRange { // inside a loop, break the current block j.endRange += 1 break } @@ -366,7 +368,7 @@ func (j *JSONPath) evalField(input []reflect.Value, node *FieldNode) ([]reflect. return results, nil } -// evalWildcard extract all contents of the given value +// evalWildcard extracts all contents of the given value func (j *JSONPath) evalWildcard(input []reflect.Value, node *WildcardNode) ([]reflect.Value, error) { results := []reflect.Value{} for _, value := range input { @@ -393,7 +395,7 @@ func (j *JSONPath) evalWildcard(input []reflect.Value, node *WildcardNode) ([]re return results, nil } -// evalRecursive visit the given value recursively and push all of them to result +// evalRecursive visits the given value recursively and pushes all of them to result func (j *JSONPath) evalRecursive(input []reflect.Value, node *RecursiveNode) ([]reflect.Value, error) { result := []reflect.Value{} for _, value := range input { @@ -429,7 +431,7 @@ func (j *JSONPath) evalRecursive(input []reflect.Value, node *RecursiveNode) ([] return result, nil } -// evalFilter filter array according to FilterNode +// evalFilter filters array according to FilterNode func (j *JSONPath) evalFilter(input []reflect.Value, node *FilterNode) ([]reflect.Value, error) { results := []reflect.Value{} for _, value := range input { diff --git a/staging/src/k8s.io/client-go/util/jsonpath/node.go b/staging/src/k8s.io/client-go/util/jsonpath/node.go index be74c4fe244..bc763357cfb 100644 --- a/staging/src/k8s.io/client-go/util/jsonpath/node.go +++ b/staging/src/k8s.io/client-go/util/jsonpath/node.go @@ -131,13 +131,13 @@ func (f *IdentifierNode) String() string { // ParamsEntry holds param information for ArrayNode type ParamsEntry struct { Value int - Known bool //whether the value is known when parse it + Known bool // whether the value is known when parse it } // ArrayNode holds start, end, step information for array index selection type ArrayNode struct { NodeType - Params [3]ParamsEntry //start, end, step + Params [3]ParamsEntry // start, end, step } func newArray(params [3]ParamsEntry) *ArrayNode { diff --git a/staging/src/k8s.io/client-go/util/testing/BUILD b/staging/src/k8s.io/client-go/util/testing/BUILD index 1a95cd8487a..d7534616aac 100644 --- a/staging/src/k8s.io/client-go/util/testing/BUILD +++ b/staging/src/k8s.io/client-go/util/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["fake_handler_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -21,7 +18,6 @@ go_library( "fake_handler.go", "tmpdir.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/client-go/util/workqueue/BUILD b/staging/src/k8s.io/client-go/util/workqueue/BUILD index d5d89f630d3..58adbda042b 100644 --- a/staging/src/k8s.io/client-go/util/workqueue/BUILD +++ b/staging/src/k8s.io/client-go/util/workqueue/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "rate_limitting_queue_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", @@ -34,7 +31,6 @@ go_library( "queue.go", "rate_limitting_queue.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/juju/ratelimit:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", @@ -45,7 +41,6 @@ go_library( go_test( name = "go_default_xtest", srcs = ["queue_test.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/client-go/util/workqueue:go_default_library"], ) diff --git a/staging/src/k8s.io/kube-aggregator/BUILD b/staging/src/k8s.io/kube-aggregator/BUILD index 87f28ebb794..52ca37eb684 100644 --- a/staging/src/k8s.io/kube-aggregator/BUILD +++ b/staging/src/k8s.io/kube-aggregator/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -18,14 +16,12 @@ go_binary( "-static", ], library = ":go_default_library", - tags = ["automanaged"], x_defs = version_x_defs(), ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/logs:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json b/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json index dbd7ff6b25c..46cff8e267b 100644 --- a/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json +++ b/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json @@ -170,10 +170,6 @@ "ImportPath": "github.com/golang/protobuf/ptypes/timestamp", "Rev": "4bd1920723d7b7c925de087aa32e2187708897f7" }, - { - "ImportPath": "github.com/google/btree", - "Rev": "7d79101e329e5a3adf994758c578dab82b90c017" - }, { "ImportPath": "github.com/google/gofuzz", "Rev": "44d81051d367757e1c7c6a5a86423ece9afcf63c" @@ -190,14 +186,6 @@ "ImportPath": "github.com/googleapis/gnostic/extensions", "Rev": "0c5108395e2debce0d731cf0287ddf7242066aba" }, - { - "ImportPath": "github.com/gregjones/httpcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" - }, - { - "ImportPath": "github.com/gregjones/httpcache/diskcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" - }, { "ImportPath": "github.com/grpc-ecosystem/go-grpc-prometheus", "Rev": "2500245aa6110c562d17020fb31a2c133d737799" @@ -262,10 +250,6 @@ "ImportPath": "github.com/pborman/uuid", "Rev": "ca53cad383cad2479bbba7f7a1a05797ec1386e4" }, - { - "ImportPath": "github.com/peterbourgon/diskv", - "Rev": "5dfcb07a075adbaaa4094cddfd160b1e1c77a043" - }, { "ImportPath": "github.com/pkg/errors", "Rev": "a22138067af1c4942683050411a841ade67fe1eb" diff --git a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/BUILD index b94bca58172..fcbc32a1992 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/install/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/install/BUILD index f7da6e3ada1..1fb42eb6273 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/install/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/BUILD index 935e7f8ad42..b3e620266ba 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -40,3 +37,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/validation/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/validation/BUILD index f4a7baf186b..040e64bea5f 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/validation/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/validation/path:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/BUILD index d7c12a1bad5..ccc0b52b072 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "openapi_aggregator_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/go-openapi/spec:go_default_library", "//vendor/golang.org/x/net/websocket:go_default_library", @@ -43,7 +40,6 @@ go_library( "openapi_aggregator.go", "resolvers.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/emicklei/go-restful:go_default_library", "//vendor/github.com/go-openapi/spec:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go index 40b07d267f3..0d72b9e43df 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go @@ -17,6 +17,7 @@ limitations under the License. package apiserver import ( + "fmt" "net/http" "time" @@ -26,6 +27,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/sets" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/rest" @@ -261,7 +263,7 @@ func (s *APIAggregator) AddAPIService(apiService *apiregistration.APIService) er } proxyHandler.updateAPIService(apiService) if err := s.openAPIAggregator.loadApiServiceSpec(proxyHandler, apiService); err != nil { - return err + utilruntime.HandleError(fmt.Errorf("unable to load OpenAPI spec for API service %s: %v", apiService.Name, err)) } s.proxyHandlers[apiService.Name] = proxyHandler s.GenericAPIServer.Handler.NonGoRestfulMux.Handle(proxyPath, proxyHandler) diff --git a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/handler_proxy.go b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/handler_proxy.go index 945051582df..7c179ab7cf3 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/handler_proxy.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/handler_proxy.go @@ -181,7 +181,7 @@ func (r *responder) Object(statusCode int, obj runtime.Object) { responsewriters.WriteRawJSON(statusCode, obj, r.w) } -func (r *responder) Error(err error) { +func (r *responder) Error(_ http.ResponseWriter, _ *http.Request, err error) { http.Error(r.w, err.Error(), http.StatusInternalServerError) } diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/BUILD index 60143c34ded..73e32289473 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "clientset.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/client-go/discovery:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/fake/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/fake/BUILD index 1095a20e063..eb6cbabfc0c 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/fake/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme/BUILD index 951a44ef551..e8298c2fce1 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1/BUILD index 78e8cea0249..908f1951a14 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "doc.go", "generated_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1/fake/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1/fake/BUILD index 33c18b6eee4..aeef781ab14 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1/fake/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_apiregistration_client.go", "fake_apiservice.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/BUILD index e5b609ba79c..1565118e39b 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "clientset.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/client-go/discovery:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/fake/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/fake/BUILD index 7d4462d99d1..9c9f335e2c5 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/fake/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/scheme/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/scheme/BUILD index 9272069b5b0..8b598eadc1d 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/scheme/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/scheme/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/typed/apiregistration/internalversion/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/typed/apiregistration/internalversion/BUILD index afa908fa7ae..1c7ac3f1a7e 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/typed/apiregistration/internalversion/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/typed/apiregistration/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "doc.go", "generated_expansion.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/typed/apiregistration/internalversion/fake/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/typed/apiregistration/internalversion/fake/BUILD index ec6619b76da..7981f793b83 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/typed/apiregistration/internalversion/fake/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/typed/apiregistration/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_apiregistration_client.go", "fake_apiservice.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/BUILD index 0c02b3258f6..c1c1b3a6141 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "factory.go", "generic.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/BUILD index 719dcf5da96..de215e40f9e 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1beta1:go_default_library", "//vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/internalinterfaces:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1beta1/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1beta1/BUILD index 022937dc1cf..413e5f0364e 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1beta1/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "apiservice.go", "interface.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/internalinterfaces/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/internalinterfaces/BUILD index 5e13b4028ab..6b5931c0466 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/internalinterfaces/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/internalinterfaces/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["factory_interfaces.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/informers/internalversion/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/informers/internalversion/BUILD index bde9de54313..77812a0b268 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/informers/internalversion/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/informers/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "factory.go", "generic.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/informers/internalversion/apiregistration/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/informers/internalversion/apiregistration/BUILD index b715ea3a0cb..8701145496c 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/informers/internalversion/apiregistration/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/informers/internalversion/apiregistration/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/kube-aggregator/pkg/client/informers/internalversion/apiregistration/internalversion:go_default_library", "//vendor/k8s.io/kube-aggregator/pkg/client/informers/internalversion/internalinterfaces:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/informers/internalversion/apiregistration/internalversion/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/informers/internalversion/apiregistration/internalversion/BUILD index a21220b33b4..055da5c8ba2 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/informers/internalversion/apiregistration/internalversion/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/informers/internalversion/apiregistration/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "apiservice.go", "interface.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/informers/internalversion/internalinterfaces/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/informers/internalversion/internalinterfaces/BUILD index 19d87bcc2d9..78dbde363ee 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/informers/internalversion/internalinterfaces/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/informers/internalversion/internalinterfaces/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["factory_interfaces.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/internalversion/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/internalversion/BUILD index 2fd375da277..152e0db9ef1 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/internalversion/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "apiservice.go", "expansion_generated.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1beta1/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1beta1/BUILD index 84596451520..d96936c35a2 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1beta1/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "apiservice.go", "expansion_generated.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/BUILD index bff6d123f80..b366c51c89b 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,10 +8,10 @@ load( go_library( name = "go_default_library", srcs = ["start.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/spf13/cobra:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apiserver/pkg/server:go_default_library", "//vendor/k8s.io/apiserver/pkg/server/filters:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/start.go b/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/start.go index c5f39f0a3c9..1db47144b33 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/start.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/start.go @@ -25,6 +25,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/pflag" + utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/sets" genericapiserver "k8s.io/apiserver/pkg/server" "k8s.io/apiserver/pkg/server/filters" @@ -47,7 +48,7 @@ type AggregatorOptions struct { ProxyClientCertFile string ProxyClientKeyFile string - // CoreAPIKubeconfig is a filename for a kubeconfig file to contact the core API server wtih + // CoreAPIKubeconfig is a filename for a kubeconfig file to contact the core API server with // If it is not set, the in cluster config is used CoreAPIKubeconfig string @@ -102,7 +103,9 @@ func NewDefaultOptions(out, err io.Writer) *AggregatorOptions { } func (o AggregatorOptions) Validate(args []string) error { - return nil + errors := []error{} + errors = append(errors, o.RecommendedOptions.Validate()...) + return utilerrors.NewAggregate(errors) } func (o *AggregatorOptions) Complete() error { diff --git a/staging/src/k8s.io/kube-aggregator/pkg/controllers/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/controllers/BUILD index f7f55cbb5cd..9644e6dc03b 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/controllers/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/controllers/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["cache.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/controllers/autoregister/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/controllers/autoregister/BUILD index 56892cb0bac..15d2fc9dfaf 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/controllers/autoregister/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/controllers/autoregister/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,7 +10,6 @@ go_test( name = "go_default_test", srcs = ["autoregister_controller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/client-go/testing:go_default_library", @@ -27,7 +24,6 @@ go_test( go_library( name = "go_default_library", srcs = ["autoregister_controller.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/controllers/status/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/controllers/status/BUILD index e52747963bd..a2f239d0ad9 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/controllers/status/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/controllers/status/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["available_controller.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -39,7 +36,6 @@ go_test( name = "go_default_test", srcs = ["available_controller_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/BUILD index acaee576a23..f77b75f5bcb 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["strategy.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/BUILD index e30b11913ca..1a486312dcd 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["etcd.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/etcd.go b/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/etcd.go index 320aa5f0f0d..82db5783f2f 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/etcd.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/etcd.go @@ -35,11 +35,11 @@ type REST struct { func NewREST(scheme *runtime.Scheme, optsGetter generic.RESTOptionsGetter) *REST { strategy := apiservice.NewStrategy(scheme) store := &genericregistry.Store{ - Copier: scheme, - NewFunc: func() runtime.Object { return &apiregistration.APIService{} }, - NewListFunc: func() runtime.Object { return &apiregistration.APIServiceList{} }, - PredicateFunc: apiservice.MatchAPIService, - QualifiedResource: apiregistration.Resource("apiservices"), + Copier: scheme, + NewFunc: func() runtime.Object { return &apiregistration.APIService{} }, + NewListFunc: func() runtime.Object { return &apiregistration.APIServiceList{} }, + PredicateFunc: apiservice.MatchAPIService, + DefaultQualifiedResource: apiregistration.Resource("apiservices"), CreateStrategy: strategy, UpdateStrategy: strategy, diff --git a/staging/src/k8s.io/kube-gen/Godeps/Godeps.json b/staging/src/k8s.io/kube-gen/Godeps/Godeps.json index acb30da54fa..3e5428dd33f 100644 --- a/staging/src/k8s.io/kube-gen/Godeps/Godeps.json +++ b/staging/src/k8s.io/kube-gen/Godeps/Godeps.json @@ -174,10 +174,6 @@ "ImportPath": "github.com/golang/protobuf/ptypes/timestamp", "Rev": "4bd1920723d7b7c925de087aa32e2187708897f7" }, - { - "ImportPath": "github.com/google/btree", - "Rev": "7d79101e329e5a3adf994758c578dab82b90c017" - }, { "ImportPath": "github.com/google/gofuzz", "Rev": "44d81051d367757e1c7c6a5a86423ece9afcf63c" @@ -194,14 +190,6 @@ "ImportPath": "github.com/googleapis/gnostic/extensions", "Rev": "0c5108395e2debce0d731cf0287ddf7242066aba" }, - { - "ImportPath": "github.com/gregjones/httpcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" - }, - { - "ImportPath": "github.com/gregjones/httpcache/diskcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" - }, { "ImportPath": "github.com/hashicorp/golang-lru", "Rev": "a0d98a5f288019575c6d1f4bb1573fef2d1fcdc4" @@ -226,10 +214,6 @@ "ImportPath": "github.com/mailru/easyjson/jwriter", "Rev": "d5b7844b561a7bc640052f1b935f7b800330d7e0" }, - { - "ImportPath": "github.com/peterbourgon/diskv", - "Rev": "5dfcb07a075adbaaa4094cddfd160b1e1c77a043" - }, { "ImportPath": "github.com/spf13/pflag", "Rev": "9ff6c6923cfffbcd502984b8e0c80539a94968b7" diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/BUILD b/staging/src/k8s.io/kube-gen/cmd/client-gen/BUILD index 3390317c787..74864e5d484 100644 --- a/staging/src/k8s.io/kube-gen/cmd/client-gen/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/client-gen/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "client-gen", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/args/BUILD b/staging/src/k8s.io/kube-gen/cmd/client-gen/args/BUILD index 6df4aaea2b8..6d7d6df7d58 100644 --- a/staging/src/k8s.io/kube-gen/cmd/client-gen/args/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/client-gen/args/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["args.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/kube-gen/cmd/client-gen/types:go_default_library"], ) diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/BUILD b/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/BUILD index 21916ba882e..95ac5eb716a 100644 --- a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "generator_for_type.go", "tags.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/fake/BUILD b/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/fake/BUILD index 756fedfb37e..71dd9a18bed 100644 --- a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/fake/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "generator_fake_for_group.go", "generator_fake_for_type.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/gengo/generator:go_default_library", "//vendor/k8s.io/gengo/namer:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/scheme/BUILD b/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/scheme/BUILD index 20b1c1f4dfd..850b30ad27b 100644 --- a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/scheme/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/scheme/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["generator_for_scheme.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/gengo/generator:go_default_library", "//vendor/k8s.io/gengo/namer:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/util/BUILD b/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/util/BUILD index 186fc7821a1..b426436d8a7 100644 --- a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/util/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,11 @@ go_test( name = "go_default_test", srcs = ["tags_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["tags.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/gengo/types:go_default_library"], ) diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/path/BUILD b/staging/src/k8s.io/kube-gen/cmd/client-gen/path/BUILD index 1c967c9b846..3a31ed9efe3 100644 --- a/staging/src/k8s.io/kube-gen/cmd/client-gen/path/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/client-gen/path/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["path.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/types/BUILD b/staging/src/k8s.io/kube-gen/cmd/client-gen/types/BUILD index 9fe181571b0..e44988f8007 100644 --- a/staging/src/k8s.io/kube-gen/cmd/client-gen/types/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/client-gen/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "helpers.go", "types.go", ], - tags = ["automanaged"], deps = ["//vendor/k8s.io/gengo/namer:go_default_library"], ) @@ -22,7 +19,6 @@ go_test( name = "go_default_test", srcs = ["helpers_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/kube-gen/cmd/conversion-gen/BUILD b/staging/src/k8s.io/kube-gen/cmd/conversion-gen/BUILD index edae1d03bbb..fea52467213 100644 --- a/staging/src/k8s.io/kube-gen/cmd/conversion-gen/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/conversion-gen/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "conversion-gen", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/cmd/conversion-gen/generators/BUILD b/staging/src/k8s.io/kube-gen/cmd/conversion-gen/generators/BUILD index 73f5df1e82a..4b3e78d33d9 100644 --- a/staging/src/k8s.io/kube-gen/cmd/conversion-gen/generators/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/conversion-gen/generators/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["conversion.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/cmd/deepcopy-gen/BUILD b/staging/src/k8s.io/kube-gen/cmd/deepcopy-gen/BUILD index ca99b067aaf..bf35f7a6463 100644 --- a/staging/src/k8s.io/kube-gen/cmd/deepcopy-gen/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/deepcopy-gen/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "deepcopy-gen", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/cmd/defaulter-gen/BUILD b/staging/src/k8s.io/kube-gen/cmd/defaulter-gen/BUILD index 6dc63230948..7af8454c780 100644 --- a/staging/src/k8s.io/kube-gen/cmd/defaulter-gen/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/defaulter-gen/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "defaulter-gen", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/BUILD b/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/BUILD index b3c08a326ee..2cbc76dd291 100644 --- a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "go-to-protobuf", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/spf13/pflag:go_default_library", "//vendor/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/BUILD b/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/BUILD index 21c02680b97..3d115ba2772 100644 --- a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "parser.go", "tags.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", @@ -36,7 +33,6 @@ go_test( name = "go_default_test", srcs = ["namer_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protoc-gen-gogo/BUILD b/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protoc-gen-gogo/BUILD index 76e877bf3a0..a37033413b0 100644 --- a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protoc-gen-gogo/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protoc-gen-gogo/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "protoc-gen-gogo", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/cmd/import-boss/BUILD b/staging/src/k8s.io/kube-gen/cmd/import-boss/BUILD index 064c5eea476..0636ed3a14c 100644 --- a/staging/src/k8s.io/kube-gen/cmd/import-boss/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/import-boss/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "import-boss", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/cmd/informer-gen/BUILD b/staging/src/k8s.io/kube-gen/cmd/informer-gen/BUILD index 4db1bc65d53..df7ee1a6d24 100644 --- a/staging/src/k8s.io/kube-gen/cmd/informer-gen/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/informer-gen/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "informer-gen", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/BUILD b/staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/BUILD index 8ea7010c548..1f56383d0fa 100644 --- a/staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -21,7 +19,6 @@ go_library( "types.go", "versioninterface.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/cmd/lister-gen/BUILD b/staging/src/k8s.io/kube-gen/cmd/lister-gen/BUILD index 874a202b0a4..292dab89b7f 100644 --- a/staging/src/k8s.io/kube-gen/cmd/lister-gen/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/lister-gen/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "lister-gen", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/cmd/lister-gen/generators/BUILD b/staging/src/k8s.io/kube-gen/cmd/lister-gen/generators/BUILD index 15703292438..0d1b4865e36 100644 --- a/staging/src/k8s.io/kube-gen/cmd/lister-gen/generators/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/lister-gen/generators/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "lister.go", "tags.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/cmd/openapi-gen/BUILD b/staging/src/k8s.io/kube-gen/cmd/openapi-gen/BUILD index f602e426bac..a092811bd49 100644 --- a/staging/src/k8s.io/kube-gen/cmd/openapi-gen/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/openapi-gen/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "openapi-gen", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/cmd/set-gen/BUILD b/staging/src/k8s.io/kube-gen/cmd/set-gen/BUILD index 933e682f90a..a5c01f9cab1 100644 --- a/staging/src/k8s.io/kube-gen/cmd/set-gen/BUILD +++ b/staging/src/k8s.io/kube-gen/cmd/set-gen/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,7 +9,6 @@ load( go_binary( name = "set-gen", library = ":go_default_library", - tags = ["automanaged"], ) exports_files([ @@ -21,7 +18,6 @@ exports_files([ go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/apis/testgroup/BUILD b/staging/src/k8s.io/kube-gen/test/apis/testgroup/BUILD index 626ac278b4c..4f10bd63323 100644 --- a/staging/src/k8s.io/kube-gen/test/apis/testgroup/BUILD +++ b/staging/src/k8s.io/kube-gen/test/apis/testgroup/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/apis/testgroup/install/BUILD b/staging/src/k8s.io/kube-gen/test/apis/testgroup/install/BUILD index 44e18448621..bff464c2a2a 100644 --- a/staging/src/k8s.io/kube-gen/test/apis/testgroup/install/BUILD +++ b/staging/src/k8s.io/kube-gen/test/apis/testgroup/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/apis/testgroup/v1/BUILD b/staging/src/k8s.io/kube-gen/test/apis/testgroup/v1/BUILD index 6a1709b50f1..6b717c07f3e 100644 --- a/staging/src/k8s.io/kube-gen/test/apis/testgroup/v1/BUILD +++ b/staging/src/k8s.io/kube-gen/test/apis/testgroup/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/ugorji/go/codec:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/BUILD b/staging/src/k8s.io/kube-gen/test/clientset/internal/BUILD index 53303cc5599..f4cc9735339 100644 --- a/staging/src/k8s.io/kube-gen/test/clientset/internal/BUILD +++ b/staging/src/k8s.io/kube-gen/test/clientset/internal/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "clientset.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/client-go/discovery:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/fake/BUILD b/staging/src/k8s.io/kube-gen/test/clientset/internal/fake/BUILD index 3f9989dadef..6ef5deb74c5 100644 --- a/staging/src/k8s.io/kube-gen/test/clientset/internal/fake/BUILD +++ b/staging/src/k8s.io/kube-gen/test/clientset/internal/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/scheme/BUILD b/staging/src/k8s.io/kube-gen/test/clientset/internal/scheme/BUILD index 526ee1a39a0..8d8513ff6ef 100644 --- a/staging/src/k8s.io/kube-gen/test/clientset/internal/scheme/BUILD +++ b/staging/src/k8s.io/kube-gen/test/clientset/internal/scheme/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/BUILD b/staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/BUILD index e05f4bc5b93..85e9eebd074 100644 --- a/staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/BUILD +++ b/staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "testgroup_client.go", "testtype.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/fake/BUILD b/staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/fake/BUILD index 1903bc64c48..5ac8473e9ee 100644 --- a/staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/fake/BUILD +++ b/staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_testgroup_client.go", "fake_testtype.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/BUILD b/staging/src/k8s.io/kube-gen/test/clientset/versioned/BUILD index 9c6d9df4321..0877e63c3ef 100644 --- a/staging/src/k8s.io/kube-gen/test/clientset/versioned/BUILD +++ b/staging/src/k8s.io/kube-gen/test/clientset/versioned/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "clientset.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/client-go/discovery:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/fake/BUILD b/staging/src/k8s.io/kube-gen/test/clientset/versioned/fake/BUILD index 1ff47c06362..8796fbb90a9 100644 --- a/staging/src/k8s.io/kube-gen/test/clientset/versioned/fake/BUILD +++ b/staging/src/k8s.io/kube-gen/test/clientset/versioned/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/scheme/BUILD b/staging/src/k8s.io/kube-gen/test/clientset/versioned/scheme/BUILD index b1036aab9ff..597a08106f3 100644 --- a/staging/src/k8s.io/kube-gen/test/clientset/versioned/scheme/BUILD +++ b/staging/src/k8s.io/kube-gen/test/clientset/versioned/scheme/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/BUILD b/staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/BUILD index 824da505af4..54c2ffbfb3e 100644 --- a/staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/BUILD +++ b/staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "testgroup_client.go", "testtype.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/fake/BUILD b/staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/fake/BUILD index 0e1e84577ac..c8bce9ba0cf 100644 --- a/staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/fake/BUILD +++ b/staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_testgroup_client.go", "fake_testtype.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/informers/externalversions/BUILD b/staging/src/k8s.io/kube-gen/test/informers/externalversions/BUILD index 1dba1bab3ac..9f53f06c80d 100644 --- a/staging/src/k8s.io/kube-gen/test/informers/externalversions/BUILD +++ b/staging/src/k8s.io/kube-gen/test/informers/externalversions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "factory.go", "generic.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/informers/externalversions/internalinterfaces/BUILD b/staging/src/k8s.io/kube-gen/test/informers/externalversions/internalinterfaces/BUILD index cd786bdf355..dcdcd13360f 100644 --- a/staging/src/k8s.io/kube-gen/test/informers/externalversions/internalinterfaces/BUILD +++ b/staging/src/k8s.io/kube-gen/test/informers/externalversions/internalinterfaces/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["factory_interfaces.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/BUILD b/staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/BUILD index 064117410d2..cb8cdbf610a 100644 --- a/staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/BUILD +++ b/staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/kube-gen/test/informers/externalversions/internalinterfaces:go_default_library", "//vendor/k8s.io/kube-gen/test/informers/externalversions/testgroup/v1:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/v1/BUILD b/staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/v1/BUILD index d83cc573b06..02608a2d6d1 100644 --- a/staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/v1/BUILD +++ b/staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "interface.go", "testtype.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/informers/internalversion/BUILD b/staging/src/k8s.io/kube-gen/test/informers/internalversion/BUILD index 0c469adb92b..5c6fc023be9 100644 --- a/staging/src/k8s.io/kube-gen/test/informers/internalversion/BUILD +++ b/staging/src/k8s.io/kube-gen/test/informers/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "factory.go", "generic.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/informers/internalversion/internalinterfaces/BUILD b/staging/src/k8s.io/kube-gen/test/informers/internalversion/internalinterfaces/BUILD index 8489f1fc40f..a2c85578479 100644 --- a/staging/src/k8s.io/kube-gen/test/informers/internalversion/internalinterfaces/BUILD +++ b/staging/src/k8s.io/kube-gen/test/informers/internalversion/internalinterfaces/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["factory_interfaces.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/BUILD b/staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/BUILD index d563c49bd58..a248c9e4ae1 100644 --- a/staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/BUILD +++ b/staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/kube-gen/test/informers/internalversion/internalinterfaces:go_default_library", "//vendor/k8s.io/kube-gen/test/informers/internalversion/testgroup/internalversion:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/internalversion/BUILD b/staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/internalversion/BUILD index 4864dda1df8..ce07c449373 100644 --- a/staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/internalversion/BUILD +++ b/staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "interface.go", "testtype.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/listers/testgroup/internalversion/BUILD b/staging/src/k8s.io/kube-gen/test/listers/testgroup/internalversion/BUILD index 8095a3f4809..c75646056a7 100644 --- a/staging/src/k8s.io/kube-gen/test/listers/testgroup/internalversion/BUILD +++ b/staging/src/k8s.io/kube-gen/test/listers/testgroup/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "testtype.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/test/listers/testgroup/v1/BUILD b/staging/src/k8s.io/kube-gen/test/listers/testgroup/v1/BUILD index 288b96f4b40..f9de88d2069 100644 --- a/staging/src/k8s.io/kube-gen/test/listers/testgroup/v1/BUILD +++ b/staging/src/k8s.io/kube-gen/test/listers/testgroup/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "expansion_generated.go", "testtype.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", diff --git a/staging/src/k8s.io/kube-gen/third_party/forked/golang/reflect/BUILD b/staging/src/k8s.io/kube-gen/third_party/forked/golang/reflect/BUILD index c06823686bf..8dd68554410 100644 --- a/staging/src/k8s.io/kube-gen/third_party/forked/golang/reflect/BUILD +++ b/staging/src/k8s.io/kube-gen/third_party/forked/golang/reflect/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["type.go"], - tags = ["automanaged"], ) filegroup( diff --git a/staging/src/k8s.io/metrics/Godeps/Godeps.json b/staging/src/k8s.io/metrics/Godeps/Godeps.json index 06f902d2542..84161570f62 100644 --- a/staging/src/k8s.io/metrics/Godeps/Godeps.json +++ b/staging/src/k8s.io/metrics/Godeps/Godeps.json @@ -82,10 +82,6 @@ "ImportPath": "github.com/golang/protobuf/ptypes/timestamp", "Rev": "4bd1920723d7b7c925de087aa32e2187708897f7" }, - { - "ImportPath": "github.com/google/btree", - "Rev": "7d79101e329e5a3adf994758c578dab82b90c017" - }, { "ImportPath": "github.com/google/gofuzz", "Rev": "44d81051d367757e1c7c6a5a86423ece9afcf63c" @@ -102,14 +98,6 @@ "ImportPath": "github.com/googleapis/gnostic/extensions", "Rev": "0c5108395e2debce0d731cf0287ddf7242066aba" }, - { - "ImportPath": "github.com/gregjones/httpcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" - }, - { - "ImportPath": "github.com/gregjones/httpcache/diskcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" - }, { "ImportPath": "github.com/juju/ratelimit", "Rev": "5b9ff866471762aa2ab2dced63c9fb6f53921342" @@ -126,10 +114,6 @@ "ImportPath": "github.com/mailru/easyjson/jwriter", "Rev": "d5b7844b561a7bc640052f1b935f7b800330d7e0" }, - { - "ImportPath": "github.com/peterbourgon/diskv", - "Rev": "5dfcb07a075adbaaa4094cddfd160b1e1c77a043" - }, { "ImportPath": "github.com/spf13/pflag", "Rev": "9ff6c6923cfffbcd502984b8e0c80539a94968b7" diff --git a/staging/src/k8s.io/metrics/pkg/apis/custom_metrics/BUILD b/staging/src/k8s.io/metrics/pkg/apis/custom_metrics/BUILD index 680d4354d88..3931e788a4a 100644 --- a/staging/src/k8s.io/metrics/pkg/apis/custom_metrics/BUILD +++ b/staging/src/k8s.io/metrics/pkg/apis/custom_metrics/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/metrics/pkg/apis/custom_metrics/install/BUILD b/staging/src/k8s.io/metrics/pkg/apis/custom_metrics/install/BUILD index bdbd61329c0..c145a808a4e 100644 --- a/staging/src/k8s.io/metrics/pkg/apis/custom_metrics/install/BUILD +++ b/staging/src/k8s.io/metrics/pkg/apis/custom_metrics/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", diff --git a/staging/src/k8s.io/metrics/pkg/apis/custom_metrics/v1alpha1/BUILD b/staging/src/k8s.io/metrics/pkg/apis/custom_metrics/v1alpha1/BUILD index 4b783399291..ce2931e74c0 100644 --- a/staging/src/k8s.io/metrics/pkg/apis/custom_metrics/v1alpha1/BUILD +++ b/staging/src/k8s.io/metrics/pkg/apis/custom_metrics/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/ugorji/go/codec:go_default_library", @@ -45,3 +42,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/metrics/pkg/apis/metrics/BUILD b/staging/src/k8s.io/metrics/pkg/apis/metrics/BUILD index c855cefe787..fba37423d13 100644 --- a/staging/src/k8s.io/metrics/pkg/apis/metrics/BUILD +++ b/staging/src/k8s.io/metrics/pkg/apis/metrics/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/metrics/pkg/apis/metrics/install/BUILD b/staging/src/k8s.io/metrics/pkg/apis/metrics/install/BUILD index c2ce2bb4700..11fb277cd7c 100644 --- a/staging/src/k8s.io/metrics/pkg/apis/metrics/install/BUILD +++ b/staging/src/k8s.io/metrics/pkg/apis/metrics/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", diff --git a/staging/src/k8s.io/metrics/pkg/apis/metrics/v1alpha1/BUILD b/staging/src/k8s.io/metrics/pkg/apis/metrics/v1alpha1/BUILD index e83db4b5575..3bed249d936 100644 --- a/staging/src/k8s.io/metrics/pkg/apis/metrics/v1alpha1/BUILD +++ b/staging/src/k8s.io/metrics/pkg/apis/metrics/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", @@ -46,3 +43,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/BUILD b/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/BUILD index a3152d8324b..e981a1df63b 100644 --- a/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/BUILD +++ b/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "clientset.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/client-go/discovery:go_default_library", diff --git a/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/fake/BUILD b/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/fake/BUILD index 2afc0e1f2c4..f7365bf3daf 100644 --- a/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/fake/BUILD +++ b/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme/BUILD b/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme/BUILD index fcc37e03fed..2dc4a1fbbb4 100644 --- a/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme/BUILD +++ b/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/BUILD b/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/BUILD index be2bab4e8c6..d9540be52cc 100644 --- a/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/BUILD +++ b/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "nodemetrics.go", "podmetrics.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", diff --git a/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/fake/BUILD b/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/fake/BUILD index e9b57b33a6d..c3a9c63f745 100644 --- a/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/fake/BUILD +++ b/staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "fake_nodemetrics.go", "fake_podmetrics.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", diff --git a/staging/src/k8s.io/metrics/pkg/client/custom_metrics/BUILD b/staging/src/k8s.io/metrics/pkg/client/custom_metrics/BUILD index 94cfdc38823..75922874918 100644 --- a/staging/src/k8s.io/metrics/pkg/client/custom_metrics/BUILD +++ b/staging/src/k8s.io/metrics/pkg/client/custom_metrics/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "client.go", "interfaces.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/metrics/pkg/client/custom_metrics/fake/BUILD b/staging/src/k8s.io/metrics/pkg/client/custom_metrics/fake/BUILD index cc143856f83..5c2e75e5934 100644 --- a/staging/src/k8s.io/metrics/pkg/client/custom_metrics/fake/BUILD +++ b/staging/src/k8s.io/metrics/pkg/client/custom_metrics/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["fake_client.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/BUILD b/staging/src/k8s.io/sample-apiserver/BUILD index 7db5e6c8c1b..5e679ec9790 100644 --- a/staging/src/k8s.io/sample-apiserver/BUILD +++ b/staging/src/k8s.io/sample-apiserver/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "sample-apiserver", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/logs:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json b/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json index da0397c8228..85d28883145 100644 --- a/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json +++ b/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json @@ -162,10 +162,6 @@ "ImportPath": "github.com/golang/protobuf/ptypes/timestamp", "Rev": "4bd1920723d7b7c925de087aa32e2187708897f7" }, - { - "ImportPath": "github.com/google/btree", - "Rev": "7d79101e329e5a3adf994758c578dab82b90c017" - }, { "ImportPath": "github.com/google/gofuzz", "Rev": "44d81051d367757e1c7c6a5a86423ece9afcf63c" @@ -182,14 +178,6 @@ "ImportPath": "github.com/googleapis/gnostic/extensions", "Rev": "0c5108395e2debce0d731cf0287ddf7242066aba" }, - { - "ImportPath": "github.com/gregjones/httpcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" - }, - { - "ImportPath": "github.com/gregjones/httpcache/diskcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" - }, { "ImportPath": "github.com/grpc-ecosystem/go-grpc-prometheus", "Rev": "2500245aa6110c562d17020fb31a2c133d737799" @@ -254,10 +242,6 @@ "ImportPath": "github.com/pborman/uuid", "Rev": "ca53cad383cad2479bbba7f7a1a05797ec1386e4" }, - { - "ImportPath": "github.com/peterbourgon/diskv", - "Rev": "5dfcb07a075adbaaa4094cddfd160b1e1c77a043" - }, { "ImportPath": "github.com/pkg/errors", "Rev": "a22138067af1c4942683050411a841ade67fe1eb" diff --git a/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/BUILD index c012a5905be..f7357b1f9b6 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["admission.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", @@ -26,7 +23,6 @@ go_library( go_test( name = "go_default_xtest", srcs = ["admission_test.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/admission.go b/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/admission.go index 8e021f120f2..8e7d51acea8 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/admission.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/admission.go @@ -18,6 +18,7 @@ package banflunder import ( "fmt" + "io" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" @@ -28,6 +29,13 @@ import ( listers "k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion" ) +// Register registers a plugin +func Register(plugins *admission.Plugins) { + plugins.Register("BanFlunder", func(config io.Reader) (admission.Interface, error) { + return New() + }) +} + type disallowFlunder struct { *admission.Handler lister listers.FischerLister @@ -80,5 +88,7 @@ func (d *disallowFlunder) Validate() error { // New creates a new ban flunder admission plugin func New() (admission.Interface, error) { - return &disallowFlunder{}, nil + return &disallowFlunder{ + Handler: admission.NewHandler(admission.Create), + }, nil } diff --git a/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/BUILD index 916652ca13a..353623b8374 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "interfaces.go", "wardleinitializer.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion:go_default_library", @@ -24,7 +21,6 @@ go_library( go_test( name = "go_default_xtest", srcs = ["wardleinitializer_test.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/admission/wardleinitializer:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/BUILD index 33a73330401..aa8f8a3dc9e 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/install/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/install/BUILD index 907a14cc58c..c451d3dc5fb 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/install/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/install/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,12 @@ go_test( name = "go_default_test", srcs = ["roundtrip_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip:go_default_library"], ) go_library( name = "go_default_library", srcs = ["install.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/BUILD index 41f1058c29a..f7ce6f12b20 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "zz_generated.conversion.go", "zz_generated.deepcopy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/apiserver/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/apiserver/BUILD index 03838d80f93..79ed70f8257 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/apiserver/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/apiserver/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,14 +10,12 @@ go_test( name = "go_default_test", srcs = ["scheme_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip:go_default_library"], ) go_library( name = "go_default_library", srcs = ["apiserver.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", @@ -33,6 +29,7 @@ go_library( "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle/install:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/registry:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/registry/wardle/fischer:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/registry/wardle/flunder:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/apiserver/apiserver.go b/staging/src/k8s.io/sample-apiserver/pkg/apiserver/apiserver.go index 41e1d94aba5..33ebf143c6a 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/apiserver/apiserver.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/apiserver/apiserver.go @@ -30,6 +30,7 @@ import ( "k8s.io/sample-apiserver/pkg/apis/wardle" "k8s.io/sample-apiserver/pkg/apis/wardle/install" "k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1" + informers "k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion" wardleregistry "k8s.io/sample-apiserver/pkg/registry" fischerstorage "k8s.io/sample-apiserver/pkg/registry/wardle/fischer" flunderstorage "k8s.io/sample-apiserver/pkg/registry/wardle/flunder" @@ -62,6 +63,8 @@ func init() { type Config struct { GenericConfig *genericapiserver.Config + // SharedInformerFactory provides shared informers for resources + SharedInformerFactory informers.SharedInformerFactory } // WardleServer contains state for a Kubernetes cluster master/api server. diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/BUILD index a3d0e1b7601..90296e4354b 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "clientset.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/client-go/discovery:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/fake/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/fake/BUILD index 0d186675aff..e6d2bafb802 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/fake/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/scheme/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/scheme/BUILD index 29bc92c6edb..8d423db96c2 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/scheme/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/scheme/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/BUILD index 7564e91c652..4d0eb671eef 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "generated_expansion.go", "wardle_client.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake/BUILD index 117d69815c0..94cdf0f6b28 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "fake_flunder.go", "fake_wardle_client.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/BUILD index 6530dd0f721..a00a83e808b 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "clientset.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/client-go/discovery:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake/BUILD index 880642a2855..a9c990af420 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/scheme/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/scheme/BUILD index 8ae1472c9d3..458b4f792b6 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/scheme/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/scheme/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "register.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/BUILD index 6a791c45b8f..ddc6e0d2211 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "generated_expansion.go", "wardle_client.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake/BUILD index 5898e924c7c..de4327b8693 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "fake_flunder.go", "fake_wardle_client.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/BUILD index e943cce340e..0895ac3e068 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "factory.go", "generic.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces/BUILD index 6c453d74d3d..8879ae2650b 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["factory_interfaces.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/BUILD index aa461baba38..b3371dcd327 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1/BUILD index 55d077087c0..e7ad18c5484 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "flunder.go", "interface.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/BUILD index 8222d45657d..337af4e206f 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "factory.go", "generic.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces/BUILD index 9c87f05bb37..d5aea15716b 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["factory_interfaces.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/BUILD index 708b02566ca..8423ea59956 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion/BUILD index 0e5ad9311c8..e8a316318a9 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "flunder.go", "interface.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion/BUILD index 9d4b75999cf..41c866a1745 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fischer.go", "flunder.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/v1alpha1/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/v1alpha1/BUILD index c5e2c3a38cd..41c1c34c495 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/v1alpha1/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/v1alpha1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fischer.go", "flunder.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/BUILD index ae62e2206ea..ab8fc50668c 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,13 +8,17 @@ load( go_library( name = "go_default_library", srcs = ["start.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/spf13/cobra:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apiserver/pkg/server:go_default_library", "//vendor/k8s.io/apiserver/pkg/server/options:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/admission/wardleinitializer:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apiserver:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion:go_default_library", ], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go b/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go index 3ed49adb52c..916ac18f4de 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go @@ -23,10 +23,15 @@ import ( "github.com/spf13/cobra" + utilerrors "k8s.io/apimachinery/pkg/util/errors" genericapiserver "k8s.io/apiserver/pkg/server" genericoptions "k8s.io/apiserver/pkg/server/options" + "k8s.io/sample-apiserver/pkg/admission/plugin/banflunder" + "k8s.io/sample-apiserver/pkg/admission/wardleinitializer" "k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1" "k8s.io/sample-apiserver/pkg/apiserver" + clientset "k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset" + informers "k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion" ) const defaultEtcdPathPrefix = "/registry/wardle.kubernetes.io" @@ -80,7 +85,10 @@ func NewCommandStartWardleServer(out, errOut io.Writer, stopCh <-chan struct{}) } func (o WardleServerOptions) Validate(args []string) error { - return nil + errors := []error{} + errors = append(errors, o.RecommendedOptions.Validate()...) + errors = append(errors, o.Admission.Validate()...) + return utilerrors.NewAggregate(errors) } func (o *WardleServerOptions) Complete() error { @@ -88,6 +96,9 @@ func (o *WardleServerOptions) Complete() error { } func (o WardleServerOptions) Config() (*apiserver.Config, error) { + // register admission plugins + banflunder.Register(o.Admission.Plugins) + // TODO have a "real" external address if err := o.RecommendedOptions.SecureServing.MaybeDefaultWithSelfSignedCerts("localhost", nil, []net.IP{net.ParseIP("127.0.0.1")}); err != nil { return nil, fmt.Errorf("error creating self-signed certificates: %v", err) @@ -98,12 +109,23 @@ func (o WardleServerOptions) Config() (*apiserver.Config, error) { return nil, err } - if err := o.Admission.ApplyTo(serverConfig); err != nil { + client, err := clientset.NewForConfig(serverConfig.LoopbackClientConfig) + if err != nil { + return nil, err + } + informerFactory := informers.NewSharedInformerFactory(client, serverConfig.LoopbackClientConfig.Timeout) + admissionInitializer, err := wardleinitializer.New(informerFactory) + if err != nil { + return nil, err + } + + if err := o.Admission.ApplyTo(serverConfig, admissionInitializer); err != nil { return nil, err } config := &apiserver.Config{ - GenericConfig: serverConfig, + GenericConfig: serverConfig, + SharedInformerFactory: informerFactory, } return config, nil } @@ -118,5 +140,11 @@ func (o WardleServerOptions) RunWardleServer(stopCh <-chan struct{}) error { if err != nil { return err } + + server.GenericAPIServer.AddPostStartHook("start-sample-server-informers", func(context genericapiserver.PostStartHookContext) error { + config.SharedInformerFactory.Start(context.StopCh) + return nil + }) + return server.GenericAPIServer.PrepareRun().Run(stopCh) } diff --git a/staging/src/k8s.io/sample-apiserver/pkg/registry/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/registry/BUILD index c18259b6cb2..46efdb56376 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/registry/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/registry/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["registry.go"], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/registry/registry.go b/staging/src/k8s.io/sample-apiserver/pkg/registry/registry.go index 08eb0576261..32da2eda903 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/registry/registry.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/registry/registry.go @@ -33,7 +33,7 @@ type REST struct { // a wrapper for wardle registries. func RESTInPeace(storage rest.StandardStorage, err error) rest.StandardStorage { if err != nil { - err = fmt.Errorf("Unable to create REST storage for a resource due to %v. Committing suicide.", err) + err = fmt.Errorf("unable to create REST storage for a resource due to %v, will die", err) panic(err) } return storage diff --git a/staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/fischer/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/fischer/BUILD index 1cf6f967ee7..e05438f7273 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/fischer/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/fischer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "etcd.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/fischer/etcd.go b/staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/fischer/etcd.go index 5cf11ec8c8e..228a668feaa 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/fischer/etcd.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/fischer/etcd.go @@ -29,11 +29,11 @@ func NewREST(scheme *runtime.Scheme, optsGetter generic.RESTOptionsGetter) (*reg strategy := NewStrategy(scheme) store := &genericregistry.Store{ - Copier: scheme, - NewFunc: func() runtime.Object { return &wardle.Fischer{} }, - NewListFunc: func() runtime.Object { return &wardle.FischerList{} }, - PredicateFunc: MatchFischer, - QualifiedResource: wardle.Resource("fischers"), + Copier: scheme, + NewFunc: func() runtime.Object { return &wardle.Fischer{} }, + NewListFunc: func() runtime.Object { return &wardle.FischerList{} }, + PredicateFunc: MatchFischer, + DefaultQualifiedResource: wardle.Resource("fischers"), CreateStrategy: strategy, UpdateStrategy: strategy, diff --git a/staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/flunder/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/flunder/BUILD index 1cf6f967ee7..e05438f7273 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/flunder/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/flunder/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "etcd.go", "strategy.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/flunder/etcd.go b/staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/flunder/etcd.go index 8bb5ef44033..7f12cb4cbe3 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/flunder/etcd.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/flunder/etcd.go @@ -29,11 +29,11 @@ func NewREST(scheme *runtime.Scheme, optsGetter generic.RESTOptionsGetter) (*reg strategy := NewStrategy(scheme) store := &genericregistry.Store{ - Copier: scheme, - NewFunc: func() runtime.Object { return &wardle.Flunder{} }, - NewListFunc: func() runtime.Object { return &wardle.FlunderList{} }, - PredicateFunc: MatchFlunder, - QualifiedResource: wardle.Resource("flunders"), + Copier: scheme, + NewFunc: func() runtime.Object { return &wardle.Flunder{} }, + NewListFunc: func() runtime.Object { return &wardle.FlunderList{} }, + PredicateFunc: MatchFlunder, + DefaultQualifiedResource: wardle.Resource("flunders"), CreateStrategy: strategy, UpdateStrategy: strategy, diff --git a/test/BUILD b/test/BUILD index 9c4c19ec884..0233959be4e 100644 --- a/test/BUILD +++ b/test/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/test/e2e/BUILD b/test/e2e/BUILD index f54541a6474..0438d934331 100644 --- a/test/e2e/BUILD +++ b/test/e2e/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,28 +10,26 @@ go_test( name = "go_default_test", srcs = [ "e2e_test.go", - "metrics_grabber_test.go", "taints_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//test/e2e/apimachinery:go_default_library", "//test/e2e/apps:go_default_library", "//test/e2e/autoscaling:go_default_library", + "//test/e2e/common:go_default_library", "//test/e2e/framework:go_default_library", "//test/e2e/instrumentation:go_default_library", "//test/e2e/kubectl:go_default_library", "//test/e2e/lifecycle:go_default_library", "//test/e2e/lifecycle/bootstrap:go_default_library", - "//test/e2e/metrics:go_default_library", "//test/e2e/network:go_default_library", + "//test/e2e/node:go_default_library", "//test/e2e/scalability:go_default_library", "//test/e2e/scheduling:go_default_library", "//test/e2e/storage:go_default_library", "//test/utils:go_default_library", "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -69,7 +65,6 @@ go_library( "ssh.go", "ubernetes_lite.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", @@ -77,17 +72,17 @@ go_library( "//pkg/cloudprovider/providers/azure:go_default_library", "//pkg/cloudprovider/providers/gce:go_default_library", "//pkg/controller/node:go_default_library", + "//pkg/kubectl/util/logs:go_default_library", "//pkg/kubelet/apis:go_default_library", "//pkg/quota/evaluator/core:go_default_library", - "//pkg/util/logs:go_default_library", "//pkg/util/version:go_default_library", "//plugin/pkg/admission/serviceaccount:go_default_library", "//test/e2e/common:go_default_library", "//test/e2e/framework:go_default_library", "//test/e2e/framework/ginkgowrapper:go_default_library", + "//test/e2e/framework/metrics:go_default_library", "//test/e2e/generated:go_default_library", "//test/e2e/manifest:go_default_library", - "//test/e2e/metrics:go_default_library", "//test/e2e_federation:go_default_library", "//test/utils:go_default_library", "//vendor/github.com/golang/glog:go_default_library", @@ -155,7 +150,6 @@ filegroup( "//test/e2e/kubectl:all-srcs", "//test/e2e/lifecycle:all-srcs", "//test/e2e/manifest:all-srcs", - "//test/e2e/metrics:all-srcs", "//test/e2e/network:all-srcs", "//test/e2e/node:all-srcs", "//test/e2e/perftype:all-srcs", diff --git a/test/e2e/apimachinery/BUILD b/test/e2e/apimachinery/BUILD index 31ef898ed15..b58944f67a0 100644 --- a/test/e2e/apimachinery/BUILD +++ b/test/e2e/apimachinery/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,21 +16,21 @@ go_library( "namespace.go", "table_conversion.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1/pod:go_default_library", "//pkg/client/retry:go_default_library", - "//pkg/controller:go_default_library", "//pkg/printers:go_default_library", "//pkg/util/version:go_default_library", "//test/e2e/apps:go_default_library", "//test/e2e/framework:go_default_library", - "//test/e2e/metrics:go_default_library", + "//test/e2e/framework/metrics:go_default_library", "//test/utils:go_default_library", "//vendor/github.com/onsi/ginkgo:go_default_library", "//vendor/github.com/onsi/gomega:go_default_library", "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", + "//vendor/k8s.io/api/batch/v1:go_default_library", + "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", @@ -43,6 +41,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_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/wait:go_default_library", diff --git a/test/e2e/apimachinery/garbage_collector.go b/test/e2e/apimachinery/garbage_collector.go index d0d38b560bd..b9dedf93537 100644 --- a/test/e2e/apimachinery/garbage_collector.go +++ b/test/e2e/apimachinery/garbage_collector.go @@ -20,22 +20,24 @@ import ( "fmt" "time" + batchv1 "k8s.io/api/batch/v1" + batchv2alpha1 "k8s.io/api/batch/v2alpha1" "k8s.io/api/core/v1" - v1beta1 "k8s.io/api/extensions/v1beta1" + "k8s.io/api/extensions/v1beta1" apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" apiextensionsclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" apiextensionstestserver "k8s.io/apiextensions-apiserver/test/integration/testserver" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apiserver/pkg/storage/names" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/kubernetes/test/e2e/metrics" + "k8s.io/kubernetes/test/e2e/framework/metrics" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -46,6 +48,11 @@ func getForegroundOptions() *metav1.DeleteOptions { return &metav1.DeleteOptions{PropagationPolicy: &policy} } +func getBackgroundOptions() *metav1.DeleteOptions { + policy := metav1.DeletePropagationBackground + return &metav1.DeleteOptions{PropagationPolicy: &policy} +} + func getOrphanOptions() *metav1.DeleteOptions { var trueVar = true return &metav1.DeleteOptions{OrphanDependents: &trueVar} @@ -56,7 +63,11 @@ func getNonOrphanOptions() *metav1.DeleteOptions { return &metav1.DeleteOptions{OrphanDependents: &falseVar} } -var zero = int64(0) +var ( + zero = int64(0) + + CronJobGroupVersionResource = schema.GroupVersionResource{Group: batchv2alpha1.GroupName, Version: "v2alpha1", Resource: "cronjobs"} +) func getPodTemplateSpec(labels map[string]string) v1.PodTemplateSpec { return v1.PodTemplateSpec{ @@ -175,10 +186,10 @@ func newGCPod(name string) *v1.Pod { } } -// verifyRemainingObjects verifies if the number of the remaining replication +// verifyRemainingReplicationControllersPods verifies if the number of the remaining replication // controllers and pods are rcNum and podNum. It returns error if the // communication with the API server fails. -func verifyRemainingObjects(f *framework.Framework, clientSet clientset.Interface, rcNum, podNum int) (bool, error) { +func verifyRemainingReplicationControllersPods(f *framework.Framework, clientSet clientset.Interface, rcNum, podNum int) (bool, error) { rcClient := clientSet.Core().ReplicationControllers(f.Namespace.Name) pods, err := clientSet.Core().Pods(f.Namespace.Name).List(metav1.ListOptions{}) if err != nil { @@ -200,10 +211,46 @@ func verifyRemainingObjects(f *framework.Framework, clientSet clientset.Interfac return ret, nil } +// verifyRemainingCronJobsJobsPods verifies if the number of remaining cronjobs, +// jobs and pods. It returns error if the communication with the API server fails. +func verifyRemainingCronJobsJobsPods(f *framework.Framework, clientSet clientset.Interface, + cjNum, jobNum, podNum int) (bool, error) { + var ret = true + + cronJobs, err := f.ClientSet.BatchV2alpha1().CronJobs(f.Namespace.Name).List(metav1.ListOptions{}) + if err != nil { + return false, fmt.Errorf("Failed to list cronjobs: %v", err) + } + if len(cronJobs.Items) != cjNum { + ret = false + By(fmt.Sprintf("expected %d cronjobs, got %d cronjobs", cjNum, len(cronJobs.Items))) + } + + jobs, err := f.ClientSet.Batch().Jobs(f.Namespace.Name).List(metav1.ListOptions{}) + if err != nil { + return false, fmt.Errorf("Failed to list jobs: %v", err) + } + if len(jobs.Items) != jobNum { + ret = false + By(fmt.Sprintf("expected %d jobs, got %d jobs", jobNum, len(jobs.Items))) + } + + pods, err := f.ClientSet.Core().Pods(f.Namespace.Name).List(metav1.ListOptions{}) + if err != nil { + return false, fmt.Errorf("Failed to list pods: %v", err) + } + if len(pods.Items) != podNum { + ret = false + By(fmt.Sprintf("expected %d pods, got %d pods", podNum, len(pods.Items))) + } + + return ret, nil +} + func gatherMetrics(f *framework.Framework) { By("Gathering metrics") var summary framework.TestDataSummary - grabber, err := metrics.NewMetricsGrabber(f.ClientSet, false, false, true, false) + grabber, err := metrics.NewMetricsGrabber(f.ClientSet, f.KubemarkExternalClusterClientSet, false, false, true, false, false) if err != nil { framework.Logf("Failed to create MetricsGrabber. Skipping metrics gathering.") } else { @@ -217,6 +264,41 @@ func gatherMetrics(f *framework.Framework) { } } +func newCronJob(name, schedule string) *batchv2alpha1.CronJob { + parallelism := int32(1) + completions := int32(1) + return &batchv2alpha1.CronJob{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + TypeMeta: metav1.TypeMeta{ + Kind: "CronJob", + }, + Spec: batchv2alpha1.CronJobSpec{ + Schedule: schedule, + JobTemplate: batchv2alpha1.JobTemplateSpec{ + Spec: batchv1.JobSpec{ + Parallelism: ¶llelism, + Completions: &completions, + Template: v1.PodTemplateSpec{ + Spec: v1.PodSpec{ + RestartPolicy: v1.RestartPolicyOnFailure, + TerminationGracePeriodSeconds: &zero, + Containers: []v1.Container{ + { + Name: "c", + Image: "gcr.io/google_containers/busybox:1.24", + Command: []string{"sleep", "300"}, + }, + }, + }, + }, + }, + }, + }, + } +} + var _ = SIGDescribe("Garbage collector", func() { f := framework.NewDefaultFramework("gc") It("should delete pods created by rc when not orphaning", func() { @@ -259,7 +341,7 @@ var _ = SIGDescribe("Garbage collector", func() { By("wait for all pods to be garbage collected") // wait for the RCs and Pods to reach the expected numbers. if err := wait.Poll(5*time.Second, 60*time.Second, func() (bool, error) { - return verifyRemainingObjects(f, clientSet, 0, 0) + return verifyRemainingReplicationControllersPods(f, clientSet, 0, 0) }); err != nil { framework.Failf("failed to wait for all pods to be deleted: %v", err) remainingPods, err := podClient.List(metav1.ListOptions{}) @@ -413,8 +495,8 @@ var _ = SIGDescribe("Garbage collector", func() { return len(rsList.Items) > 0, nil }) - if err == wait.ErrWaitTimeout { - err = fmt.Errorf("Failed to wait for the Deployment to create some ReplicaSet: %v", err) + if err != nil { + framework.Failf("Failed to wait for the Deployment to create some ReplicaSet: %v", err) } By("delete the deployment") @@ -464,8 +546,8 @@ var _ = SIGDescribe("Garbage collector", func() { return len(rsList.Items) > 0, nil }) - if err == wait.ErrWaitTimeout { - err = fmt.Errorf("Failed to wait for the Deployment to create some ReplicaSet: %v", err) + if err != nil { + framework.Failf("Failed to wait for the Deployment to create some ReplicaSet: %v", err) } By("delete the deployment") @@ -498,7 +580,7 @@ var _ = SIGDescribe("Garbage collector", func() { framework.Failf("Failed to list ReplicaSet %v", err) } for _, replicaSet := range rs.Items { - if controller.GetControllerOf(&replicaSet.ObjectMeta) != nil { + if metav1.GetControllerOf(&replicaSet.ObjectMeta) != nil { framework.Failf("Found ReplicaSet with non nil ownerRef %v", replicaSet) } } @@ -852,4 +934,39 @@ var _ = SIGDescribe("Garbage collector", func() { } } }) + + It("should delete jobs and pods created by cronjob", func() { + framework.SkipIfMissingResource(f.ClientPool, CronJobGroupVersionResource, f.Namespace.Name) + + By("Create the cronjob") + cronJob := newCronJob("simple", "*/1 * * * ?") + cronJob, err := f.ClientSet.BatchV2alpha1().CronJobs(f.Namespace.Name).Create(cronJob) + Expect(err).NotTo(HaveOccurred()) + + By("Wait for the CronJob to create new Job") + err = wait.PollImmediate(500*time.Millisecond, 2*time.Minute, func() (bool, error) { + jobs, err := f.ClientSet.Batch().Jobs(f.Namespace.Name).List(metav1.ListOptions{}) + if err != nil { + return false, fmt.Errorf("Failed to list jobs: %v", err) + } + return len(jobs.Items) > 0, nil + }) + if err != nil { + framework.Failf("Failed to wait for the CronJob to create some Jobs: %v", err) + } + + By("Delete the cronjob") + if err := f.ClientSet.BatchV2alpha1().CronJobs(f.Namespace.Name).Delete(cronJob.Name, getBackgroundOptions()); err != nil { + framework.Failf("Failed to delete the CronJob: %v", err) + } + By("Verify if cronjob does not leave jobs nor pods behind") + err = wait.PollImmediate(500*time.Millisecond, 1*time.Minute, func() (bool, error) { + return verifyRemainingCronJobsJobsPods(f, f.ClientSet, 0, 0, 0) + }) + if err != nil { + framework.Failf("Failed to wait for all jobs and pods to be deleted: %v", err) + } + + gatherMetrics(f) + }) }) diff --git a/test/e2e/apps/BUILD b/test/e2e/apps/BUILD index 8cef02c5d80..7bdc5073c68 100644 --- a/test/e2e/apps/BUILD +++ b/test/e2e/apps/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -22,7 +20,6 @@ go_library( "statefulset.go", "types.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1/pod:go_default_library", diff --git a/test/e2e/apps/daemon_set.go b/test/e2e/apps/daemon_set.go index f2825ecf895..17a00686f6b 100644 --- a/test/e2e/apps/daemon_set.go +++ b/test/e2e/apps/daemon_set.go @@ -630,7 +630,7 @@ func checkDaemonPodOnNodes(f *framework.Framework, ds *extensions.DaemonSet, nod nodesToPodCount := make(map[string]int) for _, pod := range pods { - if controllerRef := controller.GetControllerOf(&pod); controllerRef == nil || controllerRef.UID != ds.UID { + if !metav1.IsControlledBy(&pod, ds) { continue } if pod.DeletionTimestamp != nil { @@ -726,7 +726,7 @@ func checkDaemonPodsImageAndAvailability(c clientset.Interface, ds *extensions.D unavailablePods := 0 allImagesUpdated := true for _, pod := range pods { - if controllerRef := controller.GetControllerOf(&pod); controllerRef == nil || controllerRef.UID != ds.UID { + if !metav1.IsControlledBy(&pod, ds) { continue } podImage := pod.Spec.Containers[0].Image @@ -779,7 +779,7 @@ func checkDaemonSetPodsOrphaned(c clientset.Interface, ns string, label map[stri pods := listDaemonPods(c, ns, label) for _, pod := range pods.Items { // This pod is orphaned only when controller ref is cleared - if controllerRef := controller.GetControllerOf(&pod); controllerRef != nil { + if controllerRef := metav1.GetControllerOf(&pod); controllerRef != nil { return false, nil } } @@ -792,7 +792,7 @@ func checkDaemonSetHistoryOrphaned(c clientset.Interface, ns string, label map[s histories := listDaemonHistories(c, ns, label) for _, history := range histories.Items { // This history is orphaned only when controller ref is cleared - if controllerRef := controller.GetControllerOf(&history); controllerRef != nil { + if controllerRef := metav1.GetControllerOf(&history); controllerRef != nil { return false, nil } } @@ -805,7 +805,7 @@ func checkDaemonSetPodsAdopted(c clientset.Interface, ns string, dsUID types.UID pods := listDaemonPods(c, ns, label) for _, pod := range pods.Items { // This pod is adopted only when its controller ref is update - if controllerRef := controller.GetControllerOf(&pod); controllerRef == nil || controllerRef.UID != dsUID { + if controllerRef := metav1.GetControllerOf(&pod); controllerRef == nil || controllerRef.UID != dsUID { return false, nil } } @@ -818,7 +818,7 @@ func checkDaemonSetHistoryAdopted(c clientset.Interface, ns string, dsUID types. histories := listDaemonHistories(c, ns, label) for _, history := range histories.Items { // This history is adopted only when its controller ref is update - if controllerRef := controller.GetControllerOf(&history); controllerRef == nil || controllerRef.UID != dsUID { + if controllerRef := metav1.GetControllerOf(&history); controllerRef == nil || controllerRef.UID != dsUID { return false, nil } } diff --git a/test/e2e/apps/deployment.go b/test/e2e/apps/deployment.go index 96815ebb8e6..7ba00e19978 100644 --- a/test/e2e/apps/deployment.go +++ b/test/e2e/apps/deployment.go @@ -38,7 +38,6 @@ import ( extensionsclient "k8s.io/client-go/kubernetes/typed/extensions/v1beta1" extensionsinternal "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/controller" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" "k8s.io/kubernetes/pkg/kubectl" utilpointer "k8s.io/kubernetes/pkg/util/pointer" @@ -1380,7 +1379,7 @@ func checkDeploymentReplicaSetsControllerRef(c clientset.Interface, ns string, u rsList := listDeploymentReplicaSets(c, ns, label) for _, rs := range rsList.Items { // This rs is adopted only when its controller ref is update - if controllerRef := controller.GetControllerOf(&rs); controllerRef == nil || controllerRef.UID != uid { + if controllerRef := metav1.GetControllerOf(&rs); controllerRef == nil || controllerRef.UID != uid { return fmt.Errorf("ReplicaSet %s has unexpected controllerRef %v", rs.Name, controllerRef) } } @@ -1392,7 +1391,7 @@ func waitDeploymentReplicaSetsOrphaned(c clientset.Interface, ns string, label m rsList := listDeploymentReplicaSets(c, ns, label) for _, rs := range rsList.Items { // This rs is orphaned only when controller ref is cleared - if controllerRef := controller.GetControllerOf(&rs); controllerRef != nil { + if controllerRef := metav1.GetControllerOf(&rs); controllerRef != nil { return false, nil } } diff --git a/test/e2e/apps/job.go b/test/e2e/apps/job.go index a60b0f34b20..7180f9a7ad6 100644 --- a/test/e2e/apps/job.go +++ b/test/e2e/apps/job.go @@ -24,7 +24,6 @@ import ( "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" batchinternal "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/test/e2e/framework" @@ -135,7 +134,7 @@ var _ = SIGDescribe("Job", func() { By("Checking that the Job readopts the Pod") Expect(framework.WaitForPodCondition(f.ClientSet, pod.Namespace, pod.Name, "adopted", framework.JobTimeout, func(pod *v1.Pod) (bool, error) { - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { return false, nil } @@ -154,7 +153,7 @@ var _ = SIGDescribe("Job", func() { By("Checking that the Job releases the Pod") Expect(framework.WaitForPodCondition(f.ClientSet, pod.Namespace, pod.Name, "released", framework.JobTimeout, func(pod *v1.Pod) (bool, error) { - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef != nil { return false, nil } diff --git a/test/e2e/apps/statefulset.go b/test/e2e/apps/statefulset.go index bced0081214..2b7bd2c755f 100644 --- a/test/e2e/apps/statefulset.go +++ b/test/e2e/apps/statefulset.go @@ -31,7 +31,6 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" clientset "k8s.io/client-go/kubernetes" - "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/test/e2e/framework" ) @@ -145,7 +144,7 @@ var _ = SIGDescribe("StatefulSet", func() { By("Checking that stateful set pods are created with ControllerRef") pod := pods.Items[0] - controllerRef := controller.GetControllerOf(&pod) + controllerRef := metav1.GetControllerOf(&pod) Expect(controllerRef).ToNot(BeNil()) Expect(controllerRef.Kind).To(Equal(ss.Kind)) Expect(controllerRef.Name).To(Equal(ss.Name)) @@ -159,7 +158,7 @@ var _ = SIGDescribe("StatefulSet", func() { By("Checking that the stateful set readopts the pod") Expect(framework.WaitForPodCondition(c, pod.Namespace, pod.Name, "adopted", framework.StatefulSetTimeout, func(pod *v1.Pod) (bool, error) { - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { return false, nil } @@ -179,7 +178,7 @@ var _ = SIGDescribe("StatefulSet", func() { By("Checking that the stateful set releases the pod") Expect(framework.WaitForPodCondition(c, pod.Namespace, pod.Name, "released", framework.StatefulSetTimeout, func(pod *v1.Pod) (bool, error) { - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef != nil { return false, nil } @@ -196,7 +195,7 @@ var _ = SIGDescribe("StatefulSet", func() { By("Checking that the stateful set readopts the pod") Expect(framework.WaitForPodCondition(c, pod.Namespace, pod.Name, "adopted", framework.StatefulSetTimeout, func(pod *v1.Pod) (bool, error) { - controllerRef := controller.GetControllerOf(pod) + controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { return false, nil } @@ -843,6 +842,43 @@ var _ = SIGDescribe("StatefulSet", func() { return nil }, framework.StatefulPodTimeout, 2*time.Second).Should(BeNil()) }) + + It("should have a working scale subresource", func() { + By("Creating statefulset " + ssName + " in namespace " + ns) + ss := framework.NewStatefulSet(ssName, ns, headlessSvcName, 1, nil, nil, labels) + sst := framework.NewStatefulSetTester(c) + sst.SetHttpProbe(ss) + ss, err := c.AppsV1beta1().StatefulSets(ns).Create(ss) + Expect(err).NotTo(HaveOccurred()) + sst.WaitForRunningAndReady(*ss.Spec.Replicas, ss) + ss = sst.WaitForStatus(ss) + + By("getting scale subresource") + scale := framework.NewStatefulSetScale(ss) + scaleResult := &apps.Scale{} + err = c.AppsV1beta1().RESTClient().Get().AbsPath("/apis/apps/v1beta1").Namespace(ns).Resource("statefulsets").Name(ssName).SubResource("scale").Do().Into(scale) + if err != nil { + framework.Failf("Failed to get scale subresource: %v", err) + } + Expect(scale.Spec.Replicas).To(Equal(int32(1))) + Expect(scale.Status.Replicas).To(Equal(int32(1))) + + By("updating a scale subresource") + scale.ResourceVersion = "" //unconditionally update to 2 replicas + scale.Spec.Replicas = 2 + err = c.AppsV1beta1().RESTClient().Put().AbsPath("/apis/apps/v1beta1").Namespace(ns).Resource("statefulsets").Name(ssName).SubResource("scale").Body(scale).Do().Into(scaleResult) + if err != nil { + framework.Failf("Failed to put scale subresource: %v", err) + } + Expect(scaleResult.Spec.Replicas).To(Equal(int32(2))) + + By("verifying the statefulset Spec.Replicas was modified") + ss, err = c.AppsV1beta1().StatefulSets(ns).Get(ssName, metav1.GetOptions{}) + if err != nil { + framework.Failf("Failed to get statefulset resource: %v", err) + } + Expect(*(ss.Spec.Replicas)).To(Equal(int32(2))) + }) }) framework.KubeDescribe("Deploy clustered applications [Feature:StatefulSet] [Slow]", func() { diff --git a/test/e2e/apps/types.go b/test/e2e/apps/types.go index 6e54767e6bb..2f875e947ab 100644 --- a/test/e2e/apps/types.go +++ b/test/e2e/apps/types.go @@ -32,6 +32,5 @@ const ( ) var ( - CronJobGroupVersionResource = schema.GroupVersionResource{Group: batchv2alpha1.GroupName, Version: "v2alpha1", Resource: "cronjobs"} - ScheduledJobGroupVersionResource = schema.GroupVersionResource{Group: batchv2alpha1.GroupName, Version: "v2alpha1", Resource: "scheduledjobs"} + CronJobGroupVersionResource = schema.GroupVersionResource{Group: batchv2alpha1.GroupName, Version: "v2alpha1", Resource: "cronjobs"} ) diff --git a/test/e2e/autoscaling/BUILD b/test/e2e/autoscaling/BUILD index 2f13fcb1a85..a22b273c4a6 100644 --- a/test/e2e/autoscaling/BUILD +++ b/test/e2e/autoscaling/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,12 +9,12 @@ go_library( name = "go_default_library", srcs = [ "autoscaling_timer.go", + "cluster_autoscaler_scalability.go", "cluster_size_autoscaling.go", "dns_autoscaling.go", "framework.go", "horizontal_pod_autoscaling.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//test/e2e/common:go_default_library", @@ -33,9 +31,11 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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", "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", diff --git a/test/e2e/autoscaling/cluster_autoscaler_scalability.go b/test/e2e/autoscaling/cluster_autoscaler_scalability.go new file mode 100644 index 00000000000..d3577c2ca85 --- /dev/null +++ b/test/e2e/autoscaling/cluster_autoscaler_scalability.go @@ -0,0 +1,458 @@ +/* +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 autoscaling + +import ( + "encoding/json" + "fmt" + "strings" + "time" + + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/strategicpatch" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/kubernetes/test/e2e/framework" + testutils "k8s.io/kubernetes/test/utils" + + "github.com/golang/glog" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +const ( + largeResizeTimeout = 10 * time.Minute + largeScaleUpTimeout = 10 * time.Minute + largeScaleDownTimeout = 20 * time.Minute + minute = 1 * time.Minute + + maxNodes = 1000 +) + +type clusterPredicates struct { + nodes int +} + +type scaleUpTestConfig struct { + initialNodes int + initialPods int + extraPods *testutils.RCConfig + expectedResult *clusterPredicates +} + +var _ = framework.KubeDescribe("Cluster size autoscaler scalability [Slow]", func() { + f := framework.NewDefaultFramework("autoscaling") + var c clientset.Interface + var nodeCount int + var coresPerNode int + var memCapacityMb int + var originalSizes map[string]int + var sum int + + BeforeEach(func() { + framework.SkipUnlessProviderIs("gce", "gke", "kubemark") + + c = f.ClientSet + if originalSizes == nil { + originalSizes = make(map[string]int) + sum = 0 + for _, mig := range strings.Split(framework.TestContext.CloudConfig.NodeInstanceGroup, ",") { + size, err := framework.GroupSize(mig) + framework.ExpectNoError(err) + By(fmt.Sprintf("Initial size of %s: %d", mig, size)) + originalSizes[mig] = size + sum += size + } + } + + framework.ExpectNoError(framework.WaitForClusterSize(c, sum, scaleUpTimeout)) + + nodes := framework.GetReadySchedulableNodesOrDie(f.ClientSet) + nodeCount = len(nodes.Items) + Expect(nodeCount).NotTo(BeZero()) + cpu := nodes.Items[0].Status.Capacity[v1.ResourceCPU] + mem := nodes.Items[0].Status.Capacity[v1.ResourceMemory] + coresPerNode = int((&cpu).MilliValue() / 1000) + memCapacityMb = int((&mem).Value() / 1024 / 1024) + + Expect(nodeCount).Should(Equal(sum)) + + if framework.ProviderIs("gke") { + val, err := isAutoscalerEnabled(3) + framework.ExpectNoError(err) + if !val { + err = enableAutoscaler("default-pool", 3, 5) + framework.ExpectNoError(err) + } + } + }) + + AfterEach(func() { + By(fmt.Sprintf("Restoring initial size of the cluster")) + setMigSizes(originalSizes) + framework.ExpectNoError(framework.WaitForClusterSize(c, nodeCount, scaleDownTimeout)) + nodes, err := c.Core().Nodes().List(metav1.ListOptions{}) + framework.ExpectNoError(err) + s := time.Now() + makeSchedulableLoop: + for start := time.Now(); time.Since(start) < makeSchedulableTimeout; time.Sleep(makeSchedulableDelay) { + for _, n := range nodes.Items { + err = makeNodeSchedulable(c, &n, true) + switch err.(type) { + case CriticalAddonsOnlyError: + continue makeSchedulableLoop + default: + framework.ExpectNoError(err) + } + } + break + } + glog.Infof("Made nodes schedulable again in %v", time.Now().Sub(s).String()) + }) + + It("should scale up at all [Feature:ClusterAutoscalerScalability1]", func() { + perNodeReservation := int(float64(memCapacityMb) * 0.95) + replicasPerNode := 10 + + additionalNodes := maxNodes - nodeCount + replicas := additionalNodes * replicasPerNode + additionalReservation := additionalNodes * perNodeReservation + + // saturate cluster + reservationCleanup := ReserveMemory(f, "some-pod", nodeCount*2, nodeCount*perNodeReservation, true, scaleUpTimeout) + defer reservationCleanup() + framework.ExpectNoError(waitForAllCaPodsReadyInNamespace(f, c)) + + // configure pending pods & expected scale up + rcConfig := reserveMemoryRCConfig(f, "extra-pod-1", replicas, additionalReservation, largeScaleUpTimeout) + expectedResult := createClusterPredicates(nodeCount + additionalNodes) + config := createScaleUpTestConfig(nodeCount, nodeCount, rcConfig, expectedResult) + + // run test + testCleanup := simpleScaleUpTest(f, config) + defer testCleanup() + }) + + It("should scale up twice [Feature:ClusterAutoscalerScalability2]", func() { + perNodeReservation := int(float64(memCapacityMb) * 0.95) + replicasPerNode := 10 + additionalNodes1 := int(0.7 * maxNodes) + additionalNodes2 := int(0.25 * maxNodes) + + replicas1 := additionalNodes1 * replicasPerNode + replicas2 := additionalNodes2 * replicasPerNode + + glog.Infof("cores per node: %v", coresPerNode) + + // saturate cluster + reservationCleanup := ReserveMemory(f, "some-pod", nodeCount, nodeCount*perNodeReservation, true, scaleUpTimeout) + defer reservationCleanup() + framework.ExpectNoError(waitForAllCaPodsReadyInNamespace(f, c)) + + glog.Infof("Reserved successfully") + + // configure pending pods & expected scale up #1 + rcConfig := reserveMemoryRCConfig(f, "extra-pod-1", replicas1, additionalNodes1*perNodeReservation, largeScaleUpTimeout) + expectedResult := createClusterPredicates(nodeCount + additionalNodes1) + config := createScaleUpTestConfig(nodeCount, nodeCount, rcConfig, expectedResult) + + epsilon := 0.05 + + // run test #1 + testCleanup1 := simpleScaleUpTestWithEpsilon(f, config, epsilon) + defer testCleanup1() + + glog.Infof("Scaled up once") + + // configure pending pods & expected scale up #2 + rcConfig2 := reserveMemoryRCConfig(f, "extra-pod-2", replicas2, additionalNodes2*perNodeReservation, largeScaleUpTimeout) + expectedResult2 := createClusterPredicates(nodeCount + additionalNodes1 + additionalNodes2) + config2 := createScaleUpTestConfig(nodeCount+additionalNodes1, nodeCount+additionalNodes2, rcConfig2, expectedResult2) + + // run test #2 + testCleanup2 := simpleScaleUpTestWithEpsilon(f, config2, epsilon) + defer testCleanup2() + + glog.Infof("Scaled up twice") + }) + + It("should scale down empty nodes [Feature:ClusterAutoscalerScalability3]", func() { + perNodeReservation := int(float64(memCapacityMb) * 0.7) + replicas := int(float64(maxNodes) * 0.7) + totalNodes := maxNodes + + // resize cluster to totalNodes + newSizes := map[string]int{ + anyKey(originalSizes): totalNodes, + } + setMigSizes(newSizes) + framework.ExpectNoError(framework.WaitForClusterSize(f.ClientSet, totalNodes, largeResizeTimeout)) + + // run replicas + rcConfig := reserveMemoryRCConfig(f, "some-pod", replicas, replicas*perNodeReservation, largeScaleUpTimeout) + expectedResult := createClusterPredicates(totalNodes) + config := createScaleUpTestConfig(totalNodes, totalNodes, rcConfig, expectedResult) + testCleanup := simpleScaleUpTestWithEpsilon(f, config, 0.1) + defer testCleanup() + + // check if empty nodes are scaled down + framework.ExpectNoError(WaitForClusterSizeFunc(f.ClientSet, + func(size int) bool { + return size <= replicas+3 // leaving space for non-evictable kube-system pods + }, scaleDownTimeout)) + }) + + It("should scale down underutilized nodes [Feature:ClusterAutoscalerScalability4]", func() { + underutilizedReservation := int64(float64(memCapacityMb) * 0.01) + fullReservation := int64(float64(memCapacityMb) * 0.8) + perNodeReplicas := 10 + totalNodes := maxNodes + + // resize cluster to totalNodes + newSizes := map[string]int{ + anyKey(originalSizes): totalNodes, + } + setMigSizes(newSizes) + framework.ExpectNoError(framework.WaitForClusterSize(f.ClientSet, totalNodes, largeResizeTimeout)) + + // annotate all nodes with no-scale-down + ScaleDownDisabledKey := "cluster-autoscaler.kubernetes.io/scale-down-disabled" + + nodes, err := f.ClientSet.Core().Nodes().List(metav1.ListOptions{ + FieldSelector: fields.Set{ + "spec.unschedulable": "false", + }.AsSelector().String(), + }) + + framework.ExpectNoError(addAnnotation(f, nodes.Items, ScaleDownDisabledKey, "true")) + + // distribute pods (using taints) + divider := int(float64(len(nodes.Items)) * 0.7) + + fullNodes := nodes.Items[:divider] + underutilizedNodes := nodes.Items[divider:] + + framework.ExpectNoError(makeUnschedulable(f, underutilizedNodes)) + + testId2 := "full" + labels2 := map[string]string{"test_id": testId2} + cleanup2, err := runReplicatedPodOnEachNodeWithCleanup(f, fullNodes, f.Namespace.Name, 1, "filling-pod", labels2, fullReservation) + defer cleanup2() + framework.ExpectNoError(err) + + framework.ExpectNoError(makeUnschedulable(f, fullNodes)) + + testId := "underutilized" + labels := map[string]string{"test_id": testId} + cleanup, err := runReplicatedPodOnEachNodeWithCleanup(f, underutilizedNodes, f.Namespace.Name, perNodeReplicas, "underutilizing-pod", labels, underutilizedReservation) + defer cleanup() + framework.ExpectNoError(err) + + framework.ExpectNoError(makeSchedulable(f, nodes.Items)) + framework.ExpectNoError(addAnnotation(f, nodes.Items, ScaleDownDisabledKey, "false")) + + // wait for scale down + expectedSize := int(float64(totalNodes) * 0.85) + nodesToScaleDownCount := totalNodes - expectedSize + timeout := time.Duration(nodesToScaleDownCount)*time.Minute + scaleDownTimeout + framework.ExpectNoError(WaitForClusterSizeFunc(f.ClientSet, func(size int) bool { + return size <= expectedSize + }, timeout)) + }) + + It("shouldn't scale down with underutilized nodes due to host port conflicts [Feature:ClusterAutoscalerScalability5]", func() { + fullReservation := int(float64(memCapacityMb) * 0.9) + hostPortPodReservation := int(float64(memCapacityMb) * 0.3) + totalNodes := maxNodes + reservedPort := 4321 + + // resize cluster to totalNodes + newSizes := map[string]int{ + anyKey(originalSizes): totalNodes, + } + setMigSizes(newSizes) + framework.ExpectNoError(framework.WaitForClusterSize(f.ClientSet, totalNodes, largeResizeTimeout)) + divider := int(float64(totalNodes) * 0.7) + fullNodesCount := divider + underutilizedNodesCount := totalNodes - fullNodesCount + + By("Reserving full nodes") + // run RC1 w/o host port + cleanup := ReserveMemory(f, "filling-pod", fullNodesCount, fullNodesCount*fullReservation, true, largeScaleUpTimeout*2) + defer cleanup() + + By("Reserving host ports on remaining nodes") + // run RC2 w/ host port + cleanup2 := createHostPortPodsWithMemory(f, "underutilizing-host-port-pod", underutilizedNodesCount, reservedPort, underutilizedNodesCount*hostPortPodReservation, largeScaleUpTimeout) + defer cleanup2() + + waitForAllCaPodsReadyInNamespace(f, c) + // wait and check scale down doesn't occur + By(fmt.Sprintf("Sleeping %v minutes...", scaleDownTimeout.Minutes())) + time.Sleep(scaleDownTimeout) + + By("Checking if the number of nodes is as expected") + nodes := framework.GetReadySchedulableNodesOrDie(f.ClientSet) + glog.Infof("Nodes: %v, expected: %v", len(nodes.Items), totalNodes) + Expect(len(nodes.Items)).Should(Equal(totalNodes)) + }) + +}) + +func makeUnschedulable(f *framework.Framework, nodes []v1.Node) error { + for _, node := range nodes { + err := makeNodeUnschedulable(f.ClientSet, &node) + if err != nil { + return err + } + } + return nil +} + +func makeSchedulable(f *framework.Framework, nodes []v1.Node) error { + for _, node := range nodes { + err := makeNodeSchedulable(f.ClientSet, &node, false) + if err != nil { + return err + } + } + return nil +} + +func anyKey(input map[string]int) string { + for k := range input { + return k + } + return "" +} + +func simpleScaleUpTestWithEpsilon(f *framework.Framework, config *scaleUpTestConfig, epsilon float64) func() error { + // resize cluster to start size + // run rc based on config + By(fmt.Sprintf("Running RC %v from config", config.extraPods.Name)) + start := time.Now() + framework.ExpectNoError(framework.RunRC(*config.extraPods)) + // check results + if epsilon > 0 && epsilon < 1 { + // Tolerate some number of nodes not to be created. + minExpectedNodeCount := int(float64(config.expectedResult.nodes) - epsilon*float64(config.expectedResult.nodes)) + framework.ExpectNoError(WaitForClusterSizeFunc(f.ClientSet, + func(size int) bool { return size >= minExpectedNodeCount }, scaleUpTimeout)) + } else { + framework.ExpectNoError(framework.WaitForClusterSize(f.ClientSet, config.expectedResult.nodes, scaleUpTimeout)) + } + glog.Infof("cluster is increased") + if epsilon > 0 && epsilon < 0 { + framework.ExpectNoError(waitForCaPodsReadyInNamespace(f, f.ClientSet, int(epsilon*float64(config.extraPods.Replicas)+1))) + } else { + framework.ExpectNoError(waitForAllCaPodsReadyInNamespace(f, f.ClientSet)) + } + timeTrack(start, fmt.Sprintf("Scale up to %v", config.expectedResult.nodes)) + return func() error { + return framework.DeleteRCAndPods(f.ClientSet, f.InternalClientset, f.Namespace.Name, config.extraPods.Name) + } +} + +func simpleScaleUpTest(f *framework.Framework, config *scaleUpTestConfig) func() error { + return simpleScaleUpTestWithEpsilon(f, config, 0) +} + +func reserveMemoryRCConfig(f *framework.Framework, id string, replicas, megabytes int, timeout time.Duration) *testutils.RCConfig { + return &testutils.RCConfig{ + Client: f.ClientSet, + InternalClient: f.InternalClientset, + Name: id, + Namespace: f.Namespace.Name, + Timeout: timeout, + Image: framework.GetPauseImageName(f.ClientSet), + Replicas: replicas, + MemRequest: int64(1024 * 1024 * megabytes / replicas), + } +} + +func createScaleUpTestConfig(nodes, pods int, extraPods *testutils.RCConfig, expectedResult *clusterPredicates) *scaleUpTestConfig { + return &scaleUpTestConfig{ + initialNodes: nodes, + initialPods: pods, + extraPods: extraPods, + expectedResult: expectedResult, + } +} + +func createClusterPredicates(nodes int) *clusterPredicates { + return &clusterPredicates{ + nodes: nodes, + } +} + +func addAnnotation(f *framework.Framework, nodes []v1.Node, key, value string) error { + for _, node := range nodes { + oldData, err := json.Marshal(node) + if err != nil { + return err + } + + if node.Annotations == nil { + node.Annotations = make(map[string]string) + } + node.Annotations[key] = value + + newData, err := json.Marshal(node) + if err != nil { + return err + } + + patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, v1.Node{}) + if err != nil { + return err + } + + _, err = f.ClientSet.Core().Nodes().Patch(string(node.Name), types.StrategicMergePatchType, patchBytes) + if err != nil { + return err + } + } + return nil +} + +func createHostPortPodsWithMemory(f *framework.Framework, id string, replicas, port, megabytes int, timeout time.Duration) func() error { + By(fmt.Sprintf("Running RC which reserves host port and memory")) + request := int64(1024 * 1024 * megabytes / replicas) + config := &testutils.RCConfig{ + Client: f.ClientSet, + InternalClient: f.InternalClientset, + Name: id, + Namespace: f.Namespace.Name, + Timeout: timeout, + Image: framework.GetPauseImageName(f.ClientSet), + Replicas: replicas, + HostPorts: map[string]int{"port1": port}, + MemRequest: request, + } + err := framework.RunRC(*config) + framework.ExpectNoError(err) + return func() error { + return framework.DeleteRCAndPods(f.ClientSet, f.InternalClientset, f.Namespace.Name, id) + } +} + +func timeTrack(start time.Time, name string) { + elapsed := time.Since(start) + glog.Infof("%s took %s", name, elapsed) +} diff --git a/test/e2e/autoscaling/cluster_size_autoscaling.go b/test/e2e/autoscaling/cluster_size_autoscaling.go index d2b75fc828d..463d5f1e7c9 100644 --- a/test/e2e/autoscaling/cluster_size_autoscaling.go +++ b/test/e2e/autoscaling/cluster_size_autoscaling.go @@ -199,7 +199,7 @@ var _ = SIGDescribe("Cluster size autoscaling [Slow]", func() { framework.ExpectNoError(err) unmanagedNodes := nodeCount - status.ready - By("Schedule more pods than can fit and wait for claster to scale-up") + By("Schedule more pods than can fit and wait for cluster to scale-up") ReserveMemory(f, "memory-reservation", 100, nodeCount*memCapacityMb, false, 1*time.Second) defer framework.DeleteRCAndPods(f.ClientSet, f.InternalClientset, f.Namespace.Name, "memory-reservation") @@ -719,7 +719,7 @@ func runDrainTest(f *framework.Framework, migSizes map[string]int, namespace str numPods := len(nodes.Items) * podsPerNode testId := string(uuid.NewUUID()) // So that we can label and find pods labelMap := map[string]string{"test_id": testId} - framework.ExpectNoError(runReplicatedPodOnEachNode(f, nodes.Items, namespace, podsPerNode, "reschedulable-pods", labelMap)) + framework.ExpectNoError(runReplicatedPodOnEachNode(f, nodes.Items, namespace, podsPerNode, "reschedulable-pods", labelMap, 0)) defer framework.DeleteRCAndPods(f.ClientSet, f.InternalClientset, namespace, "reschedulable-pods") @@ -907,7 +907,7 @@ func doPut(url, content string) (string, error) { return strBody, nil } -func ReserveMemory(f *framework.Framework, id string, replicas, megabytes int, expectRunning bool, timeout time.Duration) { +func ReserveMemory(f *framework.Framework, id string, replicas, megabytes int, expectRunning bool, timeout time.Duration) func() error { By(fmt.Sprintf("Running RC which reserves %v MB of memory", megabytes)) request := int64(1024 * 1024 * megabytes / replicas) config := &testutils.RCConfig{ @@ -929,9 +929,12 @@ func ReserveMemory(f *framework.Framework, id string, replicas, megabytes int, e if expectRunning { framework.ExpectNoError(err) } - return + return func() error { + return framework.DeleteRCAndPods(f.ClientSet, f.InternalClientset, f.Namespace.Name, id) + } } framework.Failf("Failed to reserve memory within timeout") + return nil } // WaitForClusterSize waits until the cluster size matches the given function. @@ -961,7 +964,7 @@ func WaitForClusterSizeFuncWithUnready(c clientset.Interface, sizeFunc func(int) glog.Infof("Cluster has reached the desired size") return nil } - glog.Infof("Waiting for cluster, current size %d, not ready nodes %d", numNodes, numNodes-numReady) + glog.Infof("Waiting for cluster with func, current size %d, not ready nodes %d", numNodes, numNodes-numReady) } return fmt.Errorf("timeout waiting %v for appropriate cluster size", timeout) } @@ -1201,7 +1204,7 @@ func buildAntiAffinity(labels map[string]string) *v1.Affinity { // 3. for each node: // 3a. enable scheduling on that node // 3b. increase number of replicas in RC by podsPerNode -func runReplicatedPodOnEachNode(f *framework.Framework, nodes []v1.Node, namespace string, podsPerNode int, id string, labels map[string]string) error { +func runReplicatedPodOnEachNode(f *framework.Framework, nodes []v1.Node, namespace string, podsPerNode int, id string, labels map[string]string, memRequest int64) error { By("Run a pod on each node") for _, node := range nodes { err := makeNodeUnschedulable(f.ClientSet, &node) @@ -1223,6 +1226,7 @@ func runReplicatedPodOnEachNode(f *framework.Framework, nodes []v1.Node, namespa Image: framework.GetPauseImageName(f.ClientSet), Replicas: 0, Labels: labels, + MemRequest: memRequest, } err := framework.RunRC(*config) if err != nil { @@ -1274,6 +1278,14 @@ func runReplicatedPodOnEachNode(f *framework.Framework, nodes []v1.Node, namespa return nil } +// wrap runReplicatedPodOnEachNode to return cleanup +func runReplicatedPodOnEachNodeWithCleanup(f *framework.Framework, nodes []v1.Node, namespace string, podsPerNode int, id string, labels map[string]string, memRequest int64) (func(), error) { + err := runReplicatedPodOnEachNode(f, nodes, namespace, podsPerNode, id, labels, memRequest) + return func() { + framework.DeleteRCAndPods(f.ClientSet, f.InternalClientset, namespace, id) + }, err +} + // Increase cluster size by newNodesForScaledownTests to create some unused nodes // that can be later removed by cluster autoscaler. func manuallyIncreaseClusterSize(f *framework.Framework, originalSizes map[string]int) int { diff --git a/test/e2e/chaosmonkey/BUILD b/test/e2e/chaosmonkey/BUILD index be300605836..f0b34e6d543 100644 --- a/test/e2e/chaosmonkey/BUILD +++ b/test/e2e/chaosmonkey/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["chaosmonkey.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/onsi/ginkgo:go_default_library"], ) @@ -19,7 +16,6 @@ go_test( name = "go_default_test", srcs = ["chaosmonkey_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/test/e2e/common/BUILD b/test/e2e/common/BUILD index 296eb8f140a..58d5b24aa60 100644 --- a/test/e2e/common/BUILD +++ b/test/e2e/common/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -32,7 +30,6 @@ go_library( "util.go", "volumes.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", diff --git a/test/e2e/e2e.go b/test/e2e/e2e.go index 6400fc544ff..dd20e04cf98 100644 --- a/test/e2e/e2e.go +++ b/test/e2e/e2e.go @@ -36,12 +36,12 @@ import ( clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/pkg/cloudprovider/providers/azure" gcecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/gce" - "k8s.io/kubernetes/pkg/util/logs" + "k8s.io/kubernetes/pkg/kubectl/util/logs" commontest "k8s.io/kubernetes/test/e2e/common" "k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/framework/ginkgowrapper" + "k8s.io/kubernetes/test/e2e/framework/metrics" "k8s.io/kubernetes/test/e2e/manifest" - "k8s.io/kubernetes/test/e2e/metrics" federationtest "k8s.io/kubernetes/test/e2e_federation" testutils "k8s.io/kubernetes/test/utils" ) @@ -77,14 +77,35 @@ func setupProviderConfig() error { if !framework.TestContext.CloudConfig.MultiZone { managedZones = []string{zone} } - cloudConfig.Provider, err = gcecloud.CreateGCECloud(framework.TestContext.CloudConfig.ApiEndpoint, - framework.TestContext.CloudConfig.ProjectID, - region, zone, managedZones, "" /* networkUrl */, "" /* subnetworkUrl */, nil, /* nodeTags */ - "" /* nodeInstancePerfix */, nil /* tokenSource */, false /* useMetadataServer */) + + gceCloud, err := gcecloud.CreateGCECloud(&gcecloud.CloudConfig{ + ApiEndpoint: framework.TestContext.CloudConfig.ApiEndpoint, + ProjectID: framework.TestContext.CloudConfig.ProjectID, + Region: region, + Zone: zone, + ManagedZones: managedZones, + NetworkURL: "", + SubnetworkURL: "", + NodeTags: nil, + NodeInstancePrefix: "", + TokenSource: nil, + UseMetadataServer: false}) + if err != nil { return fmt.Errorf("Error building GCE/GKE provider: %v", err) } + cloudConfig.Provider = gceCloud + + if cloudConfig.Zone == "" && framework.TestContext.CloudConfig.MultiZone { + zones, err := gceCloud.GetAllZones() + if err != nil { + return err + } + + cloudConfig.Zone, _ = zones.PopAny() + } + case "aws": if cloudConfig.Zone == "" { return fmt.Errorf("gce-zone must be specified for AWS") @@ -287,8 +308,8 @@ func gatherTestSuiteMetrics() error { return fmt.Errorf("error loading client: %v", err) } - // Grab metrics for apiserver, scheduler, controller-manager, kubelet (for non-kubemark case). - grabber, err := metrics.NewMetricsGrabber(c, !framework.ProviderIs("kubemark"), true, true, true) + // Grab metrics for apiserver, scheduler, controller-manager, kubelet (for non-kubemark case) and cluster autoscaler (optionally). + grabber, err := metrics.NewMetricsGrabber(c, nil, !framework.ProviderIs("kubemark"), true, true, true, framework.TestContext.IncludeClusterAutoscalerMetrics) if err != nil { return fmt.Errorf("failed to create MetricsGrabber: %v", err) } diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index eeb4889d961..0682dec3bac 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -19,15 +19,19 @@ package e2e import ( "testing" + "k8s.io/kubernetes/test/e2e/framework" + + // test sources _ "k8s.io/kubernetes/test/e2e/apimachinery" _ "k8s.io/kubernetes/test/e2e/apps" _ "k8s.io/kubernetes/test/e2e/autoscaling" - "k8s.io/kubernetes/test/e2e/framework" + _ "k8s.io/kubernetes/test/e2e/common" _ "k8s.io/kubernetes/test/e2e/instrumentation" _ "k8s.io/kubernetes/test/e2e/kubectl" _ "k8s.io/kubernetes/test/e2e/lifecycle" _ "k8s.io/kubernetes/test/e2e/lifecycle/bootstrap" _ "k8s.io/kubernetes/test/e2e/network" + _ "k8s.io/kubernetes/test/e2e/node" _ "k8s.io/kubernetes/test/e2e/scalability" _ "k8s.io/kubernetes/test/e2e/scheduling" _ "k8s.io/kubernetes/test/e2e/storage" diff --git a/test/e2e/examples.go b/test/e2e/examples.go index c3c06521f84..ed7e9931090 100644 --- a/test/e2e/examples.go +++ b/test/e2e/examples.go @@ -72,7 +72,7 @@ var _ = framework.KubeDescribe("[Feature:Example]", func() { // this test wants powerful permissions. Since the namespace names are unique, we can leave this // lying around so we don't have to race any caches - framework.BindClusterRoleInNamespace(c.Rbac(), "edit", f.Namespace.Name, + framework.BindClusterRoleInNamespace(c.RbacV1beta1(), "edit", f.Namespace.Name, rbacv1beta1.Subject{Kind: rbacv1beta1.ServiceAccountKind, Namespace: f.Namespace.Name, Name: "default"}) err := framework.WaitForAuthorizationUpdate(c.AuthorizationV1beta1(), diff --git a/test/e2e/framework/BUILD b/test/e2e/framework/BUILD index 972c0b5db56..245ac34c504 100644 --- a/test/e2e/framework/BUILD +++ b/test/e2e/framework/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -40,7 +38,6 @@ go_library( "util.go", "volume_util.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//pkg/api:go_default_library", @@ -48,7 +45,6 @@ go_library( "//pkg/api/v1/helper:go_default_library", "//pkg/api/v1/node:go_default_library", "//pkg/api/v1/pod:go_default_library", - "//pkg/api/v1/service:go_default_library", "//pkg/apis/batch:go_default_library", "//pkg/apis/componentconfig:go_default_library", "//pkg/apis/extensions:go_default_library", @@ -68,6 +64,7 @@ go_library( "//pkg/kubelet/metrics:go_default_library", "//pkg/kubelet/sysctl:go_default_library", "//pkg/kubelet/util/format:go_default_library", + "//pkg/kubemark:go_default_library", "//pkg/master/ports:go_default_library", "//pkg/ssh:go_default_library", "//pkg/util/file:go_default_library", @@ -79,8 +76,8 @@ go_library( "//plugin/pkg/scheduler/algorithm/predicates:go_default_library", "//plugin/pkg/scheduler/schedulercache:go_default_library", "//test/e2e/framework/ginkgowrapper:go_default_library", + "//test/e2e/framework/metrics:go_default_library", "//test/e2e/manifest:go_default_library", - "//test/e2e/metrics:go_default_library", "//test/e2e/perftype:go_default_library", "//test/utils:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", @@ -101,6 +98,7 @@ go_library( "//vendor/google.golang.org/api/compute/v1:go_default_library", "//vendor/google.golang.org/api/googleapi:go_default_library", "//vendor/k8s.io/api/apps/v1beta1:go_default_library", + "//vendor/k8s.io/api/apps/v1beta2:go_default_library", "//vendor/k8s.io/api/authorization/v1beta1:go_default_library", "//vendor/k8s.io/api/batch/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -128,6 +126,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/client-go/discovery:go_default_library", "//vendor/k8s.io/client-go/dynamic:go_default_library", + "//vendor/k8s.io/client-go/informers:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", @@ -152,6 +151,7 @@ filegroup( srcs = [ ":package-srcs", "//test/e2e/framework/ginkgowrapper:all-srcs", + "//test/e2e/framework/metrics:all-srcs", ], tags = ["automanaged"], ) diff --git a/test/e2e/framework/firewall_util.go b/test/e2e/framework/firewall_util.go index 3fea73df8b8..d253fd87806 100644 --- a/test/e2e/framework/firewall_util.go +++ b/test/e2e/framework/firewall_util.go @@ -28,7 +28,6 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" - apiservice "k8s.io/kubernetes/pkg/api/v1/service" "k8s.io/kubernetes/pkg/cloudprovider" gcecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/gce" @@ -87,7 +86,7 @@ func ConstructHealthCheckFirewallForLBService(clusterID string, svc *v1.Service, fw.SourceRanges = gcecloud.LoadBalancerSrcRanges() healthCheckPort := gcecloud.GetNodesHealthCheckPort() if !isNodesHealthCheck { - healthCheckPort = apiservice.GetServiceHealthCheckNodePort(svc) + healthCheckPort = svc.Spec.HealthCheckNodePort } fw.Allowed = []*compute.FirewallAllowed{ { diff --git a/test/e2e/framework/framework.go b/test/e2e/framework/framework.go index fd2e7f8a41a..f17d7d31b09 100644 --- a/test/e2e/framework/framework.go +++ b/test/e2e/framework/framework.go @@ -37,13 +37,16 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/dynamic" + "k8s.io/client-go/informers" clientset "k8s.io/client-go/kubernetes" staging "k8s.io/client-go/kubernetes" clientreporestclient "k8s.io/client-go/rest" restclient "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/test/e2e/metrics" + "k8s.io/kubernetes/pkg/kubemark" + "k8s.io/kubernetes/test/e2e/framework/metrics" testutils "k8s.io/kubernetes/test/utils" . "github.com/onsi/ginkgo" @@ -63,7 +66,8 @@ type Framework struct { BaseName string // ClientSet uses internal objects, you should use ClientSet where possible. - ClientSet clientset.Interface + ClientSet clientset.Interface + KubemarkExternalClusterClientSet clientset.Interface InternalClientset *internalclientset.Clientset StagingClient *staging.Clientset @@ -95,6 +99,11 @@ type Framework struct { // Place where various additional data is stored during test run to be printed to ReportDir, // or stdout if ReportDir is not set once test ends. TestSummaries []TestDataSummary + + kubemarkControllerCloseChannel chan struct{} + + // Place to keep ClusterAutoscaler metrics from before test in order to compute delta. + clusterAutoscalerMetricsBeforeTest metrics.MetricsCollection } type TestDataSummary interface { @@ -190,6 +199,25 @@ func (f *Framework) BeforeEach() { f.StagingClient, err = staging.NewForConfig(clientRepoConfig) Expect(err).NotTo(HaveOccurred()) f.ClientPool = dynamic.NewClientPool(config, api.Registry.RESTMapper(), dynamic.LegacyAPIPathResolverFunc) + if ProviderIs("kubemark") && TestContext.KubemarkExternalKubeConfig != "" && TestContext.CloudConfig.KubemarkController == nil { + externalConfig, err := clientcmd.BuildConfigFromFlags("", TestContext.KubemarkExternalKubeConfig) + externalConfig.QPS = f.Options.ClientQPS + externalConfig.Burst = f.Options.ClientBurst + Expect(err).NotTo(HaveOccurred()) + externalClient, err := clientset.NewForConfig(externalConfig) + Expect(err).NotTo(HaveOccurred()) + f.KubemarkExternalClusterClientSet = externalClient + f.kubemarkControllerCloseChannel = make(chan struct{}) + externalInformerFactory := informers.NewSharedInformerFactory(externalClient, 0) + kubemarkInformerFactory := informers.NewSharedInformerFactory(f.ClientSet, 0) + kubemarkNodeInformer := kubemarkInformerFactory.Core().V1().Nodes() + go kubemarkNodeInformer.Informer().Run(f.kubemarkControllerCloseChannel) + TestContext.CloudConfig.KubemarkController, err = kubemark.NewKubemarkController(f.KubemarkExternalClusterClientSet, externalInformerFactory, f.ClientSet, kubemarkNodeInformer) + Expect(err).NotTo(HaveOccurred()) + externalInformerFactory.Start(f.kubemarkControllerCloseChannel) + Expect(TestContext.CloudConfig.KubemarkController.WaitForCacheSync(f.kubemarkControllerCloseChannel)).To(BeTrue()) + go TestContext.CloudConfig.KubemarkController.Run(f.kubemarkControllerCloseChannel) + } } if !f.SkipNamespaceCreation { @@ -233,6 +261,22 @@ func (f *Framework) BeforeEach() { f.logsSizeWaitGroup.Done() }() } + + gatherMetricsAfterTest := TestContext.GatherMetricsAfterTest == "true" || TestContext.GatherMetricsAfterTest == "master" + if gatherMetricsAfterTest && TestContext.IncludeClusterAutoscalerMetrics { + grabber, err := metrics.NewMetricsGrabber(f.ClientSet, f.KubemarkExternalClusterClientSet, !ProviderIs("kubemark"), false, false, false, TestContext.IncludeClusterAutoscalerMetrics) + if err != nil { + Logf("Failed to create MetricsGrabber (skipping ClusterAutoscaler metrics gathering before test): %v", err) + } else { + f.clusterAutoscalerMetricsBeforeTest, err = grabber.Grab() + if err != nil { + Logf("MetricsGrabber failed to grab CA metrics before test (skipping metrics gathering): %v", err) + } else { + Logf("Gathered ClusterAutoscaler metrics before test") + } + } + + } } // AfterEach deletes the namespace, after reading its events. @@ -329,19 +373,23 @@ func (f *Framework) AfterEach() { By("Gathering metrics") // Grab apiserver, scheduler, controller-manager metrics and (optionally) nodes' kubelet metrics. grabMetricsFromKubelets := TestContext.GatherMetricsAfterTest != "master" && !ProviderIs("kubemark") - grabber, err := metrics.NewMetricsGrabber(f.ClientSet, grabMetricsFromKubelets, true, true, true) + grabber, err := metrics.NewMetricsGrabber(f.ClientSet, f.KubemarkExternalClusterClientSet, grabMetricsFromKubelets, true, true, true, TestContext.IncludeClusterAutoscalerMetrics) if err != nil { Logf("Failed to create MetricsGrabber (skipping metrics gathering): %v", err) } else { received, err := grabber.Grab() if err != nil { - Logf("MetricsGrabber failed to grab metrics (skipping metrics gathering): %v", err) - } else { - f.TestSummaries = append(f.TestSummaries, (*MetricsForE2E)(&received)) + Logf("MetricsGrabber failed to grab some of the metrics: %v", err) } + (*MetricsForE2E)(&received).computeClusterAutoscalerMetricsDelta(f.clusterAutoscalerMetricsBeforeTest) + f.TestSummaries = append(f.TestSummaries, (*MetricsForE2E)(&received)) } } + if TestContext.CloudConfig.KubemarkController != nil { + close(f.kubemarkControllerCloseChannel) + } + PrintSummaries(f.TestSummaries, f.BaseName) // Check whether all nodes are ready after the test. diff --git a/test/e2e/framework/get-kubemark-resource-usage.go b/test/e2e/framework/get-kubemark-resource-usage.go index b3c76ced75a..e9748dcca35 100644 --- a/test/e2e/framework/get-kubemark-resource-usage.go +++ b/test/e2e/framework/get-kubemark-resource-usage.go @@ -42,7 +42,7 @@ func GetKubemarkMasterComponentsResourceUsage() map[string]*KubemarkResourceUsag // Get kuberenetes component resource usage sshResult, err := getMasterUsageByPrefix("kube") if err != nil { - Logf("Error when trying to SSH to master machine. Skipping probe") + Logf("Error when trying to SSH to master machine. Skipping probe. %v", err) return nil } scanner := bufio.NewScanner(strings.NewReader(sshResult)) diff --git a/test/e2e/framework/ginkgowrapper/BUILD b/test/e2e/framework/ginkgowrapper/BUILD index 4ea78ad010f..71e11de2668 100644 --- a/test/e2e/framework/ginkgowrapper/BUILD +++ b/test/e2e/framework/ginkgowrapper/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["wrapper.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/onsi/ginkgo:go_default_library"], ) diff --git a/test/e2e/framework/kubelet_stats.go b/test/e2e/framework/kubelet_stats.go index 4a83d219b4c..57c0193c5f1 100644 --- a/test/e2e/framework/kubelet_stats.go +++ b/test/e2e/framework/kubelet_stats.go @@ -37,7 +37,7 @@ import ( stats "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" kubeletmetrics "k8s.io/kubernetes/pkg/kubelet/metrics" "k8s.io/kubernetes/pkg/master/ports" - "k8s.io/kubernetes/test/e2e/metrics" + "k8s.io/kubernetes/test/e2e/framework/metrics" "github.com/prometheus/common/model" ) @@ -68,7 +68,7 @@ func getKubeletMetricsFromNode(c clientset.Interface, nodeName string) (metrics. if c == nil { return metrics.GrabKubeletMetricsWithoutProxy(nodeName) } - grabber, err := metrics.NewMetricsGrabber(c, true, false, false, false) + grabber, err := metrics.NewMetricsGrabber(c, nil, true, false, false, false, false) if err != nil { return metrics.KubeletMetrics{}, err } diff --git a/test/e2e/metrics/BUILD b/test/e2e/framework/metrics/BUILD similarity index 95% rename from test/e2e/metrics/BUILD rename to test/e2e/framework/metrics/BUILD index dfb56ff8b1a..44853abb7f8 100644 --- a/test/e2e/metrics/BUILD +++ b/test/e2e/framework/metrics/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,13 +9,13 @@ go_library( name = "go_default_library", srcs = [ "api_server_metrics.go", + "cluster_autoscaler_metrics.go", "controller_manager_metrics.go", "generic_metrics.go", "kubelet_metrics.go", "metrics_grabber.go", "scheduler_metrics.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/master/ports:go_default_library", diff --git a/test/e2e/metrics/api_server_metrics.go b/test/e2e/framework/metrics/api_server_metrics.go similarity index 100% rename from test/e2e/metrics/api_server_metrics.go rename to test/e2e/framework/metrics/api_server_metrics.go diff --git a/pkg/registry/autoscaling/horizontalpodautoscaler/strategy_test.go b/test/e2e/framework/metrics/cluster_autoscaler_metrics.go similarity index 50% rename from pkg/registry/autoscaling/horizontalpodautoscaler/strategy_test.go rename to test/e2e/framework/metrics/cluster_autoscaler_metrics.go index f5df8fa211b..9aa7dfebecc 100644 --- a/pkg/registry/autoscaling/horizontalpodautoscaler/strategy_test.go +++ b/test/e2e/framework/metrics/cluster_autoscaler_metrics.go @@ -14,22 +14,23 @@ See the License for the specific language governing permissions and limitations under the License. */ -package horizontalpodautoscaler +package metrics -import ( - "testing" +type ClusterAutoscalerMetrics Metrics - _ "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" - "k8s.io/kubernetes/pkg/apis/autoscaling" -) - -func TestSelectableFieldLabelConversions(t *testing.T) { - apitesting.TestSelectableFieldLabelConversionsOfKind(t, - testapi.Autoscaling.GroupVersion().String(), - "Autoscaler", - AutoscalerToSelectableFields(&autoscaling.HorizontalPodAutoscaler{}), - nil, - ) +func (m *ClusterAutoscalerMetrics) Equal(o ClusterAutoscalerMetrics) bool { + return (*Metrics)(m).Equal(Metrics(o)) +} + +func NewClusterAutoscalerMetrics() ClusterAutoscalerMetrics { + result := NewMetrics() + return ClusterAutoscalerMetrics(result) +} + +func parseClusterAutoscalerMetrics(data string) (ClusterAutoscalerMetrics, error) { + result := NewClusterAutoscalerMetrics() + if err := parseMetrics(data, (*Metrics)(&result)); err != nil { + return ClusterAutoscalerMetrics{}, err + } + return result, nil } diff --git a/test/e2e/metrics/controller_manager_metrics.go b/test/e2e/framework/metrics/controller_manager_metrics.go similarity index 100% rename from test/e2e/metrics/controller_manager_metrics.go rename to test/e2e/framework/metrics/controller_manager_metrics.go diff --git a/test/e2e/metrics/generic_metrics.go b/test/e2e/framework/metrics/generic_metrics.go similarity index 83% rename from test/e2e/metrics/generic_metrics.go rename to test/e2e/framework/metrics/generic_metrics.go index 3a8251886a6..73558779052 100644 --- a/test/e2e/metrics/generic_metrics.go +++ b/test/e2e/framework/metrics/generic_metrics.go @@ -51,7 +51,7 @@ func (m *Metrics) Equal(o Metrics) bool { func PrintSample(sample *model.Sample) string { buf := make([]string, 0) - // Id is a VERY special label. For 'normal' container it's usless, but it's necessary + // Id is a VERY special label. For 'normal' container it's useless, but it's necessary // for 'system' containers (e.g. /docker-daemon, /kubelet, etc.). We know if that's the // case by checking if there's a label "kubernetes_container_name" present. It's hacky // but it works... @@ -97,17 +97,3 @@ func parseMetrics(data string, output *Metrics) error { } } } - -func (g *MetricsGrabber) getMetricsFromPod(podName string, namespace string, port int) (string, error) { - rawOutput, err := g.client.Core().RESTClient().Get(). - Namespace(namespace). - Resource("pods"). - SubResource("proxy"). - Name(fmt.Sprintf("%v:%v", podName, port)). - Suffix("metrics"). - Do().Raw() - if err != nil { - return "", err - } - return string(rawOutput), nil -} diff --git a/test/e2e/metrics/kubelet_metrics.go b/test/e2e/framework/metrics/kubelet_metrics.go similarity index 100% rename from test/e2e/metrics/kubelet_metrics.go rename to test/e2e/framework/metrics/kubelet_metrics.go diff --git a/test/e2e/metrics/metrics_grabber.go b/test/e2e/framework/metrics/metrics_grabber.go similarity index 68% rename from test/e2e/metrics/metrics_grabber.go rename to test/e2e/framework/metrics/metrics_grabber.go index 09daa4879df..48c80edfb2f 100644 --- a/test/e2e/metrics/metrics_grabber.go +++ b/test/e2e/framework/metrics/metrics_grabber.go @@ -39,19 +39,22 @@ type MetricsCollection struct { ControllerManagerMetrics ControllerManagerMetrics KubeletMetrics map[string]KubeletMetrics SchedulerMetrics SchedulerMetrics + ClusterAutoscalerMetrics ClusterAutoscalerMetrics } type MetricsGrabber struct { client clientset.Interface + externalClient clientset.Interface grabFromApiServer bool grabFromControllerManager bool grabFromKubelets bool grabFromScheduler bool + grabFromClusterAutoscaler bool masterName string registeredMaster bool } -func NewMetricsGrabber(c clientset.Interface, kubelets bool, scheduler bool, controllers bool, apiServer bool) (*MetricsGrabber, error) { +func NewMetricsGrabber(c clientset.Interface, ec clientset.Interface, kubelets bool, scheduler bool, controllers bool, apiServer bool, clusterAutoscaler bool) (*MetricsGrabber, error) { registeredMaster := false masterName := "" nodeList, err := c.Core().Nodes().List(metav1.ListOptions{}) @@ -71,15 +74,22 @@ func NewMetricsGrabber(c clientset.Interface, kubelets bool, scheduler bool, con if !registeredMaster { scheduler = false controllers = false - glog.Warningf("Master node is not registered. Grabbing metrics from Scheduler and ControllerManager is disabled.") + clusterAutoscaler = ec != nil + if clusterAutoscaler { + glog.Warningf("Master node is not registered. Grabbing metrics from Scheduler, ControllerManager is disabled.") + } else { + glog.Warningf("Master node is not registered. Grabbing metrics from Scheduler, ControllerManager and ClusterAutoscaler is disabled.") + } } return &MetricsGrabber{ client: c, + externalClient: ec, grabFromApiServer: apiServer, grabFromControllerManager: controllers, grabFromKubelets: kubelets, grabFromScheduler: scheduler, + grabFromClusterAutoscaler: clusterAutoscaler, masterName: masterName, registeredMaster: registeredMaster, }, nil @@ -112,18 +122,38 @@ func (g *MetricsGrabber) GrabFromScheduler() (SchedulerMetrics, error) { if !g.registeredMaster { return SchedulerMetrics{}, fmt.Errorf("Master's Kubelet is not registered. Skipping Scheduler's metrics gathering.") } - output, err := g.getMetricsFromPod(fmt.Sprintf("%v-%v", "kube-scheduler", g.masterName), metav1.NamespaceSystem, ports.SchedulerPort) + output, err := g.getMetricsFromPod(g.client, fmt.Sprintf("%v-%v", "kube-scheduler", g.masterName), metav1.NamespaceSystem, ports.SchedulerPort) if err != nil { return SchedulerMetrics{}, err } return parseSchedulerMetrics(output) } +func (g *MetricsGrabber) GrabFromClusterAutoscaler() (ClusterAutoscalerMetrics, error) { + if !g.registeredMaster && g.externalClient == nil { + return ClusterAutoscalerMetrics{}, fmt.Errorf("Master's Kubelet is not registered. Skipping ClusterAutoscaler's metrics gathering.") + } + var client clientset.Interface + var namespace string + if g.externalClient != nil { + client = g.externalClient + namespace = "kubemark" + } else { + client = g.client + namespace = metav1.NamespaceSystem + } + output, err := g.getMetricsFromPod(client, "cluster-autoscaler", namespace, 8085) + if err != nil { + return ClusterAutoscalerMetrics{}, err + } + return parseClusterAutoscalerMetrics(output) +} + func (g *MetricsGrabber) GrabFromControllerManager() (ControllerManagerMetrics, error) { if !g.registeredMaster { return ControllerManagerMetrics{}, fmt.Errorf("Master's Kubelet is not registered. Skipping ControllerManager's metrics gathering.") } - output, err := g.getMetricsFromPod(fmt.Sprintf("%v-%v", "kube-controller-manager", g.masterName), metav1.NamespaceSystem, ports.ControllerManagerPort) + output, err := g.getMetricsFromPod(g.client, fmt.Sprintf("%v-%v", "kube-controller-manager", g.masterName), metav1.NamespaceSystem, ports.ControllerManagerPort) if err != nil { return ControllerManagerMetrics{}, err } @@ -165,6 +195,14 @@ func (g *MetricsGrabber) Grab() (MetricsCollection, error) { result.ControllerManagerMetrics = metrics } } + if g.grabFromClusterAutoscaler { + metrics, err := g.GrabFromClusterAutoscaler() + if err != nil { + errs = append(errs, err) + } else { + result.ClusterAutoscalerMetrics = metrics + } + } if g.grabFromKubelets { result.KubeletMetrics = make(map[string]KubeletMetrics) nodes, err := g.client.Core().Nodes().List(metav1.ListOptions{}) @@ -182,7 +220,21 @@ func (g *MetricsGrabber) Grab() (MetricsCollection, error) { } } if len(errs) > 0 { - return MetricsCollection{}, fmt.Errorf("Errors while grabbing metrics: %v", errs) + return result, fmt.Errorf("Errors while grabbing metrics: %v", errs) } return result, nil } + +func (g *MetricsGrabber) getMetricsFromPod(client clientset.Interface, podName string, namespace string, port int) (string, error) { + rawOutput, err := client.Core().RESTClient().Get(). + Namespace(namespace). + Resource("pods"). + SubResource("proxy"). + Name(fmt.Sprintf("%v:%v", podName, port)). + Suffix("metrics"). + Do().Raw() + if err != nil { + return "", err + } + return string(rawOutput), nil +} diff --git a/test/e2e/metrics/scheduler_metrics.go b/test/e2e/framework/metrics/scheduler_metrics.go similarity index 100% rename from test/e2e/metrics/scheduler_metrics.go rename to test/e2e/framework/metrics/scheduler_metrics.go diff --git a/test/e2e/framework/metrics_util.go b/test/e2e/framework/metrics_util.go index 26d464a1d54..c1e5abeb113 100644 --- a/test/e2e/framework/metrics_util.go +++ b/test/e2e/framework/metrics_util.go @@ -33,7 +33,7 @@ import ( clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/pkg/master/ports" "k8s.io/kubernetes/pkg/util/system" - "k8s.io/kubernetes/test/e2e/metrics" + "k8s.io/kubernetes/test/e2e/framework/metrics" "github.com/prometheus/common/expfmt" "github.com/prometheus/common/model" @@ -54,6 +54,10 @@ const ( // We set a higher threshold for list apicalls as they can take more time when // the list is really big. For eg. list nodes in a 5000-node cluster. apiListCallLatencyThreshold time.Duration = 2 * time.Second + + // Cluster Autoscaler metrics names + caFunctionMetric = "cluster_autoscaler_function_duration_seconds_bucket" + caFunctionMetricLabel = "function" ) type MetricsForE2E metrics.MetricsCollection @@ -67,6 +71,10 @@ func (m *MetricsForE2E) filterMetrics() { for _, metric := range InterestingControllerManagerMetrics { interestingControllerManagerMetrics[metric] = (*m).ControllerManagerMetrics[metric] } + interestingClusterAutoscalerMetrics := make(metrics.ClusterAutoscalerMetrics) + for _, metric := range InterestingClusterAutoscalerMetrics { + interestingClusterAutoscalerMetrics[metric] = (*m).ClusterAutoscalerMetrics[metric] + } interestingKubeletMetrics := make(map[string]metrics.KubeletMetrics) for kubelet, grabbed := range (*m).KubeletMetrics { interestingKubeletMetrics[kubelet] = make(metrics.KubeletMetrics) @@ -93,6 +101,12 @@ func (m *MetricsForE2E) PrintHumanReadable() string { buf.WriteString(fmt.Sprintf("\t%v\n", metrics.PrintSample(sample))) } } + for _, interestingMetric := range InterestingClusterAutoscalerMetrics { + buf.WriteString(fmt.Sprintf("For %v:\n", interestingMetric)) + for _, sample := range (*m).ClusterAutoscalerMetrics[interestingMetric] { + buf.WriteString(fmt.Sprintf("\t%v\n", metrics.PrintSample(sample))) + } + } for kubelet, grabbed := range (*m).KubeletMetrics { buf.WriteString(fmt.Sprintf("For %v:\n", kubelet)) for _, interestingMetric := range InterestingKubeletMetrics { @@ -156,6 +170,12 @@ var InterestingKubeletMetrics = []string{ "kubelet_sync_pods_latency_microseconds", } +var InterestingClusterAutoscalerMetrics = []string{ + "function_duration_seconds", + "errors_total", + "evicted_pods_total", +} + // Dashboard metrics type LatencyMetric struct { Perc50 time.Duration `json:"Perc50"` @@ -199,7 +219,7 @@ func (l *SchedulingLatency) PrintJSON() string { } type SaturationTime struct { - TimeToSaturate time.Duration `json:"timeToStaturate"` + TimeToSaturate time.Duration `json:"timeToSaturate"` NumberOfNodes int `json:"numberOfNodes"` NumberOfPods int `json:"numberOfPods"` Throughput float32 `json:"throughput"` @@ -575,3 +595,24 @@ func PrintLatencies(latencies []PodLatencyData, header string) { Logf("10%% %s: %v", header, latencies[(len(latencies)*9)/10:]) Logf("perc50: %v, perc90: %v, perc99: %v", metrics.Perc50, metrics.Perc90, metrics.Perc99) } + +func (m *MetricsForE2E) computeClusterAutoscalerMetricsDelta(before metrics.MetricsCollection) { + if beforeSamples, found := before.ClusterAutoscalerMetrics[caFunctionMetric]; found { + if afterSamples, found := m.ClusterAutoscalerMetrics[caFunctionMetric]; found { + beforeSamplesMap := make(map[string]*model.Sample) + for _, bSample := range beforeSamples { + beforeSamplesMap[makeKey(bSample.Metric[caFunctionMetricLabel], bSample.Metric["le"])] = bSample + } + for _, aSample := range afterSamples { + if bSample, found := beforeSamplesMap[makeKey(aSample.Metric[caFunctionMetricLabel], aSample.Metric["le"])]; found { + aSample.Value = aSample.Value - bSample.Value + } + + } + } + } +} + +func makeKey(a, b model.LabelValue) string { + return string(a) + "___" + string(b) +} diff --git a/test/e2e/framework/networking_utils.go b/test/e2e/framework/networking_utils.go index 06da52e58f9..9d5226e4cdb 100644 --- a/test/e2e/framework/networking_utils.go +++ b/test/e2e/framework/networking_utils.go @@ -279,9 +279,22 @@ func (config *NetworkingTestConfig) DialFromNode(protocol, targetIP string, targ func (config *NetworkingTestConfig) GetSelfURL(port int32, path string, expected string) { cmd := fmt.Sprintf("curl -i -q -s --connect-timeout 1 http://localhost:%d%s", port, path) By(fmt.Sprintf("Getting kube-proxy self URL %s", path)) + config.executeCurlCmd(cmd, expected) +} +// GetSelfStatusCode executes a curl against the given path via kubectl exec into a +// test container running with host networking, and fails if the returned status +// code doesn't match the expected string. +func (config *NetworkingTestConfig) GetSelfURLStatusCode(port int32, path string, expected string) { + // check status code + cmd := fmt.Sprintf("curl -o /dev/null -i -q -s -w %%{http_code} --connect-timeout 1 http://localhost:%d%s", port, path) + By(fmt.Sprintf("Checking status code against http://localhost:%d%s", port, path)) + config.executeCurlCmd(cmd, expected) +} + +func (config *NetworkingTestConfig) executeCurlCmd(cmd string, expected string) { // These are arbitrary timeouts. The curl command should pass on first try, - // unless kubeproxy is starved/bootstrapping/restarting etc. + // unless remote server is starved/bootstrapping/restarting etc. const retryInterval = 1 * time.Second const retryTimeout = 30 * time.Second podName := config.HostTestContainerPod.Name diff --git a/test/e2e/framework/pods.go b/test/e2e/framework/pods.go index fb0d1fcbd45..90ad5489f50 100644 --- a/test/e2e/framework/pods.go +++ b/test/e2e/framework/pods.go @@ -202,6 +202,23 @@ func (c *PodClient) WaitForSuccess(name string, timeout time.Duration) { )).To(Succeed(), "wait for pod %q to success", name) } +// WaitForFailure waits for pod to fail. +func (c *PodClient) WaitForFailure(name string, timeout time.Duration) { + f := c.f + Expect(WaitForPodCondition(f.ClientSet, f.Namespace.Name, name, "success or failure", timeout, + func(pod *v1.Pod) (bool, error) { + switch pod.Status.Phase { + case v1.PodFailed: + return true, nil + case v1.PodSucceeded: + return true, fmt.Errorf("pod %q successed with reason: %q, message: %q", name, pod.Status.Reason, pod.Status.Message) + default: + return false, nil + } + }, + )).To(Succeed(), "wait for pod %q to fail", name) +} + // WaitForSuccess waits for pod to succeed or an error event for that pod. func (c *PodClient) WaitForErrorEventOrSuccess(pod *v1.Pod) (*v1.Event, error) { var ev *v1.Event diff --git a/test/e2e/framework/size.go b/test/e2e/framework/size.go index ec20dafbe89..8878e898428 100644 --- a/test/e2e/framework/size.go +++ b/test/e2e/framework/size.go @@ -51,6 +51,8 @@ func ResizeGroup(group string, size int32) error { } else if TestContext.Provider == "aws" { client := autoscaling.New(session.New()) return awscloud.ResizeInstanceGroup(client, group, int(size)) + } else if TestContext.Provider == "kubemark" { + return TestContext.CloudConfig.KubemarkController.SetNodeGroupSize(group, int(size)) } else { return fmt.Errorf("Provider does not support InstanceGroups") } @@ -72,6 +74,8 @@ func GetGroupNodes(group string) ([]string, error) { lines[i] = line[:strings.Index(line, " ")] } return lines, nil + } else if TestContext.Provider == "kubemark" { + return TestContext.CloudConfig.KubemarkController.GetNodeNamesForNodeGroup(group) } else { return nil, fmt.Errorf("provider does not support InstanceGroups") } @@ -99,6 +103,8 @@ func GroupSize(group string) (int, error) { return -1, fmt.Errorf("instance group not found: %s", group) } return instanceGroup.CurrentSize() + } else if TestContext.Provider == "kubemark" { + return TestContext.CloudConfig.KubemarkController.GetNodeGroupSize(group) } else { return -1, fmt.Errorf("provider does not support InstanceGroups") } diff --git a/test/e2e/framework/statefulset_utils.go b/test/e2e/framework/statefulset_utils.go index bc4c9a68dac..b33cc332c54 100644 --- a/test/e2e/framework/statefulset_utils.go +++ b/test/e2e/framework/statefulset_utils.go @@ -29,6 +29,7 @@ import ( . "github.com/onsi/gomega" apps "k8s.io/api/apps/v1beta1" + appsV1beta2 "k8s.io/api/apps/v1beta2" "k8s.io/api/core/v1" apierrs "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" @@ -224,7 +225,7 @@ func (s *StatefulSetTester) Scale(ss *apps.StatefulSet, count int32) error { // UpdateReplicas updates the replicas of ss to count. func (s *StatefulSetTester) UpdateReplicas(ss *apps.StatefulSet, count int32) { - s.update(ss.Namespace, ss.Name, func(ss *apps.StatefulSet) { ss.Spec.Replicas = &count }) + s.update(ss.Namespace, ss.Name, func(ss *apps.StatefulSet) { *(ss.Spec.Replicas) = count }) } // Restart scales ss to 0 and then back to its previous number of replicas. @@ -812,6 +813,23 @@ func NewStatefulSet(name, ns, governingSvcName string, replicas int32, statefulP } } +// NewStatefulSetScale creates a new StatefulSet scale subresource and returns it +func NewStatefulSetScale(ss *apps.StatefulSet) *appsV1beta2.Scale { + return &appsV1beta2.Scale{ + // TODO: Create a variant of ObjectMeta type that only contains the fields below. + ObjectMeta: metav1.ObjectMeta{ + Name: ss.Name, + Namespace: ss.Namespace, + }, + Spec: appsV1beta2.ScaleSpec{ + Replicas: *(ss.Spec.Replicas), + }, + Status: appsV1beta2.ScaleStatus{ + Replicas: ss.Status.Replicas, + }, + } +} + var statefulPodRegex = regexp.MustCompile("(.*)-([0-9]+)$") func getStatefulPodOrdinal(pod *v1.Pod) int { diff --git a/test/e2e/framework/test_context.go b/test/e2e/framework/test_context.go index 0883eb128ae..7d784055e7b 100644 --- a/test/e2e/framework/test_context.go +++ b/test/e2e/framework/test_context.go @@ -27,17 +27,19 @@ import ( "k8s.io/client-go/tools/clientcmd" "k8s.io/kubernetes/pkg/apis/componentconfig" "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/kubemark" ) const defaultHost = "http://127.0.0.1:8080" type TestContextType struct { - KubeConfig string - KubeContext string - KubeAPIContentType string - KubeVolumeDir string - CertDir string - Host string + KubeConfig string + KubemarkExternalKubeConfig string + KubeContext string + KubeAPIContentType string + KubeVolumeDir string + CertDir string + Host string // TODO: Deprecating this over time... instead just use gobindata_util.go , see #23987. RepoRoot string DockershimCheckpointDir string @@ -75,6 +77,8 @@ type TestContextType struct { GatherLogsSizes bool GatherMetricsAfterTest string GatherSuiteMetricsAfterTest bool + // If set to 'true' framework will gather ClusterAutoscaler metrics when gathering them for other components. + IncludeClusterAutoscalerMetrics bool // Currently supported values are 'hr' for human-readable and 'json'. It's a comma separated list. OutputPrintType string // NodeSchedulableTimeout is the timeout for waiting for all nodes to be schedulable. @@ -144,7 +148,7 @@ type NodeTestContextType struct { type CloudConfig struct { ApiEndpoint string ProjectID string - Zone string + Zone string // for multizone tests, arbitrarily chosen zone Region string MultiZone bool Cluster string @@ -158,7 +162,8 @@ type CloudConfig struct { NodeTag string MasterTag string - Provider cloudprovider.Interface + Provider cloudprovider.Interface + KubemarkController *kubemark.KubemarkController } var TestContext TestContextType @@ -178,6 +183,7 @@ func RegisterCommonFlags() { flag.BoolVar(&TestContext.GatherLogsSizes, "gather-logs-sizes", false, "If set to true framework will be monitoring logs sizes on all machines running e2e tests.") flag.StringVar(&TestContext.GatherMetricsAfterTest, "gather-metrics-at-teardown", "false", "If set to 'true' framework will gather metrics from all components after each test. If set to 'master' only master component metrics would be gathered.") flag.BoolVar(&TestContext.GatherSuiteMetricsAfterTest, "gather-suite-metrics-at-teardown", false, "If set to true framwork will gather metrics from all components after the whole test suite completes.") + flag.BoolVar(&TestContext.IncludeClusterAutoscalerMetrics, "include-cluster-autoscaler", false, "If set to true, framework will include Cluster Autoscaler when gathering metrics.") flag.StringVar(&TestContext.OutputPrintType, "output-print-type", "json", "Format in which summaries should be printed: 'hr' for human readable, 'json' for JSON ones.") flag.BoolVar(&TestContext.DumpLogsOnFailure, "dump-logs-on-failure", true, "If set to true test will dump data about the namespace in which test was running.") flag.BoolVar(&TestContext.DisableLogDump, "disable-log-dump", false, "If set to true, logs from master and nodes won't be gathered after test run.") @@ -201,6 +207,7 @@ func RegisterCommonFlags() { func RegisterClusterFlags() { flag.BoolVar(&TestContext.VerifyServiceAccount, "e2e-verify-service-account", true, "If true tests will verify the service account before running.") flag.StringVar(&TestContext.KubeConfig, clientcmd.RecommendedConfigPathFlag, os.Getenv(clientcmd.RecommendedConfigPathEnvVar), "Path to kubeconfig containing embedded authinfo.") + flag.StringVar(&TestContext.KubemarkExternalKubeConfig, fmt.Sprintf("%s-%s", "kubemark-external", clientcmd.RecommendedConfigPathFlag), "", "Path to kubeconfig containing embedded authinfo for external cluster.") flag.StringVar(&TestContext.KubeContext, clientcmd.FlagContext, "", "kubeconfig context to use/override. If unset, will use value from 'current-context'") flag.StringVar(&TestContext.KubeAPIContentType, "kube-api-content-type", "application/vnd.kubernetes.protobuf", "ContentType used to communicate with apiserver") flag.StringVar(&TestContext.FederatedKubeContext, "federated-kube-context", "e2e-federation", "kubeconfig context for federation.") diff --git a/test/e2e/framework/util.go b/test/e2e/framework/util.go index 1a9130414b0..a464f3c7e46 100644 --- a/test/e2e/framework/util.go +++ b/test/e2e/framework/util.go @@ -653,7 +653,7 @@ func WaitForPodsRunningReady(c clientset.Interface, ns string, minPods, allowedN notReady++ badPods = append(badPods, pod) default: - if controller.GetControllerOf(&pod) == nil { + if metav1.GetControllerOf(&pod) == nil { Logf("Pod %s is Failed, but it's not controlled by a controller", pod.ObjectMeta.Name) badPods = append(badPods, pod) } @@ -2551,7 +2551,7 @@ func ExpectNodeHasLabel(c clientset.Interface, nodeName string, labelKey string, } func RemoveTaintOffNode(c clientset.Interface, nodeName string, taint v1.Taint) { - ExpectNoError(controller.RemoveTaintOffNode(c, nodeName, &taint, nil)) + ExpectNoError(controller.RemoveTaintOffNode(c, nodeName, nil, &taint)) VerifyThatTaintIsGone(c, nodeName, &taint) } @@ -4948,6 +4948,7 @@ func PrintSummaries(summaries []TestDataSummary, testBaseName string) { } else { // TODO: learn to extract test name and append it to the kind instead of timestamp. filePath := path.Join(TestContext.ReportDir, summaries[i].SummaryKind()+"_"+testBaseName+"_"+now.Format(time.RFC3339)+".json") + Logf("Writing to %s", filePath) if err := ioutil.WriteFile(filePath, []byte(summaries[i].PrintJSON()), 0644); err != nil { Logf("Failed to write file %v with test performance data: %v", filePath, err) } diff --git a/test/e2e/framework/volume_util.go b/test/e2e/framework/volume_util.go index 14efbbb4672..0a65928fafc 100644 --- a/test/e2e/framework/volume_util.go +++ b/test/e2e/framework/volume_util.go @@ -100,6 +100,8 @@ type VolumeTestConfig struct { ServerNodeName string // ClientNodeName is the spec.nodeName to run client pod on. Default is any node. ClientNodeName string + // NodeSelector to use in pod spec (server, client and injector pods). + NodeSelector map[string]string } // VolumeTest contains a volume to mount into a client pod and its @@ -286,6 +288,7 @@ func StartVolumeServer(client clientset.Interface, config VolumeTestConfig) *v1. Volumes: volumes, RestartPolicy: restartPolicy, NodeName: config.ServerNodeName, + NodeSelector: config.NodeSelector, }, } @@ -390,8 +393,9 @@ func TestVolumeClient(client clientset.Interface, config VolumeTestConfig, fsGro Level: "s0:c0,c1", }, }, - Volumes: []v1.Volume{}, - NodeName: config.ClientNodeName, + Volumes: []v1.Volume{}, + NodeName: config.ClientNodeName, + NodeSelector: config.NodeSelector, }, } podsNamespacer := client.CoreV1().Pods(config.Namespace) @@ -476,6 +480,7 @@ func InjectHtml(client clientset.Interface, config VolumeTestConfig, volume v1.V VolumeSource: volume, }, }, + NodeSelector: config.NodeSelector, }, } diff --git a/test/e2e/generated/BUILD b/test/e2e/generated/BUILD index dc3bd386141..706fad8a7a9 100644 --- a/test/e2e/generated/BUILD +++ b/test/e2e/generated/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,9 +8,9 @@ load( go_library( name = "go_default_library", srcs = [ + "bindata.go", "gobindata_util.go", "main.go", - ":bindata", ], deps = [ "//vendor/github.com/golang/glog:go_default_library", diff --git a/test/e2e/instrumentation/BUILD b/test/e2e/instrumentation/BUILD index 456da8b01a3..22a1d312d9e 100644 --- a/test/e2e/instrumentation/BUILD +++ b/test/e2e/instrumentation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["imports.go"], - tags = ["automanaged"], deps = [ "//test/e2e/instrumentation/logging:go_default_library", "//test/e2e/instrumentation/monitoring:go_default_library", diff --git a/test/e2e/instrumentation/common/BUILD b/test/e2e/instrumentation/common/BUILD index 57be5ca8100..944e485a448 100644 --- a/test/e2e/instrumentation/common/BUILD +++ b/test/e2e/instrumentation/common/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["framework.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/onsi/ginkgo:go_default_library"], ) diff --git a/test/e2e/instrumentation/logging/BUILD b/test/e2e/instrumentation/logging/BUILD index a91c2350537..2fd179912de 100644 --- a/test/e2e/instrumentation/logging/BUILD +++ b/test/e2e/instrumentation/logging/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "generic_soak.go", "imports.go", ], - tags = ["automanaged"], deps = [ "//test/e2e/framework:go_default_library", "//test/e2e/instrumentation/common:go_default_library", diff --git a/test/e2e/instrumentation/logging/elasticsearch/BUILD b/test/e2e/instrumentation/logging/elasticsearch/BUILD index 29d194053d5..4fb0f9efdaf 100644 --- a/test/e2e/instrumentation/logging/elasticsearch/BUILD +++ b/test/e2e/instrumentation/logging/elasticsearch/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "kibana.go", "utils.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//test/e2e/framework:go_default_library", diff --git a/test/e2e/instrumentation/logging/stackdrvier/BUILD b/test/e2e/instrumentation/logging/stackdrvier/BUILD index f8e149d084d..cbd29eff8cb 100644 --- a/test/e2e/instrumentation/logging/stackdrvier/BUILD +++ b/test/e2e/instrumentation/logging/stackdrvier/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "soak.go", "utils.go", ], - tags = ["automanaged"], deps = [ "//test/e2e/framework:go_default_library", "//test/e2e/instrumentation/common:go_default_library", diff --git a/test/e2e/instrumentation/logging/stackdrvier/soak.go b/test/e2e/instrumentation/logging/stackdrvier/soak.go index 92d94764a5f..e1a863190d7 100644 --- a/test/e2e/instrumentation/logging/stackdrvier/soak.go +++ b/test/e2e/instrumentation/logging/stackdrvier/soak.go @@ -84,8 +84,9 @@ var _ = instrumentation.SIGDescribe("Cluster level logging implemented by Stackd for runIdx := 0; runIdx < podRunCount; runIdx++ { // Starting one pod on each node. for _, pod := range podsByRun[runIdx] { - err := pod.Start(f) - framework.Logf("Failed to start pod: %v", err) + if err := pod.Start(f); err != nil { + framework.Logf("Failed to start pod: %v", err) + } } <-t.C } diff --git a/test/e2e/instrumentation/logging/utils/BUILD b/test/e2e/instrumentation/logging/utils/BUILD index 957327136f0..7b70e61dc03 100644 --- a/test/e2e/instrumentation/logging/utils/BUILD +++ b/test/e2e/instrumentation/logging/utils/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "types.go", "wait.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//test/e2e/framework:go_default_library", diff --git a/test/e2e/instrumentation/logging/utils/logging_agent.go b/test/e2e/instrumentation/logging/utils/logging_agent.go index 4ca60a6c4a4..f42dc28c6da 100644 --- a/test/e2e/instrumentation/logging/utils/logging_agent.go +++ b/test/e2e/instrumentation/logging/utils/logging_agent.go @@ -65,7 +65,12 @@ func EnsureLoggingAgentRestartsCount(f *framework.Framework, appName string, max maxRestartCount := 0 for _, pod := range agentPods.Items { - restartCount := int(pod.Status.ContainerStatuses[0].RestartCount) + contStatuses := pod.Status.ContainerStatuses + if len(contStatuses) == 0 { + framework.Logf("There are no container statuses for pod %s", pod.Name) + continue + } + restartCount := int(contStatuses[0].RestartCount) maxRestartCount = integer.IntMax(maxRestartCount, restartCount) framework.Logf("Logging agent %s on node %s was restarted %d times", diff --git a/test/e2e/instrumentation/logging/utils/wait.go b/test/e2e/instrumentation/logging/utils/wait.go index 6f0e44c5d6e..9d1c13c5810 100644 --- a/test/e2e/instrumentation/logging/utils/wait.go +++ b/test/e2e/instrumentation/logging/utils/wait.go @@ -150,9 +150,6 @@ func getFullIngestionPred(podsMap map[string]FiniteLoggingPod) NumberedIngestion return func(name string, occ map[int]bool) (bool, error) { p := podsMap[name] ok := len(occ) == p.ExpectedLineCount() - if !ok { - framework.Logf("Pod %s is still missing %d lines", name, p.ExpectedLineCount()-len(occ)) - } return ok, nil } } @@ -160,24 +157,27 @@ func getFullIngestionPred(podsMap map[string]FiniteLoggingPod) NumberedIngestion func getFullIngestionTimeout(podsMap map[string]FiniteLoggingPod, slack float64) NumberedTimeoutFun { return func(names []string, occs map[string]map[int]bool) error { totalGot, totalWant := 0, 0 - podsWithLosses := []string{} + lossMsgs := []string{} for _, name := range names { got := len(occs[name]) want := podsMap[name].ExpectedLineCount() if got != want { - podsWithLosses = append(podsWithLosses, name) + lossMsg := fmt.Sprintf("%s: %d lines", name, want-got) + lossMsgs = append(lossMsgs, lossMsg) } totalGot += got totalWant += want } - if len(podsWithLosses) > 0 { - framework.Logf("Still missing logs from: %s", strings.Join(podsWithLosses, ", ")) + if len(lossMsgs) > 0 { + framework.Logf("Still missing logs from:\n%s", strings.Join(lossMsgs, "\n")) } lostFrac := 1 - float64(totalGot)/float64(totalWant) if lostFrac > slack { return fmt.Errorf("still missing %.2f%% of logs, only %.2f%% is tolerable", lostFrac*100, slack*100) } + framework.Logf("Missing %.2f%% of logs, which is lower than the threshold %.2f%%", + lostFrac*100, slack*100) return nil } } diff --git a/test/e2e/instrumentation/monitoring/BUILD b/test/e2e/instrumentation/monitoring/BUILD index 1c898613758..7677ba55d7c 100644 --- a/test/e2e/instrumentation/monitoring/BUILD +++ b/test/e2e/instrumentation/monitoring/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,15 +10,17 @@ go_library( srcs = [ "cadvisor.go", "influxdb.go", + "metrics_grabber.go", "stackdriver.go", ], - tags = ["automanaged"], deps = [ "//test/e2e/common:go_default_library", "//test/e2e/framework:go_default_library", + "//test/e2e/framework/metrics:go_default_library", "//test/e2e/instrumentation/common:go_default_library", "//vendor/github.com/influxdata/influxdb/client/v2:go_default_library", "//vendor/github.com/onsi/ginkgo:go_default_library", + "//vendor/github.com/onsi/gomega:go_default_library", "//vendor/golang.org/x/oauth2/google:go_default_library", "//vendor/google.golang.org/api/monitoring/v3:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/test/e2e/metrics_grabber_test.go b/test/e2e/instrumentation/monitoring/metrics_grabber.go similarity index 66% rename from test/e2e/metrics_grabber_test.go rename to test/e2e/instrumentation/monitoring/metrics_grabber.go index 96005f349c6..5e115d049b5 100644 --- a/test/e2e/metrics_grabber_test.go +++ b/test/e2e/instrumentation/monitoring/metrics_grabber.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package e2e +package monitoring import ( "strings" @@ -22,42 +22,44 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/kubernetes/test/e2e/metrics" + "k8s.io/kubernetes/test/e2e/framework/metrics" + instrumentation "k8s.io/kubernetes/test/e2e/instrumentation/common" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" + gin "github.com/onsi/ginkgo" + gom "github.com/onsi/gomega" ) -var _ = framework.KubeDescribe("MetricsGrabber", func() { +var _ = instrumentation.SIGDescribe("MetricsGrabber", func() { f := framework.NewDefaultFramework("metrics-grabber") - var c clientset.Interface + var c, ec clientset.Interface var grabber *metrics.MetricsGrabber - BeforeEach(func() { + gin.BeforeEach(func() { var err error c = f.ClientSet + ec = f.KubemarkExternalClusterClientSet framework.ExpectNoError(err) - grabber, err = metrics.NewMetricsGrabber(c, true, true, true, true) + grabber, err = metrics.NewMetricsGrabber(c, ec, true, true, true, true, true) framework.ExpectNoError(err) }) - It("should grab all metrics from API server.", func() { - By("Connecting to /metrics endpoint") + gin.It("should grab all metrics from API server.", func() { + gin.By("Connecting to /metrics endpoint") response, err := grabber.GrabFromApiServer() framework.ExpectNoError(err) - Expect(response).NotTo(BeEmpty()) + gom.Expect(response).NotTo(gom.BeEmpty()) }) - It("should grab all metrics from a Kubelet.", func() { - By("Proxying to Node through the API server") + gin.It("should grab all metrics from a Kubelet.", func() { + gin.By("Proxying to Node through the API server") nodes := framework.GetReadySchedulableNodesOrDie(f.ClientSet) - Expect(nodes.Items).NotTo(BeEmpty()) + gom.Expect(nodes.Items).NotTo(gom.BeEmpty()) response, err := grabber.GrabFromKubelet(nodes.Items[0].Name) framework.ExpectNoError(err) - Expect(response).NotTo(BeEmpty()) + gom.Expect(response).NotTo(gom.BeEmpty()) }) - It("should grab all metrics from a Scheduler.", func() { - By("Proxying to Pod through the API server") + gin.It("should grab all metrics from a Scheduler.", func() { + gin.By("Proxying to Pod through the API server") // Check if master Node is registered nodes, err := c.Core().Nodes().List(metav1.ListOptions{}) framework.ExpectNoError(err) @@ -74,11 +76,11 @@ var _ = framework.KubeDescribe("MetricsGrabber", func() { } response, err := grabber.GrabFromScheduler() framework.ExpectNoError(err) - Expect(response).NotTo(BeEmpty()) + gom.Expect(response).NotTo(gom.BeEmpty()) }) - It("should grab all metrics from a ControllerManager.", func() { - By("Proxying to Pod through the API server") + gin.It("should grab all metrics from a ControllerManager.", func() { + gin.By("Proxying to Pod through the API server") // Check if master Node is registered nodes, err := c.Core().Nodes().List(metav1.ListOptions{}) framework.ExpectNoError(err) @@ -95,6 +97,6 @@ var _ = framework.KubeDescribe("MetricsGrabber", func() { } response, err := grabber.GrabFromControllerManager() framework.ExpectNoError(err) - Expect(response).NotTo(BeEmpty()) + gom.Expect(response).NotTo(gom.BeEmpty()) }) }) diff --git a/test/e2e/kubectl/BUILD b/test/e2e/kubectl/BUILD index 8a76fe4aa5a..58c5ef9c92f 100644 --- a/test/e2e/kubectl/BUILD +++ b/test/e2e/kubectl/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,11 +11,8 @@ go_library( "framework.go", "kubectl.go", "portforward.go", - "proxy.go", ], - tags = ["automanaged"], deps = [ - "//pkg/api/testapi:go_default_library", "//pkg/apis/batch/v2alpha1:go_default_library", "//pkg/controller:go_default_library", "//pkg/kubectl/cmd/util:go_default_library", @@ -38,7 +33,6 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", diff --git a/test/e2e/kubectl/kubectl.go b/test/e2e/kubectl/kubectl.go index 8f15cfdf7b6..cf18ba5a5e3 100644 --- a/test/e2e/kubectl/kubectl.go +++ b/test/e2e/kubectl/kubectl.go @@ -146,8 +146,6 @@ var ( kubectlContainerExitCodeVersion = utilversion.MustParseSemantic("v1.4.0-alpha.3") CronJobGroupVersionResource = schema.GroupVersionResource{Group: batchv2alpha1.GroupName, Version: "v2alpha1", Resource: "cronjobs"} - - ScheduledJobGroupVersionResource = schema.GroupVersionResource{Group: batchv2alpha1.GroupName, Version: "v2alpha1", Resource: "scheduledjobs"} ) // Stops everything from filePath from namespace ns and checks if everything matching selectors from the given namespace is correctly stopped. @@ -199,44 +197,6 @@ var _ = SIGDescribe("Kubectl alpha client", func() { // Customized Wait / ForEach wrapper for this test. These demonstrate the - framework.KubeDescribe("Kubectl run ScheduledJob", func() { - var nsFlag string - var sjName string - - BeforeEach(func() { - nsFlag = fmt.Sprintf("--namespace=%v", ns) - sjName = "e2e-test-echo-scheduledjob" - }) - - AfterEach(func() { - framework.RunKubectlOrDie("delete", "cronjobs", sjName, nsFlag) - }) - - It("should create a ScheduledJob", func() { - framework.SkipIfMissingResource(f.ClientPool, ScheduledJobGroupVersionResource, f.Namespace.Name) - - schedule := "*/5 * * * ?" - framework.RunKubectlOrDie("run", sjName, "--restart=OnFailure", "--generator=scheduledjob/v2alpha1", - "--schedule="+schedule, "--image="+busyboxImage, nsFlag) - By("verifying the ScheduledJob " + sjName + " was created") - sj, err := c.BatchV2alpha1().CronJobs(ns).Get(sjName, metav1.GetOptions{}) - if err != nil { - framework.Failf("Failed getting ScheduledJob %s: %v", sjName, err) - } - if sj.Spec.Schedule != schedule { - framework.Failf("Failed creating a ScheduledJob with correct schedule %s, but got %s", schedule, sj.Spec.Schedule) - } - containers := sj.Spec.JobTemplate.Spec.Template.Spec.Containers - if containers == nil || len(containers) != 1 || containers[0].Image != busyboxImage { - framework.Failf("Failed creating ScheduledJob %s for 1 pod with expected image %s: %#v", sjName, busyboxImage, containers) - } - restartPolicy := sj.Spec.JobTemplate.Spec.Template.Spec.RestartPolicy - if sj.Spec.JobTemplate.Spec.Template.Spec.RestartPolicy != v1.RestartPolicyOnFailure { - framework.Failf("Failed creating a ScheduledJob with correct restart policy %s, but got %s", v1.RestartPolicyOnFailure, restartPolicy) - } - }) - }) - framework.KubeDescribe("Kubectl run CronJob", func() { var nsFlag string var cjName string @@ -437,9 +397,6 @@ var _ = SIGDescribe("Kubectl client", func() { }) It("should support exec through an HTTP proxy", func() { - // Note: We are skipping local since we want to verify an apiserver with HTTPS. - // At this time local only supports plain HTTP. - framework.SkipIfProviderIs("local") // Fail if the variable isn't set if framework.TestContext.Host == "" { framework.Failf("--host variable must be set to the full URI to the api server on e2e run.") @@ -473,6 +430,32 @@ var _ = SIGDescribe("Kubectl client", func() { } }) + It("should support exec through kubectl proxy", func() { + // Fail if the variable isn't set + if framework.TestContext.Host == "" { + framework.Failf("--host variable must be set to the full URI to the api server on e2e run.") + } + + By("Starting kubectl proxy") + port, proxyCmd, err := startProxyServer() + framework.ExpectNoError(err) + defer framework.TryKill(proxyCmd) + + //proxyLogs.Reset() + host := fmt.Sprintf("--server=http://127.0.0.1:%d", port) + By("Running kubectl via kubectl proxy using " + host) + output := framework.NewKubectlCommand( + host, fmt.Sprintf("--namespace=%s", ns), + "exec", "nginx", "echo", "running", "in", "container", + ).ExecOrDie() + + // Verify we got the normal output captured by the exec server + expectedExecOutput := "running in container\n" + if output != expectedExecOutput { + framework.Failf("Unexpected kubectl exec output. Wanted %q, got %q", expectedExecOutput, output) + } + }) + It("should return command exit codes", func() { framework.SkipUnlessKubectlVersionGTE(kubectlContainerExitCodeVersion) nsFlag := fmt.Sprintf("--namespace=%v", ns) @@ -591,7 +574,7 @@ var _ = SIGDescribe("Kubectl client", func() { It("should handle in-cluster config", func() { By("adding rbac permissions") // grant the view permission widely to allow inspection of the `invalid` namespace and the default namespace - framework.BindClusterRole(f.ClientSet.Rbac(), "view", f.Namespace.Name, + framework.BindClusterRole(f.ClientSet.RbacV1beta1(), "view", f.Namespace.Name, rbacv1beta1.Subject{Kind: rbacv1beta1.ServiceAccountKind, Namespace: f.Namespace.Name, Name: "default"}) err := framework.WaitForAuthorizationUpdate(f.ClientSet.AuthorizationV1beta1(), @@ -1758,7 +1741,7 @@ func getAPIVersions(apiEndpoint string) (*metav1.APIVersions, error) { func startProxyServer() (int, *exec.Cmd, error) { // Specifying port 0 indicates we want the os to pick a random port. - cmd := framework.KubectlCmd("proxy", "-p", "0") + cmd := framework.KubectlCmd("proxy", "-p", "0", "--disable-filter") stdout, stderr, err := framework.StartCmdAndStreamOutput(cmd) if err != nil { return -1, nil, err diff --git a/test/e2e/lifecycle/BUILD b/test/e2e/lifecycle/BUILD index 348920c22a4..012c7044cb1 100644 --- a/test/e2e/lifecycle/BUILD +++ b/test/e2e/lifecycle/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,13 +10,12 @@ go_library( srcs = [ "addon_update.go", "cluster_upgrade.go", + "framework.go", "ha_master.go", "reboot.go", "resize_nodes.go", "restart.go", - "sig.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/kubelet/pod:go_default_library", diff --git a/test/e2e/lifecycle/bootstrap/BUILD b/test/e2e/lifecycle/bootstrap/BUILD index ca411e4a154..55eb22f3fc3 100644 --- a/test/e2e/lifecycle/bootstrap/BUILD +++ b/test/e2e/lifecycle/bootstrap/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "bootstrap_token_cleaner.go", "util.go", ], - tags = ["automanaged"], deps = [ "//pkg/bootstrap/api:go_default_library", "//test/e2e/framework:go_default_library", diff --git a/test/e2e/lifecycle/sig.go b/test/e2e/lifecycle/framework.go similarity index 100% rename from test/e2e/lifecycle/sig.go rename to test/e2e/lifecycle/framework.go diff --git a/test/e2e/manifest/BUILD b/test/e2e/manifest/BUILD index 42091e3198d..e132b429a08 100644 --- a/test/e2e/manifest/BUILD +++ b/test/e2e/manifest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["manifest.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//test/e2e/generated:go_default_library", diff --git a/test/e2e/network/BUILD b/test/e2e/network/BUILD index 4d33ef3873b..6080e1ed433 100644 --- a/test/e2e/network/BUILD +++ b/test/e2e/network/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -22,16 +20,15 @@ go_library( "networking.go", "networking_perf.go", "no_snat.go", + "proxy.go", "service.go", "service_latency.go", "serviceloadbalancers.go", "util_iperf.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", - "//pkg/api/v1/service:go_default_library", "//pkg/apis/networking:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", "//pkg/cloudprovider:go_default_library", @@ -47,12 +44,14 @@ go_library( "//vendor/github.com/onsi/gomega:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1: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/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", diff --git a/test/e2e/network/ingress.go b/test/e2e/network/ingress.go index 14bed30dbe4..607ac4d3dbf 100644 --- a/test/e2e/network/ingress.go +++ b/test/e2e/network/ingress.go @@ -48,7 +48,7 @@ var _ = SIGDescribe("Loadbalancing: L7", func() { // this test wants powerful permissions. Since the namespace names are unique, we can leave this // lying around so we don't have to race any caches - framework.BindClusterRole(jig.Client.Rbac(), "cluster-admin", f.Namespace.Name, + framework.BindClusterRole(jig.Client.RbacV1beta1(), "cluster-admin", f.Namespace.Name, rbacv1beta1.Subject{Kind: rbacv1beta1.ServiceAccountKind, Namespace: f.Namespace.Name, Name: "default"}) err := framework.WaitForAuthorizationUpdate(jig.Client.AuthorizationV1beta1(), diff --git a/test/e2e/network/networking.go b/test/e2e/network/networking.go index 68cf59a6020..f5a1566e2fb 100644 --- a/test/e2e/network/networking.go +++ b/test/e2e/network/networking.go @@ -87,7 +87,8 @@ var _ = SIGDescribe("Networking", func() { config.GetSelfURL(ports.ProxyHealthzPort, "/healthz", "200 OK") // Verify /healthz returns the proper content. config.GetSelfURL(ports.ProxyHealthzPort, "/healthz", "lastUpdated") - config.GetSelfURL(ports.ProxyStatusPort, "/proxyMode", "iptables") // the default + // Verify /proxyMode returns http status code 200. + config.GetSelfURLStatusCode(ports.ProxyStatusPort, "/proxyMode", "200") }) // TODO: Remove [Slow] when this has had enough bake time to prove presubmit worthiness. diff --git a/test/e2e/kubectl/proxy.go b/test/e2e/network/proxy.go similarity index 99% rename from test/e2e/kubectl/proxy.go rename to test/e2e/network/proxy.go index 5fb16bbdbab..dd6ae3b4f26 100644 --- a/test/e2e/kubectl/proxy.go +++ b/test/e2e/network/proxy.go @@ -14,9 +14,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -// OWNER = sig/cli +// OWNER = sig/network -package kubectl +package network import ( "fmt" @@ -51,7 +51,7 @@ const ( proxyHTTPCallTimeout = 30 * time.Second ) -var _ = SIGDescribe("Kubectl Proxy", func() { +var _ = SIGDescribe("Proxy", func() { version := testapi.Groups[v1.GroupName].GroupVersion().Version Context("version "+version, func() { options := framework.FrameworkOptions{ diff --git a/test/e2e/network/service.go b/test/e2e/network/service.go index 6de1f54c945..eee7dc663a1 100644 --- a/test/e2e/network/service.go +++ b/test/e2e/network/service.go @@ -29,7 +29,6 @@ import ( "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" - "k8s.io/kubernetes/pkg/api/v1/service" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" "k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/controller/endpoint" @@ -1454,7 +1453,7 @@ var _ = SIGDescribe("ESIPP [Slow]", func() { svc := jig.CreateOnlyLocalLoadBalancerService(namespace, serviceName, loadBalancerCreateTimeout, true, nil) serviceLBNames = append(serviceLBNames, cloudprovider.GetLoadBalancerName(svc)) - healthCheckNodePort := int(service.GetServiceHealthCheckNodePort(svc)) + healthCheckNodePort := int(svc.Spec.HealthCheckNodePort) if healthCheckNodePort == 0 { framework.Failf("Service HealthCheck NodePort was not allocated") } @@ -1531,7 +1530,7 @@ var _ = SIGDescribe("ESIPP [Slow]", func() { Expect(cs.Core().Services(svc.Namespace).Delete(svc.Name, nil)).NotTo(HaveOccurred()) }() - healthCheckNodePort := int(service.GetServiceHealthCheckNodePort(svc)) + healthCheckNodePort := int(svc.Spec.HealthCheckNodePort) if healthCheckNodePort == 0 { framework.Failf("Service HealthCheck NodePort was not allocated") } @@ -1636,13 +1635,13 @@ var _ = SIGDescribe("ESIPP [Slow]", func() { }() // save the health check node port because it disappears when ESIPP is turned off. - healthCheckNodePort := int(service.GetServiceHealthCheckNodePort(svc)) + healthCheckNodePort := int(svc.Spec.HealthCheckNodePort) By("turning ESIPP off") svc = jig.UpdateServiceOrFail(svc.Namespace, svc.Name, func(svc *v1.Service) { svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeCluster }) - if service.GetServiceHealthCheckNodePort(svc) > 0 { + if svc.Spec.HealthCheckNodePort > 0 { framework.Failf("Service HealthCheck NodePort still present") } diff --git a/test/e2e/node/BUILD b/test/e2e/node/BUILD index d12ea9c1bba..9bacfabe68c 100644 --- a/test/e2e/node/BUILD +++ b/test/e2e/node/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,13 +9,12 @@ go_library( name = "go_default_library", srcs = [ "apparmor.go", + "framework.go", "kubelet.go", "kubelet_perf.go", "nodeoutofdisk.go", "security_context.go", - "sig.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/testapi:go_default_library", "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", diff --git a/test/e2e/node/sig.go b/test/e2e/node/framework.go similarity index 100% rename from test/e2e/node/sig.go rename to test/e2e/node/framework.go diff --git a/test/e2e/perftype/BUILD b/test/e2e/perftype/BUILD index b815d9296d3..ebd879cbce2 100644 --- a/test/e2e/perftype/BUILD +++ b/test/e2e/perftype/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["perftype.go"], - tags = ["automanaged"], ) filegroup( diff --git a/test/e2e/scalability/BUILD b/test/e2e/scalability/BUILD index 36a85c3f238..6221357dc41 100644 --- a/test/e2e/scalability/BUILD +++ b/test/e2e/scalability/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "framework.go", "load.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/apis/batch:go_default_library", diff --git a/test/e2e/scheduling/BUILD b/test/e2e/scheduling/BUILD index a5e83f66d5d..fbec227aa5b 100644 --- a/test/e2e/scheduling/BUILD +++ b/test/e2e/scheduling/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "priorities.go", "rescheduler.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1/helper:go_default_library", diff --git a/test/e2e/storage/BUILD b/test/e2e/storage/BUILD index 17d539e7ba7..38d2d027665 100644 --- a/test/e2e/storage/BUILD +++ b/test/e2e/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -31,12 +29,12 @@ go_library( "vsphere_volume_placement.go", "vsphere_volume_vsan_policy.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/testapi:go_default_library", "//pkg/api/v1/helper:go_default_library", "//pkg/apis/storage/v1/util:go_default_library", "//pkg/cloudprovider/providers/vsphere:go_default_library", + "//pkg/cloudprovider/providers/vsphere/vclib:go_default_library", "//pkg/kubelet/apis:go_default_library", "//pkg/volume/util/volumehelper:go_default_library", "//test/e2e/framework:go_default_library", diff --git a/test/e2e/storage/persistent_volumes-local.go b/test/e2e/storage/persistent_volumes-local.go index 4e26fe49d48..4554947e7c3 100644 --- a/test/e2e/storage/persistent_volumes-local.go +++ b/test/e2e/storage/persistent_volumes-local.go @@ -50,8 +50,6 @@ type localTestVolume struct { node *v1.Node // Path to the volume on the host node hostDir string - // Path to the volume in the local util container - containerDir string // PVC for this volume pvc *v1.PersistentVolumeClaim // PV for this volume @@ -322,8 +320,10 @@ var _ = SIGDescribe("PersistentVolumes-local [Feature:LocalPersistentVolumes] [S By("Creating a directory under discovery path") framework.Logf("creating local volume under path %q", volumePath) mkdirCmd := fmt.Sprintf("mkdir %v -m 777", volumePath) - _, err := framework.NodeExec(node0.Name, mkdirCmd) + err := framework.IssueSSHCommand(mkdirCmd, framework.TestContext.Provider, node0) Expect(err).NotTo(HaveOccurred()) + + By("Waiting for a PersitentVolume to be created") oldPV, err := waitForLocalPersistentVolume(config.client, volumePath) Expect(err).NotTo(HaveOccurred()) @@ -333,22 +333,27 @@ var _ = SIGDescribe("PersistentVolumes-local [Feature:LocalPersistentVolumes] [S Expect(err).NotTo(HaveOccurred()) err = framework.WaitForPersistentVolumeClaimPhase( v1.ClaimBound, config.client, claim.Namespace, claim.Name, framework.Poll, 1*time.Minute) - Expect(claim.Spec.VolumeName).To(Equal(oldPV.Name)) Expect(err).NotTo(HaveOccurred()) + claim, err = config.client.Core().PersistentVolumeClaims(config.ns).Get(claim.Name, metav1.GetOptions{}) + Expect(err).NotTo(HaveOccurred()) + Expect(claim.Spec.VolumeName).To(Equal(oldPV.Name)) + // Delete the persistent volume claim: file will be cleaned up and volume be re-created. By("Deleting the persistent volume claim to clean up persistent volume and re-create one") - writeCmd, readCmd := createWriteAndReadCmds(volumePath, testFile, testFileContent) - _, err = framework.NodeExec(node0.Name, writeCmd) + writeCmd, _ := createWriteAndReadCmds(volumePath, testFile, testFileContent) + err = framework.IssueSSHCommand(writeCmd, framework.TestContext.Provider, node0) Expect(err).NotTo(HaveOccurred()) err = config.client.Core().PersistentVolumeClaims(claim.Namespace).Delete(claim.Name, &metav1.DeleteOptions{}) Expect(err).NotTo(HaveOccurred()) + + By("Waiting for a new PersistentVolume to be re-created") newPV, err := waitForLocalPersistentVolume(config.client, volumePath) Expect(err).NotTo(HaveOccurred()) Expect(newPV.UID).NotTo(Equal(oldPV.UID)) - result, err := framework.NodeExec(node0.Name, readCmd) + fileDoesntExistCmd := createFileDoesntExistCmd(volumePath, testFile) + err = framework.IssueSSHCommand(fileDoesntExistCmd, framework.TestContext.Provider, node0) Expect(err).NotTo(HaveOccurred()) - Expect(result.Code).NotTo(BeZero(), "file should be deleted across local pv recreation, but exists") }) }) }) @@ -362,18 +367,16 @@ func podNodeName(config *localTestConfig, pod *v1.Pod) (string, error) { // setupLocalVolume setups a directory to user for local PV func setupLocalVolume(config *localTestConfig) *localTestVolume { testDirName := "local-volume-test-" + string(uuid.NewUUID()) - testDir := filepath.Join(containerBase, testDirName) hostDir := filepath.Join(hostBase, testDirName) // populate volume with testFile containing testFileContent - writeCmd, _ := createWriteAndReadCmds(testDir, testFile, testFileContent) + writeCmd, _ := createWriteAndReadCmds(hostDir, testFile, testFileContent) By(fmt.Sprintf("Creating local volume on node %q at path %q", config.node0.Name, hostDir)) - _, err := framework.NodeExec(config.node0.Name, writeCmd) + err := framework.IssueSSHCommand(writeCmd, framework.TestContext.Provider, config.node0) Expect(err).NotTo(HaveOccurred()) return &localTestVolume{ - node: config.node0, - hostDir: hostDir, - containerDir: testDir, + node: config.node0, + hostDir: hostDir, } } @@ -390,8 +393,8 @@ func cleanupLocalVolume(config *localTestConfig, volume *localTestVolume) { } By("Removing the test directory") - removeCmd := fmt.Sprintf("rm -r %s", volume.containerDir) - _, err := framework.NodeExec(config.node0.Name, removeCmd) + removeCmd := fmt.Sprintf("rm -r %s", volume.hostDir) + err := framework.IssueSSHCommand(removeCmd, framework.TestContext.Provider, config.node0) Expect(err).NotTo(HaveOccurred()) } @@ -459,7 +462,7 @@ func createLocalPod(config *localTestConfig, volume *localTestVolume) (*v1.Pod, } // Create corresponding write and read commands -// to be executed inside containers with local PV attached +// to be executed via SSH on the node with the local PV func createWriteAndReadCmds(testFileDir string, testFile string, writeTestFileContent string) (writeCmd string, readCmd string) { testFilePath := filepath.Join(testFileDir, testFile) writeCmd = fmt.Sprintf("mkdir -p %s; echo %s > %s", testFileDir, writeTestFileContent, testFilePath) @@ -467,6 +470,13 @@ func createWriteAndReadCmds(testFileDir string, testFile string, writeTestFileCo return writeCmd, readCmd } +// Create command to verify that the file doesn't exist +// to be executed via SSH on the node with the local PV +func createFileDoesntExistCmd(testFileDir string, testFile string) string { + testFilePath := filepath.Join(testFileDir, testFile) + return fmt.Sprintf("[ ! -e %s ]", testFilePath) +} + // Execute a read or write command in a pod. // Fail on error func podRWCmdExec(pod *v1.Pod, cmd string) string { @@ -495,7 +505,7 @@ func setupLocalVolumeProvisioner(config *localTestConfig) { By("Initializing local volume discovery base path") mkdirCmd := fmt.Sprintf("mkdir %v -m 777", path.Join(hostBase, discoveryDir)) - _, err := framework.NodeExec(config.node0.Name, mkdirCmd) + err := framework.IssueSSHCommand(mkdirCmd, framework.TestContext.Provider, config.node0) Expect(err).NotTo(HaveOccurred()) } @@ -505,7 +515,7 @@ func cleanupLocalVolumeProvisioner(config *localTestConfig, volumePath string) { By("Removing the test directory") removeCmd := fmt.Sprintf("rm -r %s", path.Join(hostBase, discoveryDir)) - _, err := framework.NodeExec(config.node0.Name, removeCmd) + err := framework.IssueSSHCommand(removeCmd, framework.TestContext.Provider, config.node0) Expect(err).NotTo(HaveOccurred()) By("Cleaning up persistent volume") diff --git a/test/e2e/storage/persistent_volumes-vsphere.go b/test/e2e/storage/persistent_volumes-vsphere.go index d4f8cba606c..9e9caa1b503 100644 --- a/test/e2e/storage/persistent_volumes-vsphere.go +++ b/test/e2e/storage/persistent_volumes-vsphere.go @@ -102,7 +102,7 @@ var _ = SIGDescribe("PersistentVolumes:vsphere", func() { By("Creating the Client Pod") clientPod, err = framework.CreateClientPod(c, ns, pvc) Expect(err).NotTo(HaveOccurred()) - node := types.NodeName(clientPod.Spec.NodeName) + node = types.NodeName(clientPod.Spec.NodeName) By("Verify disk should be attached to the node") isAttached, err := verifyVSphereDiskAttached(vsp, volumePath, node) diff --git a/test/e2e/storage/volume_provisioning.go b/test/e2e/storage/volume_provisioning.go index b6f0f62e460..5b038f8dbc7 100644 --- a/test/e2e/storage/volume_provisioning.go +++ b/test/e2e/storage/volume_provisioning.go @@ -521,7 +521,7 @@ var _ = SIGDescribe("Dynamic Provisioning", func() { It("should let an external dynamic provisioner create and delete persistent volumes [Slow]", func() { // external dynamic provisioner pods need additional permissions provided by the // persistent-volume-provisioner role - framework.BindClusterRole(c.Rbac(), "system:persistent-volume-provisioner", ns, + framework.BindClusterRole(c.RbacV1beta1(), "system:persistent-volume-provisioner", ns, rbacv1beta1.Subject{Kind: rbacv1beta1.ServiceAccountKind, Namespace: ns, Name: "default"}) err := framework.WaitForAuthorizationUpdate(c.AuthorizationV1beta1(), diff --git a/test/e2e/storage/volumes.go b/test/e2e/storage/volumes.go index 0fe7287dacb..f5c91a583f5 100644 --- a/test/e2e/storage/volumes.go +++ b/test/e2e/storage/volumes.go @@ -54,6 +54,7 @@ import ( "k8s.io/apimachinery/pkg/types" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere" + kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis" "k8s.io/kubernetes/test/e2e/framework" ) @@ -429,6 +430,11 @@ var _ = SIGDescribe("Volumes", func() { config = framework.VolumeTestConfig{ Namespace: namespace.Name, Prefix: "pd", + // PD will be created in framework.TestContext.CloudConfig.Zone zone, + // so pods should be also scheduled there. + NodeSelector: map[string]string{ + kubeletapis.LabelZoneFailureDomain: framework.TestContext.CloudConfig.Zone, + }, } }) diff --git a/test/e2e/storage/vsphere_utils.go b/test/e2e/storage/vsphere_utils.go index 2ff91a3b932..57e159c0ace 100644 --- a/test/e2e/storage/vsphere_utils.go +++ b/test/e2e/storage/vsphere_utils.go @@ -33,6 +33,7 @@ import ( "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" vsphere "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere" + "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib" "k8s.io/kubernetes/pkg/volume/util/volumehelper" "k8s.io/kubernetes/test/e2e/framework" ) @@ -160,13 +161,13 @@ func getVSpherePersistentVolumeClaimSpec(namespace string, labels map[string]str } // function to create vmdk volume -func createVSphereVolume(vsp *vsphere.VSphere, volumeOptions *vsphere.VolumeOptions) (string, error) { +func createVSphereVolume(vsp *vsphere.VSphere, volumeOptions *vclib.VolumeOptions) (string, error) { var ( volumePath string err error ) if volumeOptions == nil { - volumeOptions = new(vsphere.VolumeOptions) + volumeOptions = new(vclib.VolumeOptions) volumeOptions.CapacityKB = 2097152 volumeOptions.Name = "e2e-vmdk-" + strconv.FormatInt(time.Now().UnixNano(), 10) } diff --git a/test/e2e/storage/vsphere_volume_fstype.go b/test/e2e/storage/vsphere_volume_fstype.go index 6a706431543..e62af60196a 100644 --- a/test/e2e/storage/vsphere_volume_fstype.go +++ b/test/e2e/storage/vsphere_volume_fstype.go @@ -22,8 +22,6 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "k8s.io/api/core/v1" - storage "k8s.io/api/storage/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" k8stype "k8s.io/apimachinery/pkg/types" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere" @@ -48,10 +46,8 @@ import ( var _ = SIGDescribe("vsphere Volume fstype", func() { f := framework.NewDefaultFramework("volume-fstype") var ( - client clientset.Interface - namespace string - storageclass *storage.StorageClass - pvclaim *v1.PersistentVolumeClaim + client clientset.Interface + namespace string ) BeforeEach(func() { framework.SkipUnlessProviderIs("vsphere") @@ -60,87 +56,56 @@ var _ = SIGDescribe("vsphere Volume fstype", func() { nodeList := framework.GetReadySchedulableNodesOrDie(f.ClientSet) Expect(len(nodeList.Items)).NotTo(BeZero(), "Unable to find ready and schedulable Node") }) - AfterEach(func() { - var scDeleteError error - var pvDeleteError error - if storageclass != nil { - scDeleteError = client.StorageV1beta1().StorageClasses().Delete(storageclass.Name, nil) - } - if pvclaim != nil { - pvDeleteError = client.CoreV1().PersistentVolumeClaims(namespace).Delete(pvclaim.Name, nil) - } - framework.ExpectNoError(scDeleteError) - framework.ExpectNoError(pvDeleteError) - storageclass = nil - pvclaim = nil - }) It("verify fstype - ext3 formatted volume", func() { By("Invoking Test for fstype: ext3") - storageclass, pvclaim = invokeTestForFstype(f, client, namespace, "ext3", "ext3") + invokeTestForFstype(f, client, namespace, "ext3", "ext3") }) It("verify disk format type - default value should be ext4", func() { By("Invoking Test for fstype: Default Value") - storageclass, pvclaim = invokeTestForFstype(f, client, namespace, "", "ext4") + invokeTestForFstype(f, client, namespace, "", "ext4") }) }) -func invokeTestForFstype(f *framework.Framework, client clientset.Interface, namespace string, fstype string, expectedContent string) (*storage.StorageClass, *v1.PersistentVolumeClaim) { - +func invokeTestForFstype(f *framework.Framework, client clientset.Interface, namespace string, fstype string, expectedContent string) { framework.Logf("Invoking Test for fstype: %s", fstype) scParameters := make(map[string]string) scParameters["fstype"] = fstype By("Creating Storage Class With Fstype") - storageClassSpec := getVSphereStorageClassSpec("fstype", scParameters) - storageclass, err := client.StorageV1().StorageClasses().Create(storageClassSpec) + storageclass, err := client.StorageV1().StorageClasses().Create(getVSphereStorageClassSpec("fstype", scParameters)) Expect(err).NotTo(HaveOccurred()) + defer client.StorageV1().StorageClasses().Delete(storageclass.Name, nil) By("Creating PVC using the Storage Class") - pvclaimSpec := getVSphereClaimSpecWithStorageClassAnnotation(namespace, storageclass) - pvclaim, err := client.CoreV1().PersistentVolumeClaims(namespace).Create(pvclaimSpec) + pvclaim, err := client.CoreV1().PersistentVolumeClaims(namespace).Create(getVSphereClaimSpecWithStorageClassAnnotation(namespace, storageclass)) Expect(err).NotTo(HaveOccurred()) + defer framework.DeletePersistentVolumeClaim(client, pvclaim.Name, namespace) + var pvclaims []*v1.PersistentVolumeClaim + pvclaims = append(pvclaims, pvclaim) By("Waiting for claim to be in bound phase") - err = framework.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, client, pvclaim.Namespace, pvclaim.Name, framework.Poll, framework.ClaimProvisionTimeout) - Expect(err).NotTo(HaveOccurred()) - - // Get new copy of the claim - pvclaim, err = client.CoreV1().PersistentVolumeClaims(pvclaim.Namespace).Get(pvclaim.Name, metav1.GetOptions{}) - Expect(err).NotTo(HaveOccurred()) - - // Get the bound PV - pv, err := client.CoreV1().PersistentVolumes().Get(pvclaim.Spec.VolumeName, metav1.GetOptions{}) + persistentvolumes, err := framework.WaitForPVClaimBoundPhase(client, pvclaims) Expect(err).NotTo(HaveOccurred()) By("Creating pod to attach PV to the node") // Create pod to attach Volume to Node - podSpec := getVSpherePodSpecWithClaim(pvclaim.Name, nil, "/bin/df -T /mnt/test | /bin/awk 'FNR == 2 {print $2}' > /mnt/test/fstype && while true ; do sleep 2 ; done") - pod, err := client.CoreV1().Pods(namespace).Create(podSpec) - Expect(err).NotTo(HaveOccurred()) - - By("Waiting for pod to be running") - Expect(framework.WaitForPodNameRunningInNamespace(client, pod.Name, namespace)).To(Succeed()) - - pod, err = client.CoreV1().Pods(namespace).Get(pod.Name, metav1.GetOptions{}) + pod, err := framework.CreatePod(client, namespace, pvclaims, false, "") Expect(err).NotTo(HaveOccurred()) // Asserts: Right disk is attached to the pod vsp, err := vsphere.GetVSphere() Expect(err).NotTo(HaveOccurred()) - isAttached, err := verifyVSphereDiskAttached(vsp, pv.Spec.VsphereVolume.VolumePath, k8stype.NodeName(pod.Spec.NodeName)) - Expect(err).NotTo(HaveOccurred()) - Expect(isAttached).To(BeTrue(), "disk is not attached with the node") + By("Verify the volume is accessible and available in the pod") + verifyVSphereVolumesAccessible(pod, persistentvolumes, vsp) _, err = framework.LookForStringInPodExec(namespace, pod.Name, []string{"/bin/cat", "/mnt/test/fstype"}, expectedContent, time.Minute) Expect(err).NotTo(HaveOccurred()) - var volumePaths []string - volumePaths = append(volumePaths, pv.Spec.VsphereVolume.VolumePath) + By("Deleting pod") + framework.DeletePodWithWait(f, client, pod) - By("Delete pod and wait for volume to be detached from node") - deletePodAndWaitForVolumeToDetach(f, client, pod, vsp, pod.Spec.NodeName, volumePaths) - - return storageclass, pvclaim + By("Waiting for volumes to be detached from the node") + waitForVSphereDiskToDetach(vsp, persistentvolumes[0].Spec.VsphereVolume.VolumePath, k8stype.NodeName(pod.Spec.NodeName)) } diff --git a/test/e2e/storage/vsphere_volume_placement.go b/test/e2e/storage/vsphere_volume_placement.go index 559f6863a51..e5a50a6adfb 100644 --- a/test/e2e/storage/vsphere_volume_placement.go +++ b/test/e2e/storage/vsphere_volume_placement.go @@ -29,6 +29,7 @@ import ( "k8s.io/apimachinery/pkg/util/uuid" clientset "k8s.io/client-go/kubernetes" vsphere "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere" + "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib" "k8s.io/kubernetes/test/e2e/framework" ) @@ -216,8 +217,8 @@ var _ = SIGDescribe("Volume Placement", func() { */ It("should create and delete pod with multiple volumes from different datastore", func() { By("creating another vmdk on non default shared datastore") - var volumeOptions *vsphere.VolumeOptions - volumeOptions = new(vsphere.VolumeOptions) + var volumeOptions *vclib.VolumeOptions + volumeOptions = new(vclib.VolumeOptions) volumeOptions.CapacityKB = 2097152 volumeOptions.Name = "e2e-vmdk-" + strconv.FormatInt(time.Now().UnixNano(), 10) volumeOptions.Datastore = os.Getenv("VSPHERE_SECOND_SHARED_DATASTORE") diff --git a/test/e2e/storage/vsphere_volume_vsan_policy.go b/test/e2e/storage/vsphere_volume_vsan_policy.go index 3210c4adbe7..1c99814223b 100644 --- a/test/e2e/storage/vsphere_volume_vsan_policy.go +++ b/test/e2e/storage/vsphere_volume_vsan_policy.go @@ -218,7 +218,7 @@ var _ = SIGDescribe("vSphere Storage policy support for dynamic provisioning", f framework.Logf("Invoking Test for SPBM storage policy on a non-compatible datastore: %+v", scParameters) err := invokeInvalidPolicyTestNeg(client, namespace, scParameters) Expect(err).To(HaveOccurred()) - errorMsg := "User specified datastore: \\\"" + VsanDatastore + "\\\" is not compatible with the storagePolicy: \\\"" + os.Getenv("VSPHERE_SPBM_TAG_POLICY") + "\\\"" + errorMsg := "User specified datastore is not compatible with the storagePolicy: \\\"" + os.Getenv("VSPHERE_SPBM_TAG_POLICY") + "\\\"" if !strings.Contains(err.Error(), errorMsg) { Expect(err).NotTo(HaveOccurred(), errorMsg) } @@ -248,7 +248,7 @@ var _ = SIGDescribe("vSphere Storage policy support for dynamic provisioning", f framework.Logf("Invoking Test for SPBM storage policy and VSAN capabilities together: %+v", scParameters) err := invokeInvalidPolicyTestNeg(client, namespace, scParameters) Expect(err).To(HaveOccurred()) - errorMsg := "Cannot specify storage policy capabilities along with storage policy name. Please specify only one." + errorMsg := "Cannot specify storage policy capabilities along with storage policy name. Please specify only one" if !strings.Contains(err.Error(), errorMsg) { Expect(err).NotTo(HaveOccurred(), errorMsg) } diff --git a/test/e2e/upgrades/BUILD b/test/e2e/upgrades/BUILD index fafed1c0b1e..e049ed86771 100644 --- a/test/e2e/upgrades/BUILD +++ b/test/e2e/upgrades/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -22,7 +20,6 @@ go_library( "sysctl.go", "upgrade.go", ], - tags = ["automanaged"], deps = [ "//pkg/api/v1/helper:go_default_library", "//pkg/kubelet/sysctl:go_default_library", diff --git a/test/e2e/upgrades/apps/BUILD b/test/e2e/upgrades/apps/BUILD index 573308257cf..1e448896e50 100644 --- a/test/e2e/upgrades/apps/BUILD +++ b/test/e2e/upgrades/apps/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "job.go", "statefulset.go", ], - tags = ["automanaged"], deps = [ "//pkg/controller:go_default_library", "//pkg/controller/deployment/util:go_default_library", diff --git a/test/e2e/upgrades/storage/BUILD b/test/e2e/upgrades/storage/BUILD index ac7b06f9423..9adedf6b5d4 100644 --- a/test/e2e/upgrades/storage/BUILD +++ b/test/e2e/upgrades/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["persistent_volumes.go"], - tags = ["automanaged"], deps = [ "//test/e2e/framework:go_default_library", "//test/e2e/upgrades:go_default_library", diff --git a/test/e2e_federation/BUILD b/test/e2e_federation/BUILD index 274a930df30..4d52f3f4989 100644 --- a/test/e2e_federation/BUILD +++ b/test/e2e_federation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,13 +13,13 @@ go_library( "crud.go", "event.go", "ingress.go", + "job.go", "namespace.go", "replicaset.go", "service.go", "upgrade.go", "util.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/federation:go_default_library", "//federation/apis/federation/v1beta1:go_default_library", @@ -29,6 +27,7 @@ go_library( "//federation/client/clientset_generated/federation_clientset/typed/core/v1:go_default_library", "//federation/pkg/federatedtypes:go_default_library", "//federation/pkg/federation-controller/util:go_default_library", + "//pkg/api:go_default_library", "//pkg/api/v1:go_default_library", "//pkg/cloudprovider:go_default_library", "//test/e2e/chaosmonkey:go_default_library", @@ -38,6 +37,7 @@ go_library( "//test/e2e_federation/upgrades:go_default_library", "//vendor/github.com/onsi/ginkgo:go_default_library", "//vendor/github.com/onsi/gomega:go_default_library", + "//vendor/k8s.io/api/batch/v1: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/errors:go_default_library", diff --git a/test/e2e_federation/OWNERS b/test/e2e_federation/OWNERS index ad98c68b671..b60580337e5 100644 --- a/test/e2e_federation/OWNERS +++ b/test/e2e_federation/OWNERS @@ -13,3 +13,4 @@ approvers: - mwielgus - nikhiljindal - quinton-hoole + - shashidharatd diff --git a/test/e2e_federation/crud.go b/test/e2e_federation/crud.go index ba8c850b00d..91d534a227b 100644 --- a/test/e2e_federation/crud.go +++ b/test/e2e_federation/crud.go @@ -45,7 +45,7 @@ var _ = framework.KubeDescribe("Federated types [Feature:Federation][Experimenta if clusterClients == nil { clusterClients = f.GetClusterClients() } - adapter := fedType.AdapterFactory(f.FederationClientset, f.FederationConfig) + adapter := fedType.AdapterFactory(f.FederationClientset, f.FederationConfig, nil) crudTester := fedframework.NewFederatedTypeCRUDTester(adapter, clusterClients) obj := adapter.NewTestObject(f.FederationNamespace.Name) crudTester.CheckLifecycle(obj) diff --git a/test/e2e_federation/framework/BUILD b/test/e2e_federation/framework/BUILD index 82c6022ee42..d6b67b7043c 100644 --- a/test/e2e_federation/framework/BUILD +++ b/test/e2e_federation/framework/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "framework.go", "util.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/client/clientset_generated/federation_clientset:go_default_library", diff --git a/test/e2e_federation/ingress.go b/test/e2e_federation/ingress.go index bc77721a22e..8782792c1cf 100644 --- a/test/e2e_federation/ingress.go +++ b/test/e2e_federation/ingress.go @@ -163,7 +163,7 @@ var _ = framework.KubeDescribe("Federated ingresses [Feature:Federation]", func( clusters = f.GetRegisteredClusters() ns = f.FederationNamespace.Name // create backend service - service = createLBServiceOrFail(f.FederationClientset, ns, FederatedIngressServiceName) + service = createLBServiceOrFail(f.FederationClientset, ns, FederatedIngressServiceName, clusters) // create the TLS secret secret = createTLSSecretOrFail(f.FederationClientset, ns, FederatedIngressTLSSecretName) // wait for services objects sync diff --git a/test/e2e_federation/job.go b/test/e2e_federation/job.go new file mode 100644 index 00000000000..71ad152ba4b --- /dev/null +++ b/test/e2e_federation/job.go @@ -0,0 +1,291 @@ +/* +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 e2e_federation + +import ( + "fmt" + "strings" + "time" + + batchv1 "k8s.io/api/batch/v1" + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" + fedclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset" + fedutil "k8s.io/kubernetes/federation/pkg/federation-controller/util" + "k8s.io/kubernetes/test/e2e/framework" + fedframework "k8s.io/kubernetes/test/e2e_federation/framework" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/kubernetes/pkg/api" +) + +const ( + FederationJobName = "federation-job" +) + +var _ = framework.KubeDescribe("Federation jobs [Feature:Federation]", func() { + + f := fedframework.NewDefaultFederatedFramework("federation-job") + + Describe("Job objects [NoCluster]", func() { + AfterEach(func() { + fedframework.SkipUnlessFederated(f.ClientSet) + + // Delete all jobs. + nsName := f.FederationNamespace.Name + deleteAllJobsOrFail(f.FederationClientset, nsName) + }) + + It("should be created and deleted successfully", func() { + fedframework.SkipUnlessFederated(f.ClientSet) + + nsName := f.FederationNamespace.Name + job := createJobOrFail(f.FederationClientset, nsName) + By(fmt.Sprintf("Creation of job %q in namespace %q succeeded. Deleting job.", job.Name, nsName)) + // Cleanup + err := f.FederationClientset.Batch().Jobs(nsName).Delete(job.Name, &metav1.DeleteOptions{}) + framework.ExpectNoError(err, "Error deleting job %q in namespace %q", job.Name, job.Namespace) + By(fmt.Sprintf("Deletion of job %q in namespace %q succeeded.", job.Name, nsName)) + }) + + }) + + // e2e cases for federated job controller + Describe("Federated Job", func() { + var ( + clusters fedframework.ClusterSlice + ) + BeforeEach(func() { + fedframework.SkipUnlessFederated(f.ClientSet) + clusters = f.GetRegisteredClusters() + }) + + AfterEach(func() { + nsName := f.FederationNamespace.Name + deleteAllJobsOrFail(f.FederationClientset, nsName) + }) + + It("should create and update matching jobs in underlying clusters", func() { + nsName := f.FederationNamespace.Name + job := createJobOrFail(f.FederationClientset, nsName) + defer func() { + // cleanup. deletion of jobs is not supported for underlying clusters + By(fmt.Sprintf("Deleting job %q/%q", nsName, job.Name)) + waitForJobOrFail(f.FederationClientset, nsName, job.Name, clusters) + f.FederationClientset.Batch().Jobs(nsName).Delete(job.Name, &metav1.DeleteOptions{}) + }() + + waitForJobOrFail(f.FederationClientset, nsName, job.Name, clusters) + By(fmt.Sprintf("Successfuly created and synced job %q/%q to clusters", nsName, job.Name)) + }) + + It("should be deleted from underlying clusters when OrphanDependents is false", func() { + fedframework.SkipUnlessFederated(f.ClientSet) + nsName := f.FederationNamespace.Name + orphanDependents := false + verifyCascadingDeletionForJob(f.FederationClientset, clusters, &orphanDependents, nsName) + By(fmt.Sprintf("Verified that jobs were deleted from underlying clusters")) + }) + + It("should not be deleted from underlying clusters when OrphanDependents is true", func() { + fedframework.SkipUnlessFederated(f.ClientSet) + nsName := f.FederationNamespace.Name + orphanDependents := true + verifyCascadingDeletionForJob(f.FederationClientset, clusters, &orphanDependents, nsName) + By(fmt.Sprintf("Verified that jobs were not deleted from underlying clusters")) + }) + + It("should not be deleted from underlying clusters when OrphanDependents is nil", func() { + fedframework.SkipUnlessFederated(f.ClientSet) + nsName := f.FederationNamespace.Name + verifyCascadingDeletionForJob(f.FederationClientset, clusters, nil, nsName) + By(fmt.Sprintf("Verified that jobs were not deleted from underlying clusters")) + }) + + }) +}) + +// deleteAllJobsOrFail deletes all jobs in the given namespace name. +func deleteAllJobsOrFail(clientset *fedclientset.Clientset, nsName string) { + jobList, err := clientset.Batch().Jobs(nsName).List(metav1.ListOptions{}) + Expect(err).NotTo(HaveOccurred()) + orphanDependents := false + for _, job := range jobList.Items { + deleteJobOrFail(clientset, nsName, job.Name, &orphanDependents) + } +} + +// verifyCascadingDeletionForJob verifies that job are deleted +// from underlying clusters when orphan dependents is false and they are not +// deleted when orphan dependents is true. +func verifyCascadingDeletionForJob(clientset *fedclientset.Clientset, clusters fedframework.ClusterSlice, orphanDependents *bool, nsName string) { + job := createJobOrFail(clientset, nsName) + jobName := job.Name + // Check subclusters if the job was created there. + By(fmt.Sprintf("Waiting for job %s to be created in all underlying clusters", jobName)) + err := wait.Poll(5*time.Second, 2*time.Minute, func() (bool, error) { + for _, cluster := range clusters { + _, err := cluster.Batch().Jobs(nsName).Get(jobName, metav1.GetOptions{}) + if err != nil && errors.IsNotFound(err) { + return false, nil + } + if err != nil { + return false, err + } + } + return true, nil + }) + framework.ExpectNoError(err, "Not all jobs created") + + By(fmt.Sprintf("Deleting job %s", jobName)) + deleteJobOrFail(clientset, nsName, jobName, orphanDependents) + + By(fmt.Sprintf("Verifying job %s in underlying clusters", jobName)) + errMessages := []string{} + // job should be present in underlying clusters unless orphanDependents is false. + shouldExist := orphanDependents == nil || *orphanDependents == true + for _, cluster := range clusters { + clusterName := cluster.Name + _, err := cluster.Batch().Jobs(nsName).Get(jobName, metav1.GetOptions{}) + if shouldExist && errors.IsNotFound(err) { + errMessages = append(errMessages, fmt.Sprintf("unexpected NotFound error for job %s in cluster %s, expected job to exist", jobName, clusterName)) + } else if !shouldExist && !errors.IsNotFound(err) { + errMessages = append(errMessages, fmt.Sprintf("expected NotFound error for job %s in cluster %s, got error: %v", jobName, clusterName, err)) + } + } + if len(errMessages) != 0 { + framework.Failf("%s", strings.Join(errMessages, "; ")) + } +} + +func waitForJobOrFail(c *fedclientset.Clientset, namespace string, jobName string, clusters fedframework.ClusterSlice) { + err := waitForJob(c, namespace, jobName, clusters) + framework.ExpectNoError(err, "Failed to verify job %q/%q, err: %v", namespace, jobName, err) +} + +func waitForJob(c *fedclientset.Clientset, namespace string, jobName string, clusters fedframework.ClusterSlice) error { + err := wait.Poll(10*time.Second, fedframework.FederatedDefaultTestTimeout, func() (bool, error) { + fjob, err := c.Batch().Jobs(namespace).Get(jobName, metav1.GetOptions{}) + if err != nil { + return false, err + } + succeeded := int32(0) + for _, cluster := range clusters { + job, err := cluster.Batch().Jobs(namespace).Get(jobName, metav1.GetOptions{}) + if err != nil && !errors.IsNotFound(err) { + By(fmt.Sprintf("Failed getting job: %q/%q/%q, err: %v", cluster.Name, namespace, jobName, err)) + return false, err + } + if err == nil { + if !verifyJob(fjob, job) { + By(fmt.Sprintf("Job meta or spec not match for cluster %q:\n federation: %v\n cluster: %v", cluster.Name, fjob, job)) + return false, nil + } + succeeded += job.Status.Succeeded + } + } + if succeeded == fjob.Status.Succeeded && + (fjob.Spec.Completions != nil && succeeded == *fjob.Spec.Completions) { + return true, nil + } + By(fmt.Sprintf("Job statuses not match, federation succeeded: %v/%v, clusters succeeded: %v\n", + fjob.Status.Succeeded, func(p *int32) int32 { + if p != nil { + return *p + } else { + return -1 + } + }(fjob.Spec.Completions), succeeded)) + return false, nil + }) + + return err +} + +func verifyJob(fedJob, localJob *batchv1.Job) bool { + localJobObj, _ := api.Scheme.DeepCopy(localJob) + localJob = localJobObj.(*batchv1.Job) + localJob.Spec.ManualSelector = fedJob.Spec.ManualSelector + localJob.Spec.Completions = fedJob.Spec.Completions + localJob.Spec.Parallelism = fedJob.Spec.Parallelism + return fedutil.ObjectMetaAndSpecEquivalent(fedJob, localJob) +} + +func createJobOrFail(clientset *fedclientset.Clientset, namespace string) *batchv1.Job { + if clientset == nil || len(namespace) == 0 { + Fail(fmt.Sprintf("Internal error: invalid parameters passed to createJobOrFail: clientset: %v, namespace: %v", clientset, namespace)) + } + By(fmt.Sprintf("Creating federation job %q in namespace %q", FederationJobName, namespace)) + + job := newJobForFed(namespace, FederationJobName, 5, 5) + + _, err := clientset.Batch().Jobs(namespace).Create(job) + framework.ExpectNoError(err, "Creating job %q in namespace %q", job.Name, namespace) + By(fmt.Sprintf("Successfully created federation job %q in namespace %q", FederationJobName, namespace)) + return job +} + +func deleteJobOrFail(clientset *fedclientset.Clientset, nsName string, jobName string, orphanDependents *bool) { + By(fmt.Sprintf("Deleting job %q in namespace %q", jobName, nsName)) + err := clientset.Batch().Jobs(nsName).Delete(jobName, &metav1.DeleteOptions{OrphanDependents: orphanDependents}) + if err != nil && !errors.IsNotFound(err) { + framework.ExpectNoError(err, "Error deleting job %q in namespace %q", jobName, nsName) + } + + // Wait for the job to be deleted. + err = wait.Poll(10*time.Second, fedframework.FederatedDefaultTestTimeout, func() (bool, error) { + _, err := clientset.Batch().Jobs(nsName).Get(jobName, metav1.GetOptions{}) + if err != nil && errors.IsNotFound(err) { + return true, nil + } + return false, err + }) + if err != nil { + framework.Failf("Error in deleting job %s: %v", jobName, err) + } +} + +func newJobForFed(namespace string, name string, completions int32, parallelism int32) *batchv1.Job { + return &batchv1.Job{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + Spec: batchv1.JobSpec{ + Parallelism: ¶llelism, + Completions: &completions, + Template: v1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{"name": "fjob"}, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "sleep", + Image: "gcr.io/google_containers/busybox:1.24", + Command: []string{"sleep", "1"}, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + }, + }, + } +} diff --git a/test/e2e_federation/service.go b/test/e2e_federation/service.go index 6dda940c687..5713ad2f2dd 100644 --- a/test/e2e_federation/service.go +++ b/test/e2e_federation/service.go @@ -183,7 +183,7 @@ var _ = framework.KubeDescribe("Federated Services [Feature:Federation]", func() backendPods = createBackendPodsOrFail(clusters, nsName, FederatedServicePodName) - service = createLBServiceOrFail(f.FederationClientset, nsName, FederatedServiceName) + service = createLBServiceOrFail(f.FederationClientset, nsName, FederatedServiceName, clusters) obj, err := scheme.Scheme.DeepCopy(service) // Cloning shouldn't fail. On the off-chance it does, we // should shallow copy service to serviceShard before diff --git a/test/e2e_federation/upgrades/BUILD b/test/e2e_federation/upgrades/BUILD index e187b3607a8..be79ca8f1d2 100644 --- a/test/e2e_federation/upgrades/BUILD +++ b/test/e2e_federation/upgrades/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "simple.go", "upgrade.go", ], - tags = ["automanaged"], deps = [ "//federation/pkg/federatedtypes:go_default_library", "//federation/pkg/federatedtypes/crudtester:go_default_library", diff --git a/test/e2e_federation/upgrades/simple.go b/test/e2e_federation/upgrades/simple.go index 75854ed297d..6516ecd204f 100644 --- a/test/e2e_federation/upgrades/simple.go +++ b/test/e2e_federation/upgrades/simple.go @@ -38,7 +38,7 @@ type SimpleUpgradeTest struct { // Setup creates a resource and validates its propagation to member clusters func (ut *SimpleUpgradeTest) Setup(f *fedframework.Framework) { - adapter := ut.adapterFactory(f.FederationClientset, f.FederationConfig) + adapter := ut.adapterFactory(f.FederationClientset, f.FederationConfig, nil) clients := f.GetClusterClients() ut.crudTester = fedframework.NewFederatedTypeCRUDTester(adapter, clients) diff --git a/test/e2e_federation/util.go b/test/e2e_federation/util.go index 0ddf52c0da5..73b55a836ea 100644 --- a/test/e2e_federation/util.go +++ b/test/e2e_federation/util.go @@ -144,7 +144,7 @@ func createService(clientset *fedclientset.Clientset, namespace, name string) (* return clientset.CoreV1().Services(namespace).Create(service) } -func createLBService(clientset *fedclientset.Clientset, namespace, name string) (*v1.Service, error) { +func createLBService(clientset *fedclientset.Clientset, namespace, name string, clusters fedframework.ClusterSlice) (*v1.Service, error) { if clientset == nil || len(namespace) == 0 { return nil, fmt.Errorf("Internal error: invalid parameters passed to createService: clientset: %v, namespace: %v", clientset, namespace) } @@ -152,10 +152,53 @@ func createLBService(clientset *fedclientset.Clientset, namespace, name string) // Tests can be run in parallel, so we need a different nodePort for // each test. - // We add 1 to FederatedSvcNodePortLast because IntnRange's range end - // is not inclusive. - nodePort := int32(rand.IntnRange(FederatedSvcNodePortFirst, FederatedSvcNodePortLast+1)) + // we add in a array all the "available" ports + availablePorts := make([]int32, FederatedSvcNodePortLast-FederatedSvcNodePortFirst) + for i := range availablePorts { + availablePorts[i] = int32(FederatedSvcNodePortFirst + i) + } + var err error + var service *v1.Service + retry := 10 // the function should retry the service creation on different port only 10 time. + + // until the availablePort list is not empty, lets try to create the service + for len(availablePorts) > 0 && retry > 0 { + // select the Id of an available port + i := rand.Intn(len(availablePorts)) + + By(fmt.Sprintf("try creating federated service %q in namespace %q with nodePort %d", name, namespace, availablePorts[i])) + + service, err = createServiceWithNodePort(clientset, namespace, name, availablePorts[i]) + if err == nil { + // check if service have been created properly in all clusters. + // if the service is not present in one of the clusters, we should cleanup all services + if err = checkServicesCreation(namespace, name, clusters); err == nil { + // everything was created properly so returns the federated service. + return service, nil + } + } + + // in case of error, cleanup everything + if service != nil { + if err = deleteService(clientset, namespace, name, nil); err != nil { + framework.ExpectNoError(err, "Deleting service %q after a partial createService() error", service.Name) + return nil, err + } + + cleanupServiceShardsAndProviderResources(namespace, service, clusters) + } + + // creation failed, lets try with another port + // first remove from the availablePorts the port with which the creation failed + availablePorts = append(availablePorts[:i], availablePorts[i+1:]...) + retry-- + } + + return nil, err +} + +func createServiceWithNodePort(clientset *fedclientset.Clientset, namespace, name string, nodePort int32) (*v1.Service, error) { service := &v1.Service{ ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -181,6 +224,33 @@ func createLBService(clientset *fedclientset.Clientset, namespace, name string) return clientset.CoreV1().Services(namespace).Create(service) } +// checkServicesCreation checks if the service have been created successfuly in all the clusters. +// if the service is not present in at least one of the clusters, this function returns an error. +func checkServicesCreation(namespace, serviceName string, clusters fedframework.ClusterSlice) error { + framework.Logf("check if service %q have been created in %d clusters", serviceName, len(clusters)) + for _, cluster := range clusters { + name := cluster.Name + err := wait.PollImmediate(framework.Poll, fedframework.FederatedDefaultTestTimeout, func() (bool, error) { + var err error + _, err = cluster.Clientset.CoreV1().Services(namespace).Get(serviceName, metav1.GetOptions{}) + if err != nil && !errors.IsNotFound(err) { + // Get failed with an error, try again. + framework.Logf("Failed to find service %q in namespace %q, in cluster %q: %v. Trying again in %s", serviceName, namespace, name, err, framework.Poll) + return false, err + } else if errors.IsNotFound(err) { + framework.Logf("Service %q in namespace %q in cluster %q not found. Trying again in %s", serviceName, namespace, name, framework.Poll) + return false, nil + } + By(fmt.Sprintf("Service %q in namespace %q in cluster %q found", serviceName, namespace, name)) + return true, nil + }) + if err != nil { + return err + } + } + return nil +} + func createServiceOrFail(clientset *fedclientset.Clientset, namespace, name string) *v1.Service { service, err := createService(clientset, namespace, name) framework.ExpectNoError(err, "Creating service %q in namespace %q", service.Name, namespace) @@ -188,8 +258,8 @@ func createServiceOrFail(clientset *fedclientset.Clientset, namespace, name stri return service } -func createLBServiceOrFail(clientset *fedclientset.Clientset, namespace, name string) *v1.Service { - service, err := createLBService(clientset, namespace, name) +func createLBServiceOrFail(clientset *fedclientset.Clientset, namespace, name string, clusters fedframework.ClusterSlice) *v1.Service { + service, err := createLBService(clientset, namespace, name, clusters) framework.ExpectNoError(err, "Creating service %q in namespace %q", service.Name, namespace) By(fmt.Sprintf("Successfully created federated service (type: load balancer) %q in namespace %q", name, namespace)) return service @@ -200,8 +270,18 @@ func deleteServiceOrFail(clientset *fedclientset.Clientset, namespace string, se Fail(fmt.Sprintf("Internal error: invalid parameters passed to deleteServiceOrFail: clientset: %v, namespace: %v, service: %v", clientset, namespace, serviceName)) } framework.Logf("Deleting service %q in namespace %v", serviceName, namespace) + + err := deleteService(clientset, namespace, serviceName, orphanDependents) + if err != nil { + framework.ExpectNoError(err, "Error deleting service %q from namespace %q", serviceName, namespace) + } +} + +func deleteService(clientset *fedclientset.Clientset, namespace string, serviceName string, orphanDependents *bool) error { err := clientset.CoreV1().Services(namespace).Delete(serviceName, &metav1.DeleteOptions{OrphanDependents: orphanDependents}) - framework.ExpectNoError(err, "Error deleting service %q from namespace %q", serviceName, namespace) + if err != nil { + return err + } // Wait for the service to be deleted. err = wait.Poll(5*time.Second, fedframework.FederatedDefaultTestTimeout, func() (bool, error) { _, err := clientset.Core().Services(namespace).Get(serviceName, metav1.GetOptions{}) @@ -210,10 +290,7 @@ func deleteServiceOrFail(clientset *fedclientset.Clientset, namespace string, se } return false, err }) - if err != nil { - framework.DescribeSvc(namespace) - framework.Failf("Error in deleting service %s: %v", serviceName, err) - } + return err } func cleanupServiceShardsAndProviderResources(namespace string, service *v1.Service, clusters fedframework.ClusterSlice) { diff --git a/test/e2e_node/BUILD b/test/e2e_node/BUILD index 57421ca310f..9039dc125e9 100644 --- a/test/e2e_node/BUILD +++ b/test/e2e_node/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,20 +9,23 @@ load( go_library( name = "go_default_library", srcs = [ - "benchmark_util.go", "container.go", "doc.go", + "docker_util.go", "gpus.go", "image_list.go", - "node_problem_detector_linux.go", - "resource_collector.go", "simple_mount.go", "util.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "benchmark_util.go", + "node_problem_detector_linux.go", + "resource_collector.go", + ], + "//conditions:default": [], + }), deps = [ "//pkg/api:go_default_library", - "//pkg/api/v1/node:go_default_library", "//pkg/api/v1/pod:go_default_library", "//pkg/apis/componentconfig:go_default_library", "//pkg/apis/componentconfig/v1alpha1:go_default_library", @@ -33,33 +34,41 @@ go_library( "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", "//pkg/kubelet/metrics:go_default_library", "//pkg/kubelet/remote:go_default_library", - "//pkg/util/procfs:go_default_library", "//test/e2e/common:go_default_library", "//test/e2e/framework:go_default_library", - "//test/e2e/metrics:go_default_library", - "//test/e2e/perftype:go_default_library", - "//test/e2e_node/perftype:go_default_library", + "//test/e2e/framework/metrics:go_default_library", + "//vendor/github.com/blang/semver:go_default_library", + "//vendor/github.com/docker/docker/client:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/google/cadvisor/client/v2:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", "//vendor/github.com/onsi/ginkgo:go_default_library", "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_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/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait: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", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//pkg/api/v1/node:go_default_library", + "//pkg/util/procfs:go_default_library", + "//test/e2e/perftype:go_default_library", + "//test/e2e_node/perftype:go_default_library", + "//vendor/github.com/google/cadvisor/client/v2:go_default_library", + "//vendor/github.com/google/cadvisor/info/v2:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/cgroups: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/util/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", + ], + "//conditions:default": [], + }), ) go_test( @@ -67,10 +76,9 @@ go_test( srcs = [ "allocatable_eviction_test.go", "apparmor_test.go", - "container_manager_test.go", "critical_pod_test.go", - "density_test.go", "disk_eviction_test.go", + "docker_test.go", "dockershim_checkpoint_test.go", "dynamic_kubelet_configuration_test.go", "e2e_node_suite_test.go", @@ -85,20 +93,23 @@ go_test( "log_path_test.go", "memory_eviction_test.go", "mirror_pod_test.go", - "node_container_manager_test.go", "pods_container_manager_test.go", - "resource_usage_test.go", - "restart_test.go", "runtime_conformance_test.go", "security_context_test.go", "summary_test.go", "volume_manager_test.go", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "container_manager_test.go", + "density_test.go", + "node_container_manager_test.go", + "resource_usage_test.go", + "restart_test.go", + ], + "//conditions:default": [], + }), library = ":go_default_library", - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1/node:go_default_library", @@ -114,11 +125,8 @@ go_test( "//pkg/security/apparmor:go_default_library", "//test/e2e/common:go_default_library", "//test/e2e/framework:go_default_library", - "//test/e2e/metrics:go_default_library", "//test/e2e_node/services:go_default_library", "//test/e2e_node/system:go_default_library", - "//test/utils:go_default_library", - "//vendor/github.com/blang/semver:go_default_library", "//vendor/github.com/coreos/go-systemd/util:go_default_library", "//vendor/github.com/davecgh/go-spew/spew:go_default_library", "//vendor/github.com/golang/glog:go_default_library", @@ -134,8 +142,6 @@ go_test( "//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/labels: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/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", @@ -146,9 +152,17 @@ go_test( "//vendor/k8s.io/apimachinery/pkg/watch: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/tools/cache:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//test/e2e/framework/metrics:go_default_library", + "//test/utils:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//vendor/k8s.io/client-go/tools/cache:go_default_library", + ], + "//conditions:default": [], + }), ) genrule( diff --git a/test/e2e_node/builder/BUILD b/test/e2e_node/builder/BUILD index cb1077d99fc..f4a9fb12d46 100644 --- a/test/e2e_node/builder/BUILD +++ b/test/e2e_node/builder/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["build.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/glog:go_default_library"], ) diff --git a/test/e2e_node/density_test.go b/test/e2e_node/density_test.go index 8aabd88d281..e440b429381 100644 --- a/test/e2e_node/density_test.go +++ b/test/e2e_node/density_test.go @@ -34,7 +34,7 @@ import ( stats "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" kubemetrics "k8s.io/kubernetes/pkg/kubelet/metrics" "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/kubernetes/test/e2e/metrics" + "k8s.io/kubernetes/test/e2e/framework/metrics" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" diff --git a/test/e2e_node/docker_test.go b/test/e2e_node/docker_test.go new file mode 100644 index 00000000000..8c79604fb14 --- /dev/null +++ b/test/e2e_node/docker_test.go @@ -0,0 +1,73 @@ +/* +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 e2e_node + +import ( + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/kubernetes/test/e2e/framework" + + . "github.com/onsi/ginkgo" +) + +var _ = framework.KubeDescribe("Docker features [Feature:Docker]", func() { + f := framework.NewDefaultFramework("docker-feature-test") + + BeforeEach(func() { + framework.RunIfContainerRuntimeIs("docker") + }) + + Context("when shared PID namespace is enabled", func() { + It("processes in different containers of the same pod should be able to see each other", func() { + // TODO(yguo0905): Change this test to run unless the runtime is + // Docker and its version is <1.13. + By("Check whether shared PID namespace is enabled.") + isEnabled, err := isSharedPIDNamespaceEnabled() + framework.ExpectNoError(err) + if !isEnabled { + framework.Skipf("Skipped because shared PID namespace is not enabled.") + } + + By("Create a pod with two containers.") + f.PodClient().CreateSync(&v1.Pod{ + ObjectMeta: metav1.ObjectMeta{Name: "shared-pid-ns-test-pod"}, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "test-container-1", + Image: "gcr.io/google_containers/busybox:1.24", + Command: []string{"/bin/top"}, + }, + { + Name: "test-container-2", + Image: "gcr.io/google_containers/busybox:1.24", + Command: []string{"/bin/sleep"}, + Args: []string{"10000"}, + }, + }, + }, + }) + + By("Check if the process in one container is visible to the process in the other.") + pid1 := f.ExecCommandInContainer("shared-pid-ns-test-pod", "test-container-1", "/bin/pidof", "top") + pid2 := f.ExecCommandInContainer("shared-pid-ns-test-pod", "test-container-2", "/bin/pidof", "top") + if pid1 != pid2 { + framework.Failf("PIDs are not the same in different containers: test-container-1=%v, test-container-2=%v", pid1, pid2) + } + }) + }) +}) diff --git a/test/e2e_node/docker_util.go b/test/e2e_node/docker_util.go new file mode 100644 index 00000000000..b8bc2497083 --- /dev/null +++ b/test/e2e_node/docker_util.go @@ -0,0 +1,62 @@ +/* +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 e2e_node + +import ( + "context" + "fmt" + + "github.com/blang/semver" + "github.com/docker/docker/client" +) + +const ( + defaultDockerEndpoint = "unix:///var/run/docker.sock" +) + +// getDockerAPIVersion returns the Docker's API version. +func getDockerAPIVersion() (semver.Version, error) { + c, err := client.NewClient(defaultDockerEndpoint, "", nil, nil) + if err != nil { + return semver.Version{}, fmt.Errorf("failed to create docker client: %v", err) + } + version, err := c.ServerVersion(context.Background()) + if err != nil { + return semver.Version{}, fmt.Errorf("failed to get docker info: %v", err) + } + return semver.MustParse(version.APIVersion + ".0"), nil +} + +// isSharedPIDNamespaceEnabled returns true if the Docker version is 1.13.1+ +// (API version 1.26+), and false otherwise. +func isSharedPIDNamespaceEnabled() (bool, error) { + version, err := getDockerAPIVersion() + if err != nil { + return false, err + } + return version.GTE(semver.MustParse("1.26.0")), nil +} + +// isDockerNoNewPrivilegesSupported returns true if Docker version is 1.11+ +// (API version 1.23+), and false otherwise. +func isDockerNoNewPrivilegesSupported() (bool, error) { + version, err := getDockerAPIVersion() + if err != nil { + return false, err + } + return version.GTE(semver.MustParse("1.23.0")), nil +} diff --git a/test/e2e_node/dynamic_kubelet_configuration_test.go b/test/e2e_node/dynamic_kubelet_configuration_test.go index 1b2bf6977f5..b02273d2708 100644 --- a/test/e2e_node/dynamic_kubelet_configuration_test.go +++ b/test/e2e_node/dynamic_kubelet_configuration_test.go @@ -30,7 +30,7 @@ import ( var _ = framework.KubeDescribe("DynamicKubeletConfiguration [Feature:DynamicKubeletConfig] [Serial] [Disruptive]", func() { f := framework.NewDefaultFramework("dynamic-kubelet-configuration-test") - Context("When a configmap called `kubelet-{node-name}` is added to the `kube-system` namespace", func() { + Context("When the config source on a Node is updated to point to new config", func() { It("The Kubelet on that node should restart to take up the new config", func() { // Get the current KubeletConfiguration (known to be valid) by // querying the configz endpoint for the current node. diff --git a/test/e2e_node/environment/BUILD b/test/e2e_node/environment/BUILD index 9ed73635ab5..896768ae717 100644 --- a/test/e2e_node/environment/BUILD +++ b/test/e2e_node/environment/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "environment", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["conformance.go"], - tags = ["automanaged"], deps = ["//pkg/kubelet/cadvisor:go_default_library"], ) diff --git a/test/e2e_node/garbage_collector_test.go b/test/e2e_node/garbage_collector_test.go index 12505349609..0bc4852ddd7 100644 --- a/test/e2e_node/garbage_collector_test.go +++ b/test/e2e_node/garbage_collector_test.go @@ -32,8 +32,6 @@ import ( ) const ( - defaultDockerEndpoint = "unix:///var/run/docker.sock" - //TODO (dashpole): Once dynamic config is possible, test different values for maxPerPodContainer and maxContainers // Currently using default values for maxPerPodContainer and maxTotalContainers maxPerPodContainer = 1 diff --git a/test/e2e_node/jenkins/image-config-serial.yaml b/test/e2e_node/jenkins/image-config-serial.yaml index 04991988a75..12da0f85f4e 100644 --- a/test/e2e_node/jenkins/image-config-serial.yaml +++ b/test/e2e_node/jenkins/image-config-serial.yaml @@ -12,7 +12,7 @@ images: containervm: image: e2e-node-containervm-v20161208-image # docker 1.11.2 project: kubernetes-node-e2e-images - gci: + cos-stable: image_regex: cos-stable-59-9460-64-0 # docker 1.11.2 project: cos-cloud metadata: "user-data= 1.11 thats when "no-new-privileges" was added - framework.Skipf("Skipping no_new_privs tests, docker version is < 1.11 it is %s", version.String()) + isSupported, err := isDockerNoNewPrivilegesSupported() + framework.ExpectNoError(err) + if !isSupported { + framework.Skipf("Skipping because no_new_privs is not supported in this docker") } } }) @@ -459,4 +433,65 @@ var _ = framework.KubeDescribe("Security Context", func() { }) }) + Context("When creating a pod with privileged", func() { + makeUserPod := func(podName, image string, command []string, privileged bool) *v1.Pod { + return &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: podName, + }, + Spec: v1.PodSpec{ + RestartPolicy: v1.RestartPolicyNever, + Containers: []v1.Container{ + { + Image: image, + Name: podName, + Command: command, + SecurityContext: &v1.SecurityContext{ + Privileged: &privileged, + }, + }, + }, + }, + } + } + createAndWaitUserPod := func(privileged bool) string { + podName := fmt.Sprintf("busybox-privileged-%v-%s", privileged, uuid.NewUUID()) + podClient.Create(makeUserPod(podName, + "gcr.io/google_containers/busybox:1.24", + []string{"sh", "-c", "ip link add dummy0 type dummy || true"}, + privileged, + )) + + podClient.WaitForSuccess(podName, framework.PodStartTimeout) + + return podName + } + + It("should run the container as privileged when true", func() { + podName := createAndWaitUserPod(true) + logs, err := framework.GetPodLogs(f.ClientSet, f.Namespace.Name, podName, podName) + if err != nil { + framework.Failf("GetPodLogs for pod %q failed: %v", podName, err) + } + + framework.Logf("Got logs for pod %q: %q", podName, logs) + if strings.Contains(logs, "Operation not permitted") { + framework.Failf("privileged container should be able to create dummy device") + } + }) + + It("should run the container as unprivileged when false", func() { + podName := createAndWaitUserPod(false) + logs, err := framework.GetPodLogs(f.ClientSet, f.Namespace.Name, podName, podName) + if err != nil { + framework.Failf("GetPodLogs for pod %q failed: %v", podName, err) + } + + framework.Logf("Got logs for pod %q: %q", podName, logs) + if !strings.Contains(logs, "Operation not permitted") { + framework.Failf("unprivileged container shouldn't be able to create dummy device") + } + }) + }) + }) diff --git a/test/e2e_node/services/BUILD b/test/e2e_node/services/BUILD index 4b50ae8efdf..2db32224862 100644 --- a/test/e2e_node/services/BUILD +++ b/test/e2e_node/services/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,12 +17,12 @@ go_library( "services.go", "util.go", ], - tags = ["automanaged"], deps = [ "//cmd/kube-apiserver/app:go_default_library", "//cmd/kube-apiserver/app/options:go_default_library", "//pkg/api:go_default_library", "//pkg/controller/namespace:go_default_library", + "//pkg/features:go_default_library", "//test/e2e/framework:go_default_library", "//test/e2e_node/builder:go_default_library", "//vendor/github.com/coreos/etcd/etcdserver:go_default_library", diff --git a/test/e2e_node/services/kubelet.go b/test/e2e_node/services/kubelet.go index e8e8795eb54..9cbc9d5ba1c 100644 --- a/test/e2e_node/services/kubelet.go +++ b/test/e2e_node/services/kubelet.go @@ -28,6 +28,8 @@ import ( "github.com/golang/glog" + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e_node/builder" ) @@ -93,6 +95,9 @@ const ( func (e *E2EServices) startKubelet() (*server, error) { glog.Info("Starting kubelet") + // set feature gates so we can check which features are enabled and pass the appropriate flags + utilfeature.DefaultFeatureGate.Set(framework.TestContext.FeatureGates) + // Build kubeconfig kubeconfigPath, err := createKubeconfigCWD() if err != nil { @@ -164,6 +169,16 @@ func (e *E2EServices) startKubelet() (*server, error) { "--eviction-minimum-reclaim", "nodefs.available=5%,nodefs.inodesFree=5%", // The minimum reclaimed resources after eviction. "--v", LOG_VERBOSITY_LEVEL, "--logtostderr", ) + + if utilfeature.DefaultFeatureGate.Enabled(features.DynamicKubeletConfig) { + // Enable dynamic config if the feature gate is enabled + dynamicConfigDir, err := getDynamicConfigDir() + if err != nil { + return nil, err + } + cmdArgs = append(cmdArgs, "--dynamic-config-dir", dynamicConfigDir) + } + // Enable kubenet by default. cniBinDir, err := getCNIBinDirectory() if err != nil { @@ -294,6 +309,15 @@ func getCNIConfDirectory() (string, error) { return filepath.Join(cwd, "cni", "net.d"), nil } +// getDynamicConfigDir returns the directory for dynamic Kubelet configuration +func getDynamicConfigDir() (string, error) { + cwd, err := os.Getwd() + if err != nil { + return "", err + } + return filepath.Join(cwd, "dynamic-kubelet-config"), nil +} + // adjustArgsForSystemd escape special characters in kubelet arguments for systemd. Systemd // may try to do auto expansion without escaping. func adjustArgsForSystemd(args []string) { diff --git a/test/e2e_node/system/BUILD b/test/e2e_node/system/BUILD index 57c0847ebeb..67dfe7d6c27 100644 --- a/test/e2e_node/system/BUILD +++ b/test/e2e_node/system/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -20,7 +18,6 @@ go_library( "types.go", "validators.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/blang/semver:go_default_library", "//vendor/github.com/docker/docker/api/types:go_default_library", @@ -41,7 +38,6 @@ go_test( "package_validator_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//vendor/github.com/docker/docker/api/types:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", diff --git a/test/e2e_node/util.go b/test/e2e_node/util.go index 92e6f2b689b..ea5a5b8b887 100644 --- a/test/e2e_node/util.go +++ b/test/e2e_node/util.go @@ -29,8 +29,9 @@ import ( "github.com/golang/glog" "k8s.io/api/core/v1" - k8serr "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/kubernetes/scheme" "k8s.io/kubernetes/pkg/api" @@ -39,7 +40,7 @@ import ( stats "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" kubeletmetrics "k8s.io/kubernetes/pkg/kubelet/metrics" "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/kubernetes/test/e2e/metrics" + "k8s.io/kubernetes/test/e2e/framework/metrics" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -128,20 +129,16 @@ func isKubeletConfigEnabled(f *framework.Framework) (bool, error) { return strings.Contains(cfgz.FeatureGates, "DynamicKubeletConfig=true"), nil } -// Queries the API server for a Kubelet configuration for the node described by framework.TestContext.NodeName -func getCurrentKubeletConfigMap(f *framework.Framework) (*v1.ConfigMap, error) { - return f.ClientSet.Core().ConfigMaps("kube-system").Get(fmt.Sprintf("kubelet-%s", framework.TestContext.NodeName), metav1.GetOptions{}) -} - // Creates or updates the configmap for KubeletConfiguration, waits for the Kubelet to restart -// with the new configuration. Returns an error if the configuration after waiting 40 seconds +// with the new configuration. Returns an error if the configuration after waiting for restartGap // doesn't match what you attempted to set, or if the dynamic configuration feature is disabled. func setKubeletConfiguration(f *framework.Framework, kubeCfg *componentconfig.KubeletConfiguration) error { const ( - restartGap = 30 * time.Second + restartGap = 40 * time.Second + pollInterval = 5 * time.Second ) - // Make sure Dynamic Kubelet Configuration feature is enabled on the Kubelet we are about to reconfigure + // make sure Dynamic Kubelet Configuration feature is enabled on the Kubelet we are about to reconfigure configEnabled, err := isKubeletConfigEnabled(f) if err != nil { return fmt.Errorf("could not determine whether 'DynamicKubeletConfig' feature is enabled, err: %v", err) @@ -152,37 +149,47 @@ func setKubeletConfiguration(f *framework.Framework, kubeCfg *componentconfig.Ku "For `make test-e2e-node`, you can set `TEST_ARGS='--feature-gates=DynamicKubeletConfig=true'`.") } - // Check whether a configmap for KubeletConfiguration already exists - _, err = getCurrentKubeletConfigMap(f) + nodeclient := f.ClientSet.CoreV1().Nodes() - if k8serr.IsNotFound(err) { - _, err := createConfigMap(f, kubeCfg) - if err != nil { - return err - } - } else if err != nil { - return err - } else { - // The configmap exists, update it instead of creating it. - _, err := updateConfigMap(f, kubeCfg) - if err != nil { - return err - } - } - - // Wait for the Kubelet to restart. - time.Sleep(restartGap) - - // Retrieve the new config and compare it to the one we attempted to set - newKubeCfg, err := getCurrentKubeletConfig() + // create the ConfigMap with the new configuration + cm, err := createConfigMap(f, kubeCfg) if err != nil { return err } - // Return an error if the desired config is not in use by now - if !reflect.DeepEqual(*kubeCfg, *newKubeCfg) { - return fmt.Errorf("either the Kubelet did not restart or it did not present the modified configuration via /configz after restarting.") + // create the correct reference object + src := &v1.NodeConfigSource{ + ConfigMapRef: &v1.ObjectReference{ + Namespace: "kube-system", + Name: cm.Name, + UID: cm.UID, + }, } + + // serialize the new node config source + raw, err := json.Marshal(src) + framework.ExpectNoError(err) + data := []byte(fmt.Sprintf(`{"spec":{"configSource":%s}}`, raw)) + + // patch the node + _, err = nodeclient.Patch(framework.TestContext.NodeName, + types.StrategicMergePatchType, + data) + framework.ExpectNoError(err) + + // poll for new config, for a maximum wait of restartGap + Eventually(func() error { + newKubeCfg, err := getCurrentKubeletConfig() + if err != nil { + return fmt.Errorf("failed trying to get current Kubelet config, will retry, error: %v", err) + } + if !reflect.DeepEqual(*kubeCfg, *newKubeCfg) { + return fmt.Errorf("still waiting for new configuration to take effect, will continue to watch /configz") + } + glog.Infof("new configuration has taken effect") + return nil + }, restartGap, pollInterval).Should(BeNil()) + return nil } @@ -239,28 +246,9 @@ func decodeConfigz(resp *http.Response) (*componentconfig.KubeletConfiguration, return &kubeCfg, nil } -// Constructs a Kubelet ConfigMap targeting the current node running the node e2e tests -func makeKubeletConfigMap(nodeName string, kubeCfg *componentconfig.KubeletConfiguration) *v1.ConfigMap { - kubeCfgExt := v1alpha1.KubeletConfiguration{} - api.Scheme.Convert(kubeCfg, &kubeCfgExt, nil) - - bytes, err := json.Marshal(kubeCfgExt) - framework.ExpectNoError(err) - - cmap := &v1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("kubelet-%s", nodeName), - }, - Data: map[string]string{ - "kubelet.config": string(bytes), - }, - } - return cmap -} - -// Uses KubeletConfiguration to create a `kubelet-` ConfigMap in the "kube-system" namespace. -func createConfigMap(f *framework.Framework, kubeCfg *componentconfig.KubeletConfiguration) (*v1.ConfigMap, error) { - cmap := makeKubeletConfigMap(framework.TestContext.NodeName, kubeCfg) +// creates a configmap containing kubeCfg in kube-system namespace +func createConfigMap(f *framework.Framework, internalKC *componentconfig.KubeletConfiguration) (*v1.ConfigMap, error) { + cmap := makeKubeletConfigMap(internalKC) cmap, err := f.ClientSet.Core().ConfigMaps("kube-system").Create(cmap) if err != nil { return nil, err @@ -268,14 +256,25 @@ func createConfigMap(f *framework.Framework, kubeCfg *componentconfig.KubeletCon return cmap, nil } -// Similar to createConfigMap, except this updates an existing ConfigMap. -func updateConfigMap(f *framework.Framework, kubeCfg *componentconfig.KubeletConfiguration) (*v1.ConfigMap, error) { - cmap := makeKubeletConfigMap(framework.TestContext.NodeName, kubeCfg) - cmap, err := f.ClientSet.Core().ConfigMaps("kube-system").Update(cmap) - if err != nil { - return nil, err +// constructs a ConfigMap, populating one of its keys with the KubeletConfiguration. Uses GenerateName. +func makeKubeletConfigMap(internalKC *componentconfig.KubeletConfiguration) *v1.ConfigMap { + externalKC := &v1alpha1.KubeletConfiguration{} + api.Scheme.Convert(internalKC, externalKC, nil) + + encoder, err := newJSONEncoder(componentconfig.GroupName) + framework.ExpectNoError(err) + + data, err := runtime.Encode(encoder, externalKC) + framework.ExpectNoError(err) + + cmap := &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{GenerateName: "testcfg"}, + Data: map[string]string{ + "kubelet": string(data), + }, } - return cmap, nil + + return cmap } func logPodEvents(f *framework.Framework) { @@ -309,3 +308,20 @@ func logKubeletMetrics(metricKeys ...string) { framework.Logf("Kubelet Metrics: %+v", framework.GetKubeletMetrics(metric, metricSet)) } } + +func newJSONEncoder(groupName string) (runtime.Encoder, error) { + // encode to json + mediaType := "application/json" + info, ok := runtime.SerializerInfoForMediaType(api.Codecs.SupportedMediaTypes(), mediaType) + if !ok { + return nil, fmt.Errorf("unsupported media type %q", mediaType) + } + + versions := api.Registry.EnabledVersionsForGroup(groupName) + if len(versions) == 0 { + return nil, fmt.Errorf("no enabled versions for group %q", groupName) + } + + // the "best" version supposedly comes first in the list returned from api.Registry.EnabledVersionsForGroup + return api.Codecs.EncoderForVersion(info.Serializer, versions[0]), nil +} diff --git a/test/images/clusterapi-tester/BUILD b/test/images/clusterapi-tester/BUILD index 98c5c2c528c..5a14c0d44c8 100644 --- a/test/images/clusterapi-tester/BUILD +++ b/test/images/clusterapi-tester/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "clusterapi-tester", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["clusterapi-tester.go"], - tags = ["automanaged"], deps = [ "//pkg/client/clientset_generated/internalclientset:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/test/images/entrypoint-tester/BUILD b/test/images/entrypoint-tester/BUILD index 3079185ade9..04dc887f9ca 100644 --- a/test/images/entrypoint-tester/BUILD +++ b/test/images/entrypoint-tester/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "entrypoint-tester", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["ep.go"], - tags = ["automanaged"], ) filegroup( diff --git a/test/images/fakegitserver/BUILD b/test/images/fakegitserver/BUILD index 4cfe6d76822..522e6a45f16 100644 --- a/test/images/fakegitserver/BUILD +++ b/test/images/fakegitserver/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "fakegitserver", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["gitserver.go"], - tags = ["automanaged"], ) filegroup( diff --git a/test/images/goproxy/BUILD b/test/images/goproxy/BUILD index 2f071e0f821..45c10904531 100644 --- a/test/images/goproxy/BUILD +++ b/test/images/goproxy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "goproxy", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["goproxy.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/elazarl/goproxy:go_default_library"], ) diff --git a/test/images/liveness/BUILD b/test/images/liveness/BUILD index d15af903256..10f23cbbcca 100644 --- a/test/images/liveness/BUILD +++ b/test/images/liveness/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "liveness", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["server.go"], - tags = ["automanaged"], ) filegroup( diff --git a/test/images/logs-generator/BUILD b/test/images/logs-generator/BUILD index e01dd83e966..a22e02b64d7 100644 --- a/test/images/logs-generator/BUILD +++ b/test/images/logs-generator/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "logs-generator", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["logs_generator.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/rand:go_default_library", diff --git a/test/images/mounttest/BUILD b/test/images/mounttest/BUILD index ace9146b8c1..427abeadce6 100644 --- a/test/images/mounttest/BUILD +++ b/test/images/mounttest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["mt.go"], - tags = ["automanaged"], ) filegroup( @@ -30,5 +27,4 @@ filegroup( go_binary( name = "mounttest", library = ":go_default_library", - tags = ["automanaged"], ) diff --git a/test/images/n-way-http/BUILD b/test/images/n-way-http/BUILD index 8aa21595e45..925ecc0e604 100644 --- a/test/images/n-way-http/BUILD +++ b/test/images/n-way-http/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "n-way-http", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["server.go"], - tags = ["automanaged"], ) filegroup( diff --git a/test/images/net/BUILD b/test/images/net/BUILD index 062738956ad..84827e9bfd6 100644 --- a/test/images/net/BUILD +++ b/test/images/net/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "net", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//test/images/net/common:go_default_library", "//test/images/net/nat:go_default_library", diff --git a/test/images/net/common/BUILD b/test/images/net/common/BUILD index 49082322652..d940c0b9bb7 100644 --- a/test/images/net/common/BUILD +++ b/test/images/net/common/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["common.go"], - tags = ["automanaged"], ) filegroup( diff --git a/test/images/net/nat/BUILD b/test/images/net/nat/BUILD index 7611a1ea143..2ea52915169 100644 --- a/test/images/net/nat/BUILD +++ b/test/images/net/nat/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["closewait.go"], - tags = ["automanaged"], deps = ["//test/images/net/common:go_default_library"], ) diff --git a/test/images/netexec/BUILD b/test/images/netexec/BUILD index 563ffb3c0c0..5a080e3c881 100644 --- a/test/images/netexec/BUILD +++ b/test/images/netexec/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "netexec", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["netexec.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library"], ) diff --git a/test/images/nettest/BUILD b/test/images/nettest/BUILD index 516fae1aa51..2f694540e57 100644 --- a/test/images/nettest/BUILD +++ b/test/images/nettest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["nettest.go"], - tags = ["automanaged"], deps = [ "//pkg/client/clientset_generated/internalclientset:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -36,5 +33,4 @@ filegroup( go_binary( name = "nettest", library = ":go_default_library", - tags = ["automanaged"], ) diff --git a/test/images/no-snat-test-proxy/BUILD b/test/images/no-snat-test-proxy/BUILD index 7092e009581..90a3e8da91a 100644 --- a/test/images/no-snat-test-proxy/BUILD +++ b/test/images/no-snat-test-proxy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "no-snat-test-proxy", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/spf13/pflag:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library", diff --git a/test/images/no-snat-test/BUILD b/test/images/no-snat-test/BUILD index a65e54587df..6a60db38d66 100644 --- a/test/images/no-snat-test/BUILD +++ b/test/images/no-snat-test/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "no-snat-test", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/spf13/pflag:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library", diff --git a/test/images/port-forward-tester/BUILD b/test/images/port-forward-tester/BUILD index e9e0aedc716..66d04340716 100644 --- a/test/images/port-forward-tester/BUILD +++ b/test/images/port-forward-tester/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "port-forward-tester", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["portforwardtester.go"], - tags = ["automanaged"], ) filegroup( diff --git a/test/images/porter/BUILD b/test/images/porter/BUILD index 94644ff53c9..1b37177fb54 100644 --- a/test/images/porter/BUILD +++ b/test/images/porter/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "porter", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["porter.go"], - tags = ["automanaged"], ) filegroup( diff --git a/test/images/resource-consumer/BUILD b/test/images/resource-consumer/BUILD index d368635cf32..a3276e5c4e0 100644 --- a/test/images/resource-consumer/BUILD +++ b/test/images/resource-consumer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,7 +9,6 @@ load( go_binary( name = "resource-consumer", library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -21,7 +18,6 @@ go_library( "resource_consumer_handler.go", "utils.go", ], - tags = ["automanaged"], deps = ["//test/images/resource-consumer/common:go_default_library"], ) diff --git a/test/images/resource-consumer/common/BUILD b/test/images/resource-consumer/common/BUILD index 49082322652..d940c0b9bb7 100644 --- a/test/images/resource-consumer/common/BUILD +++ b/test/images/resource-consumer/common/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["common.go"], - tags = ["automanaged"], ) filegroup( diff --git a/test/images/resource-consumer/consume-cpu/BUILD b/test/images/resource-consumer/consume-cpu/BUILD index f51e52545ca..b570b6060d0 100644 --- a/test/images/resource-consumer/consume-cpu/BUILD +++ b/test/images/resource-consumer/consume-cpu/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "consume-cpu", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["consume_cpu.go"], - tags = ["automanaged"], deps = ["//vendor/bitbucket.org/bertimus9/systemstat:go_default_library"], ) diff --git a/test/images/resource-consumer/controller/BUILD b/test/images/resource-consumer/controller/BUILD index a6d72fc4766..7b12bbd27ab 100644 --- a/test/images/resource-consumer/controller/BUILD +++ b/test/images/resource-consumer/controller/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "controller", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["controller.go"], - tags = ["automanaged"], deps = ["//test/images/resource-consumer/common:go_default_library"], ) diff --git a/test/images/serve-hostname/BUILD b/test/images/serve-hostname/BUILD index 22ccb86d6c1..9757630047b 100644 --- a/test/images/serve-hostname/BUILD +++ b/test/images/serve-hostname/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["serve_hostname.go"], - tags = ["automanaged"], ) filegroup( @@ -30,5 +27,4 @@ filegroup( go_binary( name = "serve-hostname", library = ":go_default_library", - tags = ["automanaged"], ) diff --git a/test/images/test-webserver/BUILD b/test/images/test-webserver/BUILD index a0f4bcac820..17cb43e6a62 100644 --- a/test/images/test-webserver/BUILD +++ b/test/images/test-webserver/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "test-webserver", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["test-webserver.go"], - tags = ["automanaged"], ) filegroup( diff --git a/test/integration/BUILD b/test/integration/BUILD index 9b7c621937d..be220b5b2a5 100644 --- a/test/integration/BUILD +++ b/test/integration/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "utils.go", ], - tags = ["automanaged"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/test/integration/apiserver/BUILD b/test/integration/apiserver/BUILD index 68b8d6634a3..82c66a895cb 100644 --- a/test/integration/apiserver/BUILD +++ b/test/integration/apiserver/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -16,7 +14,6 @@ go_test( "patch_test.go", ], tags = [ - "automanaged", "etcd", "integration", ], diff --git a/test/integration/auth/BUILD b/test/integration/auth/BUILD index cd7291e93ff..293388047a1 100644 --- a/test/integration/auth/BUILD +++ b/test/integration/auth/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -18,10 +16,7 @@ go_test( "node_test.go", "rbac_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", diff --git a/test/integration/auth/rbac_test.go b/test/integration/auth/rbac_test.go index 36283a2afc3..58093392b0b 100644 --- a/test/integration/auth/rbac_test.go +++ b/test/integration/auth/rbac_test.go @@ -162,9 +162,12 @@ func (s statusCode) String() string { // Declare a set of raw objects to use. var ( + // Make a role binding with the version enabled in testapi.Rbac + // This assumes testapi is using rbac.authorization.k8s.io/v1beta1 or rbac.authorization.k8s.io/v1, which are identical in structure. + // TODO: rework or remove testapi usage to allow writing integration tests that don't depend on envvars writeJobsRoleBinding = ` { - "apiVersion": "rbac.authorization.k8s.io/v1beta1", + "apiVersion": "` + testapi.Rbac.GroupVersion().String() + `", "kind": "RoleBinding", "metadata": { "name": "pi"%s diff --git a/test/integration/client/BUILD b/test/integration/client/BUILD index ae1280c4d16..4a04d3eb814 100644 --- a/test/integration/client/BUILD +++ b/test/integration/client/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -15,10 +13,7 @@ go_test( "dynamic_client_test.go", "main_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", diff --git a/test/integration/configmap/BUILD b/test/integration/configmap/BUILD index 90caf148af4..de491d588cc 100644 --- a/test/integration/configmap/BUILD +++ b/test/integration/configmap/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -14,10 +12,7 @@ go_test( "configmap_test.go", "main_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/api/testapi:go_default_library", "//test/integration:go_default_library", diff --git a/test/integration/defaulttolerationseconds/BUILD b/test/integration/defaulttolerationseconds/BUILD index b2a99aaaa09..3235d5c2ffb 100644 --- a/test/integration/defaulttolerationseconds/BUILD +++ b/test/integration/defaulttolerationseconds/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -15,7 +13,6 @@ go_test( "main_test.go", ], tags = [ - "automanaged", "etcd", "integration", ], diff --git a/test/integration/deployment/BUILD b/test/integration/deployment/BUILD index aff6bd8c092..ff6da2dc364 100644 --- a/test/integration/deployment/BUILD +++ b/test/integration/deployment/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_test( "main_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = [ "//pkg/controller/deployment/util:go_default_library", "//test/integration/framework:go_default_library", @@ -27,7 +24,6 @@ go_test( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = [ "//pkg/api/v1/pod:go_default_library", "//pkg/controller/deployment:go_default_library", diff --git a/test/integration/etcd/BUILD b/test/integration/etcd/BUILD index e44373bb2ac..44db94711a8 100644 --- a/test/integration/etcd/BUILD +++ b/test/integration/etcd/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -15,7 +13,6 @@ go_test( "main_test.go", ], tags = [ - "automanaged", "etcd", "integration", ], diff --git a/test/integration/etcd/etcd_storage_path_test.go b/test/integration/etcd/etcd_storage_path_test.go index 8ccfa5bdc62..e9441a9085d 100644 --- a/test/integration/etcd/etcd_storage_path_test.go +++ b/test/integration/etcd/etcd_storage_path_test.go @@ -133,7 +133,7 @@ var etcdStorageData = map[schema.GroupVersionResource]struct { // k8s.io/kubernetes/pkg/apis/apps/v1beta1 gvr("apps", "v1beta1", "statefulsets"): { - stub: `{"metadata": {"name": "ss1"}, "spec": {"template": {"metadata": {"labels": {"a": "b"}}}}}`, + stub: `{"metadata": {"name": "ss1"}, "spec": {"selector": {"matchLabels": {"a": "b"}}, "template": {"metadata": {"labels": {"a": "b"}}}}}`, expectedEtcdPath: "/registry/statefulsets/etcdstoragepathtestnamespace/ss1", }, gvr("apps", "v1beta1", "deployments"): { @@ -149,7 +149,7 @@ var etcdStorageData = map[schema.GroupVersionResource]struct { // k8s.io/kubernetes/pkg/apis/apps/v1beta2 gvr("apps", "v1beta2", "statefulsets"): { - stub: `{"metadata": {"name": "ss2"}, "spec": {"template": {"metadata": {"labels": {"a": "b"}}}}}`, + stub: `{"metadata": {"name": "ss2"}, "spec": {"selector": {"matchLabels": {"a": "b"}}, "template": {"metadata": {"labels": {"a": "b"}}}}}`, expectedEtcdPath: "/registry/statefulsets/etcdstoragepathtestnamespace/ss2", expectedGVK: gvkP("apps", "v1beta1", "StatefulSet"), }, @@ -197,11 +197,6 @@ var etcdStorageData = map[schema.GroupVersionResource]struct { stub: `{"metadata": {"name": "cj1"}, "spec": {"jobTemplate": {"spec": {"template": {"metadata": {"labels": {"controller-uid": "uid0"}}, "spec": {"containers": [{"image": "fedora:latest", "name": "container0"}], "dnsPolicy": "ClusterFirst", "restartPolicy": "Never"}}}}, "schedule": "* * * * *"}}`, expectedEtcdPath: "/registry/cronjobs/etcdstoragepathtestnamespace/cj1", }, - gvr("batch", "v2alpha1", "scheduledjobs"): { - stub: `{"metadata": {"name": "cj2"}, "spec": {"jobTemplate": {"spec": {"template": {"metadata": {"labels": {"controller-uid": "uid0"}}, "spec": {"containers": [{"image": "fedora:latest", "name": "container0"}], "dnsPolicy": "ClusterFirst", "restartPolicy": "Never"}}}}, "schedule": "* * * * *"}}`, - expectedEtcdPath: "/registry/cronjobs/etcdstoragepathtestnamespace/cj2", - expectedGVK: gvkP("batch", "v2alpha1", "CronJob"), // scheduledjobs were deprecated by cronjobs - }, // -- // k8s.io/kubernetes/pkg/apis/certificates/v1beta1 @@ -317,6 +312,29 @@ var etcdStorageData = map[schema.GroupVersionResource]struct { }, // -- + // k8s.io/kubernetes/pkg/apis/rbac/v1 + gvr("rbac.authorization.k8s.io", "v1", "roles"): { + stub: `{"metadata": {"name": "role3"}, "rules": [{"apiGroups": ["v1"], "resources": ["events"], "verbs": ["watch"]}]}`, + expectedEtcdPath: "/registry/roles/etcdstoragepathtestnamespace/role3", + expectedGVK: gvkP("rbac.authorization.k8s.io", "v1beta1", "Role"), + }, + gvr("rbac.authorization.k8s.io", "v1", "clusterroles"): { + stub: `{"metadata": {"name": "crole3"}, "rules": [{"nonResourceURLs": ["/version"], "verbs": ["get"]}]}`, + expectedEtcdPath: "/registry/clusterroles/crole3", + expectedGVK: gvkP("rbac.authorization.k8s.io", "v1beta1", "ClusterRole"), + }, + gvr("rbac.authorization.k8s.io", "v1", "rolebindings"): { + stub: `{"metadata": {"name": "roleb3"}, "roleRef": {"apiGroup": "rbac.authorization.k8s.io", "kind": "ClusterRole", "name": "somecr"}, "subjects": [{"apiVersion": "rbac.authorization.k8s.io/v1alpha1", "kind": "Group", "name": "system:authenticated"}]}`, + expectedEtcdPath: "/registry/rolebindings/etcdstoragepathtestnamespace/roleb3", + expectedGVK: gvkP("rbac.authorization.k8s.io", "v1beta1", "RoleBinding"), + }, + gvr("rbac.authorization.k8s.io", "v1", "clusterrolebindings"): { + stub: `{"metadata": {"name": "croleb3"}, "roleRef": {"apiGroup": "rbac.authorization.k8s.io", "kind": "ClusterRole", "name": "somecr"}, "subjects": [{"apiVersion": "rbac.authorization.k8s.io/v1alpha1", "kind": "Group", "name": "system:authenticated"}]}`, + expectedEtcdPath: "/registry/clusterrolebindings/croleb3", + expectedGVK: gvkP("rbac.authorization.k8s.io", "v1beta1", "ClusterRoleBinding"), + }, + // -- + // k8s.io/kubernetes/pkg/apis/admissionregistration/v1alpha1 gvr("admissionregistration.k8s.io", "v1alpha1", "initializerconfigurations"): { stub: `{"metadata":{"name":"ic1"},"initializers":[{"name":"initializer.k8s.io","rules":[{"apiGroups":["group"],"apiVersions":["version"],"resources":["resource"]}],"failurePolicy":"Ignore"}]}`, @@ -348,6 +366,7 @@ var ephemeralWhiteList = createEphemeralWhiteList( gvr("", "v1", "rangeallocations"), // stored in various places in etcd but cannot be directly created gvr("", "v1", "componentstatuses"), // status info not stored in etcd gvr("", "v1", "serializedreferences"), // used for serilization, not stored in etcd + gvr("", "v1", "nodeconfigsources"), // subfield of node.spec, but shouldn't be directly created gvr("", "v1", "podstatusresults"), // wrapper object not stored in etcd // -- @@ -385,8 +404,7 @@ var ephemeralWhiteList = createEphemeralWhiteList( // -- // k8s.io/kubernetes/pkg/apis/apps/v1beta2 - gvr("apps", "v1beta2", "scales"), // not stored in etcd, part of kapiv1.ReplicationController - gvr("apps", "v1beta2", "deploymentrollbacks"), // used to rollback deployment, not stored in etcd + gvr("apps", "v1beta2", "scales"), // not stored in etcd, part of kapiv1.ReplicationController // -- // k8s.io/kubernetes/pkg/apis/batch/v2alpha1 diff --git a/test/integration/evictions/BUILD b/test/integration/evictions/BUILD index df5c65fafb2..404d8ae9bae 100644 --- a/test/integration/evictions/BUILD +++ b/test/integration/evictions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -14,10 +12,7 @@ go_test( "evictions_test.go", "main_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/controller/disruption:go_default_library", "//test/integration/framework:go_default_library", diff --git a/test/integration/examples/BUILD b/test/integration/examples/BUILD index 8d696172022..9e9dc9b478b 100644 --- a/test/integration/examples/BUILD +++ b/test/integration/examples/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -14,10 +12,7 @@ go_test( "apiserver_test.go", "main_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//cmd/kube-apiserver/app:go_default_library", "//cmd/kube-apiserver/app/options:go_default_library", diff --git a/test/integration/federation/BUILD b/test/integration/federation/BUILD index 1bb2e870979..ab566082f17 100644 --- a/test/integration/federation/BUILD +++ b/test/integration/federation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -15,10 +13,7 @@ go_test( "crud_test.go", "main_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/pkg/federatedtypes:go_default_library", diff --git a/test/integration/federation/crud_test.go b/test/integration/federation/crud_test.go index 703eac9dd85..5c3fa8b0b24 100644 --- a/test/integration/federation/crud_test.go +++ b/test/integration/federation/crud_test.go @@ -104,7 +104,7 @@ func initCRUDTest(t *testing.T, fedFixture *framework.FederationFixture, adapter fixture := framework.NewControllerFixture(t, kind, adapterFactory, config) client := fedFixture.APIFixture.NewClient(fmt.Sprintf("crud-test-%s", kind)) - adapter := adapterFactory(client, config) + adapter := adapterFactory(client, config, nil) crudTester := framework.NewFederatedTypeCRUDTester(t, adapter, fedFixture.ClusterClients) diff --git a/test/integration/federation/framework/BUILD b/test/integration/federation/framework/BUILD index 62dc7f8b2b4..e1cdac858e6 100644 --- a/test/integration/federation/framework/BUILD +++ b/test/integration/federation/framework/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "federation.go", "util.go", ], - tags = ["automanaged"], deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//federation/client/clientset_generated/federation_clientset:go_default_library", diff --git a/test/integration/federation/framework/controller.go b/test/integration/federation/framework/controller.go index 4cfaa1ff9da..2c5e925b1dd 100644 --- a/test/integration/federation/framework/controller.go +++ b/test/integration/federation/framework/controller.go @@ -34,7 +34,7 @@ func NewControllerFixture(t *testing.T, kind string, adapterFactory federatedtyp f := &ControllerFixture{ stopChan: make(chan struct{}), } - synccontroller.StartFederationSyncController(kind, adapterFactory, config, f.stopChan, true) + synccontroller.StartFederationSyncController(kind, adapterFactory, config, f.stopChan, true, nil) return f } diff --git a/test/integration/framework/BUILD b/test/integration/framework/BUILD index 51d38ff9f68..c6fb9d6df2e 100644 --- a/test/integration/framework/BUILD +++ b/test/integration/framework/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( data = [ "@com_coreos_etcd//:etcd", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", diff --git a/test/integration/framework/master_utils.go b/test/integration/framework/master_utils.go index 3f6b6c578ee..a6b9a85665a 100644 --- a/test/integration/framework/master_utils.go +++ b/test/integration/framework/master_utils.go @@ -28,9 +28,9 @@ import ( "time" "github.com/go-openapi/spec" + "github.com/golang/glog" "github.com/pborman/uuid" - "github.com/golang/glog" apps "k8s.io/api/apps/v1beta1" autoscaling "k8s.io/api/autoscaling/v1" certificates "k8s.io/api/certificates/v1beta1" diff --git a/test/integration/garbagecollector/BUILD b/test/integration/garbagecollector/BUILD index cead86dd533..3de6f032fb8 100644 --- a/test/integration/garbagecollector/BUILD +++ b/test/integration/garbagecollector/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -11,10 +9,7 @@ go_test( name = "go_default_test", size = "large", srcs = ["garbage_collector_test.go"], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//cmd/kube-apiserver/app/testing:go_default_library", "//pkg/controller/garbagecollector:go_default_library", diff --git a/test/integration/garbagecollector/garbage_collector_test.go b/test/integration/garbagecollector/garbage_collector_test.go index ee3f8389695..c0c7c2521b4 100644 --- a/test/integration/garbagecollector/garbage_collector_test.go +++ b/test/integration/garbagecollector/garbage_collector_test.go @@ -265,7 +265,7 @@ func setup(t *testing.T, workerCount int) *testContext { syncPeriod := 5 * time.Second startGC := func(workers int) { go gc.Run(workers, stopCh) - go gc.Sync(restMapper, discoveryClient, syncPeriod, stopCh) + go gc.Sync(clientSet.Discovery(), syncPeriod, stopCh) } if workerCount > 0 { diff --git a/test/integration/kubectl/BUILD b/test/integration/kubectl/BUILD index ac2b6efb19f..51095bd76d6 100644 --- a/test/integration/kubectl/BUILD +++ b/test/integration/kubectl/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -14,10 +12,7 @@ go_test( "kubectl_test.go", "main_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/kubectl/cmd/util:go_default_library", "//test/integration/framework:go_default_library", diff --git a/test/integration/master/BUILD b/test/integration/master/BUILD index 2c4dcee737c..c281aa1a067 100644 --- a/test/integration/master/BUILD +++ b/test/integration/master/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -14,10 +12,7 @@ go_test( "main_test.go", "master_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", diff --git a/test/integration/metrics/BUILD b/test/integration/metrics/BUILD index e3b8480babe..bfe3cf1b050 100644 --- a/test/integration/metrics/BUILD +++ b/test/integration/metrics/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = ["doc.go"], - tags = ["automanaged"], ) filegroup( @@ -35,10 +32,7 @@ go_test( "metrics_test.go", ], library = ":go_default_library", - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/api/testapi:go_default_library", "//test/integration/framework:go_default_library", diff --git a/test/integration/objectmeta/BUILD b/test/integration/objectmeta/BUILD index d86979bf3e2..c55e74cbd8b 100644 --- a/test/integration/objectmeta/BUILD +++ b/test/integration/objectmeta/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -14,10 +12,7 @@ go_test( "main_test.go", "objectmeta_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/api/testapi:go_default_library", "//test/integration/framework:go_default_library", diff --git a/test/integration/openshift/BUILD b/test/integration/openshift/BUILD index b7e180a750e..5883c5f1ff6 100644 --- a/test/integration/openshift/BUILD +++ b/test/integration/openshift/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -14,10 +12,7 @@ go_test( "main_test.go", "openshift_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/master:go_default_library", "//test/integration/framework:go_default_library", diff --git a/test/integration/pods/BUILD b/test/integration/pods/BUILD index c3922be2a4c..76f4dfd4c3b 100644 --- a/test/integration/pods/BUILD +++ b/test/integration/pods/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -14,10 +12,7 @@ go_test( "main_test.go", "pods_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/api/testapi:go_default_library", "//test/integration:go_default_library", diff --git a/test/integration/quota/BUILD b/test/integration/quota/BUILD index 49ec34900c7..ced16254188 100644 --- a/test/integration/quota/BUILD +++ b/test/integration/quota/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -14,10 +12,7 @@ go_test( "main_test.go", "quota_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", diff --git a/test/integration/replicaset/BUILD b/test/integration/replicaset/BUILD index 0cf71963652..281a0238a8e 100644 --- a/test/integration/replicaset/BUILD +++ b/test/integration/replicaset/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -14,10 +12,7 @@ go_test( "main_test.go", "replicaset_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/controller/replicaset:go_default_library", "//test/integration/framework:go_default_library", diff --git a/test/integration/replicationcontroller/BUILD b/test/integration/replicationcontroller/BUILD index 4aaa84ad5bc..8cd41606c58 100644 --- a/test/integration/replicationcontroller/BUILD +++ b/test/integration/replicationcontroller/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -14,10 +12,7 @@ go_test( "main_test.go", "replicationcontroller_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/controller/replication:go_default_library", "//test/integration/framework:go_default_library", diff --git a/test/integration/scheduler/BUILD b/test/integration/scheduler/BUILD index f9ce9514453..34c1505287d 100644 --- a/test/integration/scheduler/BUILD +++ b/test/integration/scheduler/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,10 +17,7 @@ go_test( "scheduler_test.go", ], library = ":go_default_library", - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", @@ -68,7 +63,6 @@ filegroup( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", diff --git a/test/integration/scheduler_perf/BUILD b/test/integration/scheduler_perf/BUILD index 8f843b474c7..a8352ea379e 100644 --- a/test/integration/scheduler_perf/BUILD +++ b/test/integration/scheduler_perf/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,9 +12,6 @@ go_library( "scheduler_perf_types.go", "util.go", ], - tags = [ - "automanaged", - ], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", @@ -43,10 +38,7 @@ go_test( "scheduler_test.go", ], library = ":go_default_library", - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//plugin/pkg/scheduler:go_default_library", "//test/integration/framework:go_default_library", diff --git a/test/integration/secrets/BUILD b/test/integration/secrets/BUILD index 66597e6ea32..09c06c3371e 100644 --- a/test/integration/secrets/BUILD +++ b/test/integration/secrets/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -14,10 +12,7 @@ go_test( "main_test.go", "secrets_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/api/testapi:go_default_library", "//test/integration:go_default_library", diff --git a/test/integration/serviceaccount/BUILD b/test/integration/serviceaccount/BUILD index adfc5f269c1..5967cada212 100644 --- a/test/integration/serviceaccount/BUILD +++ b/test/integration/serviceaccount/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -14,10 +12,7 @@ go_test( "main_test.go", "service_account_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/api/testapi:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/test/integration/storageclasses/BUILD b/test/integration/storageclasses/BUILD index fc294a76c90..b0126f6c6f8 100644 --- a/test/integration/storageclasses/BUILD +++ b/test/integration/storageclasses/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -14,10 +12,7 @@ go_test( "main_test.go", "storage_classes_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/api/testapi:go_default_library", "//test/integration/framework:go_default_library", diff --git a/test/integration/ttlcontroller/BUILD b/test/integration/ttlcontroller/BUILD index f0c39d2cd82..14b0dac3ebf 100644 --- a/test/integration/ttlcontroller/BUILD +++ b/test/integration/ttlcontroller/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -15,7 +13,6 @@ go_test( "ttlcontroller_test.go", ], tags = [ - "automanaged", "etcd", "integration", ], diff --git a/test/integration/volume/BUILD b/test/integration/volume/BUILD index 53a0540abeb..b16bc6978bb 100644 --- a/test/integration/volume/BUILD +++ b/test/integration/volume/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_test", @@ -15,10 +13,7 @@ go_test( "main_test.go", "persistent_volumes_test.go", ], - tags = [ - "automanaged", - "integration", - ], + tags = ["integration"], deps = [ "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", diff --git a/test/kubemark/BUILD b/test/kubemark/BUILD index 6cc62052baf..7e76248ad95 100644 --- a/test/kubemark/BUILD +++ b/test/kubemark/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/test/kubemark/resources/hollow-node_template.yaml b/test/kubemark/resources/hollow-node_template.yaml index 4ff70565d93..8bfe942c07b 100644 --- a/test/kubemark/resources/hollow-node_template.yaml +++ b/test/kubemark/resources/hollow-node_template.yaml @@ -60,7 +60,7 @@ spec: mountPath: /var/log resources: requests: - cpu: 50m + cpu: 40m memory: 100M securityContext: privileged: true diff --git a/test/list/BUILD b/test/list/BUILD index a8d39ad9755..a93479475a3 100644 --- a/test/list/BUILD +++ b/test/list/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -12,20 +10,17 @@ load( go_binary( name = "list", library = ":go_default_library", - tags = ["automanaged"], ) go_test( name = "go_default_test", srcs = ["main_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], ) filegroup( diff --git a/test/soak/cauldron/BUILD b/test/soak/cauldron/BUILD index e470ee16a01..64dfdd7bd74 100644 --- a/test/soak/cauldron/BUILD +++ b/test/soak/cauldron/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "cauldron", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["cauldron.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", diff --git a/test/soak/serve_hostnames/BUILD b/test/soak/serve_hostnames/BUILD index 70acbcc9243..110d7615060 100644 --- a/test/soak/serve_hostnames/BUILD +++ b/test/soak/serve_hostnames/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,13 +9,11 @@ load( go_binary( name = "serve_hostnames", library = ":go_default_library", - tags = ["automanaged"], ) go_library( name = "go_default_library", srcs = ["serve_hostnames.go"], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//test/e2e/framework:go_default_library", diff --git a/test/utils/BUILD b/test/utils/BUILD index 92d4030b1fd..5a6ec424d3f 100644 --- a/test/utils/BUILD +++ b/test/utils/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "runners.go", "tmpdir.go", ], - tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//pkg/api/v1/pod:go_default_library", diff --git a/test/utils/junit/BUILD b/test/utils/junit/BUILD index 5c272b709e9..a5f569e7dff 100644 --- a/test/utils/junit/BUILD +++ b/test/utils/junit/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["junit.go"], - tags = ["automanaged"], ) filegroup( diff --git a/third_party/forked/etcd221/pkg/fileutil/BUILD b/third_party/forked/etcd221/pkg/fileutil/BUILD index 333804f94ce..c0b8ba69db1 100644 --- a/third_party/forked/etcd221/pkg/fileutil/BUILD +++ b/third_party/forked/etcd221/pkg/fileutil/BUILD @@ -17,7 +17,6 @@ go_test( "purge_test.go", ], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -25,10 +24,17 @@ go_library( srcs = [ "fileutil.go", "lock_unix.go", - "preallocate.go", + "perallocate_unsupported.go", "purge.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "preallocate.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "lock_windows.go", + ], + "//conditions:default": [], + }), deps = ["//vendor/github.com/coreos/pkg/capnslog:go_default_library"], ) diff --git a/third_party/forked/etcd221/wal/BUILD b/third_party/forked/etcd221/wal/BUILD index e72732f018d..825c36418f9 100644 --- a/third_party/forked/etcd221/wal/BUILD +++ b/third_party/forked/etcd221/wal/BUILD @@ -19,7 +19,6 @@ go_library( "util.go", "wal.go", ], - tags = ["automanaged"], deps = [ "//third_party/forked/etcd221/pkg/fileutil:go_default_library", "//vendor/github.com/coreos/etcd/pkg/crc:go_default_library", diff --git a/third_party/forked/etcd221/wal/walpb/BUILD b/third_party/forked/etcd221/wal/walpb/BUILD index 7c725af1975..58724da2351 100644 --- a/third_party/forked/etcd221/wal/walpb/BUILD +++ b/third_party/forked/etcd221/wal/walpb/BUILD @@ -13,7 +13,6 @@ go_library( "record.go", "record.pb.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/gogo/protobuf/proto:go_default_library"], ) @@ -29,3 +28,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["record.proto"], + visibility = ["//visibility:public"], +) diff --git a/third_party/forked/etcd237/pkg/fileutil/BUILD b/third_party/forked/etcd237/pkg/fileutil/BUILD index 0b0c77bf61a..ee197edb8c5 100644 --- a/third_party/forked/etcd237/pkg/fileutil/BUILD +++ b/third_party/forked/etcd237/pkg/fileutil/BUILD @@ -17,7 +17,6 @@ go_test( "purge_test.go", ], library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -26,11 +25,19 @@ go_library( "fileutil.go", "lock.go", "lock_unix.go", - "preallocate.go", + "perallocate_unsupported.go", "purge.go", - "sync_linux.go", - ], - tags = ["automanaged"], + "sync.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "preallocate.go", + "sync_linux.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "lock_windows.go", + ], + "//conditions:default": [], + }), deps = ["//vendor/github.com/coreos/pkg/capnslog:go_default_library"], ) diff --git a/third_party/forked/etcd237/wal/BUILD b/third_party/forked/etcd237/wal/BUILD index cbcb9489381..f50ebfe4813 100644 --- a/third_party/forked/etcd237/wal/BUILD +++ b/third_party/forked/etcd237/wal/BUILD @@ -19,7 +19,6 @@ go_library( "util.go", "wal.go", ], - tags = ["automanaged"], deps = [ "//third_party/forked/etcd237/pkg/fileutil:go_default_library", "//vendor/github.com/coreos/etcd/pkg/crc:go_default_library", diff --git a/third_party/forked/etcd237/wal/walpb/BUILD b/third_party/forked/etcd237/wal/walpb/BUILD index 4976ff58b01..31ffd3ef9cb 100644 --- a/third_party/forked/etcd237/wal/walpb/BUILD +++ b/third_party/forked/etcd237/wal/walpb/BUILD @@ -13,7 +13,6 @@ go_library( "record.go", "record.pb.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], ) @@ -29,3 +28,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["record.proto"], + visibility = ["//visibility:public"], +) diff --git a/third_party/forked/golang/expansion/BUILD b/third_party/forked/golang/expansion/BUILD index 9fad8b97b0f..98c97738eef 100644 --- a/third_party/forked/golang/expansion/BUILD +++ b/third_party/forked/golang/expansion/BUILD @@ -11,14 +11,12 @@ load( go_library( name = "go_default_library", srcs = ["expand.go"], - tags = ["automanaged"], ) go_test( name = "go_default_test", srcs = ["expand_test.go"], library = ":go_default_library", - tags = ["automanaged"], deps = ["//pkg/api:go_default_library"], ) diff --git a/third_party/forked/golang/reflect/BUILD b/third_party/forked/golang/reflect/BUILD index a966c23d06d..f0a5662d52a 100644 --- a/third_party/forked/golang/reflect/BUILD +++ b/third_party/forked/golang/reflect/BUILD @@ -14,14 +14,12 @@ go_library( "deep_equal.go", "type.go", ], - tags = ["automanaged"], ) go_test( name = "go_default_test", srcs = ["deep_equal_test.go"], library = ":go_default_library", - tags = ["automanaged"], ) filegroup( diff --git a/third_party/forked/golang/template/BUILD b/third_party/forked/golang/template/BUILD index 1c022b63430..9ad3abc8b5f 100644 --- a/third_party/forked/golang/template/BUILD +++ b/third_party/forked/golang/template/BUILD @@ -13,7 +13,6 @@ go_library( "exec.go", "funcs.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/third_party/forked/gonum/graph/BUILD b/third_party/forked/gonum/graph/BUILD index 5fef90777fb..3b95a781a93 100644 --- a/third_party/forked/gonum/graph/BUILD +++ b/third_party/forked/gonum/graph/BUILD @@ -10,7 +10,6 @@ load( go_library( name = "go_default_library", srcs = ["graph.go"], - tags = ["automanaged"], ) filegroup( diff --git a/third_party/forked/gonum/graph/internal/linear/BUILD b/third_party/forked/gonum/graph/internal/linear/BUILD index 95b086fd354..f4df14a2262 100644 --- a/third_party/forked/gonum/graph/internal/linear/BUILD +++ b/third_party/forked/gonum/graph/internal/linear/BUILD @@ -10,7 +10,6 @@ load( go_library( name = "go_default_library", srcs = ["linear.go"], - tags = ["automanaged"], deps = ["//third_party/forked/gonum/graph:go_default_library"], ) diff --git a/third_party/forked/gonum/graph/simple/BUILD b/third_party/forked/gonum/graph/simple/BUILD index 092f84cb823..e97317901ab 100644 --- a/third_party/forked/gonum/graph/simple/BUILD +++ b/third_party/forked/gonum/graph/simple/BUILD @@ -16,7 +16,6 @@ go_test( "undirected_test.go", ], library = ":go_default_library", - tags = ["automanaged"], deps = ["//third_party/forked/gonum/graph:go_default_library"], ) @@ -28,7 +27,6 @@ go_library( "simple.go", "undirected.go", ], - tags = ["automanaged"], deps = [ "//third_party/forked/gonum/graph:go_default_library", "//vendor/golang.org/x/tools/container/intsets:go_default_library", diff --git a/third_party/forked/gonum/graph/traverse/BUILD b/third_party/forked/gonum/graph/traverse/BUILD index e0eb285a761..10bced1adce 100644 --- a/third_party/forked/gonum/graph/traverse/BUILD +++ b/third_party/forked/gonum/graph/traverse/BUILD @@ -13,7 +13,6 @@ go_library( "traverse.go", "visit_depth_first.go", ], - tags = ["automanaged"], deps = [ "//third_party/forked/gonum/graph:go_default_library", "//third_party/forked/gonum/graph/internal/linear:go_default_library", diff --git a/vendor/BUILD b/vendor/BUILD index 91e67487faa..1abe198496e 100644 --- a/vendor/BUILD +++ b/vendor/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - filegroup( name = "package-srcs", srcs = glob(["**"]), @@ -230,7 +228,6 @@ filegroup( "//vendor/github.com/gorilla/context:all-srcs", "//vendor/github.com/gorilla/mux:all-srcs", "//vendor/github.com/gorilla/websocket:all-srcs", - "//vendor/github.com/gregjones/httpcache:all-srcs", "//vendor/github.com/grpc-ecosystem/go-grpc-prometheus:all-srcs", "//vendor/github.com/grpc-ecosystem/grpc-gateway/runtime:all-srcs", "//vendor/github.com/grpc-ecosystem/grpc-gateway/utilities:all-srcs", @@ -277,7 +274,6 @@ filegroup( "//vendor/github.com/pborman/uuid:all-srcs", "//vendor/github.com/pelletier/go-buffruneio:all-srcs", "//vendor/github.com/pelletier/go-toml:all-srcs", - "//vendor/github.com/peterbourgon/diskv:all-srcs", "//vendor/github.com/pkg/errors:all-srcs", "//vendor/github.com/pkg/sftp:all-srcs", "//vendor/github.com/pmezard/go-difflib/difflib:all-srcs", diff --git a/vendor/bitbucket.org/bertimus9/systemstat/BUILD b/vendor/bitbucket.org/bertimus9/systemstat/BUILD index 38bccee1976..4d9707bc7d8 100644 --- a/vendor/bitbucket.org/bertimus9/systemstat/BUILD +++ b/vendor/bitbucket.org/bertimus9/systemstat/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,9 +9,12 @@ go_library( name = "go_default_library", srcs = [ "systemstat.go", - "systemstat_linux.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "systemstat_linux.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/bitbucket.org/ww/goautoneg/BUILD b/vendor/bitbucket.org/ww/goautoneg/BUILD index 8c04dc13cb2..1a0875deb92 100644 --- a/vendor/bitbucket.org/ww/goautoneg/BUILD +++ b/vendor/bitbucket.org/ww/goautoneg/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["autoneg.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/cloud.google.com/go/compute/metadata/BUILD b/vendor/cloud.google.com/go/compute/metadata/BUILD index aca8a91f792..ae4da9a1203 100644 --- a/vendor/cloud.google.com/go/compute/metadata/BUILD +++ b/vendor/cloud.google.com/go/compute/metadata/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["metadata.go"], - tags = ["automanaged"], deps = [ "//vendor/cloud.google.com/go/internal:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", diff --git a/vendor/cloud.google.com/go/internal/BUILD b/vendor/cloud.google.com/go/internal/BUILD index 1e6ae283fa0..3d1068d3fb5 100644 --- a/vendor/cloud.google.com/go/internal/BUILD +++ b/vendor/cloud.google.com/go/internal/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["cloud.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/Azure/azure-sdk-for-go/arm/compute/BUILD b/vendor/github.com/Azure/azure-sdk-for-go/arm/compute/BUILD index e2d8fa57d93..2e45e1129e7 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/arm/compute/BUILD +++ b/vendor/github.com/Azure/azure-sdk-for-go/arm/compute/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -24,7 +22,6 @@ go_library( "virtualmachinescalesetvms.go", "virtualmachinesizes.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", diff --git a/vendor/github.com/Azure/azure-sdk-for-go/arm/containerregistry/BUILD b/vendor/github.com/Azure/azure-sdk-for-go/arm/containerregistry/BUILD index 92c50e6bcc4..0ceb3590f8b 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/arm/containerregistry/BUILD +++ b/vendor/github.com/Azure/azure-sdk-for-go/arm/containerregistry/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "registries.go", "version.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", diff --git a/vendor/github.com/Azure/azure-sdk-for-go/arm/disk/BUILD b/vendor/github.com/Azure/azure-sdk-for-go/arm/disk/BUILD index dfc4bdfa13c..edbc7c65401 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/arm/disk/BUILD +++ b/vendor/github.com/Azure/azure-sdk-for-go/arm/disk/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "snapshots.go", "version.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", diff --git a/vendor/github.com/Azure/azure-sdk-for-go/arm/network/BUILD b/vendor/github.com/Azure/azure-sdk-for-go/arm/network/BUILD index 1c6bfc06fb5..687b0a258a5 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/arm/network/BUILD +++ b/vendor/github.com/Azure/azure-sdk-for-go/arm/network/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -38,7 +36,6 @@ go_library( "virtualnetworks.go", "watchers.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", diff --git a/vendor/github.com/Azure/azure-sdk-for-go/arm/storage/BUILD b/vendor/github.com/Azure/azure-sdk-for-go/arm/storage/BUILD index f7c2637c556..8b0fcf31ced 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/arm/storage/BUILD +++ b/vendor/github.com/Azure/azure-sdk-for-go/arm/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "usage.go", "version.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", diff --git a/vendor/github.com/Azure/azure-sdk-for-go/storage/BUILD b/vendor/github.com/Azure/azure-sdk-for-go/storage/BUILD index 4727d1d04ff..6ce434abc7d 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/storage/BUILD +++ b/vendor/github.com/Azure/azure-sdk-for-go/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -38,7 +36,6 @@ go_library( "util.go", "version.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", diff --git a/vendor/github.com/Azure/go-ansiterm/BUILD b/vendor/github.com/Azure/go-ansiterm/BUILD index 6da8d8fba4e..c4a904a93bb 100644 --- a/vendor/github.com/Azure/go-ansiterm/BUILD +++ b/vendor/github.com/Azure/go-ansiterm/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -25,7 +23,6 @@ go_library( "states.go", "utilities.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/Sirupsen/logrus:go_default_library"], ) @@ -38,6 +35,9 @@ filegroup( filegroup( name = "all-srcs", - srcs = [":package-srcs"], + srcs = [ + ":package-srcs", + "//vendor/github.com/Azure/go-ansiterm/winterm:all-srcs", + ], tags = ["automanaged"], ) diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/BUILD b/vendor/github.com/Azure/go-ansiterm/winterm/BUILD new file mode 100644 index 00000000000..52807b1cf46 --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/winterm/BUILD @@ -0,0 +1,40 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "ansi.go", + "api.go", + "attr_translation.go", + "cursor_helpers.go", + "erase_helpers.go", + "scroll_helper.go", + "utilities.go", + "win_event_handler.go", + ], + "//conditions:default": [], + }), + visibility = ["//visibility:public"], + deps = select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "//vendor/github.com/Azure/go-ansiterm:go_default_library", + "//vendor/github.com/Sirupsen/logrus:go_default_library", + ], + "//conditions:default": [], + }), +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/Azure/go-autorest/autorest/BUILD b/vendor/github.com/Azure/go-autorest/autorest/BUILD index 820faee9823..748cbdf0621 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/BUILD +++ b/vendor/github.com/Azure/go-autorest/autorest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -20,7 +18,6 @@ go_library( "utility.go", "version.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/Azure/go-autorest/autorest/adal:go_default_library"], ) diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/BUILD b/vendor/github.com/Azure/go-autorest/autorest/adal/BUILD index b1cdac65efd..b6a3d28f905 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/adal/BUILD +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "sender.go", "token.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/dgrijalva/jwt-go:go_default_library"], ) diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/BUILD b/vendor/github.com/Azure/go-autorest/autorest/azure/BUILD index ec59a579147..4f3f96366cd 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/azure/BUILD +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "azure.go", "environments.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", "//vendor/github.com/Azure/go-autorest/autorest/date:go_default_library", diff --git a/vendor/github.com/Azure/go-autorest/autorest/date/BUILD b/vendor/github.com/Azure/go-autorest/autorest/date/BUILD index c1123df662c..d7a1b7a6eff 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/date/BUILD +++ b/vendor/github.com/Azure/go-autorest/autorest/date/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "unixtime.go", "utility.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/Azure/go-autorest/autorest/to/BUILD b/vendor/github.com/Azure/go-autorest/autorest/to/BUILD index cc74007167b..d14d1ff81fa 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/to/BUILD +++ b/vendor/github.com/Azure/go-autorest/autorest/to/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["convert.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/Azure/go-autorest/autorest/validation/BUILD b/vendor/github.com/Azure/go-autorest/autorest/validation/BUILD index 604fc4ca120..1a78f6d273f 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/validation/BUILD +++ b/vendor/github.com/Azure/go-autorest/autorest/validation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["validation.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/MakeNowJust/heredoc/BUILD b/vendor/github.com/MakeNowJust/heredoc/BUILD index edd4d5863a2..0d951a8811f 100644 --- a/vendor/github.com/MakeNowJust/heredoc/BUILD +++ b/vendor/github.com/MakeNowJust/heredoc/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["heredoc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/Microsoft/go-winio/BUILD b/vendor/github.com/Microsoft/go-winio/BUILD index e006289e2f0..ab042f07ce5 100644 --- a/vendor/github.com/Microsoft/go-winio/BUILD +++ b/vendor/github.com/Microsoft/go-winio/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,8 +10,24 @@ go_library( srcs = [ "reparse.go", "syscall.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "backup.go", + "file.go", + "fileinfo.go", + "pipe.go", + "privilege.go", + "sd.go", + "zsyscall_windows.go", + ], + "//conditions:default": [], + }), + deps = select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "//vendor/golang.org/x/sys/windows:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/NYTimes/gziphandler/BUILD b/vendor/github.com/NYTimes/gziphandler/BUILD index 68761bbfd8f..9825935753a 100644 --- a/vendor/github.com/NYTimes/gziphandler/BUILD +++ b/vendor/github.com/NYTimes/gziphandler/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "gzip.go", "gzip_go18.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/PuerkitoBio/purell/BUILD b/vendor/github.com/PuerkitoBio/purell/BUILD index d4bafbdb3ac..7e825e1ba05 100644 --- a/vendor/github.com/PuerkitoBio/purell/BUILD +++ b/vendor/github.com/PuerkitoBio/purell/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["purell.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/PuerkitoBio/urlesc:go_default_library", "//vendor/golang.org/x/net/idna:go_default_library", diff --git a/vendor/github.com/PuerkitoBio/urlesc/BUILD b/vendor/github.com/PuerkitoBio/urlesc/BUILD index 0b8098577a5..190965dcba1 100644 --- a/vendor/github.com/PuerkitoBio/urlesc/BUILD +++ b/vendor/github.com/PuerkitoBio/urlesc/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["urlesc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/Sirupsen/logrus/BUILD b/vendor/github.com/Sirupsen/logrus/BUILD index 4a9045454c7..b70de36f996 100644 --- a/vendor/github.com/Sirupsen/logrus/BUILD +++ b/vendor/github.com/Sirupsen/logrus/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,11 +15,21 @@ go_library( "json_formatter.go", "logger.go", "logrus.go", - "terminal_linux.go", - "terminal_notwindows.go", "text_formatter.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "terminal_darwin.go", + "terminal_notwindows.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "terminal_linux.go", + "terminal_notwindows.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "terminal_windows.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/abbot/go-http-auth/BUILD b/vendor/github.com/abbot/go-http-auth/BUILD index 688e0044a7f..5b6a945e18f 100644 --- a/vendor/github.com/abbot/go-http-auth/BUILD +++ b/vendor/github.com/abbot/go-http-auth/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "misc.go", "users.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/appc/spec/schema/BUILD b/vendor/github.com/appc/spec/schema/BUILD index 14540866d7f..71c94c0012c 100644 --- a/vendor/github.com/appc/spec/schema/BUILD +++ b/vendor/github.com/appc/spec/schema/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "pod.go", "version.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/appc/spec/schema/types:go_default_library", "//vendor/go4.org/errorutil:go_default_library", diff --git a/vendor/github.com/appc/spec/schema/common/BUILD b/vendor/github.com/appc/spec/schema/common/BUILD index 49082322652..d940c0b9bb7 100644 --- a/vendor/github.com/appc/spec/schema/common/BUILD +++ b/vendor/github.com/appc/spec/schema/common/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["common.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/appc/spec/schema/types/BUILD b/vendor/github.com/appc/spec/schema/types/BUILD index 060cb5c01cd..93bc320bced 100644 --- a/vendor/github.com/appc/spec/schema/types/BUILD +++ b/vendor/github.com/appc/spec/schema/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -37,7 +35,6 @@ go_library( "uuid.go", "volume.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/appc/spec/schema/common:go_default_library", "//vendor/github.com/appc/spec/schema/types/resource:go_default_library", diff --git a/vendor/github.com/appc/spec/schema/types/resource/BUILD b/vendor/github.com/appc/spec/schema/types/resource/BUILD index 13d2c37f090..025035b6d2e 100644 --- a/vendor/github.com/appc/spec/schema/types/resource/BUILD +++ b/vendor/github.com/appc/spec/schema/types/resource/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "scale_int.go", "suffix.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/spf13/pflag:go_default_library", "//vendor/gopkg.in/inf.v0:go_default_library", diff --git a/vendor/github.com/armon/circbuf/BUILD b/vendor/github.com/armon/circbuf/BUILD index 29cdbd8e2fd..19cf9375df6 100644 --- a/vendor/github.com/armon/circbuf/BUILD +++ b/vendor/github.com/armon/circbuf/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["circbuf.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/asaskevich/govalidator/BUILD b/vendor/github.com/asaskevich/govalidator/BUILD index 5dfd0c31ba6..a126a568882 100644 --- a/vendor/github.com/asaskevich/govalidator/BUILD +++ b/vendor/github.com/asaskevich/govalidator/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "utils.go", "validator.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/aws/aws-sdk-go/aws/BUILD b/vendor/github.com/aws/aws-sdk-go/aws/BUILD index 9ff75c1dec8..f69dd067a60 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/aws/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "types.go", "version.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/credentials:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awserr/BUILD b/vendor/github.com/aws/aws-sdk-go/aws/awserr/BUILD index c2088dbea17..b730c4bbc6c 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/awserr/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/aws/awserr/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "error.go", "types.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/BUILD b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/BUILD index f4d9fc443ea..f2bcf336128 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "prettify.go", "string_value.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/jmespath/go-jmespath:go_default_library"], ) diff --git a/vendor/github.com/aws/aws-sdk-go/aws/client/BUILD b/vendor/github.com/aws/aws-sdk-go/aws/client/BUILD index b5e2f9fd602..67bdd6d5392 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/client/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/aws/client/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "client.go", "default_retryer.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/client/metadata:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/aws/client/metadata/BUILD b/vendor/github.com/aws/aws-sdk-go/aws/client/metadata/BUILD index 3c217f56792..351f951b229 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/client/metadata/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/aws/client/metadata/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["client_info.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/BUILD b/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/BUILD index 8431a1eabe1..dfe8f39d4ee 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "handlers.go", "param_validator.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/BUILD b/vendor/github.com/aws/aws-sdk-go/aws/credentials/BUILD index 375d524db7e..48765e75f4c 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "shared_credentials_provider.go", "static_provider.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", "//vendor/github.com/go-ini/ini:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/BUILD b/vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/BUILD index 483632ac5ab..bc77c1c6167 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["ec2_role_provider.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/client:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/BUILD b/vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/BUILD index 8b1994c7fd2..4b416a72f13 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["provider.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/BUILD b/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/BUILD index c2f7b794785..3c9fa1e8163 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["assume_role_provider.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/client:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/aws/defaults/BUILD b/vendor/github.com/aws/aws-sdk-go/aws/defaults/BUILD index 8db5f13731c..afa1bb30d88 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/defaults/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/aws/defaults/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["defaults.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/corehandlers:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/BUILD b/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/BUILD index 2a14983d223..bb99aad9c36 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "api.go", "service.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/BUILD b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/BUILD index 57ac74ab41e..9d4a947a935 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "endpoints.go", "v3model.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library"], ) diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/BUILD b/vendor/github.com/aws/aws-sdk-go/aws/request/BUILD index 12a2cf577fe..c4c306a71ce 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,12 +12,12 @@ go_library( "http_request.go", "offset_reader.go", "request.go", + "request_1_7.go", "request_1_8.go", "request_pagination.go", "retryer.go", "validation.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/BUILD b/vendor/github.com/aws/aws-sdk-go/aws/session/BUILD index 6f9295b9605..a8c74b7cefa 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/session/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/aws/session/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "session.go", "shared_config.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/BUILD b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/BUILD index 98a714cebc8..af58e9c0ec1 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "uri_path.go", "v4.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/credentials:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/BUILD b/vendor/github.com/aws/aws-sdk-go/private/protocol/BUILD index 2bc2052327b..994485022d3 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "idempotency.go", "unmarshal.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/aws/aws-sdk-go/aws/request:go_default_library"], ) diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/ec2query/BUILD b/vendor/github.com/aws/aws-sdk-go/private/protocol/ec2query/BUILD index c094aa0f45b..7ec697660a2 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/ec2query/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/ec2query/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "build.go", "unmarshal.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/request:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/BUILD b/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/BUILD index 43e24efcafe..a80e6ba608e 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "build.go", "unmarshal.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/aws/aws-sdk-go/private/protocol:go_default_library"], ) diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/jsonrpc/BUILD b/vendor/github.com/aws/aws-sdk-go/private/protocol/jsonrpc/BUILD index 8affba4b954..e62d0c9b7d3 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/jsonrpc/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/jsonrpc/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["jsonrpc.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/request:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/BUILD b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/BUILD index 4a4c702b1dc..159c882220e 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "unmarshal.go", "unmarshal_error.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/request:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/BUILD b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/BUILD index 3b47de41068..630ba6a2ef2 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["queryutil.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/aws/aws-sdk-go/private/protocol:go_default_library"], ) diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/BUILD b/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/BUILD index bf52df67c3c..2ec58b2c3ff 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "payload.go", "unmarshal.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/restxml/BUILD b/vendor/github.com/aws/aws-sdk-go/private/protocol/restxml/BUILD index afad5590d50..d7237a70a6b 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/restxml/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/restxml/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["restxml.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/request:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/BUILD b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/BUILD index 62dc665118e..85163dca567 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "unmarshal.go", "xml_to_struct.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/aws/aws-sdk-go/private/protocol:go_default_library"], ) diff --git a/vendor/github.com/aws/aws-sdk-go/private/waiter/BUILD b/vendor/github.com/aws/aws-sdk-go/private/waiter/BUILD index 5ec0588a9ff..6949b9a5c7f 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/waiter/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/private/waiter/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["waiter.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/service/autoscaling/BUILD b/vendor/github.com/aws/aws-sdk-go/service/autoscaling/BUILD index 474637d1e64..7ad8fb3a317 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/autoscaling/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/service/autoscaling/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "service.go", "waiters.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/awsutil:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/service/ec2/BUILD b/vendor/github.com/aws/aws-sdk-go/service/ec2/BUILD index 4ce03d057e8..2fc43b8fc7a 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/ec2/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/service/ec2/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "service.go", "waiters.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/awsutil:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/service/ecr/BUILD b/vendor/github.com/aws/aws-sdk-go/service/ecr/BUILD index 8f0650da010..9601d97464b 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/ecr/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/service/ecr/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "api.go", "service.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/awsutil:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/service/elb/BUILD b/vendor/github.com/aws/aws-sdk-go/service/elb/BUILD index 04411e145db..18d3aa3a614 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/elb/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/service/elb/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "service.go", "waiters.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/awsutil:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/service/route53/BUILD b/vendor/github.com/aws/aws-sdk-go/service/route53/BUILD index 361bc0dedc3..36247aa79bf 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/route53/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/service/route53/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "unmarshal_error.go", "waiters.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/BUILD b/vendor/github.com/aws/aws-sdk-go/service/sts/BUILD index 6cf7b0b71db..6f2faccb30f 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/sts/BUILD +++ b/vendor/github.com/aws/aws-sdk-go/service/sts/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "customizations.go", "service.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/awsutil:go_default_library", diff --git a/vendor/github.com/beorn7/perks/quantile/BUILD b/vendor/github.com/beorn7/perks/quantile/BUILD index 0d4763bd201..dd069e54645 100644 --- a/vendor/github.com/beorn7/perks/quantile/BUILD +++ b/vendor/github.com/beorn7/perks/quantile/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["stream.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/blang/semver/BUILD b/vendor/github.com/blang/semver/BUILD index 4bd55a51e3b..b5aba2c78c7 100644 --- a/vendor/github.com/blang/semver/BUILD +++ b/vendor/github.com/blang/semver/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "sort.go", "sql.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/boltdb/bolt/BUILD b/vendor/github.com/boltdb/bolt/BUILD index c7d4b56832c..760f04d3f9d 100644 --- a/vendor/github.com/boltdb/bolt/BUILD +++ b/vendor/github.com/boltdb/bolt/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,9 +8,8 @@ load( go_library( name = "go_default_library", srcs = [ - "bolt_amd64.go", - "bolt_linux.go", "bolt_unix.go", + "boltsync_unix.go", "bucket.go", "cursor.go", "db.go", @@ -22,8 +19,20 @@ go_library( "node.go", "page.go", "tx.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "bolt_amd64.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "bolt_amd64.go", + "bolt_linux.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "bolt_amd64.go", + "bolt_windows.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/chai2010/gettext-go/gettext/BUILD b/vendor/github.com/chai2010/gettext-go/gettext/BUILD index da5312f2fbc..1d6c1247774 100644 --- a/vendor/github.com/chai2010/gettext-go/gettext/BUILD +++ b/vendor/github.com/chai2010/gettext-go/gettext/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "local.go", "tr.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/chai2010/gettext-go/gettext/mo:go_default_library", "//vendor/github.com/chai2010/gettext-go/gettext/plural:go_default_library", diff --git a/vendor/github.com/chai2010/gettext-go/gettext/mo/BUILD b/vendor/github.com/chai2010/gettext-go/gettext/mo/BUILD index ff8fb006540..2a9e7832212 100644 --- a/vendor/github.com/chai2010/gettext-go/gettext/mo/BUILD +++ b/vendor/github.com/chai2010/gettext-go/gettext/mo/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "message.go", "util.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/chai2010/gettext-go/gettext/plural/BUILD b/vendor/github.com/chai2010/gettext-go/gettext/plural/BUILD index 8ed45dec726..924d68518ae 100644 --- a/vendor/github.com/chai2010/gettext-go/gettext/plural/BUILD +++ b/vendor/github.com/chai2010/gettext-go/gettext/plural/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "formula.go", "table.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/chai2010/gettext-go/gettext/po/BUILD b/vendor/github.com/chai2010/gettext-go/gettext/po/BUILD index e06aad0b5f0..c734cd6eba0 100644 --- a/vendor/github.com/chai2010/gettext-go/gettext/po/BUILD +++ b/vendor/github.com/chai2010/gettext-go/gettext/po/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "re.go", "util.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/cloudflare/cfssl/auth/BUILD b/vendor/github.com/cloudflare/cfssl/auth/BUILD index ce489e526a8..24df7e2477b 100644 --- a/vendor/github.com/cloudflare/cfssl/auth/BUILD +++ b/vendor/github.com/cloudflare/cfssl/auth/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["auth.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/cloudflare/cfssl/certdb/BUILD b/vendor/github.com/cloudflare/cfssl/certdb/BUILD index a2099ccc8a3..a828fc79dcb 100644 --- a/vendor/github.com/cloudflare/cfssl/certdb/BUILD +++ b/vendor/github.com/cloudflare/cfssl/certdb/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["certdb.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/cloudflare/cfssl/config/BUILD b/vendor/github.com/cloudflare/cfssl/config/BUILD index bb454065dcb..603b2e73285 100644 --- a/vendor/github.com/cloudflare/cfssl/config/BUILD +++ b/vendor/github.com/cloudflare/cfssl/config/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["config.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/cloudflare/cfssl/auth:go_default_library", "//vendor/github.com/cloudflare/cfssl/errors:go_default_library", diff --git a/vendor/github.com/cloudflare/cfssl/crypto/pkcs7/BUILD b/vendor/github.com/cloudflare/cfssl/crypto/pkcs7/BUILD index 85edcc86fee..81096d170f5 100644 --- a/vendor/github.com/cloudflare/cfssl/crypto/pkcs7/BUILD +++ b/vendor/github.com/cloudflare/cfssl/crypto/pkcs7/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["pkcs7.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/cloudflare/cfssl/errors:go_default_library"], ) diff --git a/vendor/github.com/cloudflare/cfssl/csr/BUILD b/vendor/github.com/cloudflare/cfssl/csr/BUILD index febf5e35454..461251d456b 100644 --- a/vendor/github.com/cloudflare/cfssl/csr/BUILD +++ b/vendor/github.com/cloudflare/cfssl/csr/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["csr.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/cloudflare/cfssl/errors:go_default_library", "//vendor/github.com/cloudflare/cfssl/helpers:go_default_library", diff --git a/vendor/github.com/cloudflare/cfssl/errors/BUILD b/vendor/github.com/cloudflare/cfssl/errors/BUILD index aeea876d3f9..a4878fd2346 100644 --- a/vendor/github.com/cloudflare/cfssl/errors/BUILD +++ b/vendor/github.com/cloudflare/cfssl/errors/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "error.go", "http.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/cloudflare/cfssl/helpers/BUILD b/vendor/github.com/cloudflare/cfssl/helpers/BUILD index 3c8c2433280..1545cebd877 100644 --- a/vendor/github.com/cloudflare/cfssl/helpers/BUILD +++ b/vendor/github.com/cloudflare/cfssl/helpers/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["helpers.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/cloudflare/cfssl/crypto/pkcs7:go_default_library", "//vendor/github.com/cloudflare/cfssl/errors:go_default_library", diff --git a/vendor/github.com/cloudflare/cfssl/helpers/derhelpers/BUILD b/vendor/github.com/cloudflare/cfssl/helpers/derhelpers/BUILD index d24af54354f..4c5245b4ac2 100644 --- a/vendor/github.com/cloudflare/cfssl/helpers/derhelpers/BUILD +++ b/vendor/github.com/cloudflare/cfssl/helpers/derhelpers/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["derhelpers.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/cloudflare/cfssl/errors:go_default_library"], ) diff --git a/vendor/github.com/cloudflare/cfssl/info/BUILD b/vendor/github.com/cloudflare/cfssl/info/BUILD index 323cf25e637..bbb65c45671 100644 --- a/vendor/github.com/cloudflare/cfssl/info/BUILD +++ b/vendor/github.com/cloudflare/cfssl/info/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["info.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/cloudflare/cfssl/log/BUILD b/vendor/github.com/cloudflare/cfssl/log/BUILD index 6f7006448d1..e9dc9069768 100644 --- a/vendor/github.com/cloudflare/cfssl/log/BUILD +++ b/vendor/github.com/cloudflare/cfssl/log/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["log.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/cloudflare/cfssl/ocsp/config/BUILD b/vendor/github.com/cloudflare/cfssl/ocsp/config/BUILD index f811fb8f199..329b92f689b 100644 --- a/vendor/github.com/cloudflare/cfssl/ocsp/config/BUILD +++ b/vendor/github.com/cloudflare/cfssl/ocsp/config/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["config.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/cloudflare/cfssl/signer/BUILD b/vendor/github.com/cloudflare/cfssl/signer/BUILD index a74d9510222..5e862e195ec 100644 --- a/vendor/github.com/cloudflare/cfssl/signer/BUILD +++ b/vendor/github.com/cloudflare/cfssl/signer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["signer.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/cloudflare/cfssl/certdb:go_default_library", "//vendor/github.com/cloudflare/cfssl/config:go_default_library", diff --git a/vendor/github.com/cloudflare/cfssl/signer/local/BUILD b/vendor/github.com/cloudflare/cfssl/signer/local/BUILD index 628cdd38885..c72816c94c9 100644 --- a/vendor/github.com/cloudflare/cfssl/signer/local/BUILD +++ b/vendor/github.com/cloudflare/cfssl/signer/local/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["local.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/cloudflare/cfssl/certdb:go_default_library", "//vendor/github.com/cloudflare/cfssl/config:go_default_library", diff --git a/vendor/github.com/clusterhq/flocker-go/BUILD b/vendor/github.com/clusterhq/flocker-go/BUILD index 26f5e5d06a6..752893715e0 100644 --- a/vendor/github.com/clusterhq/flocker-go/BUILD +++ b/vendor/github.com/clusterhq/flocker-go/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "util.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/codedellemc/goscaleio/BUILD b/vendor/github.com/codedellemc/goscaleio/BUILD index 8751f76db5c..d7f26d921ae 100644 --- a/vendor/github.com/codedellemc/goscaleio/BUILD +++ b/vendor/github.com/codedellemc/goscaleio/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -23,7 +21,6 @@ go_library( "user.go", "volume.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/Sirupsen/logrus:go_default_library", "//vendor/github.com/codedellemc/goscaleio/types/v1:go_default_library", diff --git a/vendor/github.com/codedellemc/goscaleio/types/v1/BUILD b/vendor/github.com/codedellemc/goscaleio/types/v1/BUILD index 6109f467f1a..f39b267a2f0 100644 --- a/vendor/github.com/codedellemc/goscaleio/types/v1/BUILD +++ b/vendor/github.com/codedellemc/goscaleio/types/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["types.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/codegangsta/negroni/BUILD b/vendor/github.com/codegangsta/negroni/BUILD index 4f3ab7ccdfa..c887e81af0e 100644 --- a/vendor/github.com/codegangsta/negroni/BUILD +++ b/vendor/github.com/codegangsta/negroni/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "response_writer.go", "static.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/containernetworking/cni/libcni/BUILD b/vendor/github.com/containernetworking/cni/libcni/BUILD index 2858c1bcb65..a54c1fc39e0 100644 --- a/vendor/github.com/containernetworking/cni/libcni/BUILD +++ b/vendor/github.com/containernetworking/cni/libcni/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "api.go", "conf.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/containernetworking/cni/pkg/invoke:go_default_library", "//vendor/github.com/containernetworking/cni/pkg/types:go_default_library", diff --git a/vendor/github.com/containernetworking/cni/pkg/invoke/BUILD b/vendor/github.com/containernetworking/cni/pkg/invoke/BUILD index c2d1b3cde3a..0ca223abf3a 100644 --- a/vendor/github.com/containernetworking/cni/pkg/invoke/BUILD +++ b/vendor/github.com/containernetworking/cni/pkg/invoke/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,10 +12,19 @@ go_library( "delegate.go", "exec.go", "find.go", - "os_unix.go", "raw_exec.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "os_unix.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "os_unix.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "os_windows.go", + ], + "//conditions:default": [], + }), deps = [ "//vendor/github.com/containernetworking/cni/pkg/types:go_default_library", "//vendor/github.com/containernetworking/cni/pkg/version:go_default_library", diff --git a/vendor/github.com/containernetworking/cni/pkg/types/020/BUILD b/vendor/github.com/containernetworking/cni/pkg/types/020/BUILD index 06470c04c35..d2c45b30c2e 100644 --- a/vendor/github.com/containernetworking/cni/pkg/types/020/BUILD +++ b/vendor/github.com/containernetworking/cni/pkg/types/020/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["types.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/containernetworking/cni/pkg/types:go_default_library"], ) diff --git a/vendor/github.com/containernetworking/cni/pkg/types/BUILD b/vendor/github.com/containernetworking/cni/pkg/types/BUILD index 36edc11fa9f..14683ab5c10 100644 --- a/vendor/github.com/containernetworking/cni/pkg/types/BUILD +++ b/vendor/github.com/containernetworking/cni/pkg/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "args.go", "types.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/containernetworking/cni/pkg/types/current/BUILD b/vendor/github.com/containernetworking/cni/pkg/types/current/BUILD index 23cb13809cb..5450c28cca5 100644 --- a/vendor/github.com/containernetworking/cni/pkg/types/current/BUILD +++ b/vendor/github.com/containernetworking/cni/pkg/types/current/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["types.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/containernetworking/cni/pkg/types:go_default_library", "//vendor/github.com/containernetworking/cni/pkg/types/020:go_default_library", diff --git a/vendor/github.com/containernetworking/cni/pkg/version/BUILD b/vendor/github.com/containernetworking/cni/pkg/version/BUILD index 643c49baf2e..095c07e15db 100644 --- a/vendor/github.com/containernetworking/cni/pkg/version/BUILD +++ b/vendor/github.com/containernetworking/cni/pkg/version/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "reconcile.go", "version.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/containernetworking/cni/pkg/types:go_default_library", "//vendor/github.com/containernetworking/cni/pkg/types/020:go_default_library", diff --git a/vendor/github.com/coreos/etcd/alarm/BUILD b/vendor/github.com/coreos/etcd/alarm/BUILD index 414588f609c..b613c011999 100644 --- a/vendor/github.com/coreos/etcd/alarm/BUILD +++ b/vendor/github.com/coreos/etcd/alarm/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["alarms.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/etcdserver/etcdserverpb:go_default_library", "//vendor/github.com/coreos/etcd/mvcc/backend:go_default_library", diff --git a/vendor/github.com/coreos/etcd/auth/BUILD b/vendor/github.com/coreos/etcd/auth/BUILD index 28d0069b4a2..3dbaccfcbf5 100644 --- a/vendor/github.com/coreos/etcd/auth/BUILD +++ b/vendor/github.com/coreos/etcd/auth/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "simple_token.go", "store.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/auth/authpb:go_default_library", "//vendor/github.com/coreos/etcd/etcdserver/etcdserverpb:go_default_library", diff --git a/vendor/github.com/coreos/etcd/auth/authpb/BUILD b/vendor/github.com/coreos/etcd/auth/authpb/BUILD index 39a2cb9529a..c58d89af1af 100644 --- a/vendor/github.com/coreos/etcd/auth/authpb/BUILD +++ b/vendor/github.com/coreos/etcd/auth/authpb/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["auth.pb.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], ) @@ -26,3 +23,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["auth.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/coreos/etcd/client/BUILD b/vendor/github.com/coreos/etcd/client/BUILD index 69c042b0e1b..b6775d8e335 100644 --- a/vendor/github.com/coreos/etcd/client/BUILD +++ b/vendor/github.com/coreos/etcd/client/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -24,7 +22,6 @@ go_library( "srv.go", "util.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/pkg/pathutil:go_default_library", "//vendor/github.com/coreos/etcd/pkg/types:go_default_library", diff --git a/vendor/github.com/coreos/etcd/clientv3/BUILD b/vendor/github.com/coreos/etcd/clientv3/BUILD index a6048ddb56f..5351f504eaa 100644 --- a/vendor/github.com/coreos/etcd/clientv3/BUILD +++ b/vendor/github.com/coreos/etcd/clientv3/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -28,7 +26,6 @@ go_library( "txn.go", "watch.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/auth/authpb:go_default_library", "//vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes:go_default_library", diff --git a/vendor/github.com/coreos/etcd/compactor/BUILD b/vendor/github.com/coreos/etcd/compactor/BUILD index 29935ac1883..57c6998a56a 100644 --- a/vendor/github.com/coreos/etcd/compactor/BUILD +++ b/vendor/github.com/coreos/etcd/compactor/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "compactor.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/etcdserver/etcdserverpb:go_default_library", "//vendor/github.com/coreos/etcd/mvcc:go_default_library", diff --git a/vendor/github.com/coreos/etcd/discovery/BUILD b/vendor/github.com/coreos/etcd/discovery/BUILD index 6a1be2febb1..4ca52f741f7 100644 --- a/vendor/github.com/coreos/etcd/discovery/BUILD +++ b/vendor/github.com/coreos/etcd/discovery/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "discovery.go", "srv.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/client:go_default_library", "//vendor/github.com/coreos/etcd/pkg/transport:go_default_library", diff --git a/vendor/github.com/coreos/etcd/error/BUILD b/vendor/github.com/coreos/etcd/error/BUILD index 7fac00a9c6d..79e5f67f936 100644 --- a/vendor/github.com/coreos/etcd/error/BUILD +++ b/vendor/github.com/coreos/etcd/error/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["error.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/etcd/etcdserver/BUILD b/vendor/github.com/coreos/etcd/etcdserver/BUILD index 56145d3ae94..21270144d67 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/BUILD +++ b/vendor/github.com/coreos/etcd/etcdserver/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -28,7 +26,6 @@ go_library( "v2_server.go", "v3_server.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/alarm:go_default_library", "//vendor/github.com/coreos/etcd/auth:go_default_library", diff --git a/vendor/github.com/coreos/etcd/etcdserver/api/BUILD b/vendor/github.com/coreos/etcd/etcdserver/api/BUILD index 86d25703e10..da4dd27d1d5 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/api/BUILD +++ b/vendor/github.com/coreos/etcd/etcdserver/api/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "cluster.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/etcdserver/membership:go_default_library", "//vendor/github.com/coreos/etcd/pkg/types:go_default_library", diff --git a/vendor/github.com/coreos/etcd/etcdserver/api/v2http/BUILD b/vendor/github.com/coreos/etcd/etcdserver/api/v2http/BUILD index 271310ddb3e..f6cbe7a907b 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/api/v2http/BUILD +++ b/vendor/github.com/coreos/etcd/etcdserver/api/v2http/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "metrics.go", "peer.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/error:go_default_library", "//vendor/github.com/coreos/etcd/etcdserver:go_default_library", diff --git a/vendor/github.com/coreos/etcd/etcdserver/api/v2http/httptypes/BUILD b/vendor/github.com/coreos/etcd/etcdserver/api/v2http/httptypes/BUILD index fe2e70cf43e..4ef98e1359d 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/api/v2http/httptypes/BUILD +++ b/vendor/github.com/coreos/etcd/etcdserver/api/v2http/httptypes/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "errors.go", "member.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/pkg/types:go_default_library", "//vendor/github.com/coreos/pkg/capnslog:go_default_library", diff --git a/vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/BUILD b/vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/BUILD index cd00c3e248b..deb2c8ca6f4 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/BUILD +++ b/vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -24,7 +22,6 @@ go_library( "util.go", "watch.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/auth:go_default_library", "//vendor/github.com/coreos/etcd/etcdserver:go_default_library", diff --git a/vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes/BUILD b/vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes/BUILD index d247010b110..b8328b39e43 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes/BUILD +++ b/vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "error.go", "md.go", ], - tags = ["automanaged"], deps = [ "//vendor/google.golang.org/grpc:go_default_library", "//vendor/google.golang.org/grpc/codes:go_default_library", diff --git a/vendor/github.com/coreos/etcd/etcdserver/auth/BUILD b/vendor/github.com/coreos/etcd/etcdserver/auth/BUILD index 7f0065fb7cc..03d59ccbea0 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/auth/BUILD +++ b/vendor/github.com/coreos/etcd/etcdserver/auth/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "auth.go", "auth_requests.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/error:go_default_library", "//vendor/github.com/coreos/etcd/etcdserver:go_default_library", diff --git a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/BUILD b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/BUILD index 01d0a6c1aed..3223d936b4a 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/BUILD +++ b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "rpc.pb.go", "rpc.pb.gw.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/auth/authpb:go_default_library", "//vendor/github.com/coreos/etcd/mvcc/mvccpb:go_default_library", @@ -41,3 +38,13 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = [ + "etcdserver.proto", + "raft_internal.proto", + "rpc.proto", + ], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/coreos/etcd/etcdserver/membership/BUILD b/vendor/github.com/coreos/etcd/etcdserver/membership/BUILD index 6c1e95bf487..62793fb8007 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/membership/BUILD +++ b/vendor/github.com/coreos/etcd/etcdserver/membership/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "member.go", "store.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/error:go_default_library", "//vendor/github.com/coreos/etcd/mvcc/backend:go_default_library", diff --git a/vendor/github.com/coreos/etcd/etcdserver/stats/BUILD b/vendor/github.com/coreos/etcd/etcdserver/stats/BUILD index 71c3ae05cc3..4715fa8963a 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/stats/BUILD +++ b/vendor/github.com/coreos/etcd/etcdserver/stats/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "server.go", "stats.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/raft:go_default_library", "//vendor/github.com/coreos/pkg/capnslog:go_default_library", diff --git a/vendor/github.com/coreos/etcd/integration/BUILD b/vendor/github.com/coreos/etcd/integration/BUILD index 97b13d08147..21d3bdae646 100644 --- a/vendor/github.com/coreos/etcd/integration/BUILD +++ b/vendor/github.com/coreos/etcd/integration/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "cluster_direct.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/client:go_default_library", "//vendor/github.com/coreos/etcd/clientv3:go_default_library", diff --git a/vendor/github.com/coreos/etcd/lease/BUILD b/vendor/github.com/coreos/etcd/lease/BUILD index cabe1bff2e8..e6aeff5b343 100644 --- a/vendor/github.com/coreos/etcd/lease/BUILD +++ b/vendor/github.com/coreos/etcd/lease/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "lessor.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/lease/leasepb:go_default_library", "//vendor/github.com/coreos/etcd/mvcc/backend:go_default_library", diff --git a/vendor/github.com/coreos/etcd/lease/leasehttp/BUILD b/vendor/github.com/coreos/etcd/lease/leasehttp/BUILD index c92354708cb..bf9f4aa860f 100644 --- a/vendor/github.com/coreos/etcd/lease/leasehttp/BUILD +++ b/vendor/github.com/coreos/etcd/lease/leasehttp/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "http.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/etcdserver/etcdserverpb:go_default_library", "//vendor/github.com/coreos/etcd/lease:go_default_library", diff --git a/vendor/github.com/coreos/etcd/lease/leasepb/BUILD b/vendor/github.com/coreos/etcd/lease/leasepb/BUILD index 7717884d728..7663e10dff0 100644 --- a/vendor/github.com/coreos/etcd/lease/leasepb/BUILD +++ b/vendor/github.com/coreos/etcd/lease/leasepb/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["lease.pb.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/etcdserver/etcdserverpb:go_default_library", "//vendor/github.com/golang/protobuf/proto:go_default_library", @@ -29,3 +26,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["lease.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/coreos/etcd/mvcc/BUILD b/vendor/github.com/coreos/etcd/mvcc/BUILD index 4a800a4f57d..d486437f82a 100644 --- a/vendor/github.com/coreos/etcd/mvcc/BUILD +++ b/vendor/github.com/coreos/etcd/mvcc/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -23,7 +21,6 @@ go_library( "watcher.go", "watcher_group.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/lease:go_default_library", "//vendor/github.com/coreos/etcd/mvcc/backend:go_default_library", diff --git a/vendor/github.com/coreos/etcd/mvcc/backend/BUILD b/vendor/github.com/coreos/etcd/mvcc/backend/BUILD index 38001ca3178..d57206a4282 100644 --- a/vendor/github.com/coreos/etcd/mvcc/backend/BUILD +++ b/vendor/github.com/coreos/etcd/mvcc/backend/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,11 +10,15 @@ go_library( srcs = [ "backend.go", "batch_tx.go", - "boltoption_linux.go", + "boltoption_default.go", "doc.go", "metrics.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "boltoption_linux.go", + ], + "//conditions:default": [], + }), deps = [ "//vendor/github.com/boltdb/bolt:go_default_library", "//vendor/github.com/coreos/pkg/capnslog:go_default_library", diff --git a/vendor/github.com/coreos/etcd/mvcc/mvccpb/BUILD b/vendor/github.com/coreos/etcd/mvcc/mvccpb/BUILD index ea0765f4ff9..6b7016b1b38 100644 --- a/vendor/github.com/coreos/etcd/mvcc/mvccpb/BUILD +++ b/vendor/github.com/coreos/etcd/mvcc/mvccpb/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["kv.pb.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], ) @@ -26,3 +23,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["kv.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/coreos/etcd/pkg/adt/BUILD b/vendor/github.com/coreos/etcd/pkg/adt/BUILD index 6027964a4dd..9205a036691 100644 --- a/vendor/github.com/coreos/etcd/pkg/adt/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/adt/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "interval_tree.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/etcd/pkg/contention/BUILD b/vendor/github.com/coreos/etcd/pkg/contention/BUILD index 7fe8a50948c..68fc6fbd9c1 100644 --- a/vendor/github.com/coreos/etcd/pkg/contention/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/contention/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "contention.go", "doc.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/etcd/pkg/cpuutil/BUILD b/vendor/github.com/coreos/etcd/pkg/cpuutil/BUILD index 656eda3f9da..67ee37b45a5 100644 --- a/vendor/github.com/coreos/etcd/pkg/cpuutil/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/cpuutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "endian.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/etcd/pkg/crc/BUILD b/vendor/github.com/coreos/etcd/pkg/crc/BUILD index d57b2d96261..4e7633c1162 100644 --- a/vendor/github.com/coreos/etcd/pkg/crc/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/crc/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["crc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/etcd/pkg/fileutil/BUILD b/vendor/github.com/coreos/etcd/pkg/fileutil/BUILD index 2bbd9fa623b..957bd36e70e 100644 --- a/vendor/github.com/coreos/etcd/pkg/fileutil/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/fileutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,13 +12,27 @@ go_library( "fileutil.go", "lock.go", "lock_flock.go", - "lock_linux.go", + "lock_unix.go", "preallocate.go", - "preallocate_unix.go", + "preallocate_unsupported.go", "purge.go", - "sync_linux.go", - ], - tags = ["automanaged"], + "sync.go", + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "preallocate_darwin.go", + "sync_darwin.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "lock_linux.go", + "preallocate_unix.go", + "sync_linux.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "dir_windows.go", + "lock_windows.go", + ], + "//conditions:default": [], + }), deps = ["//vendor/github.com/coreos/pkg/capnslog:go_default_library"], ) diff --git a/vendor/github.com/coreos/etcd/pkg/httputil/BUILD b/vendor/github.com/coreos/etcd/pkg/httputil/BUILD index 4fcbc10546c..bfbb4111d4c 100644 --- a/vendor/github.com/coreos/etcd/pkg/httputil/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/httputil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["httputil.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/etcd/pkg/idutil/BUILD b/vendor/github.com/coreos/etcd/pkg/idutil/BUILD index 0a12307e34f..15ca2a5befe 100644 --- a/vendor/github.com/coreos/etcd/pkg/idutil/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/idutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["id.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/etcd/pkg/ioutil/BUILD b/vendor/github.com/coreos/etcd/pkg/ioutil/BUILD index 7623ca6cf2f..f2bb9f27920 100644 --- a/vendor/github.com/coreos/etcd/pkg/ioutil/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/ioutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "reader.go", "util.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/coreos/etcd/pkg/fileutil:go_default_library"], ) diff --git a/vendor/github.com/coreos/etcd/pkg/logutil/BUILD b/vendor/github.com/coreos/etcd/pkg/logutil/BUILD index 45cbf3dc674..0bf0d576032 100644 --- a/vendor/github.com/coreos/etcd/pkg/logutil/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/logutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["merge_logger.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/coreos/pkg/capnslog:go_default_library"], ) diff --git a/vendor/github.com/coreos/etcd/pkg/monotime/BUILD b/vendor/github.com/coreos/etcd/pkg/monotime/BUILD index e42c2b6a7f5..d6d3a35cd2e 100644 --- a/vendor/github.com/coreos/etcd/pkg/monotime/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/monotime/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "monotime.go", "nanotime.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/etcd/pkg/netutil/BUILD b/vendor/github.com/coreos/etcd/pkg/netutil/BUILD index 098221e88b7..cc0b184f4a7 100644 --- a/vendor/github.com/coreos/etcd/pkg/netutil/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/netutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,17 +8,26 @@ load( go_library( name = "go_default_library", srcs = [ - "isolate_linux.go", + "isolate_stub.go", "netutil.go", - "routes_linux.go", - ], - tags = ["automanaged"], + "routes.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "isolate_linux.go", + "routes_linux.go", + ], + "//conditions:default": [], + }), deps = [ - "//vendor/github.com/coreos/etcd/pkg/cpuutil:go_default_library", "//vendor/github.com/coreos/etcd/pkg/types:go_default_library", "//vendor/github.com/coreos/pkg/capnslog:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/coreos/etcd/pkg/cpuutil:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/coreos/etcd/pkg/pathutil/BUILD b/vendor/github.com/coreos/etcd/pkg/pathutil/BUILD index 1c967c9b846..3a31ed9efe3 100644 --- a/vendor/github.com/coreos/etcd/pkg/pathutil/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/pathutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["path.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/etcd/pkg/pbutil/BUILD b/vendor/github.com/coreos/etcd/pkg/pbutil/BUILD index f67339122a8..9fba71b166a 100644 --- a/vendor/github.com/coreos/etcd/pkg/pbutil/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/pbutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["pbutil.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/coreos/pkg/capnslog:go_default_library"], ) diff --git a/vendor/github.com/coreos/etcd/pkg/runtime/BUILD b/vendor/github.com/coreos/etcd/pkg/runtime/BUILD index c15020ff294..1765c4bde67 100644 --- a/vendor/github.com/coreos/etcd/pkg/runtime/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/runtime/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,8 +7,14 @@ load( go_library( name = "go_default_library", - srcs = ["fds_linux.go"], - tags = ["automanaged"], + srcs = [ + "fds_other.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "fds_linux.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/coreos/etcd/pkg/schedule/BUILD b/vendor/github.com/coreos/etcd/pkg/schedule/BUILD index 1f7aa108c34..8ac9ab0b0ca 100644 --- a/vendor/github.com/coreos/etcd/pkg/schedule/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/schedule/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "schedule.go", ], - tags = ["automanaged"], deps = ["//vendor/golang.org/x/net/context:go_default_library"], ) diff --git a/vendor/github.com/coreos/etcd/pkg/testutil/BUILD b/vendor/github.com/coreos/etcd/pkg/testutil/BUILD index 6545d6baeb7..7542f57eb26 100644 --- a/vendor/github.com/coreos/etcd/pkg/testutil/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/testutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "recorder.go", "testutil.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/etcd/pkg/tlsutil/BUILD b/vendor/github.com/coreos/etcd/pkg/tlsutil/BUILD index d33300e2fa5..49c41b1b740 100644 --- a/vendor/github.com/coreos/etcd/pkg/tlsutil/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/tlsutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "tlsutil.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/etcd/pkg/transport/BUILD b/vendor/github.com/coreos/etcd/pkg/transport/BUILD index 0cb54c0703f..d4eeaf1cf43 100644 --- a/vendor/github.com/coreos/etcd/pkg/transport/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/transport/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -22,7 +20,6 @@ go_library( "transport.go", "unix_listener.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/pkg/fileutil:go_default_library", "//vendor/github.com/coreos/etcd/pkg/tlsutil:go_default_library", diff --git a/vendor/github.com/coreos/etcd/pkg/types/BUILD b/vendor/github.com/coreos/etcd/pkg/types/BUILD index ac097b8e651..b0ae89aa3e2 100644 --- a/vendor/github.com/coreos/etcd/pkg/types/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "urls.go", "urlsmap.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/etcd/pkg/wait/BUILD b/vendor/github.com/coreos/etcd/pkg/wait/BUILD index fdd15673195..793265d18da 100644 --- a/vendor/github.com/coreos/etcd/pkg/wait/BUILD +++ b/vendor/github.com/coreos/etcd/pkg/wait/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "wait.go", "wait_time.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/etcd/proxy/grpcproxy/BUILD b/vendor/github.com/coreos/etcd/proxy/grpcproxy/BUILD index 6bb5f236bdb..2c25cab5644 100644 --- a/vendor/github.com/coreos/etcd/proxy/grpcproxy/BUILD +++ b/vendor/github.com/coreos/etcd/proxy/grpcproxy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -25,7 +23,6 @@ go_library( "watch_ranges.go", "watcher.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/clientv3:go_default_library", "//vendor/github.com/coreos/etcd/etcdserver/api/v3rpc:go_default_library", diff --git a/vendor/github.com/coreos/etcd/proxy/grpcproxy/cache/BUILD b/vendor/github.com/coreos/etcd/proxy/grpcproxy/cache/BUILD index dd6e0bc4e47..232b2fc2373 100644 --- a/vendor/github.com/coreos/etcd/proxy/grpcproxy/cache/BUILD +++ b/vendor/github.com/coreos/etcd/proxy/grpcproxy/cache/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["store.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes:go_default_library", "//vendor/github.com/coreos/etcd/etcdserver/etcdserverpb:go_default_library", diff --git a/vendor/github.com/coreos/etcd/raft/BUILD b/vendor/github.com/coreos/etcd/raft/BUILD index a1f1c19cf58..94965107778 100644 --- a/vendor/github.com/coreos/etcd/raft/BUILD +++ b/vendor/github.com/coreos/etcd/raft/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -23,7 +21,6 @@ go_library( "storage.go", "util.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/raft/raftpb:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", diff --git a/vendor/github.com/coreos/etcd/raft/raftpb/BUILD b/vendor/github.com/coreos/etcd/raft/raftpb/BUILD index fb934bc07cc..63eb17762cd 100644 --- a/vendor/github.com/coreos/etcd/raft/raftpb/BUILD +++ b/vendor/github.com/coreos/etcd/raft/raftpb/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["raft.pb.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], ) @@ -26,3 +23,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["raft.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/coreos/etcd/rafthttp/BUILD b/vendor/github.com/coreos/etcd/rafthttp/BUILD index 3b9fd1ffe8d..fa7ab49d3e7 100644 --- a/vendor/github.com/coreos/etcd/rafthttp/BUILD +++ b/vendor/github.com/coreos/etcd/rafthttp/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -27,7 +25,6 @@ go_library( "urlpick.go", "util.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/etcdserver/stats:go_default_library", "//vendor/github.com/coreos/etcd/pkg/httputil:go_default_library", diff --git a/vendor/github.com/coreos/etcd/snap/BUILD b/vendor/github.com/coreos/etcd/snap/BUILD index c3748ca0391..d5875e81733 100644 --- a/vendor/github.com/coreos/etcd/snap/BUILD +++ b/vendor/github.com/coreos/etcd/snap/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "metrics.go", "snapshotter.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/pkg/fileutil:go_default_library", "//vendor/github.com/coreos/etcd/pkg/ioutil:go_default_library", diff --git a/vendor/github.com/coreos/etcd/snap/snappb/BUILD b/vendor/github.com/coreos/etcd/snap/snappb/BUILD index 011a2f0df00..9dd9ae884fd 100644 --- a/vendor/github.com/coreos/etcd/snap/snappb/BUILD +++ b/vendor/github.com/coreos/etcd/snap/snappb/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["snap.pb.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], ) @@ -26,3 +23,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["snap.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/coreos/etcd/store/BUILD b/vendor/github.com/coreos/etcd/store/BUILD index f3450fe131d..3d1c6efb33d 100644 --- a/vendor/github.com/coreos/etcd/store/BUILD +++ b/vendor/github.com/coreos/etcd/store/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -23,7 +21,6 @@ go_library( "watcher.go", "watcher_hub.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/etcd/error:go_default_library", "//vendor/github.com/coreos/etcd/pkg/types:go_default_library", diff --git a/vendor/github.com/coreos/etcd/version/BUILD b/vendor/github.com/coreos/etcd/version/BUILD index ea0ffc63cfa..d259f114b37 100644 --- a/vendor/github.com/coreos/etcd/version/BUILD +++ b/vendor/github.com/coreos/etcd/version/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["version.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/coreos/go-semver/semver:go_default_library"], ) diff --git a/vendor/github.com/coreos/etcd/wal/BUILD b/vendor/github.com/coreos/etcd/wal/BUILD index 4fdb911910c..f2725ce9f62 100644 --- a/vendor/github.com/coreos/etcd/wal/BUILD +++ b/vendor/github.com/coreos/etcd/wal/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,8 +17,12 @@ go_library( "util.go", "wal.go", "wal_unix.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "wal_windows.go", + ], + "//conditions:default": [], + }), deps = [ "//vendor/github.com/coreos/etcd/pkg/crc:go_default_library", "//vendor/github.com/coreos/etcd/pkg/fileutil:go_default_library", diff --git a/vendor/github.com/coreos/etcd/wal/walpb/BUILD b/vendor/github.com/coreos/etcd/wal/walpb/BUILD index 4976ff58b01..b9f3f3901eb 100644 --- a/vendor/github.com/coreos/etcd/wal/walpb/BUILD +++ b/vendor/github.com/coreos/etcd/wal/walpb/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "record.go", "record.pb.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], ) @@ -29,3 +26,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["record.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/coreos/go-oidc/http/BUILD b/vendor/github.com/coreos/go-oidc/http/BUILD index 4cd8dfe0d78..5f63cad7ef0 100644 --- a/vendor/github.com/coreos/go-oidc/http/BUILD +++ b/vendor/github.com/coreos/go-oidc/http/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "http.go", "url.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/go-oidc/jose/BUILD b/vendor/github.com/coreos/go-oidc/jose/BUILD index 16365877c79..6ee448f3ac7 100644 --- a/vendor/github.com/coreos/go-oidc/jose/BUILD +++ b/vendor/github.com/coreos/go-oidc/jose/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "sig.go", "sig_rsa.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/go-oidc/key/BUILD b/vendor/github.com/coreos/go-oidc/key/BUILD index a9d79ff9f61..f66351eae69 100644 --- a/vendor/github.com/coreos/go-oidc/key/BUILD +++ b/vendor/github.com/coreos/go-oidc/key/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "rotate.go", "sync.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/go-oidc/jose:go_default_library", "//vendor/github.com/coreos/pkg/health:go_default_library", diff --git a/vendor/github.com/coreos/go-oidc/oauth2/BUILD b/vendor/github.com/coreos/go-oidc/oauth2/BUILD index 71958100ea6..332d61b40b3 100644 --- a/vendor/github.com/coreos/go-oidc/oauth2/BUILD +++ b/vendor/github.com/coreos/go-oidc/oauth2/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "error.go", "oauth2.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/coreos/go-oidc/http:go_default_library"], ) diff --git a/vendor/github.com/coreos/go-oidc/oidc/BUILD b/vendor/github.com/coreos/go-oidc/oidc/BUILD index 2beaff52666..df620bfffe2 100644 --- a/vendor/github.com/coreos/go-oidc/oidc/BUILD +++ b/vendor/github.com/coreos/go-oidc/oidc/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -20,7 +18,6 @@ go_library( "util.go", "verification.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/go-oidc/http:go_default_library", "//vendor/github.com/coreos/go-oidc/jose:go_default_library", diff --git a/vendor/github.com/coreos/go-semver/semver/BUILD b/vendor/github.com/coreos/go-semver/semver/BUILD index 00c5cdede4f..16771f7fc50 100644 --- a/vendor/github.com/coreos/go-semver/semver/BUILD +++ b/vendor/github.com/coreos/go-semver/semver/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "semver.go", "sort.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/go-systemd/daemon/BUILD b/vendor/github.com/coreos/go-systemd/daemon/BUILD index 170cbacc950..85732bb543a 100644 --- a/vendor/github.com/coreos/go-systemd/daemon/BUILD +++ b/vendor/github.com/coreos/go-systemd/daemon/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "sdnotify.go", "watchdog.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/go-systemd/dbus/BUILD b/vendor/github.com/coreos/go-systemd/dbus/BUILD index c3fd84396a2..3d1f39178e5 100644 --- a/vendor/github.com/coreos/go-systemd/dbus/BUILD +++ b/vendor/github.com/coreos/go-systemd/dbus/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "subscription.go", "subscription_set.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/godbus/dbus:go_default_library"], ) diff --git a/vendor/github.com/coreos/go-systemd/journal/BUILD b/vendor/github.com/coreos/go-systemd/journal/BUILD index 90926da7c08..f8a213f910f 100644 --- a/vendor/github.com/coreos/go-systemd/journal/BUILD +++ b/vendor/github.com/coreos/go-systemd/journal/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["journal.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/go-systemd/unit/BUILD b/vendor/github.com/coreos/go-systemd/unit/BUILD index 83bd09dd2ee..1d485b17a19 100644 --- a/vendor/github.com/coreos/go-systemd/unit/BUILD +++ b/vendor/github.com/coreos/go-systemd/unit/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "option.go", "serialize.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/go-systemd/util/BUILD b/vendor/github.com/coreos/go-systemd/util/BUILD index c0d70c2084d..b19d1d8ad46 100644 --- a/vendor/github.com/coreos/go-systemd/util/BUILD +++ b/vendor/github.com/coreos/go-systemd/util/BUILD @@ -1,30 +1,17 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", - "cgo_genrule", "go_library", ) -cgo_genrule( - name = "cgo_codegen", - srcs = ["util_cgo.go"], - clinkopts = [ - "-lz", - "-lm", - "-lpthread", - "-ldl", - ], - tags = ["automanaged"], -) - go_library( name = "go_default_library", - srcs = ["util.go"], - library = ":cgo_codegen", - tags = ["automanaged"], + srcs = [ + "util.go", + "util_cgo.go", + ], + cgo = True, deps = ["//vendor/github.com/coreos/pkg/dlopen:go_default_library"], ) diff --git a/vendor/github.com/coreos/pkg/capnslog/BUILD b/vendor/github.com/coreos/pkg/capnslog/BUILD index 6b0b4879543..409b2f64c89 100644 --- a/vendor/github.com/coreos/pkg/capnslog/BUILD +++ b/vendor/github.com/coreos/pkg/capnslog/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,8 +16,12 @@ go_library( "logmap.go", "pkg_logger.go", "syslog_formatter.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "init_windows.go", + ], + "//conditions:default": [], + }), deps = ["//vendor/github.com/coreos/go-systemd/journal:go_default_library"], ) diff --git a/vendor/github.com/coreos/pkg/dlopen/BUILD b/vendor/github.com/coreos/pkg/dlopen/BUILD index 78c6c020ebe..a0b9454a4f2 100644 --- a/vendor/github.com/coreos/pkg/dlopen/BUILD +++ b/vendor/github.com/coreos/pkg/dlopen/BUILD @@ -1,33 +1,22 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", - "cgo_genrule", "go_library", ) -cgo_genrule( - name = "cgo_codegen", - srcs = [ - "dlopen.go", - "dlopen_example.go", - ], - clinkopts = [ - "-lz", - "-lm", - "-lpthread", - "-ldl", - ], - tags = ["automanaged"], -) - go_library( name = "go_default_library", - srcs = [], - library = ":cgo_codegen", - tags = ["automanaged"], + srcs = [ + "dlopen.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "dlopen_example.go", + ], + "//conditions:default": [], + }), + cgo = True, + clinkopts = ["-ldl"], ) filegroup( diff --git a/vendor/github.com/coreos/pkg/health/BUILD b/vendor/github.com/coreos/pkg/health/BUILD index 0a39c0046f7..9eb5aca9d43 100644 --- a/vendor/github.com/coreos/pkg/health/BUILD +++ b/vendor/github.com/coreos/pkg/health/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["health.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/coreos/pkg/httputil:go_default_library"], ) diff --git a/vendor/github.com/coreos/pkg/httputil/BUILD b/vendor/github.com/coreos/pkg/httputil/BUILD index a5d8634eed9..1f64da29dde 100644 --- a/vendor/github.com/coreos/pkg/httputil/BUILD +++ b/vendor/github.com/coreos/pkg/httputil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "cookie.go", "json.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/pkg/timeutil/BUILD b/vendor/github.com/coreos/pkg/timeutil/BUILD index 1d2362736a2..52fa8dbba0c 100644 --- a/vendor/github.com/coreos/pkg/timeutil/BUILD +++ b/vendor/github.com/coreos/pkg/timeutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["backoff.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/coreos/rkt/api/v1alpha/BUILD b/vendor/github.com/coreos/rkt/api/v1alpha/BUILD index 25b5b0f2df1..40acab5df43 100644 --- a/vendor/github.com/coreos/rkt/api/v1alpha/BUILD +++ b/vendor/github.com/coreos/rkt/api/v1alpha/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["api.pb.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/protobuf/proto:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", @@ -30,3 +27,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["api.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/cpuguy83/go-md2man/md2man/BUILD b/vendor/github.com/cpuguy83/go-md2man/md2man/BUILD index f0d4e81137c..18c9bd81d12 100644 --- a/vendor/github.com/cpuguy83/go-md2man/md2man/BUILD +++ b/vendor/github.com/cpuguy83/go-md2man/md2man/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "md2man.go", "roff.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/russross/blackfriday:go_default_library"], ) diff --git a/vendor/github.com/davecgh/go-spew/spew/BUILD b/vendor/github.com/davecgh/go-spew/spew/BUILD index 5f798007fd3..5c4e2ecb6df 100644 --- a/vendor/github.com/davecgh/go-spew/spew/BUILD +++ b/vendor/github.com/davecgh/go-spew/spew/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "format.go", "spew.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/daviddengcn/go-colortext/BUILD b/vendor/github.com/daviddengcn/go-colortext/BUILD index 131075b8125..4aef21661f6 100644 --- a/vendor/github.com/daviddengcn/go-colortext/BUILD +++ b/vendor/github.com/daviddengcn/go-colortext/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,8 +10,12 @@ go_library( srcs = [ "ct.go", "ct_ansi.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "ct_win.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/dgrijalva/jwt-go/BUILD b/vendor/github.com/dgrijalva/jwt-go/BUILD index c0f8d3dd4d2..d412f78e506 100644 --- a/vendor/github.com/dgrijalva/jwt-go/BUILD +++ b/vendor/github.com/dgrijalva/jwt-go/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -25,7 +23,6 @@ go_library( "signing_method.go", "token.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/distribution/digest/BUILD b/vendor/github.com/docker/distribution/digest/BUILD index c142cc27b27..b7655fb04f9 100644 --- a/vendor/github.com/docker/distribution/digest/BUILD +++ b/vendor/github.com/docker/distribution/digest/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "set.go", "verifiers.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/distribution/reference/BUILD b/vendor/github.com/docker/distribution/reference/BUILD index a13aded7c66..53e398b3689 100644 --- a/vendor/github.com/docker/distribution/reference/BUILD +++ b/vendor/github.com/docker/distribution/reference/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "reference.go", "regexp.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/docker/distribution/digest:go_default_library"], ) diff --git a/vendor/github.com/docker/docker/api/types/BUILD b/vendor/github.com/docker/docker/api/types/BUILD index f0e376cdda1..36d64a856a3 100644 --- a/vendor/github.com/docker/docker/api/types/BUILD +++ b/vendor/github.com/docker/docker/api/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -29,7 +27,6 @@ go_library( "types.go", "volume.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/docker/docker/api/types/container:go_default_library", "//vendor/github.com/docker/docker/api/types/filters:go_default_library", diff --git a/vendor/github.com/docker/docker/api/types/blkiodev/BUILD b/vendor/github.com/docker/docker/api/types/blkiodev/BUILD index b91b089bc43..15daa3b3e17 100644 --- a/vendor/github.com/docker/docker/api/types/blkiodev/BUILD +++ b/vendor/github.com/docker/docker/api/types/blkiodev/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["blkio.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/docker/api/types/container/BUILD b/vendor/github.com/docker/docker/api/types/container/BUILD index 382cbf9196e..39e0d46e6f6 100644 --- a/vendor/github.com/docker/docker/api/types/container/BUILD +++ b/vendor/github.com/docker/docker/api/types/container/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,8 +14,12 @@ go_library( "container_wait.go", "host_config.go", "hostconfig_unix.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "hostconfig_windows.go", + ], + "//conditions:default": [], + }), deps = [ "//vendor/github.com/docker/docker/api/types/blkiodev:go_default_library", "//vendor/github.com/docker/docker/api/types/mount:go_default_library", diff --git a/vendor/github.com/docker/docker/api/types/events/BUILD b/vendor/github.com/docker/docker/api/types/events/BUILD index 448d3680eec..90984a6c91a 100644 --- a/vendor/github.com/docker/docker/api/types/events/BUILD +++ b/vendor/github.com/docker/docker/api/types/events/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["events.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/docker/api/types/filters/BUILD b/vendor/github.com/docker/docker/api/types/filters/BUILD index e213cd218f7..e896a1587a8 100644 --- a/vendor/github.com/docker/docker/api/types/filters/BUILD +++ b/vendor/github.com/docker/docker/api/types/filters/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["parse.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/docker/docker/api/types/versions:go_default_library"], ) diff --git a/vendor/github.com/docker/docker/api/types/mount/BUILD b/vendor/github.com/docker/docker/api/types/mount/BUILD index f59afd6e458..e2a891d559d 100644 --- a/vendor/github.com/docker/docker/api/types/mount/BUILD +++ b/vendor/github.com/docker/docker/api/types/mount/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["mount.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/docker/api/types/network/BUILD b/vendor/github.com/docker/docker/api/types/network/BUILD index 92c61ea2d55..ed25dae25e0 100644 --- a/vendor/github.com/docker/docker/api/types/network/BUILD +++ b/vendor/github.com/docker/docker/api/types/network/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["network.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/docker/api/types/reference/BUILD b/vendor/github.com/docker/docker/api/types/reference/BUILD index 3ee7e42504f..3d9e2b7fb42 100644 --- a/vendor/github.com/docker/docker/api/types/reference/BUILD +++ b/vendor/github.com/docker/docker/api/types/reference/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["image_reference.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/docker/distribution/reference:go_default_library"], ) diff --git a/vendor/github.com/docker/docker/api/types/registry/BUILD b/vendor/github.com/docker/docker/api/types/registry/BUILD index 5cda5364534..dcab897890d 100644 --- a/vendor/github.com/docker/docker/api/types/registry/BUILD +++ b/vendor/github.com/docker/docker/api/types/registry/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "authenticate.go", "registry.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/docker/api/types/strslice/BUILD b/vendor/github.com/docker/docker/api/types/strslice/BUILD index 5bc70d31071..270257ad921 100644 --- a/vendor/github.com/docker/docker/api/types/strslice/BUILD +++ b/vendor/github.com/docker/docker/api/types/strslice/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["strslice.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/docker/api/types/swarm/BUILD b/vendor/github.com/docker/docker/api/types/swarm/BUILD index e6252de9949..83b0e680a9b 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/BUILD +++ b/vendor/github.com/docker/docker/api/types/swarm/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "swarm.go", "task.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/docker/docker/api/types/container:go_default_library", "//vendor/github.com/docker/docker/api/types/mount:go_default_library", diff --git a/vendor/github.com/docker/docker/api/types/time/BUILD b/vendor/github.com/docker/docker/api/types/time/BUILD index 13d03b7e35e..d8061508219 100644 --- a/vendor/github.com/docker/docker/api/types/time/BUILD +++ b/vendor/github.com/docker/docker/api/types/time/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "duration_convert.go", "timestamp.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/docker/api/types/versions/BUILD b/vendor/github.com/docker/docker/api/types/versions/BUILD index a5645d2d247..042932ac6b2 100644 --- a/vendor/github.com/docker/docker/api/types/versions/BUILD +++ b/vendor/github.com/docker/docker/api/types/versions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["compare.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/docker/api/types/volume/BUILD b/vendor/github.com/docker/docker/api/types/volume/BUILD index 091934083e6..0297c66eef7 100644 --- a/vendor/github.com/docker/docker/api/types/volume/BUILD +++ b/vendor/github.com/docker/docker/api/types/volume/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "volumes_create.go", "volumes_list.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/docker/docker/api/types:go_default_library"], ) diff --git a/vendor/github.com/docker/docker/client/BUILD b/vendor/github.com/docker/docker/client/BUILD index 39b6df2c6ca..799b5c6e57a 100644 --- a/vendor/github.com/docker/docker/client/BUILD +++ b/vendor/github.com/docker/docker/client/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "checkpoint_delete.go", "checkpoint_list.go", "client.go", - "client_unix.go", "container_attach.go", "container_commit.go", "container_copy.go", @@ -113,8 +110,18 @@ go_library( "volume_list.go", "volume_prune.go", "volume_remove.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "client_unix.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "client_unix.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "client_windows.go", + ], + "//conditions:default": [], + }), deps = [ "//vendor/github.com/docker/distribution/reference:go_default_library", "//vendor/github.com/docker/docker/api/types:go_default_library", diff --git a/vendor/github.com/docker/docker/pkg/jsonlog/BUILD b/vendor/github.com/docker/docker/pkg/jsonlog/BUILD index b932fbc175b..c1d76b41773 100644 --- a/vendor/github.com/docker/docker/pkg/jsonlog/BUILD +++ b/vendor/github.com/docker/docker/pkg/jsonlog/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "jsonlogbytes.go", "time_marshalling.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/docker/pkg/jsonmessage/BUILD b/vendor/github.com/docker/docker/pkg/jsonmessage/BUILD index 4d6cda4d427..a999efcef75 100644 --- a/vendor/github.com/docker/docker/pkg/jsonmessage/BUILD +++ b/vendor/github.com/docker/docker/pkg/jsonmessage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["jsonmessage.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/docker/docker/pkg/jsonlog:go_default_library", "//vendor/github.com/docker/docker/pkg/term:go_default_library", diff --git a/vendor/github.com/docker/docker/pkg/longpath/BUILD b/vendor/github.com/docker/docker/pkg/longpath/BUILD index 5b120788173..77a27e1eeb9 100644 --- a/vendor/github.com/docker/docker/pkg/longpath/BUILD +++ b/vendor/github.com/docker/docker/pkg/longpath/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["longpath.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/docker/pkg/mount/BUILD b/vendor/github.com/docker/docker/pkg/mount/BUILD index f992f3e8292..8b4bb7f92cd 100644 --- a/vendor/github.com/docker/docker/pkg/mount/BUILD +++ b/vendor/github.com/docker/docker/pkg/mount/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,14 +9,24 @@ go_library( name = "go_default_library", srcs = [ "flags.go", - "flags_linux.go", + "flags_unsupported.go", "mount.go", - "mounter_linux.go", + "mounter_unsupported.go", "mountinfo.go", - "mountinfo_linux.go", - "sharedsubtree_linux.go", - ], - tags = ["automanaged"], + "mountinfo_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "flags_linux.go", + "mounter_linux.go", + "mountinfo_linux.go", + "sharedsubtree_linux.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "mountinfo_windows.go", + ], + "//conditions:default": [], + }), + cgo = True, ) filegroup( diff --git a/vendor/github.com/docker/docker/pkg/stdcopy/BUILD b/vendor/github.com/docker/docker/pkg/stdcopy/BUILD index c5b688c01c9..498b138c114 100644 --- a/vendor/github.com/docker/docker/pkg/stdcopy/BUILD +++ b/vendor/github.com/docker/docker/pkg/stdcopy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["stdcopy.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/docker/pkg/symlink/BUILD b/vendor/github.com/docker/docker/pkg/symlink/BUILD index 1735399a66b..a3a748bd47f 100644 --- a/vendor/github.com/docker/docker/pkg/symlink/BUILD +++ b/vendor/github.com/docker/docker/pkg/symlink/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,9 +10,20 @@ go_library( srcs = [ "fs.go", "fs_unix.go", - ], - tags = ["automanaged"], - deps = ["//vendor/github.com/docker/docker/pkg/system:go_default_library"], + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "fs_windows.go", + ], + "//conditions:default": [], + }), + deps = [ + "//vendor/github.com/docker/docker/pkg/system:go_default_library", + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "//vendor/github.com/docker/docker/pkg/longpath:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/docker/docker/pkg/system/BUILD b/vendor/github.com/docker/docker/pkg/system/BUILD index c5fa07261d6..1c6f8aa61fa 100644 --- a/vendor/github.com/docker/docker/pkg/system/BUILD +++ b/vendor/github.com/docker/docker/pkg/system/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,18 +15,51 @@ go_library( "filesys.go", "lstat.go", "meminfo.go", - "meminfo_linux.go", + "meminfo_unsupported.go", "mknod.go", "path_unix.go", "stat.go", - "stat_linux.go", - "syscall_unix.go", + "stat_unsupported.go", "umask.go", - "utimes_linux.go", - "xattrs_linux.go", - ], - tags = ["automanaged"], - deps = ["//vendor/github.com/docker/go-units:go_default_library"], + "utimes_unsupported.go", + "xattrs_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "stat_darwin.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "meminfo_linux.go", + "stat_linux.go", + "syscall_unix.go", + "utimes_linux.go", + "xattrs_linux.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "chtimes_windows.go", + "events_windows.go", + "filesys_windows.go", + "lstat_windows.go", + "meminfo_windows.go", + "mknod_windows.go", + "path_windows.go", + "stat_windows.go", + "syscall_windows.go", + "umask_windows.go", + ], + "//conditions:default": [], + }), + cgo = True, + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/docker/go-units:go_default_library", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "//vendor/github.com/Microsoft/go-winio:go_default_library", + "//vendor/github.com/Sirupsen/logrus:go_default_library", + "//vendor/golang.org/x/sys/windows:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/docker/docker/pkg/term/BUILD b/vendor/github.com/docker/docker/pkg/term/BUILD index 9dd91e30603..213094d0fa1 100644 --- a/vendor/github.com/docker/docker/pkg/term/BUILD +++ b/vendor/github.com/docker/docker/pkg/term/BUILD @@ -1,34 +1,37 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", - "cgo_genrule", "go_library", ) -cgo_genrule( - name = "cgo_codegen", - srcs = ["tc_linux_cgo.go"], - clinkopts = [ - "-lz", - "-lm", - "-lpthread", - "-ldl", - ], - tags = ["automanaged"], -) - go_library( name = "go_default_library", srcs = [ "ascii.go", + "tc_other.go", "term.go", "term_unix.go", - ], - library = ":cgo_codegen", - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "termios_darwin.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "tc_linux_cgo.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "term_windows.go", + ], + "//conditions:default": [], + }), + cgo = True, + deps = select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "//vendor/github.com/Azure/go-ansiterm/winterm:go_default_library", + "//vendor/github.com/docker/docker/pkg/term/windows:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/docker/docker/pkg/term/windows/BUILD b/vendor/github.com/docker/docker/pkg/term/windows/BUILD index 02c75db5c38..5d564e0db49 100644 --- a/vendor/github.com/docker/docker/pkg/term/windows/BUILD +++ b/vendor/github.com/docker/docker/pkg/term/windows/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,12 +7,25 @@ load( go_library( name = "go_default_library", - srcs = ["windows.go"], - tags = ["automanaged"], + srcs = [ + "windows.go", + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "ansi_reader.go", + "ansi_writer.go", + "console.go", + ], + "//conditions:default": [], + }), deps = [ "//vendor/github.com/Azure/go-ansiterm:go_default_library", "//vendor/github.com/Sirupsen/logrus:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "//vendor/github.com/Azure/go-ansiterm/winterm:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/docker/docker/pkg/tlsconfig/BUILD b/vendor/github.com/docker/docker/pkg/tlsconfig/BUILD index aab2f504dff..041930bf804 100644 --- a/vendor/github.com/docker/docker/pkg/tlsconfig/BUILD +++ b/vendor/github.com/docker/docker/pkg/tlsconfig/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,8 +7,11 @@ load( go_library( name = "go_default_library", - srcs = ["tlsconfig_clone.go"], - tags = ["automanaged"], + srcs = [ + "tlsconfig_clone.go", + "tlsconfig_clone_go16.go", + "tlsconfig_clone_go17.go", + ], ) filegroup( diff --git a/vendor/github.com/docker/engine-api/client/BUILD b/vendor/github.com/docker/engine-api/client/BUILD index 331e9c52949..315c575e0d0 100644 --- a/vendor/github.com/docker/engine-api/client/BUILD +++ b/vendor/github.com/docker/engine-api/client/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,7 +9,6 @@ go_library( name = "go_default_library", srcs = [ "client.go", - "client_unix.go", "container_attach.go", "container_commit.go", "container_copy.go", @@ -66,8 +63,18 @@ go_library( "volume_inspect.go", "volume_list.go", "volume_remove.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "client_darwin.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "client_unix.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "client_windows.go", + ], + "//conditions:default": [], + }), deps = [ "//vendor/github.com/docker/distribution/reference:go_default_library", "//vendor/github.com/docker/engine-api/client/transport:go_default_library", diff --git a/vendor/github.com/docker/engine-api/client/transport/BUILD b/vendor/github.com/docker/engine-api/client/transport/BUILD index a6b417c7d88..8efb1c7e6ac 100644 --- a/vendor/github.com/docker/engine-api/client/transport/BUILD +++ b/vendor/github.com/docker/engine-api/client/transport/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "client.go", "transport.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/docker/go-connections/sockets:go_default_library"], ) diff --git a/vendor/github.com/docker/engine-api/client/transport/cancellable/BUILD b/vendor/github.com/docker/engine-api/client/transport/cancellable/BUILD index 61ec7cc313c..8edb3074660 100644 --- a/vendor/github.com/docker/engine-api/client/transport/cancellable/BUILD +++ b/vendor/github.com/docker/engine-api/client/transport/cancellable/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,9 +9,9 @@ go_library( name = "go_default_library", srcs = [ "canceler.go", + "canceler_go14.go", "cancellable.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/docker/engine-api/client/transport:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", diff --git a/vendor/github.com/docker/engine-api/types/BUILD b/vendor/github.com/docker/engine-api/types/BUILD index bf19af150a2..f433a94aae1 100644 --- a/vendor/github.com/docker/engine-api/types/BUILD +++ b/vendor/github.com/docker/engine-api/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "stats.go", "types.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/docker/engine-api/types/container:go_default_library", "//vendor/github.com/docker/engine-api/types/filters:go_default_library", diff --git a/vendor/github.com/docker/engine-api/types/blkiodev/BUILD b/vendor/github.com/docker/engine-api/types/blkiodev/BUILD index b91b089bc43..15daa3b3e17 100644 --- a/vendor/github.com/docker/engine-api/types/blkiodev/BUILD +++ b/vendor/github.com/docker/engine-api/types/blkiodev/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["blkio.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/engine-api/types/container/BUILD b/vendor/github.com/docker/engine-api/types/container/BUILD index 9f9042ddea1..178b8911fa7 100644 --- a/vendor/github.com/docker/engine-api/types/container/BUILD +++ b/vendor/github.com/docker/engine-api/types/container/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,8 +11,12 @@ go_library( "config.go", "host_config.go", "hostconfig_unix.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "hostconfig_windows.go", + ], + "//conditions:default": [], + }), deps = [ "//vendor/github.com/docker/engine-api/types/blkiodev:go_default_library", "//vendor/github.com/docker/engine-api/types/strslice:go_default_library", diff --git a/vendor/github.com/docker/engine-api/types/filters/BUILD b/vendor/github.com/docker/engine-api/types/filters/BUILD index 83a1f21fa86..fc1abe63531 100644 --- a/vendor/github.com/docker/engine-api/types/filters/BUILD +++ b/vendor/github.com/docker/engine-api/types/filters/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["parse.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/docker/engine-api/types/versions:go_default_library"], ) diff --git a/vendor/github.com/docker/engine-api/types/network/BUILD b/vendor/github.com/docker/engine-api/types/network/BUILD index 92c61ea2d55..ed25dae25e0 100644 --- a/vendor/github.com/docker/engine-api/types/network/BUILD +++ b/vendor/github.com/docker/engine-api/types/network/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["network.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/engine-api/types/reference/BUILD b/vendor/github.com/docker/engine-api/types/reference/BUILD index 3ee7e42504f..3d9e2b7fb42 100644 --- a/vendor/github.com/docker/engine-api/types/reference/BUILD +++ b/vendor/github.com/docker/engine-api/types/reference/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["image_reference.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/docker/distribution/reference:go_default_library"], ) diff --git a/vendor/github.com/docker/engine-api/types/registry/BUILD b/vendor/github.com/docker/engine-api/types/registry/BUILD index e398e92f734..1d6348e6fb8 100644 --- a/vendor/github.com/docker/engine-api/types/registry/BUILD +++ b/vendor/github.com/docker/engine-api/types/registry/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["registry.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/engine-api/types/strslice/BUILD b/vendor/github.com/docker/engine-api/types/strslice/BUILD index 5bc70d31071..270257ad921 100644 --- a/vendor/github.com/docker/engine-api/types/strslice/BUILD +++ b/vendor/github.com/docker/engine-api/types/strslice/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["strslice.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/engine-api/types/time/BUILD b/vendor/github.com/docker/engine-api/types/time/BUILD index f12407119a9..08e4b01ac61 100644 --- a/vendor/github.com/docker/engine-api/types/time/BUILD +++ b/vendor/github.com/docker/engine-api/types/time/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["timestamp.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/engine-api/types/versions/BUILD b/vendor/github.com/docker/engine-api/types/versions/BUILD index a5645d2d247..042932ac6b2 100644 --- a/vendor/github.com/docker/engine-api/types/versions/BUILD +++ b/vendor/github.com/docker/engine-api/types/versions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["compare.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/go-connections/nat/BUILD b/vendor/github.com/docker/go-connections/nat/BUILD index 24a58d36cc0..4c0a4a41c3e 100644 --- a/vendor/github.com/docker/go-connections/nat/BUILD +++ b/vendor/github.com/docker/go-connections/nat/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "parse.go", "sort.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/go-connections/sockets/BUILD b/vendor/github.com/docker/go-connections/sockets/BUILD index 95bd4bb1a66..710827fd4d5 100644 --- a/vendor/github.com/docker/go-connections/sockets/BUILD +++ b/vendor/github.com/docker/go-connections/sockets/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,14 +13,27 @@ go_library( "sockets.go", "sockets_unix.go", "tcp_socket.go", - "unix_socket.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "unix_socket.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "sockets_windows.go", + ], + "//conditions:default": [], + }), deps = [ - "//vendor/github.com/Sirupsen/logrus:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/user:go_default_library", "//vendor/golang.org/x/net/proxy:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/Sirupsen/logrus:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/user:go_default_library", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "//vendor/github.com/Microsoft/go-winio:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/docker/go-connections/tlsconfig/BUILD b/vendor/github.com/docker/go-connections/tlsconfig/BUILD index 3cde4a968da..a0ab0679022 100644 --- a/vendor/github.com/docker/go-connections/tlsconfig/BUILD +++ b/vendor/github.com/docker/go-connections/tlsconfig/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,8 +10,8 @@ go_library( srcs = [ "config.go", "config_client_ciphers.go", + "config_legacy_client_ciphers.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/Sirupsen/logrus:go_default_library"], ) diff --git a/vendor/github.com/docker/go-units/BUILD b/vendor/github.com/docker/go-units/BUILD index 527f3b57edd..9c8816c8424 100644 --- a/vendor/github.com/docker/go-units/BUILD +++ b/vendor/github.com/docker/go-units/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "size.go", "ulimit.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/docker/spdystream/BUILD b/vendor/github.com/docker/spdystream/BUILD index fbc6c38953d..1c3269df74e 100644 --- a/vendor/github.com/docker/spdystream/BUILD +++ b/vendor/github.com/docker/spdystream/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "stream.go", "utils.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/docker/spdystream/spdy:go_default_library"], ) diff --git a/vendor/github.com/docker/spdystream/spdy/BUILD b/vendor/github.com/docker/spdystream/spdy/BUILD index cb65e7792a1..0fbaa96eba7 100644 --- a/vendor/github.com/docker/spdystream/spdy/BUILD +++ b/vendor/github.com/docker/spdystream/spdy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "types.go", "write.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/elazarl/go-bindata-assetfs/BUILD b/vendor/github.com/elazarl/go-bindata-assetfs/BUILD index c85ceff5200..16f6ae9d465 100644 --- a/vendor/github.com/elazarl/go-bindata-assetfs/BUILD +++ b/vendor/github.com/elazarl/go-bindata-assetfs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "assetfs.go", "doc.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/elazarl/goproxy/BUILD b/vendor/github.com/elazarl/goproxy/BUILD index e0a89fa69ed..41f08f78c76 100644 --- a/vendor/github.com/elazarl/goproxy/BUILD +++ b/vendor/github.com/elazarl/goproxy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -22,7 +20,6 @@ go_library( "responses.go", "signer.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/emicklei/go-restful-swagger12/BUILD b/vendor/github.com/emicklei/go-restful-swagger12/BUILD index 5e7abc48671..55c49ad41fd 100644 --- a/vendor/github.com/emicklei/go-restful-swagger12/BUILD +++ b/vendor/github.com/emicklei/go-restful-swagger12/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -21,7 +19,6 @@ go_library( "swagger_builder.go", "swagger_webservice.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/emicklei/go-restful:go_default_library", "//vendor/github.com/emicklei/go-restful/log:go_default_library", diff --git a/vendor/github.com/emicklei/go-restful/BUILD b/vendor/github.com/emicklei/go-restful/BUILD index 47179213542..6ec5f85a0cd 100644 --- a/vendor/github.com/emicklei/go-restful/BUILD +++ b/vendor/github.com/emicklei/go-restful/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -37,7 +35,6 @@ go_library( "web_service.go", "web_service_container.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/emicklei/go-restful/log:go_default_library"], ) diff --git a/vendor/github.com/emicklei/go-restful/log/BUILD b/vendor/github.com/emicklei/go-restful/log/BUILD index 6f7006448d1..e9dc9069768 100644 --- a/vendor/github.com/emicklei/go-restful/log/BUILD +++ b/vendor/github.com/emicklei/go-restful/log/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["log.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/evanphx/json-patch/BUILD b/vendor/github.com/evanphx/json-patch/BUILD index 88e573e3c25..6f04aea8888 100644 --- a/vendor/github.com/evanphx/json-patch/BUILD +++ b/vendor/github.com/evanphx/json-patch/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "merge.go", "patch.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/exponent-io/jsonpath/BUILD b/vendor/github.com/exponent-io/jsonpath/BUILD index c6ca7770022..e5eb87f8f08 100644 --- a/vendor/github.com/exponent-io/jsonpath/BUILD +++ b/vendor/github.com/exponent-io/jsonpath/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "path.go", "pathaction.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/fatih/camelcase/BUILD b/vendor/github.com/fatih/camelcase/BUILD index d63414b1385..3a5d0c3aaa1 100644 --- a/vendor/github.com/fatih/camelcase/BUILD +++ b/vendor/github.com/fatih/camelcase/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["camelcase.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/fsnotify/fsnotify/BUILD b/vendor/github.com/fsnotify/fsnotify/BUILD index 563dbc6667e..747ab36282a 100644 --- a/vendor/github.com/fsnotify/fsnotify/BUILD +++ b/vendor/github.com/fsnotify/fsnotify/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,11 +9,29 @@ go_library( name = "go_default_library", srcs = [ "fsnotify.go", - "inotify.go", - "inotify_poller.go", - ], - tags = ["automanaged"], - deps = ["//vendor/golang.org/x/sys/unix:go_default_library"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "kqueue.go", + "open_mode_darwin.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "inotify.go", + "inotify_poller.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "windows.go", + ], + "//conditions:default": [], + }), + deps = select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/garyburd/redigo/internal/BUILD b/vendor/github.com/garyburd/redigo/internal/BUILD index 5a5e9160ba8..8b1302e9448 100644 --- a/vendor/github.com/garyburd/redigo/internal/BUILD +++ b/vendor/github.com/garyburd/redigo/internal/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["commandinfo.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/garyburd/redigo/redis/BUILD b/vendor/github.com/garyburd/redigo/redis/BUILD index 2b649d9b4c1..fb58c1b03ab 100644 --- a/vendor/github.com/garyburd/redigo/redis/BUILD +++ b/vendor/github.com/garyburd/redigo/redis/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -20,7 +18,6 @@ go_library( "scan.go", "script.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/garyburd/redigo/internal:go_default_library"], ) diff --git a/vendor/github.com/ghodss/yaml/BUILD b/vendor/github.com/ghodss/yaml/BUILD index 42b38c70daf..9fb67e17b01 100644 --- a/vendor/github.com/ghodss/yaml/BUILD +++ b/vendor/github.com/ghodss/yaml/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "fields.go", "yaml.go", ], - tags = ["automanaged"], deps = ["//vendor/gopkg.in/yaml.v2:go_default_library"], ) diff --git a/vendor/github.com/go-ini/ini/BUILD b/vendor/github.com/go-ini/ini/BUILD index ebe735e3e5d..81c29f14909 100644 --- a/vendor/github.com/go-ini/ini/BUILD +++ b/vendor/github.com/go-ini/ini/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "ini.go", "struct.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/go-openapi/analysis/BUILD b/vendor/github.com/go-openapi/analysis/BUILD index fbea5a0b0ec..2cd83a786f1 100644 --- a/vendor/github.com/go-openapi/analysis/BUILD +++ b/vendor/github.com/go-openapi/analysis/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["analyzer.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/go-openapi/jsonpointer:go_default_library", "//vendor/github.com/go-openapi/spec:go_default_library", diff --git a/vendor/github.com/go-openapi/errors/BUILD b/vendor/github.com/go-openapi/errors/BUILD index a48c0193a81..7d6a633dcb4 100644 --- a/vendor/github.com/go-openapi/errors/BUILD +++ b/vendor/github.com/go-openapi/errors/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "parsing.go", "schema.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/go-openapi/jsonpointer/BUILD b/vendor/github.com/go-openapi/jsonpointer/BUILD index 89ea7a753bf..f213621ded3 100644 --- a/vendor/github.com/go-openapi/jsonpointer/BUILD +++ b/vendor/github.com/go-openapi/jsonpointer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["pointer.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/go-openapi/swag:go_default_library"], ) diff --git a/vendor/github.com/go-openapi/jsonreference/BUILD b/vendor/github.com/go-openapi/jsonreference/BUILD index 275b9a54421..cab0f6de735 100644 --- a/vendor/github.com/go-openapi/jsonreference/BUILD +++ b/vendor/github.com/go-openapi/jsonreference/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["reference.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/PuerkitoBio/purell:go_default_library", "//vendor/github.com/go-openapi/jsonpointer:go_default_library", diff --git a/vendor/github.com/go-openapi/loads/BUILD b/vendor/github.com/go-openapi/loads/BUILD index 41550384d46..b770f4380f0 100644 --- a/vendor/github.com/go-openapi/loads/BUILD +++ b/vendor/github.com/go-openapi/loads/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["spec.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/go-openapi/analysis:go_default_library", "//vendor/github.com/go-openapi/spec:go_default_library", diff --git a/vendor/github.com/go-openapi/runtime/BUILD b/vendor/github.com/go-openapi/runtime/BUILD index ce6d1da0b86..d6e24eb4886 100644 --- a/vendor/github.com/go-openapi/runtime/BUILD +++ b/vendor/github.com/go-openapi/runtime/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -26,7 +24,6 @@ go_library( "values.go", "xml.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/go-openapi/errors:go_default_library", "//vendor/github.com/go-openapi/strfmt:go_default_library", diff --git a/vendor/github.com/go-openapi/spec/BUILD b/vendor/github.com/go-openapi/spec/BUILD index 8f87a5ca5c8..cb79e2b3666 100644 --- a/vendor/github.com/go-openapi/spec/BUILD +++ b/vendor/github.com/go-openapi/spec/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -32,7 +30,6 @@ go_library( "tag.go", "xml_object.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/go-openapi/jsonpointer:go_default_library", "//vendor/github.com/go-openapi/jsonreference:go_default_library", diff --git a/vendor/github.com/go-openapi/strfmt/BUILD b/vendor/github.com/go-openapi/strfmt/BUILD index 7d8105eb922..fd58c551d7e 100644 --- a/vendor/github.com/go-openapi/strfmt/BUILD +++ b/vendor/github.com/go-openapi/strfmt/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "format.go", "time.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/asaskevich/govalidator:go_default_library", "//vendor/github.com/go-openapi/errors:go_default_library", diff --git a/vendor/github.com/go-openapi/swag/BUILD b/vendor/github.com/go-openapi/swag/BUILD index 6f1561fe845..f69e04215c4 100644 --- a/vendor/github.com/go-openapi/swag/BUILD +++ b/vendor/github.com/go-openapi/swag/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "path.go", "util.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/mailru/easyjson/jlexer:go_default_library", "//vendor/github.com/mailru/easyjson/jwriter:go_default_library", diff --git a/vendor/github.com/go-openapi/validate/BUILD b/vendor/github.com/go-openapi/validate/BUILD index c58411f139f..98e66da928e 100644 --- a/vendor/github.com/go-openapi/validate/BUILD +++ b/vendor/github.com/go-openapi/validate/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -21,7 +19,6 @@ go_library( "validator.go", "values.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/go-openapi/analysis:go_default_library", "//vendor/github.com/go-openapi/errors:go_default_library", diff --git a/vendor/github.com/godbus/dbus/BUILD b/vendor/github.com/godbus/dbus/BUILD index 8eecd34b825..5bd56e43b62 100644 --- a/vendor/github.com/godbus/dbus/BUILD +++ b/vendor/github.com/godbus/dbus/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -28,12 +26,20 @@ go_library( "sig.go", "transport_generic.go", "transport_unix.go", - "transport_unixcred_linux.go", "variant.go", "variant_lexer.go", "variant_parser.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "conn_darwin.go", + "transport_darwin.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "transport_unixcred_linux.go", + ], + "//conditions:default": [], + }), + cgo = True, ) filegroup( diff --git a/vendor/github.com/gogo/protobuf/gogoproto/BUILD b/vendor/github.com/gogo/protobuf/gogoproto/BUILD index acbcf470f57..f7d2b0a1a3c 100644 --- a/vendor/github.com/gogo/protobuf/gogoproto/BUILD +++ b/vendor/github.com/gogo/protobuf/gogoproto/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "gogo.pb.go", "helper.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor:go_default_library", @@ -33,3 +30,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["gogo.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/gogo/protobuf/plugin/compare/BUILD b/vendor/github.com/gogo/protobuf/plugin/compare/BUILD index a033b241efe..5f67619acd5 100644 --- a/vendor/github.com/gogo/protobuf/plugin/compare/BUILD +++ b/vendor/github.com/gogo/protobuf/plugin/compare/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "compare.go", "comparetest.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/plugin/testgen:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/plugin/defaultcheck/BUILD b/vendor/github.com/gogo/protobuf/plugin/defaultcheck/BUILD index a965d837c71..cc4d91d2a68 100644 --- a/vendor/github.com/gogo/protobuf/plugin/defaultcheck/BUILD +++ b/vendor/github.com/gogo/protobuf/plugin/defaultcheck/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["defaultcheck.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/protoc-gen-gogo/generator:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/plugin/description/BUILD b/vendor/github.com/gogo/protobuf/plugin/description/BUILD index 9350f4b2fae..c66d92bda5c 100644 --- a/vendor/github.com/gogo/protobuf/plugin/description/BUILD +++ b/vendor/github.com/gogo/protobuf/plugin/description/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "description.go", "descriptiontest.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/plugin/testgen:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/plugin/embedcheck/BUILD b/vendor/github.com/gogo/protobuf/plugin/embedcheck/BUILD index 12fc73597b7..e07f94a61c1 100644 --- a/vendor/github.com/gogo/protobuf/plugin/embedcheck/BUILD +++ b/vendor/github.com/gogo/protobuf/plugin/embedcheck/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["embedcheck.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/protoc-gen-gogo/generator:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/plugin/enumstringer/BUILD b/vendor/github.com/gogo/protobuf/plugin/enumstringer/BUILD index 35934294e65..6969fe66135 100644 --- a/vendor/github.com/gogo/protobuf/plugin/enumstringer/BUILD +++ b/vendor/github.com/gogo/protobuf/plugin/enumstringer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["enumstringer.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/protoc-gen-gogo/generator:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/plugin/equal/BUILD b/vendor/github.com/gogo/protobuf/plugin/equal/BUILD index f57cc459d0a..fc2da895cd6 100644 --- a/vendor/github.com/gogo/protobuf/plugin/equal/BUILD +++ b/vendor/github.com/gogo/protobuf/plugin/equal/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "equal.go", "equaltest.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/plugin/testgen:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/plugin/face/BUILD b/vendor/github.com/gogo/protobuf/plugin/face/BUILD index 69ad01a187d..a0650471b6b 100644 --- a/vendor/github.com/gogo/protobuf/plugin/face/BUILD +++ b/vendor/github.com/gogo/protobuf/plugin/face/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "face.go", "facetest.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/plugin/testgen:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/plugin/gostring/BUILD b/vendor/github.com/gogo/protobuf/plugin/gostring/BUILD index cfdb42d6d2c..a89e657a6a2 100644 --- a/vendor/github.com/gogo/protobuf/plugin/gostring/BUILD +++ b/vendor/github.com/gogo/protobuf/plugin/gostring/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "gostring.go", "gostringtest.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/plugin/testgen:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/plugin/marshalto/BUILD b/vendor/github.com/gogo/protobuf/plugin/marshalto/BUILD index ebb604ca057..f0cac14eb46 100644 --- a/vendor/github.com/gogo/protobuf/plugin/marshalto/BUILD +++ b/vendor/github.com/gogo/protobuf/plugin/marshalto/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["marshalto.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/plugin/oneofcheck/BUILD b/vendor/github.com/gogo/protobuf/plugin/oneofcheck/BUILD index 86a32b2d24c..de30e37499c 100644 --- a/vendor/github.com/gogo/protobuf/plugin/oneofcheck/BUILD +++ b/vendor/github.com/gogo/protobuf/plugin/oneofcheck/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["oneofcheck.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/protoc-gen-gogo/generator:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/plugin/populate/BUILD b/vendor/github.com/gogo/protobuf/plugin/populate/BUILD index a4a62affe9a..2e02d312928 100644 --- a/vendor/github.com/gogo/protobuf/plugin/populate/BUILD +++ b/vendor/github.com/gogo/protobuf/plugin/populate/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["populate.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/plugin/size/BUILD b/vendor/github.com/gogo/protobuf/plugin/size/BUILD index 4a481a153bf..311982b8b7c 100644 --- a/vendor/github.com/gogo/protobuf/plugin/size/BUILD +++ b/vendor/github.com/gogo/protobuf/plugin/size/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "size.go", "sizetest.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/plugin/testgen:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/plugin/stringer/BUILD b/vendor/github.com/gogo/protobuf/plugin/stringer/BUILD index 1136c3d94f6..d0c11034eac 100644 --- a/vendor/github.com/gogo/protobuf/plugin/stringer/BUILD +++ b/vendor/github.com/gogo/protobuf/plugin/stringer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "stringer.go", "stringertest.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/plugin/testgen:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/plugin/testgen/BUILD b/vendor/github.com/gogo/protobuf/plugin/testgen/BUILD index 7fb0177fb5e..d7d167125ae 100644 --- a/vendor/github.com/gogo/protobuf/plugin/testgen/BUILD +++ b/vendor/github.com/gogo/protobuf/plugin/testgen/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["testgen.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/protoc-gen-gogo/generator:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/plugin/union/BUILD b/vendor/github.com/gogo/protobuf/plugin/union/BUILD index 68d6b58ab47..ff9a09d91b4 100644 --- a/vendor/github.com/gogo/protobuf/plugin/union/BUILD +++ b/vendor/github.com/gogo/protobuf/plugin/union/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "union.go", "uniontest.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/plugin/testgen:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/plugin/unmarshal/BUILD b/vendor/github.com/gogo/protobuf/plugin/unmarshal/BUILD index 3cef129d5b1..4b1b845eca8 100644 --- a/vendor/github.com/gogo/protobuf/plugin/unmarshal/BUILD +++ b/vendor/github.com/gogo/protobuf/plugin/unmarshal/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["unmarshal.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/proto/BUILD b/vendor/github.com/gogo/protobuf/proto/BUILD index c66531dcfd4..fba6b7f5b8c 100644 --- a/vendor/github.com/gogo/protobuf/proto/BUILD +++ b/vendor/github.com/gogo/protobuf/proto/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -34,7 +32,6 @@ go_library( "timestamp.go", "timestamp_gogo.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/BUILD b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/BUILD index ddb8ccd1329..5113a24e2cc 100644 --- a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/BUILD +++ b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "descriptor_gostring.gen.go", "helper.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/gogo/protobuf/proto:go_default_library"], ) diff --git a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/generator/BUILD b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/generator/BUILD index b71d5b81f3f..03cc688eecc 100644 --- a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/generator/BUILD +++ b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/generator/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "generator.go", "helper.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/grpc/BUILD b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/grpc/BUILD index d96f0e37e9d..61d43f006ee 100644 --- a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/grpc/BUILD +++ b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/grpc/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["grpc.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor:go_default_library", "//vendor/github.com/gogo/protobuf/protoc-gen-gogo/generator:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/plugin/BUILD b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/plugin/BUILD index a3e775174d1..a0a1a346024 100644 --- a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/plugin/BUILD +++ b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/plugin/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["plugin.pb.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/sortkeys/BUILD b/vendor/github.com/gogo/protobuf/sortkeys/BUILD index 5c845636368..a0ce76ea544 100644 --- a/vendor/github.com/gogo/protobuf/sortkeys/BUILD +++ b/vendor/github.com/gogo/protobuf/sortkeys/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["sortkeys.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/gogo/protobuf/vanity/BUILD b/vendor/github.com/gogo/protobuf/vanity/BUILD index f999786d52b..fabf280b69b 100644 --- a/vendor/github.com/gogo/protobuf/vanity/BUILD +++ b/vendor/github.com/gogo/protobuf/vanity/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "foreach.go", "msg.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", diff --git a/vendor/github.com/gogo/protobuf/vanity/command/BUILD b/vendor/github.com/gogo/protobuf/vanity/command/BUILD index 86397e47301..58518373b54 100644 --- a/vendor/github.com/gogo/protobuf/vanity/command/BUILD +++ b/vendor/github.com/gogo/protobuf/vanity/command/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["command.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/gogo/protobuf/plugin/compare:go_default_library", "//vendor/github.com/gogo/protobuf/plugin/defaultcheck:go_default_library", diff --git a/vendor/github.com/golang/glog/BUILD b/vendor/github.com/golang/glog/BUILD index 7b41af72bd4..e807aa3249e 100644 --- a/vendor/github.com/golang/glog/BUILD +++ b/vendor/github.com/golang/glog/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "glog.go", "glog_file.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/golang/groupcache/lru/BUILD b/vendor/github.com/golang/groupcache/lru/BUILD index fcdf8021d5f..957de8a19b8 100644 --- a/vendor/github.com/golang/groupcache/lru/BUILD +++ b/vendor/github.com/golang/groupcache/lru/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["lru.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/golang/mock/gomock/BUILD b/vendor/github.com/golang/mock/gomock/BUILD index ed99389fc93..8806128b552 100644 --- a/vendor/github.com/golang/mock/gomock/BUILD +++ b/vendor/github.com/golang/mock/gomock/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "controller.go", "matchers.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/golang/protobuf/jsonpb/BUILD b/vendor/github.com/golang/protobuf/jsonpb/BUILD index bbc8fa0d012..e930b52a497 100644 --- a/vendor/github.com/golang/protobuf/jsonpb/BUILD +++ b/vendor/github.com/golang/protobuf/jsonpb/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["jsonpb.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], ) diff --git a/vendor/github.com/golang/protobuf/proto/BUILD b/vendor/github.com/golang/protobuf/proto/BUILD index 8f210f4375e..eaad117b98d 100644 --- a/vendor/github.com/golang/protobuf/proto/BUILD +++ b/vendor/github.com/golang/protobuf/proto/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -22,7 +20,6 @@ go_library( "text.go", "text_parser.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/golang/protobuf/ptypes/BUILD b/vendor/github.com/golang/protobuf/ptypes/BUILD index 096f367030b..2c636381fba 100644 --- a/vendor/github.com/golang/protobuf/ptypes/BUILD +++ b/vendor/github.com/golang/protobuf/ptypes/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "duration.go", "timestamp.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/protobuf/proto:go_default_library", "//vendor/github.com/golang/protobuf/ptypes/any:go_default_library", diff --git a/vendor/github.com/golang/protobuf/ptypes/any/BUILD b/vendor/github.com/golang/protobuf/ptypes/any/BUILD index b8c925ab4ca..54b0d338ad6 100644 --- a/vendor/github.com/golang/protobuf/ptypes/any/BUILD +++ b/vendor/github.com/golang/protobuf/ptypes/any/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["any.pb.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], ) @@ -26,3 +23,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["any.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/golang/protobuf/ptypes/duration/BUILD b/vendor/github.com/golang/protobuf/ptypes/duration/BUILD index 32d428ba458..3522299db88 100644 --- a/vendor/github.com/golang/protobuf/ptypes/duration/BUILD +++ b/vendor/github.com/golang/protobuf/ptypes/duration/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["duration.pb.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], ) @@ -26,3 +23,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["duration.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/golang/protobuf/ptypes/timestamp/BUILD b/vendor/github.com/golang/protobuf/ptypes/timestamp/BUILD index d655bd914c3..0923ff56564 100644 --- a/vendor/github.com/golang/protobuf/ptypes/timestamp/BUILD +++ b/vendor/github.com/golang/protobuf/ptypes/timestamp/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["timestamp.pb.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], ) @@ -26,3 +23,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["timestamp.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/google/btree/BUILD b/vendor/github.com/google/btree/BUILD index 6d74f48e9e3..174aa0d49ea 100644 --- a/vendor/github.com/google/btree/BUILD +++ b/vendor/github.com/google/btree/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["btree.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/google/cadvisor/api/BUILD b/vendor/github.com/google/cadvisor/api/BUILD index 14b08d52e59..e722ddb26b7 100644 --- a/vendor/github.com/google/cadvisor/api/BUILD +++ b/vendor/github.com/google/cadvisor/api/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "handler.go", "versions.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/events:go_default_library", diff --git a/vendor/github.com/google/cadvisor/cache/memory/BUILD b/vendor/github.com/google/cadvisor/cache/memory/BUILD index 0c57665a7c4..13a3d5d7c0f 100644 --- a/vendor/github.com/google/cadvisor/cache/memory/BUILD +++ b/vendor/github.com/google/cadvisor/cache/memory/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["memory.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", diff --git a/vendor/github.com/google/cadvisor/client/v2/BUILD b/vendor/github.com/google/cadvisor/client/v2/BUILD index 54d755f9dd1..50d8b4b6025 100644 --- a/vendor/github.com/google/cadvisor/client/v2/BUILD +++ b/vendor/github.com/google/cadvisor/client/v2/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["client.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/google/cadvisor/info/v1:go_default_library", "//vendor/github.com/google/cadvisor/info/v2:go_default_library", diff --git a/vendor/github.com/google/cadvisor/collector/BUILD b/vendor/github.com/google/cadvisor/collector/BUILD index 7432abd226e..5792af49e77 100644 --- a/vendor/github.com/google/cadvisor/collector/BUILD +++ b/vendor/github.com/google/cadvisor/collector/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "types.go", "util.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/google/cadvisor/container:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", diff --git a/vendor/github.com/google/cadvisor/container/BUILD b/vendor/github.com/google/cadvisor/container/BUILD index 529740fb23e..be86459e085 100644 --- a/vendor/github.com/google/cadvisor/container/BUILD +++ b/vendor/github.com/google/cadvisor/container/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "container.go", "factory.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", diff --git a/vendor/github.com/google/cadvisor/container/common/BUILD b/vendor/github.com/google/cadvisor/container/common/BUILD index 8940f5d2d5f..ff7b3997cdd 100644 --- a/vendor/github.com/google/cadvisor/container/common/BUILD +++ b/vendor/github.com/google/cadvisor/container/common/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "helpers.go", "inotify_watcher.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/container:go_default_library", diff --git a/vendor/github.com/google/cadvisor/container/docker/BUILD b/vendor/github.com/google/cadvisor/container/docker/BUILD index d889d804653..03f76e5cc34 100644 --- a/vendor/github.com/google/cadvisor/container/docker/BUILD +++ b/vendor/github.com/google/cadvisor/container/docker/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "factory.go", "handler.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/blang/semver:go_default_library", "//vendor/github.com/docker/engine-api/client:go_default_library", diff --git a/vendor/github.com/google/cadvisor/container/libcontainer/BUILD b/vendor/github.com/google/cadvisor/container/libcontainer/BUILD index d0d87369756..0f535172a0b 100644 --- a/vendor/github.com/google/cadvisor/container/libcontainer/BUILD +++ b/vendor/github.com/google/cadvisor/container/libcontainer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["helpers.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/container:go_default_library", diff --git a/vendor/github.com/google/cadvisor/container/raw/BUILD b/vendor/github.com/google/cadvisor/container/raw/BUILD index ba2b64449ed..f9313fa4211 100644 --- a/vendor/github.com/google/cadvisor/container/raw/BUILD +++ b/vendor/github.com/google/cadvisor/container/raw/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "factory.go", "handler.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/container:go_default_library", diff --git a/vendor/github.com/google/cadvisor/container/rkt/BUILD b/vendor/github.com/google/cadvisor/container/rkt/BUILD index e53f08d00b9..12fa090b074 100644 --- a/vendor/github.com/google/cadvisor/container/rkt/BUILD +++ b/vendor/github.com/google/cadvisor/container/rkt/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "handler.go", "helpers.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/blang/semver:go_default_library", "//vendor/github.com/coreos/rkt/api/v1alpha:go_default_library", diff --git a/vendor/github.com/google/cadvisor/container/systemd/BUILD b/vendor/github.com/google/cadvisor/container/systemd/BUILD index 8c446bc7b2b..d32286a12c7 100644 --- a/vendor/github.com/google/cadvisor/container/systemd/BUILD +++ b/vendor/github.com/google/cadvisor/container/systemd/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["factory.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/container:go_default_library", diff --git a/vendor/github.com/google/cadvisor/devicemapper/BUILD b/vendor/github.com/google/cadvisor/devicemapper/BUILD index 47701c98451..e1ca79df82e 100644 --- a/vendor/github.com/google/cadvisor/devicemapper/BUILD +++ b/vendor/github.com/google/cadvisor/devicemapper/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "thin_pool_watcher.go", "util.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/glog:go_default_library"], ) diff --git a/vendor/github.com/google/cadvisor/events/BUILD b/vendor/github.com/google/cadvisor/events/BUILD index 5a76cffa95d..ff5dd458966 100644 --- a/vendor/github.com/google/cadvisor/events/BUILD +++ b/vendor/github.com/google/cadvisor/events/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["handler.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", diff --git a/vendor/github.com/google/cadvisor/fs/BUILD b/vendor/github.com/google/cadvisor/fs/BUILD index 5777e951951..c31f780b2d1 100644 --- a/vendor/github.com/google/cadvisor/fs/BUILD +++ b/vendor/github.com/google/cadvisor/fs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,17 +8,23 @@ load( go_library( name = "go_default_library", srcs = [ - "fs.go", "types.go", - ], - tags = ["automanaged"], - deps = [ - "//vendor/github.com/docker/docker/pkg/mount:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/google/cadvisor/devicemapper:go_default_library", - "//vendor/github.com/google/cadvisor/utils/docker:go_default_library", - "//vendor/github.com/mistifyio/go-zfs:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "fs.go", + ], + "//conditions:default": [], + }), + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/docker/docker/pkg/mount:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/github.com/google/cadvisor/devicemapper:go_default_library", + "//vendor/github.com/google/cadvisor/utils/docker:go_default_library", + "//vendor/github.com/mistifyio/go-zfs:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/google/cadvisor/healthz/BUILD b/vendor/github.com/google/cadvisor/healthz/BUILD index 53497755c51..45db39ae225 100644 --- a/vendor/github.com/google/cadvisor/healthz/BUILD +++ b/vendor/github.com/google/cadvisor/healthz/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["healthz.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/google/cadvisor/http/mux:go_default_library"], ) diff --git a/vendor/github.com/google/cadvisor/http/BUILD b/vendor/github.com/google/cadvisor/http/BUILD index 1cb58a4f877..a84cbe663e3 100644 --- a/vendor/github.com/google/cadvisor/http/BUILD +++ b/vendor/github.com/google/cadvisor/http/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["handlers.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/abbot/go-http-auth:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/vendor/github.com/google/cadvisor/http/mux/BUILD b/vendor/github.com/google/cadvisor/http/mux/BUILD index 533bda8cfd0..3c2e1b6f73c 100644 --- a/vendor/github.com/google/cadvisor/http/mux/BUILD +++ b/vendor/github.com/google/cadvisor/http/mux/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["mux.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/google/cadvisor/info/v1/BUILD b/vendor/github.com/google/cadvisor/info/v1/BUILD index 17cbb0fca05..43f5562e441 100644 --- a/vendor/github.com/google/cadvisor/info/v1/BUILD +++ b/vendor/github.com/google/cadvisor/info/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "machine.go", "metric.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/google/cadvisor/info/v2/BUILD b/vendor/github.com/google/cadvisor/info/v2/BUILD index b4e40c48c81..7c1c6e8b264 100644 --- a/vendor/github.com/google/cadvisor/info/v2/BUILD +++ b/vendor/github.com/google/cadvisor/info/v2/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "conversion.go", "machine.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", diff --git a/vendor/github.com/google/cadvisor/machine/BUILD b/vendor/github.com/google/cadvisor/machine/BUILD index 6e3e05c2da0..6f9c9c03ed5 100644 --- a/vendor/github.com/google/cadvisor/machine/BUILD +++ b/vendor/github.com/google/cadvisor/machine/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "info.go", "machine.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/fs:go_default_library", diff --git a/vendor/github.com/google/cadvisor/manager/BUILD b/vendor/github.com/google/cadvisor/manager/BUILD index c1e123269ed..cd306216a26 100644 --- a/vendor/github.com/google/cadvisor/manager/BUILD +++ b/vendor/github.com/google/cadvisor/manager/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "container.go", "manager.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/docker/go-units:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/vendor/github.com/google/cadvisor/manager/watcher/BUILD b/vendor/github.com/google/cadvisor/manager/watcher/BUILD index bc27cd3c64d..3248585c27c 100644 --- a/vendor/github.com/google/cadvisor/manager/watcher/BUILD +++ b/vendor/github.com/google/cadvisor/manager/watcher/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["watcher.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/google/cadvisor/manager/watcher/raw/BUILD b/vendor/github.com/google/cadvisor/manager/watcher/raw/BUILD index c3cfb3d79a9..d92e12acc03 100644 --- a/vendor/github.com/google/cadvisor/manager/watcher/raw/BUILD +++ b/vendor/github.com/google/cadvisor/manager/watcher/raw/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["raw.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/container/common:go_default_library", diff --git a/vendor/github.com/google/cadvisor/manager/watcher/rkt/BUILD b/vendor/github.com/google/cadvisor/manager/watcher/rkt/BUILD index 85f69c9b527..5c572b265b6 100644 --- a/vendor/github.com/google/cadvisor/manager/watcher/rkt/BUILD +++ b/vendor/github.com/google/cadvisor/manager/watcher/rkt/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["rkt.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/coreos/rkt/api/v1alpha:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/vendor/github.com/google/cadvisor/metrics/BUILD b/vendor/github.com/google/cadvisor/metrics/BUILD index b3dd3659944..eff40db21f9 100644 --- a/vendor/github.com/google/cadvisor/metrics/BUILD +++ b/vendor/github.com/google/cadvisor/metrics/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["prometheus.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", diff --git a/vendor/github.com/google/cadvisor/pages/BUILD b/vendor/github.com/google/cadvisor/pages/BUILD index 554073e2408..d1dade2d9fd 100644 --- a/vendor/github.com/google/cadvisor/pages/BUILD +++ b/vendor/github.com/google/cadvisor/pages/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "pages.go", "templates.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/abbot/go-http-auth:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/vendor/github.com/google/cadvisor/pages/static/BUILD b/vendor/github.com/google/cadvisor/pages/static/BUILD index 69da867568f..49e44dd36b9 100644 --- a/vendor/github.com/google/cadvisor/pages/static/BUILD +++ b/vendor/github.com/google/cadvisor/pages/static/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "assets.go", "static.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/google/cadvisor/storage/BUILD b/vendor/github.com/google/cadvisor/storage/BUILD index 679ffde7596..e9ac50f6acf 100644 --- a/vendor/github.com/google/cadvisor/storage/BUILD +++ b/vendor/github.com/google/cadvisor/storage/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "common_flags.go", "storage.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/google/cadvisor/info/v1:go_default_library"], ) diff --git a/vendor/github.com/google/cadvisor/summary/BUILD b/vendor/github.com/google/cadvisor/summary/BUILD index e61d769c884..a6c4fd71b0b 100644 --- a/vendor/github.com/google/cadvisor/summary/BUILD +++ b/vendor/github.com/google/cadvisor/summary/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "percentiles.go", "summary.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/google/cadvisor/info/v1:go_default_library", "//vendor/github.com/google/cadvisor/info/v2:go_default_library", diff --git a/vendor/github.com/google/cadvisor/utils/BUILD b/vendor/github.com/google/cadvisor/utils/BUILD index 8c486dd4b06..30baf87d044 100644 --- a/vendor/github.com/google/cadvisor/utils/BUILD +++ b/vendor/github.com/google/cadvisor/utils/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "timed_store.go", "utils.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/google/cadvisor/utils/cloudinfo/BUILD b/vendor/github.com/google/cadvisor/utils/cloudinfo/BUILD index 324d5b9785a..9689a43de55 100644 --- a/vendor/github.com/google/cadvisor/utils/cloudinfo/BUILD +++ b/vendor/github.com/google/cadvisor/utils/cloudinfo/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "cloudinfo.go", "gce.go", ], - tags = ["automanaged"], deps = [ "//vendor/cloud.google.com/go/compute/metadata:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", diff --git a/vendor/github.com/google/cadvisor/utils/cpuload/BUILD b/vendor/github.com/google/cadvisor/utils/cpuload/BUILD index 69873be7f69..ae3650ca868 100644 --- a/vendor/github.com/google/cadvisor/utils/cpuload/BUILD +++ b/vendor/github.com/google/cadvisor/utils/cpuload/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["cpuload.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", diff --git a/vendor/github.com/google/cadvisor/utils/cpuload/netlink/BUILD b/vendor/github.com/google/cadvisor/utils/cpuload/netlink/BUILD index d6d4831352e..eb6aa78514b 100644 --- a/vendor/github.com/google/cadvisor/utils/cpuload/netlink/BUILD +++ b/vendor/github.com/google/cadvisor/utils/cpuload/netlink/BUILD @@ -1,34 +1,19 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", - "cgo_genrule", "go_library", ) -cgo_genrule( - name = "cgo_codegen", - srcs = ["defs.go"], - clinkopts = [ - "-lz", - "-lm", - "-lpthread", - "-ldl", - ], - tags = ["automanaged"], -) - go_library( name = "go_default_library", srcs = [ "conn.go", + "defs.go", "netlink.go", "reader.go", ], - library = ":cgo_codegen", - tags = ["automanaged"], + cgo = True, deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", diff --git a/vendor/github.com/google/cadvisor/utils/docker/BUILD b/vendor/github.com/google/cadvisor/utils/docker/BUILD index 3597a3045cb..11866628c30 100644 --- a/vendor/github.com/google/cadvisor/utils/docker/BUILD +++ b/vendor/github.com/google/cadvisor/utils/docker/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["docker.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/docker/engine-api/types:go_default_library"], ) diff --git a/vendor/github.com/google/cadvisor/utils/oomparser/BUILD b/vendor/github.com/google/cadvisor/utils/oomparser/BUILD index 5d6887722f4..ec126880212 100644 --- a/vendor/github.com/google/cadvisor/utils/oomparser/BUILD +++ b/vendor/github.com/google/cadvisor/utils/oomparser/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["oomparser.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/utils:go_default_library", diff --git a/vendor/github.com/google/cadvisor/utils/sysfs/BUILD b/vendor/github.com/google/cadvisor/utils/sysfs/BUILD index 4a0e316e644..a44a5e0e982 100644 --- a/vendor/github.com/google/cadvisor/utils/sysfs/BUILD +++ b/vendor/github.com/google/cadvisor/utils/sysfs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["sysfs.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/google/cadvisor/utils/sysinfo/BUILD b/vendor/github.com/google/cadvisor/utils/sysinfo/BUILD index 08e7d8a3c41..b29cf3e1306 100644 --- a/vendor/github.com/google/cadvisor/utils/sysinfo/BUILD +++ b/vendor/github.com/google/cadvisor/utils/sysinfo/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["sysinfo.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/google/cadvisor/info/v1:go_default_library", "//vendor/github.com/google/cadvisor/utils/sysfs:go_default_library", diff --git a/vendor/github.com/google/cadvisor/utils/tail/BUILD b/vendor/github.com/google/cadvisor/utils/tail/BUILD index 734c6a15364..0063b51d04d 100644 --- a/vendor/github.com/google/cadvisor/utils/tail/BUILD +++ b/vendor/github.com/google/cadvisor/utils/tail/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["tail.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/golang.org/x/exp/inotify:go_default_library", diff --git a/vendor/github.com/google/cadvisor/validate/BUILD b/vendor/github.com/google/cadvisor/validate/BUILD index 6ec53d54c16..7d8b534acb8 100644 --- a/vendor/github.com/google/cadvisor/validate/BUILD +++ b/vendor/github.com/google/cadvisor/validate/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["validate.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/google/cadvisor/container/docker:go_default_library", "//vendor/github.com/google/cadvisor/manager:go_default_library", diff --git a/vendor/github.com/google/cadvisor/version/BUILD b/vendor/github.com/google/cadvisor/version/BUILD index 4928f163172..5ba586b201c 100644 --- a/vendor/github.com/google/cadvisor/version/BUILD +++ b/vendor/github.com/google/cadvisor/version/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["version.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/google/cadvisor/zfs/BUILD b/vendor/github.com/google/cadvisor/zfs/BUILD index dcdb6874d58..6e5f54a816a 100644 --- a/vendor/github.com/google/cadvisor/zfs/BUILD +++ b/vendor/github.com/google/cadvisor/zfs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["watcher.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/mistifyio/go-zfs:go_default_library", diff --git a/vendor/github.com/google/certificate-transparency/go/BUILD b/vendor/github.com/google/certificate-transparency/go/BUILD index cf02006bcef..e8455b4c645 100644 --- a/vendor/github.com/google/certificate-transparency/go/BUILD +++ b/vendor/github.com/google/certificate-transparency/go/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "signatures.go", "types.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/google/certificate-transparency/go/x509:go_default_library"], ) diff --git a/vendor/github.com/google/certificate-transparency/go/asn1/BUILD b/vendor/github.com/google/certificate-transparency/go/asn1/BUILD index 3bfaf716edc..10c1452175e 100644 --- a/vendor/github.com/google/certificate-transparency/go/asn1/BUILD +++ b/vendor/github.com/google/certificate-transparency/go/asn1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "common.go", "marshal.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/google/certificate-transparency/go/client/BUILD b/vendor/github.com/google/certificate-transparency/go/client/BUILD index 959bab46afc..840a64012d1 100644 --- a/vendor/github.com/google/certificate-transparency/go/client/BUILD +++ b/vendor/github.com/google/certificate-transparency/go/client/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["logclient.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/google/certificate-transparency/go:go_default_library", "//vendor/github.com/mreiferson/go-httpclient:go_default_library", diff --git a/vendor/github.com/google/certificate-transparency/go/x509/BUILD b/vendor/github.com/google/certificate-transparency/go/x509/BUILD index 059253971b2..70bf61584c7 100644 --- a/vendor/github.com/google/certificate-transparency/go/x509/BUILD +++ b/vendor/github.com/google/certificate-transparency/go/x509/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,12 +13,34 @@ go_library( "pkcs1.go", "pkcs8.go", "root.go", - "root_unix.go", "sec1.go", "verify.go", "x509.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "root_darwin.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "root_unix.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "root_windows.go", + ], + "//conditions:default": [], + }), + cgo = True, + clinkopts = select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "-framework CoreFoundation -framework Security", + ], + "//conditions:default": [], + }), + copts = select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "-mmacosx-version-min=10.6 -D__MAC_OS_X_VERSION_MAX_ALLOWED=1060", + ], + "//conditions:default": [], + }), deps = [ "//vendor/github.com/google/certificate-transparency/go/asn1:go_default_library", "//vendor/github.com/google/certificate-transparency/go/x509/pkix:go_default_library", diff --git a/vendor/github.com/google/certificate-transparency/go/x509/pkix/BUILD b/vendor/github.com/google/certificate-transparency/go/x509/pkix/BUILD index e2d0ab429a0..6c14039fc53 100644 --- a/vendor/github.com/google/certificate-transparency/go/x509/pkix/BUILD +++ b/vendor/github.com/google/certificate-transparency/go/x509/pkix/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["pkix.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/google/certificate-transparency/go/asn1:go_default_library"], ) diff --git a/vendor/github.com/google/gofuzz/BUILD b/vendor/github.com/google/gofuzz/BUILD index ec629e6785e..94f98183a66 100644 --- a/vendor/github.com/google/gofuzz/BUILD +++ b/vendor/github.com/google/gofuzz/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "fuzz.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/googleapis/gnostic/OpenAPIv2/BUILD b/vendor/github.com/googleapis/gnostic/OpenAPIv2/BUILD index 7552825a511..11a270877ee 100644 --- a/vendor/github.com/googleapis/gnostic/OpenAPIv2/BUILD +++ b/vendor/github.com/googleapis/gnostic/OpenAPIv2/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "OpenAPIv2.go", "OpenAPIv2.pb.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/protobuf/proto:go_default_library", "//vendor/github.com/golang/protobuf/ptypes/any:go_default_library", @@ -34,3 +31,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["OpenAPIv2.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/googleapis/gnostic/compiler/BUILD b/vendor/github.com/googleapis/gnostic/compiler/BUILD index 0bce780808c..391edc78bd5 100644 --- a/vendor/github.com/googleapis/gnostic/compiler/BUILD +++ b/vendor/github.com/googleapis/gnostic/compiler/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "main.go", "reader.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/protobuf/proto:go_default_library", "//vendor/github.com/golang/protobuf/ptypes/any:go_default_library", diff --git a/vendor/github.com/googleapis/gnostic/extensions/BUILD b/vendor/github.com/googleapis/gnostic/extensions/BUILD index da13d979311..9e474feb339 100644 --- a/vendor/github.com/googleapis/gnostic/extensions/BUILD +++ b/vendor/github.com/googleapis/gnostic/extensions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "extension.pb.go", "extensions.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/protobuf/proto:go_default_library", "//vendor/github.com/golang/protobuf/ptypes:go_default_library", @@ -33,3 +30,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["extension.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/gophercloud/gophercloud/BUILD b/vendor/github.com/gophercloud/gophercloud/BUILD index cfff084a0be..44c7163df45 100644 --- a/vendor/github.com/gophercloud/gophercloud/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -20,7 +18,6 @@ go_library( "service_client.go", "util.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/BUILD index 9b80a679a6e..e3b68e89f7e 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "endpoint_location.go", "errors.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/BUILD index bb8bf4e650d..63ec222bdf7 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumes/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumes/BUILD index 1438b4d9b81..47741e19e55 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumes/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumes/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "urls.go", "util.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/BUILD index 1438b4d9b81..47741e19e55 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "urls.go", "util.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/common/extensions/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/common/extensions/BUILD index dfe5d1eaed6..855148a06b7 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/common/extensions/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/common/extensions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach/BUILD index bb8bf4e650d..63ec222bdf7 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/flavors/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/flavors/BUILD index bb8bf4e650d..63ec222bdf7 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/flavors/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/flavors/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/images/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/images/BUILD index bb8bf4e650d..63ec222bdf7 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/images/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/images/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/servers/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/servers/BUILD index effff1f3b7a..3471ff910b3 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/servers/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/servers/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "urls.go", "util.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/flavors:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/BUILD index bb8bf4e650d..63ec222bdf7 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/BUILD index d21ed9100d7..56f71df4df1 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/extensions/trusts/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/extensions/trusts/BUILD index a4a54a66ea0..4ca8601e6c1 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/extensions/trusts/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/extensions/trusts/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "requests.go", "results.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens:go_default_library"], ) diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/BUILD index a8318ca5ff5..7ac5f997c1d 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/gophercloud/gophercloud:go_default_library"], ) diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/BUILD index 803f5e0e27a..838702796bf 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["delegate.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/common/extensions:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips/BUILD index 381705d59bf..69ffe188f69 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers/BUILD index 381705d59bf..69ffe188f69 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/members/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/members/BUILD index 381705d59bf..69ffe188f69 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/members/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/members/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/monitors/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/monitors/BUILD index 381705d59bf..69ffe188f69 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/monitors/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/monitors/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/pools/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/pools/BUILD index 381705d59bf..69ffe188f69 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/pools/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/pools/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/vips/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/vips/BUILD index 381705d59bf..69ffe188f69 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/vips/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/vips/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/listeners/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/listeners/BUILD index 266dd3672e6..2c1fd335e8c 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/listeners/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/listeners/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/pools:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/loadbalancers/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/loadbalancers/BUILD index 569011cc178..f7f16c0bc55 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/loadbalancers/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/loadbalancers/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/listeners:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/monitors/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/monitors/BUILD index 381705d59bf..69ffe188f69 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/monitors/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/monitors/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/pools/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/pools/BUILD index 3432f22270d..2af38a15434 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/pools/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/pools/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/monitors:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups/BUILD index a52368ce9ab..da9d689a458 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules/BUILD index 381705d59bf..69ffe188f69 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/ports/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/ports/BUILD index bb8bf4e650d..63ec222bdf7 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/ports/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/ports/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/utils/BUILD b/vendor/github.com/gophercloud/gophercloud/openstack/utils/BUILD index 701111fad0d..34942c1e33f 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/utils/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/openstack/utils/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["choose_version.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/gophercloud/gophercloud:go_default_library"], ) diff --git a/vendor/github.com/gophercloud/gophercloud/pagination/BUILD b/vendor/github.com/gophercloud/gophercloud/pagination/BUILD index a191ed2a81e..b48c5e180db 100644 --- a/vendor/github.com/gophercloud/gophercloud/pagination/BUILD +++ b/vendor/github.com/gophercloud/gophercloud/pagination/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "pkg.go", "single.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/gophercloud/gophercloud:go_default_library"], ) diff --git a/vendor/github.com/gorilla/context/BUILD b/vendor/github.com/gorilla/context/BUILD index 6de7fa2a083..378da872b7f 100644 --- a/vendor/github.com/gorilla/context/BUILD +++ b/vendor/github.com/gorilla/context/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "context.go", "doc.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/gorilla/mux/BUILD b/vendor/github.com/gorilla/mux/BUILD index ef0365e684c..1383c19f375 100644 --- a/vendor/github.com/gorilla/mux/BUILD +++ b/vendor/github.com/gorilla/mux/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "regexp.go", "route.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/gorilla/context:go_default_library"], ) diff --git a/vendor/github.com/gorilla/websocket/BUILD b/vendor/github.com/gorilla/websocket/BUILD index b2fe99b0993..81f47647a16 100644 --- a/vendor/github.com/gorilla/websocket/BUILD +++ b/vendor/github.com/gorilla/websocket/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "server.go", "util.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/gregjones/httpcache/.travis.yml b/vendor/github.com/gregjones/httpcache/.travis.yml deleted file mode 100644 index 2bca4c599fd..00000000000 --- a/vendor/github.com/gregjones/httpcache/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -sudo: false -language: go -go: - - 1.6.x - - 1.7.x - - 1.8.x - - master -matrix: - allow_failures: - - go: master - fast_finish: true -install: - - # Do nothing. This is needed to prevent default install action "go get -t -v ./..." from happening here (we want it to happen inside script step). -script: - - go get -t -v ./... - - diff -u <(echo -n) <(gofmt -d .) - - go tool vet . - - go test -v -race ./... diff --git a/vendor/github.com/gregjones/httpcache/LICENSE.txt b/vendor/github.com/gregjones/httpcache/LICENSE.txt deleted file mode 100644 index 81316beb0cb..00000000000 --- a/vendor/github.com/gregjones/httpcache/LICENSE.txt +++ /dev/null @@ -1,7 +0,0 @@ -Copyright © 2012 Greg Jones (greg.jones@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/gregjones/httpcache/README.md b/vendor/github.com/gregjones/httpcache/README.md deleted file mode 100644 index 61bd830e57c..00000000000 --- a/vendor/github.com/gregjones/httpcache/README.md +++ /dev/null @@ -1,24 +0,0 @@ -httpcache -========= - -[![Build Status](https://travis-ci.org/gregjones/httpcache.svg?branch=master)](https://travis-ci.org/gregjones/httpcache) [![GoDoc](https://godoc.org/github.com/gregjones/httpcache?status.svg)](https://godoc.org/github.com/gregjones/httpcache) - -Package httpcache provides a http.RoundTripper implementation that works as a mostly RFC-compliant cache for http responses. - -It is only suitable for use as a 'private' cache (i.e. for a web-browser or an API-client and not for a shared proxy). - -Cache Backends --------------- - -- The built-in 'memory' cache stores responses in an in-memory map. -- [`github.com/gregjones/httpcache/diskcache`](https://github.com/gregjones/httpcache/tree/master/diskcache) provides a filesystem-backed cache using the [diskv](https://github.com/peterbourgon/diskv) library. -- [`github.com/gregjones/httpcache/memcache`](https://github.com/gregjones/httpcache/tree/master/memcache) provides memcache implementations, for both App Engine and 'normal' memcache servers. -- [`sourcegraph.com/sourcegraph/s3cache`](https://sourcegraph.com/github.com/sourcegraph/s3cache) uses Amazon S3 for storage. -- [`github.com/gregjones/httpcache/leveldbcache`](https://github.com/gregjones/httpcache/tree/master/leveldbcache) provides a filesystem-backed cache using [leveldb](https://github.com/syndtr/goleveldb/leveldb). -- [`github.com/die-net/lrucache`](https://github.com/die-net/lrucache) provides an in-memory cache that will evict least-recently used entries. -- [`github.com/die-net/lrucache/twotier`](https://github.com/die-net/lrucache/tree/master/twotier) allows caches to be combined, for example to use lrucache above with a persistent disk-cache. - -License -------- - -- [MIT License](LICENSE.txt) diff --git a/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go b/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go deleted file mode 100644 index 42e3129d823..00000000000 --- a/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go +++ /dev/null @@ -1,61 +0,0 @@ -// Package diskcache provides an implementation of httpcache.Cache that uses the diskv package -// to supplement an in-memory map with persistent storage -// -package diskcache - -import ( - "bytes" - "crypto/md5" - "encoding/hex" - "github.com/peterbourgon/diskv" - "io" -) - -// Cache is an implementation of httpcache.Cache that supplements the in-memory map with persistent storage -type Cache struct { - d *diskv.Diskv -} - -// Get returns the response corresponding to key if present -func (c *Cache) Get(key string) (resp []byte, ok bool) { - key = keyToFilename(key) - resp, err := c.d.Read(key) - if err != nil { - return []byte{}, false - } - return resp, true -} - -// Set saves a response to the cache as key -func (c *Cache) Set(key string, resp []byte) { - key = keyToFilename(key) - c.d.WriteStream(key, bytes.NewReader(resp), true) -} - -// Delete removes the response with key from the cache -func (c *Cache) Delete(key string) { - key = keyToFilename(key) - c.d.Erase(key) -} - -func keyToFilename(key string) string { - h := md5.New() - io.WriteString(h, key) - return hex.EncodeToString(h.Sum(nil)) -} - -// New returns a new Cache that will store files in basePath -func New(basePath string) *Cache { - return &Cache{ - d: diskv.New(diskv.Options{ - BasePath: basePath, - CacheSizeMax: 100 * 1024 * 1024, // 100MB - }), - } -} - -// NewWithDiskv returns a new Cache using the provided Diskv as underlying -// storage. -func NewWithDiskv(d *diskv.Diskv) *Cache { - return &Cache{d} -} diff --git a/vendor/github.com/gregjones/httpcache/httpcache.go b/vendor/github.com/gregjones/httpcache/httpcache.go deleted file mode 100644 index 8239edc2cb2..00000000000 --- a/vendor/github.com/gregjones/httpcache/httpcache.go +++ /dev/null @@ -1,553 +0,0 @@ -// Package httpcache provides a http.RoundTripper implementation that works as a -// mostly RFC-compliant cache for http responses. -// -// It is only suitable for use as a 'private' cache (i.e. for a web-browser or an API-client -// and not for a shared proxy). -// -package httpcache - -import ( - "bufio" - "bytes" - "errors" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/http/httputil" - "strings" - "sync" - "time" -) - -const ( - stale = iota - fresh - transparent - // XFromCache is the header added to responses that are returned from the cache - XFromCache = "X-From-Cache" -) - -// A Cache interface is used by the Transport to store and retrieve responses. -type Cache interface { - // Get returns the []byte representation of a cached response and a bool - // set to true if the value isn't empty - Get(key string) (responseBytes []byte, ok bool) - // Set stores the []byte representation of a response against a key - Set(key string, responseBytes []byte) - // Delete removes the value associated with the key - Delete(key string) -} - -// cacheKey returns the cache key for req. -func cacheKey(req *http.Request) string { - return req.URL.String() -} - -// CachedResponse returns the cached http.Response for req if present, and nil -// otherwise. -func CachedResponse(c Cache, req *http.Request) (resp *http.Response, err error) { - cachedVal, ok := c.Get(cacheKey(req)) - if !ok { - return - } - - b := bytes.NewBuffer(cachedVal) - return http.ReadResponse(bufio.NewReader(b), req) -} - -// MemoryCache is an implemtation of Cache that stores responses in an in-memory map. -type MemoryCache struct { - mu sync.RWMutex - items map[string][]byte -} - -// Get returns the []byte representation of the response and true if present, false if not -func (c *MemoryCache) Get(key string) (resp []byte, ok bool) { - c.mu.RLock() - resp, ok = c.items[key] - c.mu.RUnlock() - return resp, ok -} - -// Set saves response resp to the cache with key -func (c *MemoryCache) Set(key string, resp []byte) { - c.mu.Lock() - c.items[key] = resp - c.mu.Unlock() -} - -// Delete removes key from the cache -func (c *MemoryCache) Delete(key string) { - c.mu.Lock() - delete(c.items, key) - c.mu.Unlock() -} - -// NewMemoryCache returns a new Cache that will store items in an in-memory map -func NewMemoryCache() *MemoryCache { - c := &MemoryCache{items: map[string][]byte{}} - return c -} - -// Transport is an implementation of http.RoundTripper that will return values from a cache -// where possible (avoiding a network request) and will additionally add validators (etag/if-modified-since) -// to repeated requests allowing servers to return 304 / Not Modified -type Transport struct { - // The RoundTripper interface actually used to make requests - // If nil, http.DefaultTransport is used - Transport http.RoundTripper - Cache Cache - // If true, responses returned from the cache will be given an extra header, X-From-Cache - MarkCachedResponses bool -} - -// NewTransport returns a new Transport with the -// provided Cache implementation and MarkCachedResponses set to true -func NewTransport(c Cache) *Transport { - return &Transport{Cache: c, MarkCachedResponses: true} -} - -// Client returns an *http.Client that caches responses. -func (t *Transport) Client() *http.Client { - return &http.Client{Transport: t} -} - -// varyMatches will return false unless all of the cached values for the headers listed in Vary -// match the new request -func varyMatches(cachedResp *http.Response, req *http.Request) bool { - for _, header := range headerAllCommaSepValues(cachedResp.Header, "vary") { - header = http.CanonicalHeaderKey(header) - if header != "" && req.Header.Get(header) != cachedResp.Header.Get("X-Varied-"+header) { - return false - } - } - return true -} - -// RoundTrip takes a Request and returns a Response -// -// If there is a fresh Response already in cache, then it will be returned without connecting to -// the server. -// -// If there is a stale Response, then any validators it contains will be set on the new request -// to give the server a chance to respond with NotModified. If this happens, then the cached Response -// will be returned. -func (t *Transport) RoundTrip(req *http.Request) (resp *http.Response, err error) { - cacheKey := cacheKey(req) - cacheable := (req.Method == "GET" || req.Method == "HEAD") && req.Header.Get("range") == "" - var cachedResp *http.Response - if cacheable { - cachedResp, err = CachedResponse(t.Cache, req) - } else { - // Need to invalidate an existing value - t.Cache.Delete(cacheKey) - } - - transport := t.Transport - if transport == nil { - transport = http.DefaultTransport - } - - if cacheable && cachedResp != nil && err == nil { - if t.MarkCachedResponses { - cachedResp.Header.Set(XFromCache, "1") - } - - if varyMatches(cachedResp, req) { - // Can only use cached value if the new request doesn't Vary significantly - freshness := getFreshness(cachedResp.Header, req.Header) - if freshness == fresh { - return cachedResp, nil - } - - if freshness == stale { - var req2 *http.Request - // Add validators if caller hasn't already done so - etag := cachedResp.Header.Get("etag") - if etag != "" && req.Header.Get("etag") == "" { - req2 = cloneRequest(req) - req2.Header.Set("if-none-match", etag) - } - lastModified := cachedResp.Header.Get("last-modified") - if lastModified != "" && req.Header.Get("last-modified") == "" { - if req2 == nil { - req2 = cloneRequest(req) - } - req2.Header.Set("if-modified-since", lastModified) - } - if req2 != nil { - req = req2 - } - } - } - - resp, err = transport.RoundTrip(req) - if err == nil && req.Method == "GET" && resp.StatusCode == http.StatusNotModified { - // Replace the 304 response with the one from cache, but update with some new headers - endToEndHeaders := getEndToEndHeaders(resp.Header) - for _, header := range endToEndHeaders { - cachedResp.Header[header] = resp.Header[header] - } - cachedResp.Status = fmt.Sprintf("%d %s", http.StatusOK, http.StatusText(http.StatusOK)) - cachedResp.StatusCode = http.StatusOK - - resp = cachedResp - } else if (err != nil || (cachedResp != nil && resp.StatusCode >= 500)) && - req.Method == "GET" && canStaleOnError(cachedResp.Header, req.Header) { - // In case of transport failure and stale-if-error activated, returns cached content - // when available - cachedResp.Status = fmt.Sprintf("%d %s", http.StatusOK, http.StatusText(http.StatusOK)) - cachedResp.StatusCode = http.StatusOK - return cachedResp, nil - } else { - if err != nil || resp.StatusCode != http.StatusOK { - t.Cache.Delete(cacheKey) - } - if err != nil { - return nil, err - } - } - } else { - reqCacheControl := parseCacheControl(req.Header) - if _, ok := reqCacheControl["only-if-cached"]; ok { - resp = newGatewayTimeoutResponse(req) - } else { - resp, err = transport.RoundTrip(req) - if err != nil { - return nil, err - } - } - } - - if cacheable && canStore(parseCacheControl(req.Header), parseCacheControl(resp.Header)) { - for _, varyKey := range headerAllCommaSepValues(resp.Header, "vary") { - varyKey = http.CanonicalHeaderKey(varyKey) - fakeHeader := "X-Varied-" + varyKey - reqValue := req.Header.Get(varyKey) - if reqValue != "" { - resp.Header.Set(fakeHeader, reqValue) - } - } - switch req.Method { - case "GET": - // Delay caching until EOF is reached. - resp.Body = &cachingReadCloser{ - R: resp.Body, - OnEOF: func(r io.Reader) { - resp := *resp - resp.Body = ioutil.NopCloser(r) - respBytes, err := httputil.DumpResponse(&resp, true) - if err == nil { - t.Cache.Set(cacheKey, respBytes) - } - }, - } - default: - respBytes, err := httputil.DumpResponse(resp, true) - if err == nil { - t.Cache.Set(cacheKey, respBytes) - } - } - } else { - t.Cache.Delete(cacheKey) - } - return resp, nil -} - -// ErrNoDateHeader indicates that the HTTP headers contained no Date header. -var ErrNoDateHeader = errors.New("no Date header") - -// Date parses and returns the value of the Date header. -func Date(respHeaders http.Header) (date time.Time, err error) { - dateHeader := respHeaders.Get("date") - if dateHeader == "" { - err = ErrNoDateHeader - return - } - - return time.Parse(time.RFC1123, dateHeader) -} - -type realClock struct{} - -func (c *realClock) since(d time.Time) time.Duration { - return time.Since(d) -} - -type timer interface { - since(d time.Time) time.Duration -} - -var clock timer = &realClock{} - -// getFreshness will return one of fresh/stale/transparent based on the cache-control -// values of the request and the response -// -// fresh indicates the response can be returned -// stale indicates that the response needs validating before it is returned -// transparent indicates the response should not be used to fulfil the request -// -// Because this is only a private cache, 'public' and 'private' in cache-control aren't -// signficant. Similarly, smax-age isn't used. -func getFreshness(respHeaders, reqHeaders http.Header) (freshness int) { - respCacheControl := parseCacheControl(respHeaders) - reqCacheControl := parseCacheControl(reqHeaders) - if _, ok := reqCacheControl["no-cache"]; ok { - return transparent - } - if _, ok := respCacheControl["no-cache"]; ok { - return stale - } - if _, ok := reqCacheControl["only-if-cached"]; ok { - return fresh - } - - date, err := Date(respHeaders) - if err != nil { - return stale - } - currentAge := clock.since(date) - - var lifetime time.Duration - var zeroDuration time.Duration - - // If a response includes both an Expires header and a max-age directive, - // the max-age directive overrides the Expires header, even if the Expires header is more restrictive. - if maxAge, ok := respCacheControl["max-age"]; ok { - lifetime, err = time.ParseDuration(maxAge + "s") - if err != nil { - lifetime = zeroDuration - } - } else { - expiresHeader := respHeaders.Get("Expires") - if expiresHeader != "" { - expires, err := time.Parse(time.RFC1123, expiresHeader) - if err != nil { - lifetime = zeroDuration - } else { - lifetime = expires.Sub(date) - } - } - } - - if maxAge, ok := reqCacheControl["max-age"]; ok { - // the client is willing to accept a response whose age is no greater than the specified time in seconds - lifetime, err = time.ParseDuration(maxAge + "s") - if err != nil { - lifetime = zeroDuration - } - } - if minfresh, ok := reqCacheControl["min-fresh"]; ok { - // the client wants a response that will still be fresh for at least the specified number of seconds. - minfreshDuration, err := time.ParseDuration(minfresh + "s") - if err == nil { - currentAge = time.Duration(currentAge + minfreshDuration) - } - } - - if maxstale, ok := reqCacheControl["max-stale"]; ok { - // Indicates that the client is willing to accept a response that has exceeded its expiration time. - // If max-stale is assigned a value, then the client is willing to accept a response that has exceeded - // its expiration time by no more than the specified number of seconds. - // If no value is assigned to max-stale, then the client is willing to accept a stale response of any age. - // - // Responses served only because of a max-stale value are supposed to have a Warning header added to them, - // but that seems like a hassle, and is it actually useful? If so, then there needs to be a different - // return-value available here. - if maxstale == "" { - return fresh - } - maxstaleDuration, err := time.ParseDuration(maxstale + "s") - if err == nil { - currentAge = time.Duration(currentAge - maxstaleDuration) - } - } - - if lifetime > currentAge { - return fresh - } - - return stale -} - -// Returns true if either the request or the response includes the stale-if-error -// cache control extension: https://tools.ietf.org/html/rfc5861 -func canStaleOnError(respHeaders, reqHeaders http.Header) bool { - respCacheControl := parseCacheControl(respHeaders) - reqCacheControl := parseCacheControl(reqHeaders) - - var err error - lifetime := time.Duration(-1) - - if staleMaxAge, ok := respCacheControl["stale-if-error"]; ok { - if staleMaxAge != "" { - lifetime, err = time.ParseDuration(staleMaxAge + "s") - if err != nil { - return false - } - } else { - return true - } - } - if staleMaxAge, ok := reqCacheControl["stale-if-error"]; ok { - if staleMaxAge != "" { - lifetime, err = time.ParseDuration(staleMaxAge + "s") - if err != nil { - return false - } - } else { - return true - } - } - - if lifetime >= 0 { - date, err := Date(respHeaders) - if err != nil { - return false - } - currentAge := clock.since(date) - if lifetime > currentAge { - return true - } - } - - return false -} - -func getEndToEndHeaders(respHeaders http.Header) []string { - // These headers are always hop-by-hop - hopByHopHeaders := map[string]struct{}{ - "Connection": struct{}{}, - "Keep-Alive": struct{}{}, - "Proxy-Authenticate": struct{}{}, - "Proxy-Authorization": struct{}{}, - "Te": struct{}{}, - "Trailers": struct{}{}, - "Transfer-Encoding": struct{}{}, - "Upgrade": struct{}{}, - } - - for _, extra := range strings.Split(respHeaders.Get("connection"), ",") { - // any header listed in connection, if present, is also considered hop-by-hop - if strings.Trim(extra, " ") != "" { - hopByHopHeaders[http.CanonicalHeaderKey(extra)] = struct{}{} - } - } - endToEndHeaders := []string{} - for respHeader, _ := range respHeaders { - if _, ok := hopByHopHeaders[respHeader]; !ok { - endToEndHeaders = append(endToEndHeaders, respHeader) - } - } - return endToEndHeaders -} - -func canStore(reqCacheControl, respCacheControl cacheControl) (canStore bool) { - if _, ok := respCacheControl["no-store"]; ok { - return false - } - if _, ok := reqCacheControl["no-store"]; ok { - return false - } - return true -} - -func newGatewayTimeoutResponse(req *http.Request) *http.Response { - var braw bytes.Buffer - braw.WriteString("HTTP/1.1 504 Gateway Timeout\r\n\r\n") - resp, err := http.ReadResponse(bufio.NewReader(&braw), req) - if err != nil { - panic(err) - } - return resp -} - -// cloneRequest returns a clone of the provided *http.Request. -// The clone is a shallow copy of the struct and its Header map. -// (This function copyright goauth2 authors: https://code.google.com/p/goauth2) -func cloneRequest(r *http.Request) *http.Request { - // shallow copy of the struct - r2 := new(http.Request) - *r2 = *r - // deep copy of the Header - r2.Header = make(http.Header) - for k, s := range r.Header { - r2.Header[k] = s - } - return r2 -} - -type cacheControl map[string]string - -func parseCacheControl(headers http.Header) cacheControl { - cc := cacheControl{} - ccHeader := headers.Get("Cache-Control") - for _, part := range strings.Split(ccHeader, ",") { - part = strings.Trim(part, " ") - if part == "" { - continue - } - if strings.ContainsRune(part, '=') { - keyval := strings.Split(part, "=") - cc[strings.Trim(keyval[0], " ")] = strings.Trim(keyval[1], ",") - } else { - cc[part] = "" - } - } - return cc -} - -// headerAllCommaSepValues returns all comma-separated values (each -// with whitespace trimmed) for header name in headers. According to -// Section 4.2 of the HTTP/1.1 spec -// (http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2), -// values from multiple occurrences of a header should be concatenated, if -// the header's value is a comma-separated list. -func headerAllCommaSepValues(headers http.Header, name string) []string { - var vals []string - for _, val := range headers[http.CanonicalHeaderKey(name)] { - fields := strings.Split(val, ",") - for i, f := range fields { - fields[i] = strings.TrimSpace(f) - } - vals = append(vals, fields...) - } - return vals -} - -// cachingReadCloser is a wrapper around ReadCloser R that calls OnEOF -// handler with a full copy of the content read from R when EOF is -// reached. -type cachingReadCloser struct { - // Underlying ReadCloser. - R io.ReadCloser - // OnEOF is called with a copy of the content of R when EOF is reached. - OnEOF func(io.Reader) - - buf bytes.Buffer // buf stores a copy of the content of R. -} - -// Read reads the next len(p) bytes from R or until R is drained. The -// return value n is the number of bytes read. If R has no data to -// return, err is io.EOF and OnEOF is called with a full copy of what -// has been read so far. -func (r *cachingReadCloser) Read(p []byte) (n int, err error) { - n, err = r.R.Read(p) - r.buf.Write(p[:n]) - if err == io.EOF { - r.OnEOF(bytes.NewReader(r.buf.Bytes())) - } - return n, err -} - -func (r *cachingReadCloser) Close() error { - return r.R.Close() -} - -// NewMemoryCacheTransport returns a new Transport using the in-memory cache implementation -func NewMemoryCacheTransport() *Transport { - c := NewMemoryCache() - t := NewTransport(c) - return t -} diff --git a/vendor/github.com/grpc-ecosystem/go-grpc-prometheus/BUILD b/vendor/github.com/grpc-ecosystem/go-grpc-prometheus/BUILD index d2e3a56f1d1..f3479dc2fe9 100644 --- a/vendor/github.com/grpc-ecosystem/go-grpc-prometheus/BUILD +++ b/vendor/github.com/grpc-ecosystem/go-grpc-prometheus/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "server_reporter.go", "util.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/BUILD b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/BUILD index 88ee2dea26e..f700b53da77 100644 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/BUILD +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -24,7 +22,6 @@ go_library( "proto2_convert.go", "query.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/protobuf/jsonpb:go_default_library", "//vendor/github.com/golang/protobuf/proto:go_default_library", diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/internal/BUILD b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/internal/BUILD index 082b39a94b4..00a8cdaad89 100644 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/internal/BUILD +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/internal/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["stream_chunk.pb.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], ) @@ -26,3 +23,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["stream_chunk.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/BUILD b/vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/BUILD index 2e926c462f0..802add56ce1 100644 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/BUILD +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "pattern.go", "trie.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/hashicorp/golang-lru/BUILD b/vendor/github.com/hashicorp/golang-lru/BUILD index ccac560ea93..0d686f855c0 100644 --- a/vendor/github.com/hashicorp/golang-lru/BUILD +++ b/vendor/github.com/hashicorp/golang-lru/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "arc.go", "lru.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/hashicorp/golang-lru/simplelru:go_default_library"], ) diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/BUILD b/vendor/github.com/hashicorp/golang-lru/simplelru/BUILD index fcdf8021d5f..957de8a19b8 100644 --- a/vendor/github.com/hashicorp/golang-lru/simplelru/BUILD +++ b/vendor/github.com/hashicorp/golang-lru/simplelru/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["lru.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/hashicorp/hcl/BUILD b/vendor/github.com/hashicorp/hcl/BUILD index a8c3cc25a53..d44215fe4d9 100644 --- a/vendor/github.com/hashicorp/hcl/BUILD +++ b/vendor/github.com/hashicorp/hcl/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "lex.go", "parse.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/hashicorp/hcl/hcl/ast:go_default_library", "//vendor/github.com/hashicorp/hcl/hcl/parser:go_default_library", diff --git a/vendor/github.com/hashicorp/hcl/hcl/ast/BUILD b/vendor/github.com/hashicorp/hcl/hcl/ast/BUILD index 105f4c66b80..a1aa0b87191 100644 --- a/vendor/github.com/hashicorp/hcl/hcl/ast/BUILD +++ b/vendor/github.com/hashicorp/hcl/hcl/ast/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "ast.go", "walk.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/hashicorp/hcl/hcl/token:go_default_library"], ) diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/BUILD b/vendor/github.com/hashicorp/hcl/hcl/parser/BUILD index c761f448764..4b2baa5fe0b 100644 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/BUILD +++ b/vendor/github.com/hashicorp/hcl/hcl/parser/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "error.go", "parser.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/hashicorp/hcl/hcl/ast:go_default_library", "//vendor/github.com/hashicorp/hcl/hcl/scanner:go_default_library", diff --git a/vendor/github.com/hashicorp/hcl/hcl/scanner/BUILD b/vendor/github.com/hashicorp/hcl/hcl/scanner/BUILD index 2a2cc6ad191..f531bea9d64 100644 --- a/vendor/github.com/hashicorp/hcl/hcl/scanner/BUILD +++ b/vendor/github.com/hashicorp/hcl/hcl/scanner/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["scanner.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/hashicorp/hcl/hcl/token:go_default_library"], ) diff --git a/vendor/github.com/hashicorp/hcl/hcl/strconv/BUILD b/vendor/github.com/hashicorp/hcl/hcl/strconv/BUILD index c6af50d47d2..69e46a1a102 100644 --- a/vendor/github.com/hashicorp/hcl/hcl/strconv/BUILD +++ b/vendor/github.com/hashicorp/hcl/hcl/strconv/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["quote.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/hashicorp/hcl/hcl/token/BUILD b/vendor/github.com/hashicorp/hcl/hcl/token/BUILD index c3889adf09c..901025f812f 100644 --- a/vendor/github.com/hashicorp/hcl/hcl/token/BUILD +++ b/vendor/github.com/hashicorp/hcl/hcl/token/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "position.go", "token.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/hashicorp/hcl/hcl/strconv:go_default_library"], ) diff --git a/vendor/github.com/hashicorp/hcl/json/parser/BUILD b/vendor/github.com/hashicorp/hcl/json/parser/BUILD index cd452666001..8db12af56c9 100644 --- a/vendor/github.com/hashicorp/hcl/json/parser/BUILD +++ b/vendor/github.com/hashicorp/hcl/json/parser/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "flatten.go", "parser.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/hashicorp/hcl/hcl/ast:go_default_library", "//vendor/github.com/hashicorp/hcl/json/scanner:go_default_library", diff --git a/vendor/github.com/hashicorp/hcl/json/scanner/BUILD b/vendor/github.com/hashicorp/hcl/json/scanner/BUILD index fe4c496bc47..2cf1e467aff 100644 --- a/vendor/github.com/hashicorp/hcl/json/scanner/BUILD +++ b/vendor/github.com/hashicorp/hcl/json/scanner/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["scanner.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/hashicorp/hcl/json/token:go_default_library"], ) diff --git a/vendor/github.com/hashicorp/hcl/json/token/BUILD b/vendor/github.com/hashicorp/hcl/json/token/BUILD index 6cb098da877..736b087d310 100644 --- a/vendor/github.com/hashicorp/hcl/json/token/BUILD +++ b/vendor/github.com/hashicorp/hcl/json/token/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "position.go", "token.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/hashicorp/hcl/hcl/token:go_default_library"], ) diff --git a/vendor/github.com/hawkular/hawkular-client-go/metrics/BUILD b/vendor/github.com/hawkular/hawkular-client-go/metrics/BUILD index ad539be7a1c..73e2e183746 100644 --- a/vendor/github.com/hawkular/hawkular-client-go/metrics/BUILD +++ b/vendor/github.com/hawkular/hawkular-client-go/metrics/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "helpers.go", "types.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/heketi/heketi/client/api/go-client/BUILD b/vendor/github.com/heketi/heketi/client/api/go-client/BUILD index 6bf574746d9..894cd1c92eb 100644 --- a/vendor/github.com/heketi/heketi/client/api/go-client/BUILD +++ b/vendor/github.com/heketi/heketi/client/api/go-client/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "topology.go", "volume.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/dgrijalva/jwt-go:go_default_library", "//vendor/github.com/heketi/heketi/pkg/glusterfs/api:go_default_library", diff --git a/vendor/github.com/heketi/heketi/pkg/glusterfs/api/BUILD b/vendor/github.com/heketi/heketi/pkg/glusterfs/api/BUILD index 6109f467f1a..f39b267a2f0 100644 --- a/vendor/github.com/heketi/heketi/pkg/glusterfs/api/BUILD +++ b/vendor/github.com/heketi/heketi/pkg/glusterfs/api/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["types.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/heketi/heketi/pkg/utils/BUILD b/vendor/github.com/heketi/heketi/pkg/utils/BUILD index fbc5df12e58..f0575671cdd 100644 --- a/vendor/github.com/heketi/heketi/pkg/utils/BUILD +++ b/vendor/github.com/heketi/heketi/pkg/utils/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "stringstack.go", "uuid.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/lpabon/godbc:go_default_library"], ) diff --git a/vendor/github.com/howeyc/gopass/BUILD b/vendor/github.com/howeyc/gopass/BUILD index 455dee6cf34..2d9c1d589e6 100644 --- a/vendor/github.com/howeyc/gopass/BUILD +++ b/vendor/github.com/howeyc/gopass/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "pass.go", "terminal.go", ], - tags = ["automanaged"], deps = ["//vendor/golang.org/x/crypto/ssh/terminal:go_default_library"], ) diff --git a/vendor/github.com/imdario/mergo/BUILD b/vendor/github.com/imdario/mergo/BUILD index 18989dd7a35..080f87ccc95 100644 --- a/vendor/github.com/imdario/mergo/BUILD +++ b/vendor/github.com/imdario/mergo/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "merge.go", "mergo.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/inconshreveable/mousetrap/BUILD b/vendor/github.com/inconshreveable/mousetrap/BUILD index ba2d22bc978..27db2d5708b 100644 --- a/vendor/github.com/inconshreveable/mousetrap/BUILD +++ b/vendor/github.com/inconshreveable/mousetrap/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,8 +7,15 @@ load( go_library( name = "go_default_library", - srcs = ["trap_others.go"], - tags = ["automanaged"], + srcs = [ + "trap_others.go", + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "trap_windows.go", + "trap_windows_1.4.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/influxdata/influxdb/client/BUILD b/vendor/github.com/influxdata/influxdb/client/BUILD index 54ffc7167a9..71df9f54955 100644 --- a/vendor/github.com/influxdata/influxdb/client/BUILD +++ b/vendor/github.com/influxdata/influxdb/client/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["influxdb.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/influxdata/influxdb/models:go_default_library"], ) diff --git a/vendor/github.com/influxdata/influxdb/client/v2/BUILD b/vendor/github.com/influxdata/influxdb/client/v2/BUILD index 55b1c9dc8db..5e7d614c901 100644 --- a/vendor/github.com/influxdata/influxdb/client/v2/BUILD +++ b/vendor/github.com/influxdata/influxdb/client/v2/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "client.go", "udp.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/influxdata/influxdb/models:go_default_library"], ) diff --git a/vendor/github.com/influxdata/influxdb/models/BUILD b/vendor/github.com/influxdata/influxdb/models/BUILD index 9c57ef96c7d..ee5dd2dbf81 100644 --- a/vendor/github.com/influxdata/influxdb/models/BUILD +++ b/vendor/github.com/influxdata/influxdb/models/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "statistic.go", "time.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/influxdata/influxdb/pkg/escape:go_default_library"], ) diff --git a/vendor/github.com/influxdata/influxdb/pkg/escape/BUILD b/vendor/github.com/influxdata/influxdb/pkg/escape/BUILD index e39caf970b2..700e427e124 100644 --- a/vendor/github.com/influxdata/influxdb/pkg/escape/BUILD +++ b/vendor/github.com/influxdata/influxdb/pkg/escape/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "bytes.go", "strings.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/jmespath/go-jmespath/BUILD b/vendor/github.com/jmespath/go-jmespath/BUILD index 54d1ebaeab0..fa628987383 100644 --- a/vendor/github.com/jmespath/go-jmespath/BUILD +++ b/vendor/github.com/jmespath/go-jmespath/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "toktype_string.go", "util.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/jonboulle/clockwork/BUILD b/vendor/github.com/jonboulle/clockwork/BUILD index ca407acd78c..4c4c55aede7 100644 --- a/vendor/github.com/jonboulle/clockwork/BUILD +++ b/vendor/github.com/jonboulle/clockwork/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["clockwork.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/jteeuwen/go-bindata/BUILD b/vendor/github.com/jteeuwen/go-bindata/BUILD index 8b899916874..5daeb41b44f 100644 --- a/vendor/github.com/jteeuwen/go-bindata/BUILD +++ b/vendor/github.com/jteeuwen/go-bindata/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -21,7 +19,6 @@ go_library( "stringwriter.go", "toc.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/jteeuwen/go-bindata/go-bindata/BUILD b/vendor/github.com/jteeuwen/go-bindata/go-bindata/BUILD index 3436527656c..ad7e9fbbad3 100644 --- a/vendor/github.com/jteeuwen/go-bindata/go-bindata/BUILD +++ b/vendor/github.com/jteeuwen/go-bindata/go-bindata/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,7 +9,6 @@ load( go_binary( name = "go-bindata", library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -21,7 +18,6 @@ go_library( "main.go", "version.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/jteeuwen/go-bindata:go_default_library"], ) diff --git a/vendor/github.com/juju/ratelimit/BUILD b/vendor/github.com/juju/ratelimit/BUILD index bd17513b2cc..4955bc7b452 100644 --- a/vendor/github.com/juju/ratelimit/BUILD +++ b/vendor/github.com/juju/ratelimit/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "ratelimit.go", "reader.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/kardianos/osext/BUILD b/vendor/github.com/kardianos/osext/BUILD index c47b00d888d..86e381855f2 100644 --- a/vendor/github.com/kardianos/osext/BUILD +++ b/vendor/github.com/kardianos/osext/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,9 +9,18 @@ go_library( name = "go_default_library", srcs = [ "osext.go", - "osext_procfs.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "osext_sysctl.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "osext_procfs.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "osext_windows.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/karlseguin/ccache/BUILD b/vendor/github.com/karlseguin/ccache/BUILD index 157ad0e67e7..3b8fd7df683 100644 --- a/vendor/github.com/karlseguin/ccache/BUILD +++ b/vendor/github.com/karlseguin/ccache/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "layeredcache.go", "secondarycache.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/kr/fs/BUILD b/vendor/github.com/kr/fs/BUILD index cdfc9f8c94e..10e923a4a08 100644 --- a/vendor/github.com/kr/fs/BUILD +++ b/vendor/github.com/kr/fs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "filesystem.go", "walk.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/kr/pty/BUILD b/vendor/github.com/kr/pty/BUILD index 9e91f90eed4..6ee61d9508c 100644 --- a/vendor/github.com/kr/pty/BUILD +++ b/vendor/github.com/kr/pty/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,12 +10,25 @@ go_library( srcs = [ "doc.go", "ioctl.go", - "pty_linux.go", + "pty_unsupported.go", "run.go", "util.go", - "ztypes_amd64.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "ioctl_bsd.go", + "pty_darwin.go", + "ztypes_amd64.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "pty_linux.go", + "ztypes_amd64.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "ztypes_amd64.go", + ], + "//conditions:default": [], + }), + cgo = True, ) filegroup( diff --git a/vendor/github.com/libopenstorage/openstorage/api/BUILD b/vendor/github.com/libopenstorage/openstorage/api/BUILD index 61888772d56..89e1c229fd2 100644 --- a/vendor/github.com/libopenstorage/openstorage/api/BUILD +++ b/vendor/github.com/libopenstorage/openstorage/api/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "api.pb.go", "status.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/protobuf/proto:go_default_library", "//vendor/go.pedge.io/pb/go/google/protobuf:go_default_library", @@ -37,3 +34,9 @@ filegroup( ], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["api.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/libopenstorage/openstorage/api/client/BUILD b/vendor/github.com/libopenstorage/openstorage/api/client/BUILD index 91359115331..06e5559df9f 100644 --- a/vendor/github.com/libopenstorage/openstorage/api/client/BUILD +++ b/vendor/github.com/libopenstorage/openstorage/api/client/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "client.go", "request.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/libopenstorage/openstorage/api/client/volume/BUILD b/vendor/github.com/libopenstorage/openstorage/api/client/volume/BUILD index d9d770e2c3c..e2a61771ab9 100644 --- a/vendor/github.com/libopenstorage/openstorage/api/client/volume/BUILD +++ b/vendor/github.com/libopenstorage/openstorage/api/client/volume/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "client.go", "volume.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/libopenstorage/openstorage/api:go_default_library", "//vendor/github.com/libopenstorage/openstorage/api/client:go_default_library", diff --git a/vendor/github.com/libopenstorage/openstorage/api/spec/BUILD b/vendor/github.com/libopenstorage/openstorage/api/spec/BUILD index a0686b95b40..7f62e974aeb 100644 --- a/vendor/github.com/libopenstorage/openstorage/api/spec/BUILD +++ b/vendor/github.com/libopenstorage/openstorage/api/spec/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["spec_handler.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/libopenstorage/openstorage/api:go_default_library", "//vendor/github.com/libopenstorage/openstorage/pkg/units:go_default_library", diff --git a/vendor/github.com/libopenstorage/openstorage/pkg/units/BUILD b/vendor/github.com/libopenstorage/openstorage/pkg/units/BUILD index 89e84c2dd0c..d13ef81fd2e 100644 --- a/vendor/github.com/libopenstorage/openstorage/pkg/units/BUILD +++ b/vendor/github.com/libopenstorage/openstorage/pkg/units/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["units.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/libopenstorage/openstorage/volume/BUILD b/vendor/github.com/libopenstorage/openstorage/volume/BUILD index 0927b8ea0d6..61dde57a2cd 100644 --- a/vendor/github.com/libopenstorage/openstorage/volume/BUILD +++ b/vendor/github.com/libopenstorage/openstorage/volume/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "volume_driver_registry.go", "volume_not_supported.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/libopenstorage/openstorage/api:go_default_library"], ) diff --git a/vendor/github.com/lpabon/godbc/BUILD b/vendor/github.com/lpabon/godbc/BUILD index 1546c63b234..f4d6634ea7f 100644 --- a/vendor/github.com/lpabon/godbc/BUILD +++ b/vendor/github.com/lpabon/godbc/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["godbc.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/magiconair/properties/BUILD b/vendor/github.com/magiconair/properties/BUILD index ce14cf2aef3..770888384ad 100644 --- a/vendor/github.com/magiconair/properties/BUILD +++ b/vendor/github.com/magiconair/properties/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "properties.go", "rangecheck.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/mailru/easyjson/buffer/BUILD b/vendor/github.com/mailru/easyjson/buffer/BUILD index 317a7ee4a48..969576b710f 100644 --- a/vendor/github.com/mailru/easyjson/buffer/BUILD +++ b/vendor/github.com/mailru/easyjson/buffer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["pool.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/mailru/easyjson/jlexer/BUILD b/vendor/github.com/mailru/easyjson/jlexer/BUILD index 3a01b8d0ea1..c60eda48b3d 100644 --- a/vendor/github.com/mailru/easyjson/jlexer/BUILD +++ b/vendor/github.com/mailru/easyjson/jlexer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "error.go", "lexer.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/mailru/easyjson/jwriter/BUILD b/vendor/github.com/mailru/easyjson/jwriter/BUILD index 423437e64b5..b959506d46d 100644 --- a/vendor/github.com/mailru/easyjson/jwriter/BUILD +++ b/vendor/github.com/mailru/easyjson/jwriter/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["writer.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/mailru/easyjson/buffer:go_default_library"], ) diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/BUILD b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/BUILD index bb9d4733e26..fe3e4393084 100644 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/BUILD +++ b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "encode.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], ) diff --git a/vendor/github.com/miekg/coredns/middleware/etcd/msg/BUILD b/vendor/github.com/miekg/coredns/middleware/etcd/msg/BUILD index 56fef5183e7..52c93fb1776 100644 --- a/vendor/github.com/miekg/coredns/middleware/etcd/msg/BUILD +++ b/vendor/github.com/miekg/coredns/middleware/etcd/msg/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "path.go", "service.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/miekg/dns:go_default_library"], ) diff --git a/vendor/github.com/miekg/dns/BUILD b/vendor/github.com/miekg/dns/BUILD index be2868fc250..83772c5b1a8 100644 --- a/vendor/github.com/miekg/dns/BUILD +++ b/vendor/github.com/miekg/dns/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -40,13 +38,20 @@ go_library( "tsig.go", "types.go", "udp.go", - "udp_linux.go", + "udp_other.go", "update.go", "xfr.go", "zmsg.go", "ztypes.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "udp_linux.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "udp_windows.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/mistifyio/go-zfs/BUILD b/vendor/github.com/mistifyio/go-zfs/BUILD index 3bfb359a97b..4ab092146c7 100644 --- a/vendor/github.com/mistifyio/go-zfs/BUILD +++ b/vendor/github.com/mistifyio/go-zfs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "zfs.go", "zpool.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/pborman/uuid:go_default_library"], ) diff --git a/vendor/github.com/mitchellh/go-wordwrap/BUILD b/vendor/github.com/mitchellh/go-wordwrap/BUILD index 9080f46883d..27999f8ee05 100644 --- a/vendor/github.com/mitchellh/go-wordwrap/BUILD +++ b/vendor/github.com/mitchellh/go-wordwrap/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["wordwrap.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/mitchellh/mapstructure/BUILD b/vendor/github.com/mitchellh/mapstructure/BUILD index 2ff6aed6813..c31b0916135 100644 --- a/vendor/github.com/mitchellh/mapstructure/BUILD +++ b/vendor/github.com/mitchellh/mapstructure/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "error.go", "mapstructure.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/mreiferson/go-httpclient/BUILD b/vendor/github.com/mreiferson/go-httpclient/BUILD index c1f2f8bb7cb..0da23fa56d5 100644 --- a/vendor/github.com/mreiferson/go-httpclient/BUILD +++ b/vendor/github.com/mreiferson/go-httpclient/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["httpclient.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/mvdan/xurls/BUILD b/vendor/github.com/mvdan/xurls/BUILD index 34a98cfe4fb..e148b939fbc 100644 --- a/vendor/github.com/mvdan/xurls/BUILD +++ b/vendor/github.com/mvdan/xurls/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "tlds_pseudo.go", "xurls.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/mxk/go-flowrate/flowrate/BUILD b/vendor/github.com/mxk/go-flowrate/flowrate/BUILD index 36a64dcd452..989bc7b29d3 100644 --- a/vendor/github.com/mxk/go-flowrate/flowrate/BUILD +++ b/vendor/github.com/mxk/go-flowrate/flowrate/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "io.go", "util.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/onsi/ginkgo/BUILD b/vendor/github.com/onsi/ginkgo/BUILD index 00d10068723..795d826f09f 100644 --- a/vendor/github.com/onsi/ginkgo/BUILD +++ b/vendor/github.com/onsi/ginkgo/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["ginkgo_dsl.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/onsi/ginkgo/config:go_default_library", "//vendor/github.com/onsi/ginkgo/internal/codelocation:go_default_library", diff --git a/vendor/github.com/onsi/ginkgo/config/BUILD b/vendor/github.com/onsi/ginkgo/config/BUILD index f811fb8f199..329b92f689b 100644 --- a/vendor/github.com/onsi/ginkgo/config/BUILD +++ b/vendor/github.com/onsi/ginkgo/config/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["config.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/BUILD b/vendor/github.com/onsi/ginkgo/ginkgo/BUILD index 9bcacc7b111..d8ad62e7ee1 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/BUILD +++ b/vendor/github.com/onsi/ginkgo/ginkgo/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,7 +9,6 @@ load( go_binary( name = "ginkgo", library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -32,7 +29,6 @@ go_library( "version_command.go", "watch_command.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/onsi/ginkgo/config:go_default_library", "//vendor/github.com/onsi/ginkgo/ginkgo/convert:go_default_library", diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/convert/BUILD b/vendor/github.com/onsi/ginkgo/ginkgo/convert/BUILD index ffa59aba3ce..9a142c74ebc 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/convert/BUILD +++ b/vendor/github.com/onsi/ginkgo/ginkgo/convert/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "testfile_rewriter.go", "testing_t_rewriter.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/interrupthandler/BUILD b/vendor/github.com/onsi/ginkgo/ginkgo/interrupthandler/BUILD index 2c0cecf621c..55766a1fc17 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/interrupthandler/BUILD +++ b/vendor/github.com/onsi/ginkgo/ginkgo/interrupthandler/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,9 +9,18 @@ go_library( name = "go_default_library", srcs = [ "interrupt_handler.go", - "sigquit_swallower_unix.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "sigquit_swallower_unix.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "sigquit_swallower_unix.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "sigquit_swallower_windows.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/nodot/BUILD b/vendor/github.com/onsi/ginkgo/ginkgo/nodot/BUILD index e640e729a9b..8512ec0737c 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/nodot/BUILD +++ b/vendor/github.com/onsi/ginkgo/ginkgo/nodot/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["nodot.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/BUILD b/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/BUILD index 59b922f563b..a0ffc978556 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/BUILD +++ b/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "run_result.go", "test_runner.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/onsi/ginkgo/config:go_default_library", "//vendor/github.com/onsi/ginkgo/ginkgo/testsuite:go_default_library", diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/BUILD b/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/BUILD index 960ca64ddb9..499d59650e9 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/BUILD +++ b/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,9 +9,9 @@ go_library( name = "go_default_library", srcs = [ "test_suite.go", + "vendor_check_go15.go", "vendor_check_go16.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/watch/BUILD b/vendor/github.com/onsi/ginkgo/ginkgo/watch/BUILD index de9dabc33a3..efa03fd21b5 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/watch/BUILD +++ b/vendor/github.com/onsi/ginkgo/ginkgo/watch/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "package_hashes.go", "suite.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/onsi/ginkgo/ginkgo/testsuite:go_default_library"], ) diff --git a/vendor/github.com/onsi/ginkgo/internal/codelocation/BUILD b/vendor/github.com/onsi/ginkgo/internal/codelocation/BUILD index a80abdaab33..dda00b6b6f5 100644 --- a/vendor/github.com/onsi/ginkgo/internal/codelocation/BUILD +++ b/vendor/github.com/onsi/ginkgo/internal/codelocation/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["code_location.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/onsi/ginkgo/types:go_default_library"], ) diff --git a/vendor/github.com/onsi/ginkgo/internal/containernode/BUILD b/vendor/github.com/onsi/ginkgo/internal/containernode/BUILD index 1b1b2fa0fbe..dfb74ab7b16 100644 --- a/vendor/github.com/onsi/ginkgo/internal/containernode/BUILD +++ b/vendor/github.com/onsi/ginkgo/internal/containernode/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["container_node.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/onsi/ginkgo/internal/leafnodes:go_default_library", "//vendor/github.com/onsi/ginkgo/types:go_default_library", diff --git a/vendor/github.com/onsi/ginkgo/internal/failer/BUILD b/vendor/github.com/onsi/ginkgo/internal/failer/BUILD index 0f9562005b6..2f09a895fb7 100644 --- a/vendor/github.com/onsi/ginkgo/internal/failer/BUILD +++ b/vendor/github.com/onsi/ginkgo/internal/failer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["failer.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/onsi/ginkgo/types:go_default_library"], ) diff --git a/vendor/github.com/onsi/ginkgo/internal/leafnodes/BUILD b/vendor/github.com/onsi/ginkgo/internal/leafnodes/BUILD index 0418a2d9563..4a4d7a127e8 100644 --- a/vendor/github.com/onsi/ginkgo/internal/leafnodes/BUILD +++ b/vendor/github.com/onsi/ginkgo/internal/leafnodes/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -20,7 +18,6 @@ go_library( "synchronized_after_suite_node.go", "synchronized_before_suite_node.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/onsi/ginkgo/internal/codelocation:go_default_library", "//vendor/github.com/onsi/ginkgo/internal/failer:go_default_library", diff --git a/vendor/github.com/onsi/ginkgo/internal/remote/BUILD b/vendor/github.com/onsi/ginkgo/internal/remote/BUILD index c6cf8b9b7a7..f7c21b1cfe0 100644 --- a/vendor/github.com/onsi/ginkgo/internal/remote/BUILD +++ b/vendor/github.com/onsi/ginkgo/internal/remote/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,11 +11,20 @@ go_library( "aggregator.go", "forwarding_reporter.go", "output_interceptor.go", - "output_interceptor_unix.go", "server.go", "syscall_dup_unix.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "output_interceptor_unix.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "output_interceptor_unix.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "output_interceptor_win.go", + ], + "//conditions:default": [], + }), deps = [ "//vendor/github.com/onsi/ginkgo/config:go_default_library", "//vendor/github.com/onsi/ginkgo/internal/spec_iterator:go_default_library", diff --git a/vendor/github.com/onsi/ginkgo/internal/spec/BUILD b/vendor/github.com/onsi/ginkgo/internal/spec/BUILD index 9906e84a560..f25584a56ee 100644 --- a/vendor/github.com/onsi/ginkgo/internal/spec/BUILD +++ b/vendor/github.com/onsi/ginkgo/internal/spec/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "spec.go", "specs.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/onsi/ginkgo/internal/containernode:go_default_library", "//vendor/github.com/onsi/ginkgo/internal/leafnodes:go_default_library", diff --git a/vendor/github.com/onsi/ginkgo/internal/spec_iterator/BUILD b/vendor/github.com/onsi/ginkgo/internal/spec_iterator/BUILD index 73ff76fec85..64b8bdcbb59 100644 --- a/vendor/github.com/onsi/ginkgo/internal/spec_iterator/BUILD +++ b/vendor/github.com/onsi/ginkgo/internal/spec_iterator/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "sharded_parallel_spec_iterator.go", "spec_iterator.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/onsi/ginkgo/internal/spec:go_default_library"], ) diff --git a/vendor/github.com/onsi/ginkgo/internal/specrunner/BUILD b/vendor/github.com/onsi/ginkgo/internal/specrunner/BUILD index cd37422bd76..056af460c5d 100644 --- a/vendor/github.com/onsi/ginkgo/internal/specrunner/BUILD +++ b/vendor/github.com/onsi/ginkgo/internal/specrunner/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "random_id.go", "spec_runner.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/onsi/ginkgo/config:go_default_library", "//vendor/github.com/onsi/ginkgo/internal/leafnodes:go_default_library", diff --git a/vendor/github.com/onsi/ginkgo/internal/suite/BUILD b/vendor/github.com/onsi/ginkgo/internal/suite/BUILD index 101964bbf2b..b98a7de9b1f 100644 --- a/vendor/github.com/onsi/ginkgo/internal/suite/BUILD +++ b/vendor/github.com/onsi/ginkgo/internal/suite/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["suite.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/onsi/ginkgo/config:go_default_library", "//vendor/github.com/onsi/ginkgo/internal/containernode:go_default_library", diff --git a/vendor/github.com/onsi/ginkgo/internal/testingtproxy/BUILD b/vendor/github.com/onsi/ginkgo/internal/testingtproxy/BUILD index 69e3aaace2a..f73f6225738 100644 --- a/vendor/github.com/onsi/ginkgo/internal/testingtproxy/BUILD +++ b/vendor/github.com/onsi/ginkgo/internal/testingtproxy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["testing_t_proxy.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/onsi/ginkgo/internal/writer/BUILD b/vendor/github.com/onsi/ginkgo/internal/writer/BUILD index fee3f67a4d0..b4e91c1b0cb 100644 --- a/vendor/github.com/onsi/ginkgo/internal/writer/BUILD +++ b/vendor/github.com/onsi/ginkgo/internal/writer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "fake_writer.go", "writer.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/onsi/ginkgo/reporters/BUILD b/vendor/github.com/onsi/ginkgo/reporters/BUILD index 26d120b8684..f67e0f9c918 100644 --- a/vendor/github.com/onsi/ginkgo/reporters/BUILD +++ b/vendor/github.com/onsi/ginkgo/reporters/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "reporter.go", "teamcity_reporter.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/onsi/ginkgo/config:go_default_library", "//vendor/github.com/onsi/ginkgo/reporters/stenographer:go_default_library", diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/BUILD b/vendor/github.com/onsi/ginkgo/reporters/stenographer/BUILD index 03a0da5fbfa..e3efb1866f4 100644 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/BUILD +++ b/vendor/github.com/onsi/ginkgo/reporters/stenographer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "fake_stenographer.go", "stenographer.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable:go_default_library", "//vendor/github.com/onsi/ginkgo/types:go_default_library", diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/BUILD b/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/BUILD index 7d7fe0d12e9..b1f2efe065e 100644 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/BUILD +++ b/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,8 +10,18 @@ go_library( srcs = [ "colorable_others.go", "noncolorable.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "colorable_windows.go", + ], + "//conditions:default": [], + }), + deps = select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "//vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/BUILD b/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/BUILD index 637bb54aaa8..33af7a8a18c 100644 --- a/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/BUILD +++ b/vendor/github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,9 +9,18 @@ go_library( name = "go_default_library", srcs = [ "doc.go", - "isatty_linux.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "isatty_bsd.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "isatty_linux.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "isatty_windows.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/onsi/ginkgo/types/BUILD b/vendor/github.com/onsi/ginkgo/types/BUILD index bafcdf6c224..227986214ba 100644 --- a/vendor/github.com/onsi/ginkgo/types/BUILD +++ b/vendor/github.com/onsi/ginkgo/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "synchronization.go", "types.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/onsi/gomega/BUILD b/vendor/github.com/onsi/gomega/BUILD index def22b6b1d4..3c79114b46c 100644 --- a/vendor/github.com/onsi/gomega/BUILD +++ b/vendor/github.com/onsi/gomega/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "gomega_dsl.go", "matchers.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/onsi/gomega/internal/assertion:go_default_library", "//vendor/github.com/onsi/gomega/internal/asyncassertion:go_default_library", diff --git a/vendor/github.com/onsi/gomega/format/BUILD b/vendor/github.com/onsi/gomega/format/BUILD index 69bb917a887..fee97c09115 100644 --- a/vendor/github.com/onsi/gomega/format/BUILD +++ b/vendor/github.com/onsi/gomega/format/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["format.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/onsi/gomega/gstruct/BUILD b/vendor/github.com/onsi/gomega/gstruct/BUILD index 6126ce5dc13..f465405f1f7 100644 --- a/vendor/github.com/onsi/gomega/gstruct/BUILD +++ b/vendor/github.com/onsi/gomega/gstruct/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "pointer.go", "types.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/onsi/gomega/format:go_default_library", "//vendor/github.com/onsi/gomega/gstruct/errors:go_default_library", diff --git a/vendor/github.com/onsi/gomega/gstruct/errors/BUILD b/vendor/github.com/onsi/gomega/gstruct/errors/BUILD index 25dfeac89eb..1afde9131a6 100644 --- a/vendor/github.com/onsi/gomega/gstruct/errors/BUILD +++ b/vendor/github.com/onsi/gomega/gstruct/errors/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["nested_types.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/onsi/gomega/types:go_default_library"], ) diff --git a/vendor/github.com/onsi/gomega/internal/assertion/BUILD b/vendor/github.com/onsi/gomega/internal/assertion/BUILD index 555f3f7e42b..65f01061b95 100644 --- a/vendor/github.com/onsi/gomega/internal/assertion/BUILD +++ b/vendor/github.com/onsi/gomega/internal/assertion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["assertion.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/onsi/gomega/types:go_default_library"], ) diff --git a/vendor/github.com/onsi/gomega/internal/asyncassertion/BUILD b/vendor/github.com/onsi/gomega/internal/asyncassertion/BUILD index 122b9076100..c354f84d387 100644 --- a/vendor/github.com/onsi/gomega/internal/asyncassertion/BUILD +++ b/vendor/github.com/onsi/gomega/internal/asyncassertion/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["async_assertion.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/onsi/gomega/internal/oraclematcher:go_default_library", "//vendor/github.com/onsi/gomega/types:go_default_library", diff --git a/vendor/github.com/onsi/gomega/internal/oraclematcher/BUILD b/vendor/github.com/onsi/gomega/internal/oraclematcher/BUILD index 5bc5465eac1..f3076761b3a 100644 --- a/vendor/github.com/onsi/gomega/internal/oraclematcher/BUILD +++ b/vendor/github.com/onsi/gomega/internal/oraclematcher/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["oracle_matcher.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/onsi/gomega/types:go_default_library"], ) diff --git a/vendor/github.com/onsi/gomega/internal/testingtsupport/BUILD b/vendor/github.com/onsi/gomega/internal/testingtsupport/BUILD index c7d2f5f47e9..b5a24364e91 100644 --- a/vendor/github.com/onsi/gomega/internal/testingtsupport/BUILD +++ b/vendor/github.com/onsi/gomega/internal/testingtsupport/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["testing_t_support.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/onsi/gomega/types:go_default_library"], ) diff --git a/vendor/github.com/onsi/gomega/matchers/BUILD b/vendor/github.com/onsi/gomega/matchers/BUILD index 8e427389022..0023f9026a2 100644 --- a/vendor/github.com/onsi/gomega/matchers/BUILD +++ b/vendor/github.com/onsi/gomega/matchers/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -49,7 +47,6 @@ go_library( "type_support.go", "with_transform.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/onsi/gomega/format:go_default_library", "//vendor/github.com/onsi/gomega/internal/oraclematcher:go_default_library", diff --git a/vendor/github.com/onsi/gomega/matchers/support/goraph/bipartitegraph/BUILD b/vendor/github.com/onsi/gomega/matchers/support/goraph/bipartitegraph/BUILD index 324ae5d2f9a..812b7f3b933 100644 --- a/vendor/github.com/onsi/gomega/matchers/support/goraph/bipartitegraph/BUILD +++ b/vendor/github.com/onsi/gomega/matchers/support/goraph/bipartitegraph/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "bipartitegraph.go", "bipartitegraphmatching.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/onsi/gomega/matchers/support/goraph/edge:go_default_library", "//vendor/github.com/onsi/gomega/matchers/support/goraph/node:go_default_library", diff --git a/vendor/github.com/onsi/gomega/matchers/support/goraph/edge/BUILD b/vendor/github.com/onsi/gomega/matchers/support/goraph/edge/BUILD index dd371a0e0d4..b1e3e1194c1 100644 --- a/vendor/github.com/onsi/gomega/matchers/support/goraph/edge/BUILD +++ b/vendor/github.com/onsi/gomega/matchers/support/goraph/edge/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["edge.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/onsi/gomega/matchers/support/goraph/node:go_default_library"], ) diff --git a/vendor/github.com/onsi/gomega/matchers/support/goraph/node/BUILD b/vendor/github.com/onsi/gomega/matchers/support/goraph/node/BUILD index 9a53c1b5d5e..bb074c50e35 100644 --- a/vendor/github.com/onsi/gomega/matchers/support/goraph/node/BUILD +++ b/vendor/github.com/onsi/gomega/matchers/support/goraph/node/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["node.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/onsi/gomega/matchers/support/goraph/util/BUILD b/vendor/github.com/onsi/gomega/matchers/support/goraph/util/BUILD index 5eb8bcd4466..213076f9d9f 100644 --- a/vendor/github.com/onsi/gomega/matchers/support/goraph/util/BUILD +++ b/vendor/github.com/onsi/gomega/matchers/support/goraph/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/onsi/gomega/types/BUILD b/vendor/github.com/onsi/gomega/types/BUILD index 6109f467f1a..f39b267a2f0 100644 --- a/vendor/github.com/onsi/gomega/types/BUILD +++ b/vendor/github.com/onsi/gomega/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["types.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/opencontainers/runc/libcontainer/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/BUILD index 351bed4e87e..d10e9d37b08 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,55 +8,69 @@ load( go_library( name = "go_default_library", srcs = [ - "capabilities_linux.go", "console.go", - "console_linux.go", "container.go", - "container_linux.go", - "criu_opts_unix.go", "error.go", "factory.go", - "factory_linux.go", "generic_error.go", - "init_linux.go", - "message_linux.go", - "network_linux.go", - "notify_linux.go", "process.go", - "process_linux.go", - "restored_process.go", - "rootfs_linux.go", - "setgroups_linux.go", - "setns_init_linux.go", - "standard_init_linux.go", - "state_linux.go", "stats.go", - "stats_linux.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "capabilities_linux.go", + "compat_1.5_linux.go", + "console_linux.go", + "container_linux.go", + "criu_opts_unix.go", + "factory_linux.go", + "init_linux.go", + "message_linux.go", + "network_linux.go", + "notify_linux.go", + "process_linux.go", + "restored_process.go", + "rootfs_linux.go", + "setgroups_linux.go", + "setns_init_linux.go", + "standard_init_linux.go", + "state_linux.go", + "stats_linux.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "console_windows.go", + "container_windows.go", + "criu_opts_windows.go", + "stats_windows.go", + ], + "//conditions:default": [], + }), deps = [ - "//vendor/github.com/Sirupsen/logrus:go_default_library", - "//vendor/github.com/docker/docker/pkg/mount:go_default_library", - "//vendor/github.com/docker/docker/pkg/symlink:go_default_library", - "//vendor/github.com/golang/protobuf/proto:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/apparmor:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/configs/validate:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/criurpc:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/keys:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/label:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/seccomp:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/stacktrace:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/system:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/user:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/utils:go_default_library", - "//vendor/github.com/syndtr/gocapability/capability:go_default_library", - "//vendor/github.com/vishvananda/netlink:go_default_library", - "//vendor/github.com/vishvananda/netlink/nl:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/Sirupsen/logrus:go_default_library", + "//vendor/github.com/docker/docker/pkg/mount:go_default_library", + "//vendor/github.com/docker/docker/pkg/symlink:go_default_library", + "//vendor/github.com/golang/protobuf/proto:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/apparmor:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/configs/validate:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/criurpc:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/keys:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/label:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/seccomp:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/system:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/user:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/utils:go_default_library", + "//vendor/github.com/syndtr/gocapability/capability:go_default_library", + "//vendor/github.com/vishvananda/netlink:go_default_library", + "//vendor/github.com/vishvananda/netlink/nl:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/opencontainers/runc/libcontainer/apparmor/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/apparmor/BUILD index 4b95302511b..52fcc537b06 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/apparmor/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/apparmor/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,7 @@ load( go_library( name = "go_default_library", srcs = ["apparmor_disabled.go"], - tags = ["automanaged"], + cgo = True, ) filegroup( diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/BUILD index 2d6bd7c44ca..e4ef90cb301 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,15 +8,22 @@ load( go_library( name = "go_default_library", srcs = [ - "cgroups.go", - "stats.go", - "utils.go", - ], - tags = ["automanaged"], - deps = [ - "//vendor/github.com/docker/go-units:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", - ], + "cgroups_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "cgroups.go", + "stats.go", + "utils.go", + ], + "//conditions:default": [], + }), + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/docker/go-units:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/BUILD index 04ffd13d03f..b1a434d5905 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,29 +8,36 @@ load( go_library( name = "go_default_library", srcs = [ - "apply_raw.go", - "blkio.go", - "cpu.go", - "cpuacct.go", - "cpuset.go", - "devices.go", - "freezer.go", - "hugetlb.go", - "memory.go", - "name.go", - "net_cls.go", - "net_prio.go", - "perf_event.go", - "pids.go", - "utils.go", - ], - tags = ["automanaged"], - deps = [ - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/system:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/utils:go_default_library", - ], + "fs_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "apply_raw.go", + "blkio.go", + "cpu.go", + "cpuacct.go", + "cpuset.go", + "devices.go", + "freezer.go", + "hugetlb.go", + "memory.go", + "name.go", + "net_cls.go", + "net_prio.go", + "perf_event.go", + "pids.go", + "utils.go", + ], + "//conditions:default": [], + }), + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/system:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/utils:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/BUILD index 82f543f8473..30626c6c384 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,16 +7,26 @@ load( go_library( name = "go_default_library", - srcs = ["apply_systemd.go"], - tags = ["automanaged"], + srcs = [ + "apply_nosystemd.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "apply_systemd.go", + ], + "//conditions:default": [], + }), deps = [ - "//vendor/github.com/coreos/go-systemd/dbus:go_default_library", - "//vendor/github.com/coreos/go-systemd/util:go_default_library", - "//vendor/github.com/godbus/dbus:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/coreos/go-systemd/dbus:go_default_library", + "//vendor/github.com/coreos/go-systemd/util:go_default_library", + "//vendor/github.com/godbus/dbus:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/configs/BUILD index 62f460e546e..d029dd04a82 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/configs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,20 +9,29 @@ go_library( name = "go_default_library", srcs = [ "blkio_device.go", - "cgroup_unix.go", + "cgroup_unsupported.go", "config.go", - "config_unix.go", "device.go", - "device_defaults.go", "hugepage_limit.go", "interface_priority_map.go", "mount.go", "namespaces.go", - "namespaces_syscall.go", - "namespaces_unix.go", + "namespaces_syscall_unsupported.go", + "namespaces_unsupported.go", "network.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "cgroup_unix.go", + "config_unix.go", + "device_defaults.go", + "namespaces_syscall.go", + "namespaces_unix.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "cgroup_windows.go", + ], + "//conditions:default": [], + }), deps = ["//vendor/github.com/Sirupsen/logrus:go_default_library"], ) diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/BUILD index 0724ea1d067..b9de525b360 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["validator.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/selinux:go_default_library", diff --git a/vendor/github.com/opencontainers/runc/libcontainer/criurpc/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/criurpc/BUILD index 93ad771b2b4..6c71e43a5be 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/criurpc/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/criurpc/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["criurpc.pb.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], ) @@ -26,3 +23,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +filegroup( + name = "go_default_library_protos", + srcs = ["criurpc.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/opencontainers/runc/libcontainer/keys/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/keys/BUILD index 3e353b0fb7a..a452d1cb876 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/keys/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/keys/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,8 +7,12 @@ load( go_library( name = "go_default_library", - srcs = ["keyctl.go"], - tags = ["automanaged"], + srcs = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "keyctl.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/opencontainers/runc/libcontainer/label/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/label/BUILD index b0a9ce57894..d133bde837a 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/label/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/label/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["label.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/opencontainers/runc/libcontainer/seccomp/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/seccomp/BUILD index 2193b070d1b..c8c6e28dda3 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/seccomp/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/seccomp/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "config.go", "seccomp_unsupported.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library"], ) diff --git a/vendor/github.com/opencontainers/runc/libcontainer/selinux/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/selinux/BUILD index ace4d5c9c46..2161c522d19 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/selinux/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/selinux/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,9 +7,18 @@ load( go_library( name = "go_default_library", - srcs = ["selinux.go"], - tags = ["automanaged"], - deps = ["//vendor/github.com/opencontainers/runc/libcontainer/system:go_default_library"], + srcs = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "selinux.go", + ], + "//conditions:default": [], + }), + deps = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/github.com/opencontainers/runc/libcontainer/system:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/opencontainers/runc/libcontainer/stacktrace/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/stacktrace/BUILD index 28baac231c6..f288a9fc8d7 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/stacktrace/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/stacktrace/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "frame.go", "stacktrace.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/opencontainers/runc/libcontainer/system/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/system/BUILD index acd6f51ecf1..5a114263ad0 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/system/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/system/BUILD @@ -1,36 +1,29 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", - "cgo_genrule", "go_library", ) -cgo_genrule( - name = "cgo_codegen", - srcs = ["sysconfig.go"], - clinkopts = [ - "-lz", - "-lm", - "-lpthread", - "-ldl", - ], - tags = ["automanaged"], -) - go_library( name = "go_default_library", srcs = [ - "linux.go", "proc.go", - "setns_linux.go", - "syscall_linux_64.go", - "xattrs_linux.go", - ], - library = ":cgo_codegen", - tags = ["automanaged"], + "unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "linux.go", + "setns_linux.go", + "syscall_linux_64.go", + "sysconfig.go", + "xattrs_linux.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "sysconfig_notcgo.go", + ], + "//conditions:default": [], + }), + cgo = True, ) filegroup( diff --git a/vendor/github.com/opencontainers/runc/libcontainer/user/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/user/BUILD index 33662738a47..7f8420bcdb4 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/user/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/user/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,10 +9,17 @@ go_library( name = "go_default_library", srcs = [ "lookup.go", - "lookup_unix.go", + "lookup_unsupported.go", "user.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "lookup_unix.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "lookup_unix.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/opencontainers/runc/libcontainer/utils/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/utils/BUILD index c7ea210d834..f8b2676ad29 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/utils/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/utils/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "utils.go", "utils_unix.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/pborman/uuid/BUILD b/vendor/github.com/pborman/uuid/BUILD index d2f1ef05cf9..4a64c22fb41 100644 --- a/vendor/github.com/pborman/uuid/BUILD +++ b/vendor/github.com/pborman/uuid/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -21,7 +19,6 @@ go_library( "version1.go", "version4.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/pelletier/go-buffruneio/BUILD b/vendor/github.com/pelletier/go-buffruneio/BUILD index b2206b15f7e..310b1022f08 100644 --- a/vendor/github.com/pelletier/go-buffruneio/BUILD +++ b/vendor/github.com/pelletier/go-buffruneio/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["buffruneio.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/pelletier/go-toml/BUILD b/vendor/github.com/pelletier/go-toml/BUILD index aa25cb96ccb..c87e0c658f3 100644 --- a/vendor/github.com/pelletier/go-toml/BUILD +++ b/vendor/github.com/pelletier/go-toml/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -23,7 +21,6 @@ go_library( "toml.go", "tomltree_conversions.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/pelletier/go-buffruneio:go_default_library"], ) diff --git a/vendor/github.com/peterbourgon/diskv/LICENSE b/vendor/github.com/peterbourgon/diskv/LICENSE deleted file mode 100644 index 41ce7f16e1d..00000000000 --- a/vendor/github.com/peterbourgon/diskv/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011-2012 Peter Bourgon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/github.com/peterbourgon/diskv/README.md b/vendor/github.com/peterbourgon/diskv/README.md deleted file mode 100644 index 3474739edc7..00000000000 --- a/vendor/github.com/peterbourgon/diskv/README.md +++ /dev/null @@ -1,141 +0,0 @@ -# What is diskv? - -Diskv (disk-vee) is a simple, persistent key-value store written in the Go -language. It starts with an incredibly simple API for storing arbitrary data on -a filesystem by key, and builds several layers of performance-enhancing -abstraction on top. The end result is a conceptually simple, but highly -performant, disk-backed storage system. - -[![Build Status][1]][2] - -[1]: https://drone.io/github.com/peterbourgon/diskv/status.png -[2]: https://drone.io/github.com/peterbourgon/diskv/latest - - -# Installing - -Install [Go 1][3], either [from source][4] or [with a prepackaged binary][5]. -Then, - -```bash -$ go get github.com/peterbourgon/diskv -``` - -[3]: http://golang.org -[4]: http://golang.org/doc/install/source -[5]: http://golang.org/doc/install - - -# Usage - -```go -package main - -import ( - "fmt" - "github.com/peterbourgon/diskv" -) - -func main() { - // Simplest transform function: put all the data files into the base dir. - flatTransform := func(s string) []string { return []string{} } - - // Initialize a new diskv store, rooted at "my-data-dir", with a 1MB cache. - d := diskv.New(diskv.Options{ - BasePath: "my-data-dir", - Transform: flatTransform, - CacheSizeMax: 1024 * 1024, - }) - - // Write three bytes to the key "alpha". - key := "alpha" - d.Write(key, []byte{'1', '2', '3'}) - - // Read the value back out of the store. - value, _ := d.Read(key) - fmt.Printf("%v\n", value) - - // Erase the key+value from the store (and the disk). - d.Erase(key) -} -``` - -More complex examples can be found in the "examples" subdirectory. - - -# Theory - -## Basic idea - -At its core, diskv is a map of a key (`string`) to arbitrary data (`[]byte`). -The data is written to a single file on disk, with the same name as the key. -The key determines where that file will be stored, via a user-provided -`TransformFunc`, which takes a key and returns a slice (`[]string`) -corresponding to a path list where the key file will be stored. The simplest -TransformFunc, - -```go -func SimpleTransform (key string) []string { - return []string{} -} -``` - -will place all keys in the same, base directory. The design is inspired by -[Redis diskstore][6]; a TransformFunc which emulates the default diskstore -behavior is available in the content-addressable-storage example. - -[6]: http://groups.google.com/group/redis-db/browse_thread/thread/d444bc786689bde9?pli=1 - -**Note** that your TransformFunc should ensure that one valid key doesn't -transform to a subset of another valid key. That is, it shouldn't be possible -to construct valid keys that resolve to directory names. As a concrete example, -if your TransformFunc splits on every 3 characters, then - -```go -d.Write("abcabc", val) // OK: written to /abc/abc/abcabc -d.Write("abc", val) // Error: attempted write to /abc/abc, but it's a directory -``` - -This will be addressed in an upcoming version of diskv. - -Probably the most important design principle behind diskv is that your data is -always flatly available on the disk. diskv will never do anything that would -prevent you from accessing, copying, backing up, or otherwise interacting with -your data via common UNIX commandline tools. - -## Adding a cache - -An in-memory caching layer is provided by combining the BasicStore -functionality with a simple map structure, and keeping it up-to-date as -appropriate. Since the map structure in Go is not threadsafe, it's combined -with a RWMutex to provide safe concurrent access. - -## Adding order - -diskv is a key-value store and therefore inherently unordered. An ordering -system can be injected into the store by passing something which satisfies the -diskv.Index interface. (A default implementation, using Google's -[btree][7] package, is provided.) Basically, diskv keeps an ordered (by a -user-provided Less function) index of the keys, which can be queried. - -[7]: https://github.com/google/btree - -## Adding compression - -Something which implements the diskv.Compression interface may be passed -during store creation, so that all Writes and Reads are filtered through -a compression/decompression pipeline. Several default implementations, -using stdlib compression algorithms, are provided. Note that data is cached -compressed; the cost of decompression is borne with each Read. - -## Streaming - -diskv also now provides ReadStream and WriteStream methods, to allow very large -data to be handled efficiently. - - -# Future plans - - * Needs plenty of robust testing: huge datasets, etc... - * More thorough benchmarking - * Your suggestions for use-cases I haven't thought of diff --git a/vendor/github.com/peterbourgon/diskv/compression.go b/vendor/github.com/peterbourgon/diskv/compression.go deleted file mode 100644 index 5192b027330..00000000000 --- a/vendor/github.com/peterbourgon/diskv/compression.go +++ /dev/null @@ -1,64 +0,0 @@ -package diskv - -import ( - "compress/flate" - "compress/gzip" - "compress/zlib" - "io" -) - -// Compression is an interface that Diskv uses to implement compression of -// data. Writer takes a destination io.Writer and returns a WriteCloser that -// compresses all data written through it. Reader takes a source io.Reader and -// returns a ReadCloser that decompresses all data read through it. You may -// define these methods on your own type, or use one of the NewCompression -// helpers. -type Compression interface { - Writer(dst io.Writer) (io.WriteCloser, error) - Reader(src io.Reader) (io.ReadCloser, error) -} - -// NewGzipCompression returns a Gzip-based Compression. -func NewGzipCompression() Compression { - return NewGzipCompressionLevel(flate.DefaultCompression) -} - -// NewGzipCompressionLevel returns a Gzip-based Compression with the given level. -func NewGzipCompressionLevel(level int) Compression { - return &genericCompression{ - wf: func(w io.Writer) (io.WriteCloser, error) { return gzip.NewWriterLevel(w, level) }, - rf: func(r io.Reader) (io.ReadCloser, error) { return gzip.NewReader(r) }, - } -} - -// NewZlibCompression returns a Zlib-based Compression. -func NewZlibCompression() Compression { - return NewZlibCompressionLevel(flate.DefaultCompression) -} - -// NewZlibCompressionLevel returns a Zlib-based Compression with the given level. -func NewZlibCompressionLevel(level int) Compression { - return NewZlibCompressionLevelDict(level, nil) -} - -// NewZlibCompressionLevelDict returns a Zlib-based Compression with the given -// level, based on the given dictionary. -func NewZlibCompressionLevelDict(level int, dict []byte) Compression { - return &genericCompression{ - func(w io.Writer) (io.WriteCloser, error) { return zlib.NewWriterLevelDict(w, level, dict) }, - func(r io.Reader) (io.ReadCloser, error) { return zlib.NewReaderDict(r, dict) }, - } -} - -type genericCompression struct { - wf func(w io.Writer) (io.WriteCloser, error) - rf func(r io.Reader) (io.ReadCloser, error) -} - -func (g *genericCompression) Writer(dst io.Writer) (io.WriteCloser, error) { - return g.wf(dst) -} - -func (g *genericCompression) Reader(src io.Reader) (io.ReadCloser, error) { - return g.rf(src) -} diff --git a/vendor/github.com/peterbourgon/diskv/diskv.go b/vendor/github.com/peterbourgon/diskv/diskv.go deleted file mode 100644 index ea05842cbd1..00000000000 --- a/vendor/github.com/peterbourgon/diskv/diskv.go +++ /dev/null @@ -1,578 +0,0 @@ -// Diskv (disk-vee) is a simple, persistent, key-value store. -// It stores all data flatly on the filesystem. - -package diskv - -import ( - "bytes" - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "sync" - "syscall" -) - -const ( - defaultBasePath = "diskv" - defaultFilePerm os.FileMode = 0666 - defaultPathPerm os.FileMode = 0777 -) - -var ( - defaultTransform = func(s string) []string { return []string{} } - errCanceled = errors.New("canceled") - errEmptyKey = errors.New("empty key") - errBadKey = errors.New("bad key") - errImportDirectory = errors.New("can't import a directory") -) - -// TransformFunction transforms a key into a slice of strings, with each -// element in the slice representing a directory in the file path where the -// key's entry will eventually be stored. -// -// For example, if TransformFunc transforms "abcdef" to ["ab", "cde", "f"], -// the final location of the data file will be /ab/cde/f/abcdef -type TransformFunction func(s string) []string - -// Options define a set of properties that dictate Diskv behavior. -// All values are optional. -type Options struct { - BasePath string - Transform TransformFunction - CacheSizeMax uint64 // bytes - PathPerm os.FileMode - FilePerm os.FileMode - - Index Index - IndexLess LessFunction - - Compression Compression -} - -// Diskv implements the Diskv interface. You shouldn't construct Diskv -// structures directly; instead, use the New constructor. -type Diskv struct { - Options - mu sync.RWMutex - cache map[string][]byte - cacheSize uint64 -} - -// New returns an initialized Diskv structure, ready to use. -// If the path identified by baseDir already contains data, -// it will be accessible, but not yet cached. -func New(o Options) *Diskv { - if o.BasePath == "" { - o.BasePath = defaultBasePath - } - if o.Transform == nil { - o.Transform = defaultTransform - } - if o.PathPerm == 0 { - o.PathPerm = defaultPathPerm - } - if o.FilePerm == 0 { - o.FilePerm = defaultFilePerm - } - - d := &Diskv{ - Options: o, - cache: map[string][]byte{}, - cacheSize: 0, - } - - if d.Index != nil && d.IndexLess != nil { - d.Index.Initialize(d.IndexLess, d.Keys(nil)) - } - - return d -} - -// Write synchronously writes the key-value pair to disk, making it immediately -// available for reads. Write relies on the filesystem to perform an eventual -// sync to physical media. If you need stronger guarantees, see WriteStream. -func (d *Diskv) Write(key string, val []byte) error { - return d.WriteStream(key, bytes.NewBuffer(val), false) -} - -// WriteStream writes the data represented by the io.Reader to the disk, under -// the provided key. If sync is true, WriteStream performs an explicit sync on -// the file as soon as it's written. -// -// bytes.Buffer provides io.Reader semantics for basic data types. -func (d *Diskv) WriteStream(key string, r io.Reader, sync bool) error { - if len(key) <= 0 { - return errEmptyKey - } - - d.mu.Lock() - defer d.mu.Unlock() - - return d.writeStreamWithLock(key, r, sync) -} - -// writeStream does no input validation checking. -// TODO: use atomic FS ops. -func (d *Diskv) writeStreamWithLock(key string, r io.Reader, sync bool) error { - if err := d.ensurePathWithLock(key); err != nil { - return fmt.Errorf("ensure path: %s", err) - } - - mode := os.O_WRONLY | os.O_CREATE | os.O_TRUNC // overwrite if exists - f, err := os.OpenFile(d.completeFilename(key), mode, d.FilePerm) - if err != nil { - return fmt.Errorf("open file: %s", err) - } - - wc := io.WriteCloser(&nopWriteCloser{f}) - if d.Compression != nil { - wc, err = d.Compression.Writer(f) - if err != nil { - f.Close() // error deliberately ignored - return fmt.Errorf("compression writer: %s", err) - } - } - - if _, err := io.Copy(wc, r); err != nil { - f.Close() // error deliberately ignored - return fmt.Errorf("i/o copy: %s", err) - } - - if err := wc.Close(); err != nil { - f.Close() // error deliberately ignored - return fmt.Errorf("compression close: %s", err) - } - - if sync { - if err := f.Sync(); err != nil { - f.Close() // error deliberately ignored - return fmt.Errorf("file sync: %s", err) - } - } - - if err := f.Close(); err != nil { - return fmt.Errorf("file close: %s", err) - } - - if d.Index != nil { - d.Index.Insert(key) - } - - d.bustCacheWithLock(key) // cache only on read - - return nil -} - -// Import imports the source file into diskv under the destination key. If the -// destination key already exists, it's overwritten. If move is true, the -// source file is removed after a successful import. -func (d *Diskv) Import(srcFilename, dstKey string, move bool) (err error) { - if dstKey == "" { - return errEmptyKey - } - - if fi, err := os.Stat(srcFilename); err != nil { - return err - } else if fi.IsDir() { - return errImportDirectory - } - - d.mu.Lock() - defer d.mu.Unlock() - - if err := d.ensurePathWithLock(dstKey); err != nil { - return fmt.Errorf("ensure path: %s", err) - } - - if move { - if err := syscall.Rename(srcFilename, d.completeFilename(dstKey)); err == nil { - d.bustCacheWithLock(dstKey) - return nil - } else if err != syscall.EXDEV { - // If it failed due to being on a different device, fall back to copying - return err - } - } - - f, err := os.Open(srcFilename) - if err != nil { - return err - } - defer f.Close() - err = d.writeStreamWithLock(dstKey, f, false) - if err == nil && move { - err = os.Remove(srcFilename) - } - return err -} - -// Read reads the key and returns the value. -// If the key is available in the cache, Read won't touch the disk. -// If the key is not in the cache, Read will have the side-effect of -// lazily caching the value. -func (d *Diskv) Read(key string) ([]byte, error) { - rc, err := d.ReadStream(key, false) - if err != nil { - return []byte{}, err - } - defer rc.Close() - return ioutil.ReadAll(rc) -} - -// ReadStream reads the key and returns the value (data) as an io.ReadCloser. -// If the value is cached from a previous read, and direct is false, -// ReadStream will use the cached value. Otherwise, it will return a handle to -// the file on disk, and cache the data on read. -// -// If direct is true, ReadStream will lazily delete any cached value for the -// key, and return a direct handle to the file on disk. -// -// If compression is enabled, ReadStream taps into the io.Reader stream prior -// to decompression, and caches the compressed data. -func (d *Diskv) ReadStream(key string, direct bool) (io.ReadCloser, error) { - d.mu.RLock() - defer d.mu.RUnlock() - - if val, ok := d.cache[key]; ok { - if !direct { - buf := bytes.NewBuffer(val) - if d.Compression != nil { - return d.Compression.Reader(buf) - } - return ioutil.NopCloser(buf), nil - } - - go func() { - d.mu.Lock() - defer d.mu.Unlock() - d.uncacheWithLock(key, uint64(len(val))) - }() - } - - return d.readWithRLock(key) -} - -// read ignores the cache, and returns an io.ReadCloser representing the -// decompressed data for the given key, streamed from the disk. Clients should -// acquire a read lock on the Diskv and check the cache themselves before -// calling read. -func (d *Diskv) readWithRLock(key string) (io.ReadCloser, error) { - filename := d.completeFilename(key) - - fi, err := os.Stat(filename) - if err != nil { - return nil, err - } - if fi.IsDir() { - return nil, os.ErrNotExist - } - - f, err := os.Open(filename) - if err != nil { - return nil, err - } - - var r io.Reader - if d.CacheSizeMax > 0 { - r = newSiphon(f, d, key) - } else { - r = &closingReader{f} - } - - var rc = io.ReadCloser(ioutil.NopCloser(r)) - if d.Compression != nil { - rc, err = d.Compression.Reader(r) - if err != nil { - return nil, err - } - } - - return rc, nil -} - -// closingReader provides a Reader that automatically closes the -// embedded ReadCloser when it reaches EOF -type closingReader struct { - rc io.ReadCloser -} - -func (cr closingReader) Read(p []byte) (int, error) { - n, err := cr.rc.Read(p) - if err == io.EOF { - if closeErr := cr.rc.Close(); closeErr != nil { - return n, closeErr // close must succeed for Read to succeed - } - } - return n, err -} - -// siphon is like a TeeReader: it copies all data read through it to an -// internal buffer, and moves that buffer to the cache at EOF. -type siphon struct { - f *os.File - d *Diskv - key string - buf *bytes.Buffer -} - -// newSiphon constructs a siphoning reader that represents the passed file. -// When a successful series of reads ends in an EOF, the siphon will write -// the buffered data to Diskv's cache under the given key. -func newSiphon(f *os.File, d *Diskv, key string) io.Reader { - return &siphon{ - f: f, - d: d, - key: key, - buf: &bytes.Buffer{}, - } -} - -// Read implements the io.Reader interface for siphon. -func (s *siphon) Read(p []byte) (int, error) { - n, err := s.f.Read(p) - - if err == nil { - return s.buf.Write(p[0:n]) // Write must succeed for Read to succeed - } - - if err == io.EOF { - s.d.cacheWithoutLock(s.key, s.buf.Bytes()) // cache may fail - if closeErr := s.f.Close(); closeErr != nil { - return n, closeErr // close must succeed for Read to succeed - } - return n, err - } - - return n, err -} - -// Erase synchronously erases the given key from the disk and the cache. -func (d *Diskv) Erase(key string) error { - d.mu.Lock() - defer d.mu.Unlock() - - d.bustCacheWithLock(key) - - // erase from index - if d.Index != nil { - d.Index.Delete(key) - } - - // erase from disk - filename := d.completeFilename(key) - if s, err := os.Stat(filename); err == nil { - if s.IsDir() { - return errBadKey - } - if err = os.Remove(filename); err != nil { - return err - } - } else { - // Return err as-is so caller can do os.IsNotExist(err). - return err - } - - // clean up and return - d.pruneDirsWithLock(key) - return nil -} - -// EraseAll will delete all of the data from the store, both in the cache and on -// the disk. Note that EraseAll doesn't distinguish diskv-related data from non- -// diskv-related data. Care should be taken to always specify a diskv base -// directory that is exclusively for diskv data. -func (d *Diskv) EraseAll() error { - d.mu.Lock() - defer d.mu.Unlock() - d.cache = make(map[string][]byte) - d.cacheSize = 0 - return os.RemoveAll(d.BasePath) -} - -// Has returns true if the given key exists. -func (d *Diskv) Has(key string) bool { - d.mu.Lock() - defer d.mu.Unlock() - - if _, ok := d.cache[key]; ok { - return true - } - - filename := d.completeFilename(key) - s, err := os.Stat(filename) - if err != nil { - return false - } - if s.IsDir() { - return false - } - - return true -} - -// Keys returns a channel that will yield every key accessible by the store, -// in undefined order. If a cancel channel is provided, closing it will -// terminate and close the keys channel. -func (d *Diskv) Keys(cancel <-chan struct{}) <-chan string { - return d.KeysPrefix("", cancel) -} - -// KeysPrefix returns a channel that will yield every key accessible by the -// store with the given prefix, in undefined order. If a cancel channel is -// provided, closing it will terminate and close the keys channel. If the -// provided prefix is the empty string, all keys will be yielded. -func (d *Diskv) KeysPrefix(prefix string, cancel <-chan struct{}) <-chan string { - var prepath string - if prefix == "" { - prepath = d.BasePath - } else { - prepath = d.pathFor(prefix) - } - c := make(chan string) - go func() { - filepath.Walk(prepath, walker(c, prefix, cancel)) - close(c) - }() - return c -} - -// walker returns a function which satisfies the filepath.WalkFunc interface. -// It sends every non-directory file entry down the channel c. -func walker(c chan<- string, prefix string, cancel <-chan struct{}) filepath.WalkFunc { - return func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - if info.IsDir() || !strings.HasPrefix(info.Name(), prefix) { - return nil // "pass" - } - - select { - case c <- info.Name(): - case <-cancel: - return errCanceled - } - - return nil - } -} - -// pathFor returns the absolute path for location on the filesystem where the -// data for the given key will be stored. -func (d *Diskv) pathFor(key string) string { - return filepath.Join(d.BasePath, filepath.Join(d.Transform(key)...)) -} - -// ensurePathWithLock is a helper function that generates all necessary -// directories on the filesystem for the given key. -func (d *Diskv) ensurePathWithLock(key string) error { - return os.MkdirAll(d.pathFor(key), d.PathPerm) -} - -// completeFilename returns the absolute path to the file for the given key. -func (d *Diskv) completeFilename(key string) string { - return filepath.Join(d.pathFor(key), key) -} - -// cacheWithLock attempts to cache the given key-value pair in the store's -// cache. It can fail if the value is larger than the cache's maximum size. -func (d *Diskv) cacheWithLock(key string, val []byte) error { - valueSize := uint64(len(val)) - if err := d.ensureCacheSpaceWithLock(valueSize); err != nil { - return fmt.Errorf("%s; not caching", err) - } - - // be very strict about memory guarantees - if (d.cacheSize + valueSize) > d.CacheSizeMax { - panic(fmt.Sprintf("failed to make room for value (%d/%d)", valueSize, d.CacheSizeMax)) - } - - d.cache[key] = val - d.cacheSize += valueSize - return nil -} - -// cacheWithoutLock acquires the store's (write) mutex and calls cacheWithLock. -func (d *Diskv) cacheWithoutLock(key string, val []byte) error { - d.mu.Lock() - defer d.mu.Unlock() - return d.cacheWithLock(key, val) -} - -func (d *Diskv) bustCacheWithLock(key string) { - if val, ok := d.cache[key]; ok { - d.uncacheWithLock(key, uint64(len(val))) - } -} - -func (d *Diskv) uncacheWithLock(key string, sz uint64) { - d.cacheSize -= sz - delete(d.cache, key) -} - -// pruneDirsWithLock deletes empty directories in the path walk leading to the -// key k. Typically this function is called after an Erase is made. -func (d *Diskv) pruneDirsWithLock(key string) error { - pathlist := d.Transform(key) - for i := range pathlist { - dir := filepath.Join(d.BasePath, filepath.Join(pathlist[:len(pathlist)-i]...)) - - // thanks to Steven Blenkinsop for this snippet - switch fi, err := os.Stat(dir); true { - case err != nil: - return err - case !fi.IsDir(): - panic(fmt.Sprintf("corrupt dirstate at %s", dir)) - } - - nlinks, err := filepath.Glob(filepath.Join(dir, "*")) - if err != nil { - return err - } else if len(nlinks) > 0 { - return nil // has subdirs -- do not prune - } - if err = os.Remove(dir); err != nil { - return err - } - } - - return nil -} - -// ensureCacheSpaceWithLock deletes entries from the cache in arbitrary order -// until the cache has at least valueSize bytes available. -func (d *Diskv) ensureCacheSpaceWithLock(valueSize uint64) error { - if valueSize > d.CacheSizeMax { - return fmt.Errorf("value size (%d bytes) too large for cache (%d bytes)", valueSize, d.CacheSizeMax) - } - - safe := func() bool { return (d.cacheSize + valueSize) <= d.CacheSizeMax } - - for key, val := range d.cache { - if safe() { - break - } - - d.uncacheWithLock(key, uint64(len(val))) - } - - if !safe() { - panic(fmt.Sprintf("%d bytes still won't fit in the cache! (max %d bytes)", valueSize, d.CacheSizeMax)) - } - - return nil -} - -// nopWriteCloser wraps an io.Writer and provides a no-op Close method to -// satisfy the io.WriteCloser interface. -type nopWriteCloser struct { - io.Writer -} - -func (wc *nopWriteCloser) Write(p []byte) (int, error) { return wc.Writer.Write(p) } -func (wc *nopWriteCloser) Close() error { return nil } diff --git a/vendor/github.com/peterbourgon/diskv/index.go b/vendor/github.com/peterbourgon/diskv/index.go deleted file mode 100644 index 96fee5152b1..00000000000 --- a/vendor/github.com/peterbourgon/diskv/index.go +++ /dev/null @@ -1,115 +0,0 @@ -package diskv - -import ( - "sync" - - "github.com/google/btree" -) - -// Index is a generic interface for things that can -// provide an ordered list of keys. -type Index interface { - Initialize(less LessFunction, keys <-chan string) - Insert(key string) - Delete(key string) - Keys(from string, n int) []string -} - -// LessFunction is used to initialize an Index of keys in a specific order. -type LessFunction func(string, string) bool - -// btreeString is a custom data type that satisfies the BTree Less interface, -// making the strings it wraps sortable by the BTree package. -type btreeString struct { - s string - l LessFunction -} - -// Less satisfies the BTree.Less interface using the btreeString's LessFunction. -func (s btreeString) Less(i btree.Item) bool { - return s.l(s.s, i.(btreeString).s) -} - -// BTreeIndex is an implementation of the Index interface using google/btree. -type BTreeIndex struct { - sync.RWMutex - LessFunction - *btree.BTree -} - -// Initialize populates the BTree tree with data from the keys channel, -// according to the passed less function. It's destructive to the BTreeIndex. -func (i *BTreeIndex) Initialize(less LessFunction, keys <-chan string) { - i.Lock() - defer i.Unlock() - i.LessFunction = less - i.BTree = rebuild(less, keys) -} - -// Insert inserts the given key (only) into the BTree tree. -func (i *BTreeIndex) Insert(key string) { - i.Lock() - defer i.Unlock() - if i.BTree == nil || i.LessFunction == nil { - panic("uninitialized index") - } - i.BTree.ReplaceOrInsert(btreeString{s: key, l: i.LessFunction}) -} - -// Delete removes the given key (only) from the BTree tree. -func (i *BTreeIndex) Delete(key string) { - i.Lock() - defer i.Unlock() - if i.BTree == nil || i.LessFunction == nil { - panic("uninitialized index") - } - i.BTree.Delete(btreeString{s: key, l: i.LessFunction}) -} - -// Keys yields a maximum of n keys in order. If the passed 'from' key is empty, -// Keys will return the first n keys. If the passed 'from' key is non-empty, the -// first key in the returned slice will be the key that immediately follows the -// passed key, in key order. -func (i *BTreeIndex) Keys(from string, n int) []string { - i.RLock() - defer i.RUnlock() - - if i.BTree == nil || i.LessFunction == nil { - panic("uninitialized index") - } - - if i.BTree.Len() <= 0 { - return []string{} - } - - btreeFrom := btreeString{s: from, l: i.LessFunction} - skipFirst := true - if len(from) <= 0 || !i.BTree.Has(btreeFrom) { - // no such key, so fabricate an always-smallest item - btreeFrom = btreeString{s: "", l: func(string, string) bool { return true }} - skipFirst = false - } - - keys := []string{} - iterator := func(i btree.Item) bool { - keys = append(keys, i.(btreeString).s) - return len(keys) < n - } - i.BTree.AscendGreaterOrEqual(btreeFrom, iterator) - - if skipFirst && len(keys) > 0 { - keys = keys[1:] - } - - return keys -} - -// rebuildIndex does the work of regenerating the index -// with the given keys. -func rebuild(less LessFunction, keys <-chan string) *btree.BTree { - tree := btree.New(2) - for key := range keys { - tree.ReplaceOrInsert(btreeString{s: key, l: less}) - } - return tree -} diff --git a/vendor/github.com/pkg/errors/BUILD b/vendor/github.com/pkg/errors/BUILD index 339a557ae74..218f1357bd3 100644 --- a/vendor/github.com/pkg/errors/BUILD +++ b/vendor/github.com/pkg/errors/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "errors.go", "stack.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/pkg/sftp/BUILD b/vendor/github.com/pkg/sftp/BUILD index 141f53cfdca..cd57c039412 100644 --- a/vendor/github.com/pkg/sftp/BUILD +++ b/vendor/github.com/pkg/sftp/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,18 +9,32 @@ go_library( name = "go_default_library", srcs = [ "attrs.go", - "attrs_unix.go", "client.go", "conn.go", "packet.go", "release.go", "server.go", - "server_statvfs_impl.go", - "server_statvfs_linux.go", - "server_unix.go", + "server_statvfs_stubs.go", "sftp.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "attrs_unix.go", + "server_statvfs_darwin.go", + "server_statvfs_impl.go", + "server_unix.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "attrs_unix.go", + "server_statvfs_impl.go", + "server_statvfs_linux.go", + "server_unix.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "attrs_stubs.go", + "server_stubs.go", + ], + "//conditions:default": [], + }), deps = [ "//vendor/github.com/kr/fs:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", diff --git a/vendor/github.com/pmezard/go-difflib/difflib/BUILD b/vendor/github.com/pmezard/go-difflib/difflib/BUILD index c8b97c988ae..10dafc89d77 100644 --- a/vendor/github.com/pmezard/go-difflib/difflib/BUILD +++ b/vendor/github.com/pmezard/go-difflib/difflib/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["difflib.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/prometheus/client_golang/prometheus/BUILD b/vendor/github.com/prometheus/client_golang/prometheus/BUILD index d1ca2725248..b2d98bdc666 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/BUILD +++ b/vendor/github.com/prometheus/client_golang/prometheus/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -30,7 +28,6 @@ go_library( "value.go", "vec.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/beorn7/perks/quantile:go_default_library", "//vendor/github.com/golang/protobuf/proto:go_default_library", diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/BUILD b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/BUILD index 77d2c7fe28e..d17767b4e62 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/BUILD +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,13 +8,13 @@ load( go_library( name = "go_default_library", srcs = [ + "delegator_1_7.go", "delegator_1_8.go", "http.go", "instrument_client.go", "instrument_client_1_8.go", "instrument_server.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/github.com/prometheus/client_model/go:go_default_library", diff --git a/vendor/github.com/prometheus/client_model/go/BUILD b/vendor/github.com/prometheus/client_model/go/BUILD index 1b3f3fdedf5..e8c75453c05 100644 --- a/vendor/github.com/prometheus/client_model/go/BUILD +++ b/vendor/github.com/prometheus/client_model/go/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["metrics.pb.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], ) diff --git a/vendor/github.com/prometheus/common/expfmt/BUILD b/vendor/github.com/prometheus/common/expfmt/BUILD index eecf0f2d1d6..c3e4ab3cf9f 100644 --- a/vendor/github.com/prometheus/common/expfmt/BUILD +++ b/vendor/github.com/prometheus/common/expfmt/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "text_create.go", "text_parse.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/protobuf/proto:go_default_library", "//vendor/github.com/matttproud/golang_protobuf_extensions/pbutil:go_default_library", diff --git a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/BUILD b/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/BUILD index 8c04dc13cb2..1a0875deb92 100644 --- a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/BUILD +++ b/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["autoneg.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/prometheus/common/model/BUILD b/vendor/github.com/prometheus/common/model/BUILD index 599c9871eba..8805caf84e7 100644 --- a/vendor/github.com/prometheus/common/model/BUILD +++ b/vendor/github.com/prometheus/common/model/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -22,7 +20,6 @@ go_library( "time.go", "value.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/prometheus/procfs/BUILD b/vendor/github.com/prometheus/procfs/BUILD index 6b12957ea05..ebb6091321f 100644 --- a/vendor/github.com/prometheus/procfs/BUILD +++ b/vendor/github.com/prometheus/procfs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -23,7 +21,6 @@ go_library( "stat.go", "xfrm.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/prometheus/procfs/xfs:go_default_library"], ) diff --git a/vendor/github.com/prometheus/procfs/xfs/BUILD b/vendor/github.com/prometheus/procfs/xfs/BUILD index 17670f115fc..b2d23813388 100644 --- a/vendor/github.com/prometheus/procfs/xfs/BUILD +++ b/vendor/github.com/prometheus/procfs/xfs/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "parse.go", "xfs.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/quobyte/api/BUILD b/vendor/github.com/quobyte/api/BUILD index 84fec6cd094..2827b25b772 100644 --- a/vendor/github.com/quobyte/api/BUILD +++ b/vendor/github.com/quobyte/api/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "rpc_client.go", "types.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/rackspace/gophercloud/BUILD b/vendor/github.com/rackspace/gophercloud/BUILD index 45e0f3c1206..47777d6b586 100644 --- a/vendor/github.com/rackspace/gophercloud/BUILD +++ b/vendor/github.com/rackspace/gophercloud/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -20,7 +18,6 @@ go_library( "service_client.go", "util.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/mitchellh/mapstructure:go_default_library"], ) diff --git a/vendor/github.com/rackspace/gophercloud/openstack/BUILD b/vendor/github.com/rackspace/gophercloud/openstack/BUILD index 588e9909f53..d95e0f0964f 100644 --- a/vendor/github.com/rackspace/gophercloud/openstack/BUILD +++ b/vendor/github.com/rackspace/gophercloud/openstack/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "client.go", "endpoint_location.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/rackspace/gophercloud:go_default_library", "//vendor/github.com/rackspace/gophercloud/openstack/identity/v2/tokens:go_default_library", diff --git a/vendor/github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes/BUILD b/vendor/github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes/BUILD index 352a6bd792b..427dd138a41 100644 --- a/vendor/github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes/BUILD +++ b/vendor/github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "urls.go", "util.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/mitchellh/mapstructure:go_default_library", "//vendor/github.com/rackspace/gophercloud:go_default_library", diff --git a/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/bootfromvolume/BUILD b/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/bootfromvolume/BUILD index 1ad61c762f8..763e9904adc 100644 --- a/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/bootfromvolume/BUILD +++ b/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/bootfromvolume/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/rackspace/gophercloud:go_default_library", "//vendor/github.com/rackspace/gophercloud/openstack/compute/v2/servers:go_default_library", diff --git a/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/diskconfig/BUILD b/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/diskconfig/BUILD index 8585e4f855d..37aa5880773 100644 --- a/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/diskconfig/BUILD +++ b/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/diskconfig/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "requests.go", "results.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/mitchellh/mapstructure:go_default_library", "//vendor/github.com/rackspace/gophercloud:go_default_library", diff --git a/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/BUILD b/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/BUILD index 88ad8ca5017..7115567bbbd 100644 --- a/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/BUILD +++ b/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/mitchellh/mapstructure:go_default_library", "//vendor/github.com/rackspace/gophercloud:go_default_library", diff --git a/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/flavors/BUILD b/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/flavors/BUILD index 88ad8ca5017..7115567bbbd 100644 --- a/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/flavors/BUILD +++ b/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/flavors/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/mitchellh/mapstructure:go_default_library", "//vendor/github.com/rackspace/gophercloud:go_default_library", diff --git a/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/images/BUILD b/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/images/BUILD index 88ad8ca5017..7115567bbbd 100644 --- a/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/images/BUILD +++ b/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/images/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/mitchellh/mapstructure:go_default_library", "//vendor/github.com/rackspace/gophercloud:go_default_library", diff --git a/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/servers/BUILD b/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/servers/BUILD index 2fc5ec0c49b..c19379e9e38 100644 --- a/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/servers/BUILD +++ b/vendor/github.com/rackspace/gophercloud/openstack/compute/v2/servers/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "urls.go", "util.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/mitchellh/mapstructure:go_default_library", "//vendor/github.com/rackspace/gophercloud:go_default_library", diff --git a/vendor/github.com/rackspace/gophercloud/openstack/identity/v2/tenants/BUILD b/vendor/github.com/rackspace/gophercloud/openstack/identity/v2/tenants/BUILD index 88ad8ca5017..7115567bbbd 100644 --- a/vendor/github.com/rackspace/gophercloud/openstack/identity/v2/tenants/BUILD +++ b/vendor/github.com/rackspace/gophercloud/openstack/identity/v2/tenants/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/mitchellh/mapstructure:go_default_library", "//vendor/github.com/rackspace/gophercloud:go_default_library", diff --git a/vendor/github.com/rackspace/gophercloud/openstack/identity/v2/tokens/BUILD b/vendor/github.com/rackspace/gophercloud/openstack/identity/v2/tokens/BUILD index deee80b7a25..68b6deb49c6 100644 --- a/vendor/github.com/rackspace/gophercloud/openstack/identity/v2/tokens/BUILD +++ b/vendor/github.com/rackspace/gophercloud/openstack/identity/v2/tokens/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/mitchellh/mapstructure:go_default_library", "//vendor/github.com/rackspace/gophercloud:go_default_library", diff --git a/vendor/github.com/rackspace/gophercloud/openstack/identity/v3/tokens/BUILD b/vendor/github.com/rackspace/gophercloud/openstack/identity/v3/tokens/BUILD index daeca2b6138..f3214b94ebd 100644 --- a/vendor/github.com/rackspace/gophercloud/openstack/identity/v3/tokens/BUILD +++ b/vendor/github.com/rackspace/gophercloud/openstack/identity/v3/tokens/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "results.go", "urls.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/mitchellh/mapstructure:go_default_library", "//vendor/github.com/rackspace/gophercloud:go_default_library", diff --git a/vendor/github.com/rackspace/gophercloud/openstack/utils/BUILD b/vendor/github.com/rackspace/gophercloud/openstack/utils/BUILD index ce4ad4f04bd..32ffcbcf229 100644 --- a/vendor/github.com/rackspace/gophercloud/openstack/utils/BUILD +++ b/vendor/github.com/rackspace/gophercloud/openstack/utils/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["choose_version.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/rackspace/gophercloud:go_default_library"], ) diff --git a/vendor/github.com/rackspace/gophercloud/pagination/BUILD b/vendor/github.com/rackspace/gophercloud/pagination/BUILD index 1b10fd7db86..809e81c9bc3 100644 --- a/vendor/github.com/rackspace/gophercloud/pagination/BUILD +++ b/vendor/github.com/rackspace/gophercloud/pagination/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "pkg.go", "single.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/rackspace/gophercloud:go_default_library"], ) diff --git a/vendor/github.com/rackspace/gophercloud/rackspace/BUILD b/vendor/github.com/rackspace/gophercloud/rackspace/BUILD index 72ca5258c93..a1151db5b82 100644 --- a/vendor/github.com/rackspace/gophercloud/rackspace/BUILD +++ b/vendor/github.com/rackspace/gophercloud/rackspace/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "auth_env.go", "client.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/rackspace/gophercloud:go_default_library", "//vendor/github.com/rackspace/gophercloud/openstack:go_default_library", diff --git a/vendor/github.com/rackspace/gophercloud/rackspace/blockstorage/v1/volumes/BUILD b/vendor/github.com/rackspace/gophercloud/rackspace/blockstorage/v1/volumes/BUILD index 8c9f3b1f3c4..56941ef22d6 100644 --- a/vendor/github.com/rackspace/gophercloud/rackspace/blockstorage/v1/volumes/BUILD +++ b/vendor/github.com/rackspace/gophercloud/rackspace/blockstorage/v1/volumes/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "results.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/mitchellh/mapstructure:go_default_library", "//vendor/github.com/rackspace/gophercloud:go_default_library", diff --git a/vendor/github.com/rackspace/gophercloud/rackspace/compute/v2/servers/BUILD b/vendor/github.com/rackspace/gophercloud/rackspace/compute/v2/servers/BUILD index c3aeb40c8e6..76e5b7cfe18 100644 --- a/vendor/github.com/rackspace/gophercloud/rackspace/compute/v2/servers/BUILD +++ b/vendor/github.com/rackspace/gophercloud/rackspace/compute/v2/servers/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "requests.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/rackspace/gophercloud:go_default_library", "//vendor/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/bootfromvolume:go_default_library", diff --git a/vendor/github.com/rackspace/gophercloud/rackspace/compute/v2/volumeattach/BUILD b/vendor/github.com/rackspace/gophercloud/rackspace/compute/v2/volumeattach/BUILD index ad19fc4e042..5ccf0d4c6dc 100644 --- a/vendor/github.com/rackspace/gophercloud/rackspace/compute/v2/volumeattach/BUILD +++ b/vendor/github.com/rackspace/gophercloud/rackspace/compute/v2/volumeattach/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "delegate.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/rackspace/gophercloud:go_default_library", "//vendor/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach:go_default_library", diff --git a/vendor/github.com/rackspace/gophercloud/rackspace/identity/v2/tokens/BUILD b/vendor/github.com/rackspace/gophercloud/rackspace/identity/v2/tokens/BUILD index ba0b8fc978d..e940cac74be 100644 --- a/vendor/github.com/rackspace/gophercloud/rackspace/identity/v2/tokens/BUILD +++ b/vendor/github.com/rackspace/gophercloud/rackspace/identity/v2/tokens/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "delegate.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/rackspace/gophercloud:go_default_library", "//vendor/github.com/rackspace/gophercloud/openstack/identity/v2/tokens:go_default_library", diff --git a/vendor/github.com/rackspace/gophercloud/testhelper/BUILD b/vendor/github.com/rackspace/gophercloud/testhelper/BUILD index ac50eafc843..41e3ac2166f 100644 --- a/vendor/github.com/rackspace/gophercloud/testhelper/BUILD +++ b/vendor/github.com/rackspace/gophercloud/testhelper/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "http_responses.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/rackspace/gophercloud/testhelper/client/BUILD b/vendor/github.com/rackspace/gophercloud/testhelper/client/BUILD index 64c3575b943..9848216fa06 100644 --- a/vendor/github.com/rackspace/gophercloud/testhelper/client/BUILD +++ b/vendor/github.com/rackspace/gophercloud/testhelper/client/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["fake.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/rackspace/gophercloud:go_default_library", "//vendor/github.com/rackspace/gophercloud/testhelper:go_default_library", diff --git a/vendor/github.com/rancher/go-rancher/client/BUILD b/vendor/github.com/rancher/go-rancher/client/BUILD index abb3eac09a0..5ea67452e55 100644 --- a/vendor/github.com/rancher/go-rancher/client/BUILD +++ b/vendor/github.com/rancher/go-rancher/client/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -158,7 +156,6 @@ go_library( "schemas.go", "types.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/gorilla/websocket:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", diff --git a/vendor/github.com/renstrom/dedent/BUILD b/vendor/github.com/renstrom/dedent/BUILD index 807570addc4..466d7326105 100644 --- a/vendor/github.com/renstrom/dedent/BUILD +++ b/vendor/github.com/renstrom/dedent/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["dedent.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/robfig/cron/BUILD b/vendor/github.com/robfig/cron/BUILD index 08804674ac6..f723dc468e8 100644 --- a/vendor/github.com/robfig/cron/BUILD +++ b/vendor/github.com/robfig/cron/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "parser.go", "spec.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/rubiojr/go-vhd/vhd/BUILD b/vendor/github.com/rubiojr/go-vhd/vhd/BUILD index f6b3c09c3d5..3e4b297a986 100644 --- a/vendor/github.com/rubiojr/go-vhd/vhd/BUILD +++ b/vendor/github.com/rubiojr/go-vhd/vhd/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "util.go", "vhd.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/russross/blackfriday/BUILD b/vendor/github.com/russross/blackfriday/BUILD index 0079fe996b4..7bf24bba8c0 100644 --- a/vendor/github.com/russross/blackfriday/BUILD +++ b/vendor/github.com/russross/blackfriday/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "markdown.go", "smartypants.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/shurcooL/sanitized_anchor_name:go_default_library"], ) diff --git a/vendor/github.com/satori/uuid/BUILD b/vendor/github.com/satori/uuid/BUILD index 0ab5752bdbb..c3bd28ced0a 100644 --- a/vendor/github.com/satori/uuid/BUILD +++ b/vendor/github.com/satori/uuid/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["uuid.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/seccomp/libseccomp-golang/BUILD b/vendor/github.com/seccomp/libseccomp-golang/BUILD index 91e6400e979..2fb6e598e54 100644 --- a/vendor/github.com/seccomp/libseccomp-golang/BUILD +++ b/vendor/github.com/seccomp/libseccomp-golang/BUILD @@ -1,33 +1,27 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", - "cgo_genrule", "go_library", ) -cgo_genrule( - name = "cgo_codegen", - srcs = [ - "seccomp.go", - "seccomp_internal.go", - ], - clinkopts = [ - "-lz", - "-lm", - "-lpthread", - "-ldl", - ], - tags = ["automanaged"], -) - go_library( name = "go_default_library", - srcs = [], - library = ":cgo_codegen", - tags = ["automanaged"], + srcs = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "seccomp.go", + "seccomp_internal.go", + ], + "//conditions:default": [], + }), + cgo = True, + clinkopts = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "-lseccomp", + "-lseccomp", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/shurcooL/sanitized_anchor_name/BUILD b/vendor/github.com/shurcooL/sanitized_anchor_name/BUILD index 74aa35774f5..3098ba911b8 100644 --- a/vendor/github.com/shurcooL/sanitized_anchor_name/BUILD +++ b/vendor/github.com/shurcooL/sanitized_anchor_name/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["main.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/spf13/afero/BUILD b/vendor/github.com/spf13/afero/BUILD index 92276cee3b8..956955149ac 100644 --- a/vendor/github.com/spf13/afero/BUILD +++ b/vendor/github.com/spf13/afero/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -26,8 +24,12 @@ go_library( "sftp.go", "unionFile.go", "util.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "const_bsds.go", + ], + "//conditions:default": [], + }), deps = [ "//vendor/github.com/pkg/sftp:go_default_library", "//vendor/github.com/spf13/afero/mem:go_default_library", diff --git a/vendor/github.com/spf13/afero/mem/BUILD b/vendor/github.com/spf13/afero/mem/BUILD index bf1595e805e..4fa0cf2fe1e 100644 --- a/vendor/github.com/spf13/afero/mem/BUILD +++ b/vendor/github.com/spf13/afero/mem/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "dirmap.go", "file.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/spf13/afero/sftp/BUILD b/vendor/github.com/spf13/afero/sftp/BUILD index bab703b0352..97e50d26bc4 100644 --- a/vendor/github.com/spf13/afero/sftp/BUILD +++ b/vendor/github.com/spf13/afero/sftp/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["file.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/pkg/sftp:go_default_library"], ) diff --git a/vendor/github.com/spf13/cast/BUILD b/vendor/github.com/spf13/cast/BUILD index 0833287e120..620541c401d 100644 --- a/vendor/github.com/spf13/cast/BUILD +++ b/vendor/github.com/spf13/cast/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "cast.go", "caste.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/spf13/jwalterweatherman:go_default_library"], ) diff --git a/vendor/github.com/spf13/cobra/BUILD b/vendor/github.com/spf13/cobra/BUILD index 5484971caee..7cf0ae917a3 100644 --- a/vendor/github.com/spf13/cobra/BUILD +++ b/vendor/github.com/spf13/cobra/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,9 +12,20 @@ go_library( "cobra.go", "command.go", "command_notwin.go", - ], - tags = ["automanaged"], - deps = ["//vendor/github.com/spf13/pflag:go_default_library"], + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "command_win.go", + ], + "//conditions:default": [], + }), + deps = [ + "//vendor/github.com/spf13/pflag:go_default_library", + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "//vendor/github.com/inconshreveable/mousetrap:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/spf13/cobra/doc/BUILD b/vendor/github.com/spf13/cobra/doc/BUILD index 94fda7916cd..8fe54fc12e9 100644 --- a/vendor/github.com/spf13/cobra/doc/BUILD +++ b/vendor/github.com/spf13/cobra/doc/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "md_docs.go", "util.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/cpuguy83/go-md2man/md2man:go_default_library", "//vendor/github.com/spf13/cobra:go_default_library", diff --git a/vendor/github.com/spf13/jwalterweatherman/BUILD b/vendor/github.com/spf13/jwalterweatherman/BUILD index 055098c7f8c..4f9c752c069 100644 --- a/vendor/github.com/spf13/jwalterweatherman/BUILD +++ b/vendor/github.com/spf13/jwalterweatherman/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["thatswhyyoualwaysleaveanote.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/spf13/pflag/BUILD b/vendor/github.com/spf13/pflag/BUILD index f49186f71f3..fa18e4f093e 100644 --- a/vendor/github.com/spf13/pflag/BUILD +++ b/vendor/github.com/spf13/pflag/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -37,7 +35,6 @@ go_library( "uint8.go", "uint_slice.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/spf13/viper/BUILD b/vendor/github.com/spf13/viper/BUILD index c3a87460ef3..5c478cf40e9 100644 --- a/vendor/github.com/spf13/viper/BUILD +++ b/vendor/github.com/spf13/viper/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "util.go", "viper.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/fsnotify/fsnotify:go_default_library", "//vendor/github.com/hashicorp/hcl:go_default_library", diff --git a/vendor/github.com/square/go-jose/BUILD b/vendor/github.com/square/go-jose/BUILD index 9ec58cd66de..73447ad728c 100644 --- a/vendor/github.com/square/go-jose/BUILD +++ b/vendor/github.com/square/go-jose/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -22,7 +20,6 @@ go_library( "symmetric.go", "utils.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/square/go-jose/cipher:go_default_library", "//vendor/github.com/square/go-jose/json:go_default_library", diff --git a/vendor/github.com/square/go-jose/cipher/BUILD b/vendor/github.com/square/go-jose/cipher/BUILD index 66eff4ca765..d427e6e7bea 100644 --- a/vendor/github.com/square/go-jose/cipher/BUILD +++ b/vendor/github.com/square/go-jose/cipher/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "ecdh_es.go", "key_wrap.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/square/go-jose/json/BUILD b/vendor/github.com/square/go-jose/json/BUILD index eb8d7f131c4..78d2e9cd662 100644 --- a/vendor/github.com/square/go-jose/json/BUILD +++ b/vendor/github.com/square/go-jose/json/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "stream.go", "tags.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/storageos/go-api/BUILD b/vendor/github.com/storageos/go-api/BUILD index 4c5e1e9529f..68bf99afebb 100644 --- a/vendor/github.com/storageos/go-api/BUILD +++ b/vendor/github.com/storageos/go-api/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -22,12 +20,21 @@ go_library( "util.go", "validation.go", "volume.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "client_windows.go", + ], + "//conditions:default": [], + }), deps = [ "//vendor/github.com/gorilla/websocket:go_default_library", "//vendor/github.com/storageos/go-api/types:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "//vendor/github.com/Microsoft/go-winio:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/storageos/go-api/types/BUILD b/vendor/github.com/storageos/go-api/types/BUILD index ef048b6a499..2336eb3c520 100644 --- a/vendor/github.com/storageos/go-api/types/BUILD +++ b/vendor/github.com/storageos/go-api/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -32,7 +30,6 @@ go_library( "volume_create_options.go", "volume_update_options.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/stretchr/objx/BUILD b/vendor/github.com/stretchr/objx/BUILD index 70f4f291514..d8cf0170ba5 100644 --- a/vendor/github.com/stretchr/objx/BUILD +++ b/vendor/github.com/stretchr/objx/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -21,7 +19,6 @@ go_library( "type_specific_codegen.go", "value.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/stretchr/testify/assert/BUILD b/vendor/github.com/stretchr/testify/assert/BUILD index 3f6ab86c08e..155a21ff0bd 100644 --- a/vendor/github.com/stretchr/testify/assert/BUILD +++ b/vendor/github.com/stretchr/testify/assert/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "forward_assertions.go", "http_assertions.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/davecgh/go-spew/spew:go_default_library", "//vendor/github.com/pmezard/go-difflib/difflib:go_default_library", diff --git a/vendor/github.com/stretchr/testify/mock/BUILD b/vendor/github.com/stretchr/testify/mock/BUILD index c6399a0936e..053fb85cdae 100644 --- a/vendor/github.com/stretchr/testify/mock/BUILD +++ b/vendor/github.com/stretchr/testify/mock/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "mock.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/davecgh/go-spew/spew:go_default_library", "//vendor/github.com/pmezard/go-difflib/difflib:go_default_library", diff --git a/vendor/github.com/stretchr/testify/require/BUILD b/vendor/github.com/stretchr/testify/require/BUILD index fadc8e7f2fc..4fbd20e021d 100644 --- a/vendor/github.com/stretchr/testify/require/BUILD +++ b/vendor/github.com/stretchr/testify/require/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "require_forward.go", "requirements.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], ) diff --git a/vendor/github.com/syndtr/gocapability/capability/BUILD b/vendor/github.com/syndtr/gocapability/capability/BUILD index 2a837a65434..0e9b01b3b05 100644 --- a/vendor/github.com/syndtr/gocapability/capability/BUILD +++ b/vendor/github.com/syndtr/gocapability/capability/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,12 +9,16 @@ go_library( name = "go_default_library", srcs = [ "capability.go", - "capability_linux.go", + "capability_noop.go", "enum.go", "enum_gen.go", - "syscall_linux.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "capability_linux.go", + "syscall_linux.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/ugorji/go/codec/BUILD b/vendor/github.com/ugorji/go/codec/BUILD index ee7d0d82f3f..0f5f7bed374 100644 --- a/vendor/github.com/ugorji/go/codec/BUILD +++ b/vendor/github.com/ugorji/go/codec/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,11 +13,13 @@ go_library( "cbor.go", "decode.go", "decode_go.go", + "decode_go14.go", "encode.go", "fast-path.generated.go", "gen.generated.go", "gen.go", "gen-helper.generated.go", + "gen_15.go", "gen_16.go", "gen_17.go", "helper.go", @@ -33,7 +33,6 @@ go_library( "simple.go", "time.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/ugorji/go/codec/codecgen/BUILD b/vendor/github.com/ugorji/go/codec/codecgen/BUILD index 8c44fb5e9c2..8d39b73df16 100644 --- a/vendor/github.com/ugorji/go/codec/codecgen/BUILD +++ b/vendor/github.com/ugorji/go/codec/codecgen/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_binary", @@ -11,7 +9,6 @@ load( go_binary( name = "codecgen", library = ":go_default_library", - tags = ["automanaged"], ) go_library( @@ -20,7 +17,6 @@ go_library( "gen.go", "z.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/vishvananda/netlink/BUILD b/vendor/github.com/vishvananda/netlink/BUILD index 4914c81ff67..ecb736d2a45 100644 --- a/vendor/github.com/vishvananda/netlink/BUILD +++ b/vendor/github.com/vishvananda/netlink/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,27 +9,31 @@ go_library( name = "go_default_library", srcs = [ "addr.go", - "addr_linux.go", "filter.go", - "filter_linux.go", "link.go", - "link_linux.go", "neigh.go", - "neigh_linux.go", "netlink.go", + "netlink_unspecified.go", "protinfo.go", - "protinfo_linux.go", "qdisc.go", - "qdisc_linux.go", "route.go", - "route_linux.go", "xfrm.go", "xfrm_policy.go", - "xfrm_policy_linux.go", "xfrm_state.go", - "xfrm_state_linux.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "addr_linux.go", + "filter_linux.go", + "link_linux.go", + "neigh_linux.go", + "protinfo_linux.go", + "qdisc_linux.go", + "route_linux.go", + "xfrm_policy_linux.go", + "xfrm_state_linux.go", + ], + "//conditions:default": [], + }), deps = ["//vendor/github.com/vishvananda/netlink/nl:go_default_library"], ) diff --git a/vendor/github.com/vishvananda/netlink/nl/BUILD b/vendor/github.com/vishvananda/netlink/nl/BUILD index 30456d29140..2741e7a60c6 100644 --- a/vendor/github.com/vishvananda/netlink/nl/BUILD +++ b/vendor/github.com/vishvananda/netlink/nl/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,17 +7,19 @@ load( go_library( name = "go_default_library", - srcs = [ - "addr_linux.go", - "link_linux.go", - "nl_linux.go", - "route_linux.go", - "tc_linux.go", - "xfrm_linux.go", - "xfrm_policy_linux.go", - "xfrm_state_linux.go", - ], - tags = ["automanaged"], + srcs = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "addr_linux.go", + "link_linux.go", + "nl_linux.go", + "route_linux.go", + "tc_linux.go", + "xfrm_linux.go", + "xfrm_policy_linux.go", + "xfrm_state_linux.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/vmware/govmomi/BUILD b/vendor/github.com/vmware/govmomi/BUILD index 7d4040cb596..dd5f1eb66dc 100644 --- a/vendor/github.com/vmware/govmomi/BUILD +++ b/vendor/github.com/vmware/govmomi/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["client.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/vmware/govmomi/property:go_default_library", "//vendor/github.com/vmware/govmomi/session:go_default_library", diff --git a/vendor/github.com/vmware/govmomi/find/BUILD b/vendor/github.com/vmware/govmomi/find/BUILD index fd6df8e4d10..6efc3e7ee42 100644 --- a/vendor/github.com/vmware/govmomi/find/BUILD +++ b/vendor/github.com/vmware/govmomi/find/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "finder.go", "recurser.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/vmware/govmomi/list:go_default_library", "//vendor/github.com/vmware/govmomi/object:go_default_library", diff --git a/vendor/github.com/vmware/govmomi/list/BUILD b/vendor/github.com/vmware/govmomi/list/BUILD index a58ef53322a..37919ff2a97 100644 --- a/vendor/github.com/vmware/govmomi/list/BUILD +++ b/vendor/github.com/vmware/govmomi/list/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "lister.go", "path.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/vmware/govmomi/property:go_default_library", "//vendor/github.com/vmware/govmomi/vim25/mo:go_default_library", diff --git a/vendor/github.com/vmware/govmomi/object/BUILD b/vendor/github.com/vmware/govmomi/object/BUILD index 8229b147138..2214f252a16 100644 --- a/vendor/github.com/vmware/govmomi/object/BUILD +++ b/vendor/github.com/vmware/govmomi/object/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -65,7 +63,6 @@ go_library( "virtual_machine.go", "vmware_distributed_virtual_switch.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/vmware/govmomi/property:go_default_library", "//vendor/github.com/vmware/govmomi/session:go_default_library", diff --git a/vendor/github.com/vmware/govmomi/pbm/BUILD b/vendor/github.com/vmware/govmomi/pbm/BUILD index 738d8079ac7..9bbb5b06f7e 100644 --- a/vendor/github.com/vmware/govmomi/pbm/BUILD +++ b/vendor/github.com/vmware/govmomi/pbm/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "client.go", "pbm_util.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/vmware/govmomi/pbm/methods:go_default_library", "//vendor/github.com/vmware/govmomi/pbm/types:go_default_library", diff --git a/vendor/github.com/vmware/govmomi/pbm/methods/BUILD b/vendor/github.com/vmware/govmomi/pbm/methods/BUILD index e46975ca601..893f8e8e161 100644 --- a/vendor/github.com/vmware/govmomi/pbm/methods/BUILD +++ b/vendor/github.com/vmware/govmomi/pbm/methods/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["methods.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/vmware/govmomi/pbm/types:go_default_library", "//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library", diff --git a/vendor/github.com/vmware/govmomi/pbm/types/BUILD b/vendor/github.com/vmware/govmomi/pbm/types/BUILD index 5106154689f..68c48e424f9 100644 --- a/vendor/github.com/vmware/govmomi/pbm/types/BUILD +++ b/vendor/github.com/vmware/govmomi/pbm/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "if.go", "types.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/vmware/govmomi/vim25/types:go_default_library"], ) diff --git a/vendor/github.com/vmware/govmomi/property/BUILD b/vendor/github.com/vmware/govmomi/property/BUILD index ba6f040c4ac..0f260d12744 100644 --- a/vendor/github.com/vmware/govmomi/property/BUILD +++ b/vendor/github.com/vmware/govmomi/property/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "filter.go", "wait.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/vmware/govmomi/vim25:go_default_library", "//vendor/github.com/vmware/govmomi/vim25/methods:go_default_library", diff --git a/vendor/github.com/vmware/govmomi/session/BUILD b/vendor/github.com/vmware/govmomi/session/BUILD index 207a7db4541..b72ac1017f6 100644 --- a/vendor/github.com/vmware/govmomi/session/BUILD +++ b/vendor/github.com/vmware/govmomi/session/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "keep_alive.go", "manager.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/vmware/govmomi/property:go_default_library", "//vendor/github.com/vmware/govmomi/vim25:go_default_library", diff --git a/vendor/github.com/vmware/govmomi/task/BUILD b/vendor/github.com/vmware/govmomi/task/BUILD index ce6f62096ff..c441a836f26 100644 --- a/vendor/github.com/vmware/govmomi/task/BUILD +++ b/vendor/github.com/vmware/govmomi/task/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "error.go", "wait.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/vmware/govmomi/property:go_default_library", "//vendor/github.com/vmware/govmomi/vim25/progress:go_default_library", diff --git a/vendor/github.com/vmware/govmomi/vim25/BUILD b/vendor/github.com/vmware/govmomi/vim25/BUILD index afa0e144475..c0277e65e67 100644 --- a/vendor/github.com/vmware/govmomi/vim25/BUILD +++ b/vendor/github.com/vmware/govmomi/vim25/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "doc.go", "retry.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/vmware/govmomi/vim25/methods:go_default_library", "//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library", diff --git a/vendor/github.com/vmware/govmomi/vim25/debug/BUILD b/vendor/github.com/vmware/govmomi/vim25/debug/BUILD index b23d60e1f28..12db11434b4 100644 --- a/vendor/github.com/vmware/govmomi/vim25/debug/BUILD +++ b/vendor/github.com/vmware/govmomi/vim25/debug/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["debug.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/vmware/govmomi/vim25/methods/BUILD b/vendor/github.com/vmware/govmomi/vim25/methods/BUILD index f749b5ae011..68886e87130 100644 --- a/vendor/github.com/vmware/govmomi/vim25/methods/BUILD +++ b/vendor/github.com/vmware/govmomi/vim25/methods/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "methods.go", "service_content.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library", "//vendor/github.com/vmware/govmomi/vim25/types:go_default_library", diff --git a/vendor/github.com/vmware/govmomi/vim25/mo/BUILD b/vendor/github.com/vmware/govmomi/vim25/mo/BUILD index aa7b40e7777..435045478bb 100644 --- a/vendor/github.com/vmware/govmomi/vim25/mo/BUILD +++ b/vendor/github.com/vmware/govmomi/vim25/mo/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "retrieve.go", "type_info.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/vmware/govmomi/vim25/methods:go_default_library", "//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library", diff --git a/vendor/github.com/vmware/govmomi/vim25/progress/BUILD b/vendor/github.com/vmware/govmomi/vim25/progress/BUILD index 6259cee719d..a7b91985718 100644 --- a/vendor/github.com/vmware/govmomi/vim25/progress/BUILD +++ b/vendor/github.com/vmware/govmomi/vim25/progress/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "sinker.go", "tee.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/vmware/govmomi/vim25/soap/BUILD b/vendor/github.com/vmware/govmomi/vim25/soap/BUILD index ff3c0b5a0c5..93e0b105738 100644 --- a/vendor/github.com/vmware/govmomi/vim25/soap/BUILD +++ b/vendor/github.com/vmware/govmomi/vim25/soap/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "error.go", "soap.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/vmware/govmomi/vim25/debug:go_default_library", "//vendor/github.com/vmware/govmomi/vim25/progress:go_default_library", diff --git a/vendor/github.com/vmware/govmomi/vim25/types/BUILD b/vendor/github.com/vmware/govmomi/vim25/types/BUILD index c3a87771851..a6fdf93cfe2 100644 --- a/vendor/github.com/vmware/govmomi/vim25/types/BUILD +++ b/vendor/github.com/vmware/govmomi/vim25/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "registry.go", "types.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/vmware/govmomi/vim25/xml/BUILD b/vendor/github.com/vmware/govmomi/vim25/xml/BUILD index 817e5f6e1a7..a13876c6cdf 100644 --- a/vendor/github.com/vmware/govmomi/vim25/xml/BUILD +++ b/vendor/github.com/vmware/govmomi/vim25/xml/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "typeinfo.go", "xml.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/vmware/photon-controller-go-sdk/SSPI/BUILD b/vendor/github.com/vmware/photon-controller-go-sdk/SSPI/BUILD index 9757edae8d7..6f00739bba4 100644 --- a/vendor/github.com/vmware/photon-controller-go-sdk/SSPI/BUILD +++ b/vendor/github.com/vmware/photon-controller-go-sdk/SSPI/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,8 +7,14 @@ load( go_library( name = "go_default_library", - srcs = ["sspi_unsupported.go"], - tags = ["automanaged"], + srcs = [ + "sspi_unsupported.go", + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "sspi.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/vmware/photon-controller-go-sdk/photon/BUILD b/vendor/github.com/vmware/photon-controller-go-sdk/photon/BUILD index 75bf6382127..e4d93672d03 100644 --- a/vendor/github.com/vmware/photon-controller-go-sdk/photon/BUILD +++ b/vendor/github.com/vmware/photon-controller-go-sdk/photon/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -34,7 +32,6 @@ go_library( "virtualnetworks.go", "vms.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/vmware/photon-controller-go-sdk/photon/lightwave:go_default_library"], ) diff --git a/vendor/github.com/vmware/photon-controller-go-sdk/photon/lightwave/BUILD b/vendor/github.com/vmware/photon-controller-go-sdk/photon/lightwave/BUILD index 5ae09ea1017..e2e3976e3c0 100644 --- a/vendor/github.com/vmware/photon-controller-go-sdk/photon/lightwave/BUILD +++ b/vendor/github.com/vmware/photon-controller-go-sdk/photon/lightwave/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,8 +11,18 @@ go_library( "jwttoken.go", "oidcclient.go", "oidcclient_sspi_unsupported.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "oidcclient_sspi.go", + ], + "//conditions:default": [], + }), + deps = select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "//vendor/github.com/vmware/photon-controller-go-sdk/SSPI:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/BUILD b/vendor/github.com/xanzy/go-cloudstack/cloudstack/BUILD index f7c64bdb5da..3a49049a5aa 100644 --- a/vendor/github.com/xanzy/go-cloudstack/cloudstack/BUILD +++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -75,7 +73,6 @@ go_library( "ZoneService.go", "cloudstack.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/xiang90/probing/BUILD b/vendor/github.com/xiang90/probing/BUILD index 3e6a20197f4..79c2152f78d 100644 --- a/vendor/github.com/xiang90/probing/BUILD +++ b/vendor/github.com/xiang90/probing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "server.go", "status.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/github.com/xyproto/simpleredis/BUILD b/vendor/github.com/xyproto/simpleredis/BUILD index a9b08c82268..64ee58816e6 100644 --- a/vendor/github.com/xyproto/simpleredis/BUILD +++ b/vendor/github.com/xyproto/simpleredis/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["simpleredis.go"], - tags = ["automanaged"], deps = ["//vendor/github.com/garyburd/redigo/redis:go_default_library"], ) diff --git a/vendor/go.pedge.io/pb/go/google/protobuf/BUILD b/vendor/go.pedge.io/pb/go/google/protobuf/BUILD index 7eac7a8ccc8..faa76615de1 100644 --- a/vendor/go.pedge.io/pb/go/google/protobuf/BUILD +++ b/vendor/go.pedge.io/pb/go/google/protobuf/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -22,7 +20,6 @@ go_library( "type.pb.go", "wrappers.pb.go", ], - tags = ["automanaged"], deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], ) diff --git a/vendor/go4.org/errorutil/BUILD b/vendor/go4.org/errorutil/BUILD index 92d7f9d9691..426a0d6252f 100644 --- a/vendor/go4.org/errorutil/BUILD +++ b/vendor/go4.org/errorutil/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["highlight.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/golang.org/x/crypto/bcrypt/BUILD b/vendor/golang.org/x/crypto/bcrypt/BUILD index bd7f57084a5..39f4b0c4b1f 100644 --- a/vendor/golang.org/x/crypto/bcrypt/BUILD +++ b/vendor/golang.org/x/crypto/bcrypt/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "base64.go", "bcrypt.go", ], - tags = ["automanaged"], deps = ["//vendor/golang.org/x/crypto/blowfish:go_default_library"], ) diff --git a/vendor/golang.org/x/crypto/blowfish/BUILD b/vendor/golang.org/x/crypto/blowfish/BUILD index 339b539b2cf..ddcb7df51d0 100644 --- a/vendor/golang.org/x/crypto/blowfish/BUILD +++ b/vendor/golang.org/x/crypto/blowfish/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "cipher.go", "const.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/golang.org/x/crypto/curve25519/BUILD b/vendor/golang.org/x/crypto/curve25519/BUILD index fe43abbea6e..827a8ad1822 100644 --- a/vendor/golang.org/x/crypto/curve25519/BUILD +++ b/vendor/golang.org/x/crypto/curve25519/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,16 +8,38 @@ load( go_library( name = "go_default_library", srcs = [ - "const_amd64.s", - "cswap_amd64.s", + "curve25519.go", "doc.go", - "freeze_amd64.s", - "ladderstep_amd64.s", - "mont25519_amd64.go", - "mul_amd64.s", - "square_amd64.s", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "const_amd64.s", + "cswap_amd64.s", + "freeze_amd64.s", + "ladderstep_amd64.s", + "mont25519_amd64.go", + "mul_amd64.s", + "square_amd64.s", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "const_amd64.s", + "cswap_amd64.s", + "freeze_amd64.s", + "ladderstep_amd64.s", + "mont25519_amd64.go", + "mul_amd64.s", + "square_amd64.s", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "const_amd64.s", + "cswap_amd64.s", + "freeze_amd64.s", + "ladderstep_amd64.s", + "mont25519_amd64.go", + "mul_amd64.s", + "square_amd64.s", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/golang.org/x/crypto/ed25519/BUILD b/vendor/golang.org/x/crypto/ed25519/BUILD index 0ac739f977e..30cbf4f6cc5 100644 --- a/vendor/golang.org/x/crypto/ed25519/BUILD +++ b/vendor/golang.org/x/crypto/ed25519/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["ed25519.go"], - tags = ["automanaged"], deps = ["//vendor/golang.org/x/crypto/ed25519/internal/edwards25519:go_default_library"], ) diff --git a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/BUILD b/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/BUILD index fdf6b424272..4f1b357fa14 100644 --- a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/BUILD +++ b/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "const.go", "edwards25519.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/golang.org/x/crypto/nacl/secretbox/BUILD b/vendor/golang.org/x/crypto/nacl/secretbox/BUILD index fa296b3c1c8..4e8deb9793a 100644 --- a/vendor/golang.org/x/crypto/nacl/secretbox/BUILD +++ b/vendor/golang.org/x/crypto/nacl/secretbox/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["secretbox.go"], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/crypto/poly1305:go_default_library", "//vendor/golang.org/x/crypto/salsa20/salsa:go_default_library", diff --git a/vendor/golang.org/x/crypto/pkcs12/BUILD b/vendor/golang.org/x/crypto/pkcs12/BUILD index 57973e4f4fc..3a2f81a8a20 100644 --- a/vendor/golang.org/x/crypto/pkcs12/BUILD +++ b/vendor/golang.org/x/crypto/pkcs12/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "pkcs12.go", "safebags.go", ], - tags = ["automanaged"], deps = ["//vendor/golang.org/x/crypto/pkcs12/internal/rc2:go_default_library"], ) diff --git a/vendor/golang.org/x/crypto/pkcs12/internal/rc2/BUILD b/vendor/golang.org/x/crypto/pkcs12/internal/rc2/BUILD index 09c19cc8657..32dcb294966 100644 --- a/vendor/golang.org/x/crypto/pkcs12/internal/rc2/BUILD +++ b/vendor/golang.org/x/crypto/pkcs12/internal/rc2/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["rc2.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/golang.org/x/crypto/poly1305/BUILD b/vendor/golang.org/x/crypto/poly1305/BUILD index c11beb17b03..47ae4f4b564 100644 --- a/vendor/golang.org/x/crypto/poly1305/BUILD +++ b/vendor/golang.org/x/crypto/poly1305/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,10 +9,22 @@ go_library( name = "go_default_library", srcs = [ "poly1305.go", - "poly1305_amd64.s", - "sum_amd64.go", - ], - tags = ["automanaged"], + "sum_ref.go", + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "poly1305_amd64.s", + "sum_amd64.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "poly1305_amd64.s", + "sum_amd64.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "poly1305_amd64.s", + "sum_amd64.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/BUILD b/vendor/golang.org/x/crypto/salsa20/salsa/BUILD index be4b5c42505..47238e57b80 100644 --- a/vendor/golang.org/x/crypto/salsa20/salsa/BUILD +++ b/vendor/golang.org/x/crypto/salsa20/salsa/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,11 +9,23 @@ go_library( name = "go_default_library", srcs = [ "hsalsa20.go", - "salsa2020_amd64.s", "salsa208.go", - "salsa20_amd64.go", - ], - tags = ["automanaged"], + "salsa20_ref.go", + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "salsa2020_amd64.s", + "salsa20_amd64.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "salsa2020_amd64.s", + "salsa20_amd64.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "salsa2020_amd64.s", + "salsa20_amd64.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/golang.org/x/crypto/ssh/BUILD b/vendor/golang.org/x/crypto/ssh/BUILD index 7974c289307..1a1ab217249 100644 --- a/vendor/golang.org/x/crypto/ssh/BUILD +++ b/vendor/golang.org/x/crypto/ssh/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -30,7 +28,6 @@ go_library( "tcpip.go", "transport.go", ], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/crypto/curve25519:go_default_library", "//vendor/golang.org/x/crypto/ed25519:go_default_library", diff --git a/vendor/golang.org/x/crypto/ssh/terminal/BUILD b/vendor/golang.org/x/crypto/ssh/terminal/BUILD index e636c07a8e4..e7e6f0d4532 100644 --- a/vendor/golang.org/x/crypto/ssh/terminal/BUILD +++ b/vendor/golang.org/x/crypto/ssh/terminal/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,10 +9,20 @@ go_library( name = "go_default_library", srcs = [ "terminal.go", - "util.go", - "util_linux.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "util.go", + "util_bsd.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "util.go", + "util_linux.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "util_windows.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/golang.org/x/exp/inotify/BUILD b/vendor/golang.org/x/exp/inotify/BUILD index 6bb5a0b3788..c69a2b4276b 100644 --- a/vendor/golang.org/x/exp/inotify/BUILD +++ b/vendor/golang.org/x/exp/inotify/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,8 +7,12 @@ load( go_library( name = "go_default_library", - srcs = ["inotify_linux.go"], - tags = ["automanaged"], + srcs = select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "inotify_linux.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/golang.org/x/net/context/BUILD b/vendor/golang.org/x/net/context/BUILD index dbb39d55cba..5d8a2f41ed9 100644 --- a/vendor/golang.org/x/net/context/BUILD +++ b/vendor/golang.org/x/net/context/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,8 +10,8 @@ go_library( srcs = [ "context.go", "go17.go", + "pre_go17.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/golang.org/x/net/context/ctxhttp/BUILD b/vendor/golang.org/x/net/context/ctxhttp/BUILD index efa77b9b428..b46f3256fef 100644 --- a/vendor/golang.org/x/net/context/ctxhttp/BUILD +++ b/vendor/golang.org/x/net/context/ctxhttp/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,8 +7,10 @@ load( go_library( name = "go_default_library", - srcs = ["ctxhttp.go"], - tags = ["automanaged"], + srcs = [ + "ctxhttp.go", + "ctxhttp_pre17.go", + ], deps = ["//vendor/golang.org/x/net/context:go_default_library"], ) diff --git a/vendor/golang.org/x/net/html/BUILD b/vendor/golang.org/x/net/html/BUILD index 26bfe511315..42504580cd0 100644 --- a/vendor/golang.org/x/net/html/BUILD +++ b/vendor/golang.org/x/net/html/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -21,7 +19,6 @@ go_library( "render.go", "token.go", ], - tags = ["automanaged"], deps = ["//vendor/golang.org/x/net/html/atom:go_default_library"], ) diff --git a/vendor/golang.org/x/net/html/atom/BUILD b/vendor/golang.org/x/net/html/atom/BUILD index 73899017b57..52bfd1e95a8 100644 --- a/vendor/golang.org/x/net/html/atom/BUILD +++ b/vendor/golang.org/x/net/html/atom/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "atom.go", "table.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/golang.org/x/net/http2/BUILD b/vendor/golang.org/x/net/http2/BUILD index a103412c644..bdf6e3a259e 100644 --- a/vendor/golang.org/x/net/http2/BUILD +++ b/vendor/golang.org/x/net/http2/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,10 +16,14 @@ go_library( "frame.go", "go16.go", "go17.go", + "go17_not18.go", "go18.go", "gotrack.go", "headermap.go", "http2.go", + "not_go16.go", + "not_go17.go", + "not_go18.go", "pipe.go", "server.go", "transport.go", @@ -30,7 +32,6 @@ go_library( "writesched_priority.go", "writesched_random.go", ], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/http2/hpack:go_default_library", "//vendor/golang.org/x/net/idna:go_default_library", diff --git a/vendor/golang.org/x/net/http2/hpack/BUILD b/vendor/golang.org/x/net/http2/hpack/BUILD index 49af50cde5c..e44ac73695c 100644 --- a/vendor/golang.org/x/net/http2/hpack/BUILD +++ b/vendor/golang.org/x/net/http2/hpack/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "huffman.go", "tables.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/golang.org/x/net/idna/BUILD b/vendor/golang.org/x/net/idna/BUILD index 169d9980a23..125d4d58f4a 100644 --- a/vendor/golang.org/x/net/idna/BUILD +++ b/vendor/golang.org/x/net/idna/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "idna.go", "punycode.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/golang.org/x/net/internal/timeseries/BUILD b/vendor/golang.org/x/net/internal/timeseries/BUILD index f559df57670..10ba33c5fd2 100644 --- a/vendor/golang.org/x/net/internal/timeseries/BUILD +++ b/vendor/golang.org/x/net/internal/timeseries/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["timeseries.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/golang.org/x/net/lex/httplex/BUILD b/vendor/golang.org/x/net/lex/httplex/BUILD index cd52e02bc74..18b564cd916 100644 --- a/vendor/golang.org/x/net/lex/httplex/BUILD +++ b/vendor/golang.org/x/net/lex/httplex/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["httplex.go"], - tags = ["automanaged"], deps = ["//vendor/golang.org/x/net/idna:go_default_library"], ) diff --git a/vendor/golang.org/x/net/proxy/BUILD b/vendor/golang.org/x/net/proxy/BUILD index d458ac168c1..957f17bbe23 100644 --- a/vendor/golang.org/x/net/proxy/BUILD +++ b/vendor/golang.org/x/net/proxy/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "proxy.go", "socks5.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/golang.org/x/net/trace/BUILD b/vendor/golang.org/x/net/trace/BUILD index 8bac8a02139..7050391e3ca 100644 --- a/vendor/golang.org/x/net/trace/BUILD +++ b/vendor/golang.org/x/net/trace/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "histogram.go", "trace.go", ], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/net/internal/timeseries:go_default_library", diff --git a/vendor/golang.org/x/net/websocket/BUILD b/vendor/golang.org/x/net/websocket/BUILD index 3b1c6be9d6b..814385f7025 100644 --- a/vendor/golang.org/x/net/websocket/BUILD +++ b/vendor/golang.org/x/net/websocket/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "server.go", "websocket.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/golang.org/x/oauth2/BUILD b/vendor/golang.org/x/oauth2/BUILD index db1282402fa..a22ef4bd0d3 100644 --- a/vendor/golang.org/x/oauth2/BUILD +++ b/vendor/golang.org/x/oauth2/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "token.go", "transport.go", ], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/oauth2/internal:go_default_library", diff --git a/vendor/golang.org/x/oauth2/google/BUILD b/vendor/golang.org/x/oauth2/google/BUILD index 6762f336108..15ef1d88976 100644 --- a/vendor/golang.org/x/oauth2/google/BUILD +++ b/vendor/golang.org/x/oauth2/google/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "jwt.go", "sdk.go", ], - tags = ["automanaged"], deps = [ "//vendor/cloud.google.com/go/compute/metadata:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", diff --git a/vendor/golang.org/x/oauth2/internal/BUILD b/vendor/golang.org/x/oauth2/internal/BUILD index d12501ab885..768c2b80565 100644 --- a/vendor/golang.org/x/oauth2/internal/BUILD +++ b/vendor/golang.org/x/oauth2/internal/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "token.go", "transport.go", ], - tags = ["automanaged"], deps = ["//vendor/golang.org/x/net/context:go_default_library"], ) diff --git a/vendor/golang.org/x/oauth2/jws/BUILD b/vendor/golang.org/x/oauth2/jws/BUILD index 2de08ce6877..5b56fb88e08 100644 --- a/vendor/golang.org/x/oauth2/jws/BUILD +++ b/vendor/golang.org/x/oauth2/jws/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["jws.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/golang.org/x/oauth2/jwt/BUILD b/vendor/golang.org/x/oauth2/jwt/BUILD index 713ba86b7fe..bc2d9a517dd 100644 --- a/vendor/golang.org/x/oauth2/jwt/BUILD +++ b/vendor/golang.org/x/oauth2/jwt/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["jwt.go"], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/oauth2:go_default_library", diff --git a/vendor/golang.org/x/sys/unix/BUILD b/vendor/golang.org/x/sys/unix/BUILD index bed30da32aa..95c4e22b28a 100644 --- a/vendor/golang.org/x/sys/unix/BUILD +++ b/vendor/golang.org/x/sys/unix/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,31 +8,59 @@ load( go_library( name = "go_default_library", srcs = [ - "asm_linux_amd64.s", - "bluetooth_linux.go", - "constants.go", - "dirent.go", - "endian_little.go", - "env_unix.go", "env_unset.go", "file_unix.go", - "flock.go", - "race0.go", - "sockcmsg_linux.go", - "sockcmsg_unix.go", - "str.go", - "syscall.go", - "syscall_linux.go", - "syscall_linux_amd64.go", - "syscall_linux_amd64_gc.go", - "syscall_unix.go", - "syscall_unix_gc.go", - "zerrors_linux_amd64.go", - "zsyscall_linux_amd64.go", - "zsysnum_linux_amd64.go", - "ztypes_linux_amd64.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "asm_darwin_amd64.s", + "constants.go", + "dirent.go", + "endian_little.go", + "env_unix.go", + "flock.go", + "race0.go", + "sockcmsg_unix.go", + "str.go", + "syscall.go", + "syscall_bsd.go", + "syscall_darwin.go", + "syscall_darwin_amd64.go", + "syscall_unix.go", + "syscall_unix_gc.go", + "zerrors_darwin_amd64.go", + "zsyscall_darwin_amd64.go", + "zsysnum_darwin_amd64.go", + "ztypes_darwin_amd64.go", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "asm_linux_amd64.s", + "bluetooth_linux.go", + "constants.go", + "dirent.go", + "endian_little.go", + "env_unix.go", + "flock.go", + "race0.go", + "sockcmsg_linux.go", + "sockcmsg_unix.go", + "str.go", + "syscall.go", + "syscall_linux.go", + "syscall_linux_amd64.go", + "syscall_linux_amd64_gc.go", + "syscall_unix.go", + "syscall_unix_gc.go", + "zerrors_linux_amd64.go", + "zsyscall_linux_amd64.go", + "zsysnum_linux_amd64.go", + "ztypes_linux_amd64.go", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "endian_little.go", + ], + "//conditions:default": [], + }), + cgo = True, ) filegroup( diff --git a/vendor/golang.org/x/sys/windows/BUILD b/vendor/golang.org/x/sys/windows/BUILD index 7117d56a4eb..e7a44073396 100644 --- a/vendor/golang.org/x/sys/windows/BUILD +++ b/vendor/golang.org/x/sys/windows/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -9,8 +7,29 @@ load( go_library( name = "go_default_library", - srcs = ["mksyscall.go"], - tags = ["automanaged"], + srcs = [ + "mksyscall.go", + ] + select({ + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "asm_windows_amd64.s", + "dll_windows.go", + "env_unset.go", + "env_windows.go", + "eventlog.go", + "exec_windows.go", + "memory_windows.go", + "race0.go", + "security_windows.go", + "service.go", + "str.go", + "syscall.go", + "syscall_windows.go", + "zsyscall_windows.go", + "ztypes_windows.go", + "ztypes_windows_amd64.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/golang.org/x/text/cases/BUILD b/vendor/golang.org/x/text/cases/BUILD index 218be6b4cc7..ab46bb2b99d 100644 --- a/vendor/golang.org/x/text/cases/BUILD +++ b/vendor/golang.org/x/text/cases/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -18,7 +16,6 @@ go_library( "tables.go", "trieval.go", ], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/text/language:go_default_library", "//vendor/golang.org/x/text/transform:go_default_library", diff --git a/vendor/golang.org/x/text/encoding/BUILD b/vendor/golang.org/x/text/encoding/BUILD index 63bc0f691ab..ed736dfb2ed 100644 --- a/vendor/golang.org/x/text/encoding/BUILD +++ b/vendor/golang.org/x/text/encoding/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["encoding.go"], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/text/encoding/internal/identifier:go_default_library", "//vendor/golang.org/x/text/transform:go_default_library", diff --git a/vendor/golang.org/x/text/encoding/internal/BUILD b/vendor/golang.org/x/text/encoding/internal/BUILD index ff348ae26b6..b2ee36aaf90 100644 --- a/vendor/golang.org/x/text/encoding/internal/BUILD +++ b/vendor/golang.org/x/text/encoding/internal/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["internal.go"], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/text/encoding:go_default_library", "//vendor/golang.org/x/text/encoding/internal/identifier:go_default_library", diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/BUILD b/vendor/golang.org/x/text/encoding/internal/identifier/BUILD index f53ef4beb26..797f87bcebb 100644 --- a/vendor/golang.org/x/text/encoding/internal/identifier/BUILD +++ b/vendor/golang.org/x/text/encoding/internal/identifier/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "identifier.go", "mib.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/golang.org/x/text/encoding/unicode/BUILD b/vendor/golang.org/x/text/encoding/unicode/BUILD index dcc19327106..1c2b9f2b7aa 100644 --- a/vendor/golang.org/x/text/encoding/unicode/BUILD +++ b/vendor/golang.org/x/text/encoding/unicode/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "override.go", "unicode.go", ], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/text/encoding:go_default_library", "//vendor/golang.org/x/text/encoding/internal:go_default_library", diff --git a/vendor/golang.org/x/text/internal/tag/BUILD b/vendor/golang.org/x/text/internal/tag/BUILD index d7e9e50756e..c8d54fe7ce2 100644 --- a/vendor/golang.org/x/text/internal/tag/BUILD +++ b/vendor/golang.org/x/text/internal/tag/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["tag.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/golang.org/x/text/internal/utf8internal/BUILD b/vendor/golang.org/x/text/internal/utf8internal/BUILD index 8c9fb63de53..74c25c20ecb 100644 --- a/vendor/golang.org/x/text/internal/utf8internal/BUILD +++ b/vendor/golang.org/x/text/internal/utf8internal/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["utf8internal.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/golang.org/x/text/language/BUILD b/vendor/golang.org/x/text/language/BUILD index aae748fa55a..c38e7a70e17 100644 --- a/vendor/golang.org/x/text/language/BUILD +++ b/vendor/golang.org/x/text/language/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,6 +10,7 @@ go_library( srcs = [ "common.go", "coverage.go", + "go1_1.go", "go1_2.go", "index.go", "language.go", @@ -21,7 +20,6 @@ go_library( "tables.go", "tags.go", ], - tags = ["automanaged"], deps = ["//vendor/golang.org/x/text/internal/tag:go_default_library"], ) diff --git a/vendor/golang.org/x/text/runes/BUILD b/vendor/golang.org/x/text/runes/BUILD index 9390613ea76..1d1e2696d59 100644 --- a/vendor/golang.org/x/text/runes/BUILD +++ b/vendor/golang.org/x/text/runes/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "cond.go", "runes.go", ], - tags = ["automanaged"], deps = ["//vendor/golang.org/x/text/transform:go_default_library"], ) diff --git a/vendor/golang.org/x/text/secure/bidirule/BUILD b/vendor/golang.org/x/text/secure/bidirule/BUILD index ca1b4471ef8..70e8c3f1685 100644 --- a/vendor/golang.org/x/text/secure/bidirule/BUILD +++ b/vendor/golang.org/x/text/secure/bidirule/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["bidirule.go"], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/text/transform:go_default_library", "//vendor/golang.org/x/text/unicode/bidi:go_default_library", diff --git a/vendor/golang.org/x/text/secure/precis/BUILD b/vendor/golang.org/x/text/secure/precis/BUILD index eae8ff64729..f107424f834 100644 --- a/vendor/golang.org/x/text/secure/precis/BUILD +++ b/vendor/golang.org/x/text/secure/precis/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -21,7 +19,6 @@ go_library( "transformer.go", "trieval.go", ], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/text/cases:go_default_library", "//vendor/golang.org/x/text/runes:go_default_library", diff --git a/vendor/golang.org/x/text/transform/BUILD b/vendor/golang.org/x/text/transform/BUILD index 78f8c3b10f9..5ff1a168a14 100644 --- a/vendor/golang.org/x/text/transform/BUILD +++ b/vendor/golang.org/x/text/transform/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["transform.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/golang.org/x/text/unicode/bidi/BUILD b/vendor/golang.org/x/text/unicode/bidi/BUILD index 02437601ea1..ee17f7ce915 100644 --- a/vendor/golang.org/x/text/unicode/bidi/BUILD +++ b/vendor/golang.org/x/text/unicode/bidi/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "tables.go", "trieval.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/golang.org/x/text/unicode/norm/BUILD b/vendor/golang.org/x/text/unicode/norm/BUILD index f4c22759aed..5ce37562270 100644 --- a/vendor/golang.org/x/text/unicode/norm/BUILD +++ b/vendor/golang.org/x/text/unicode/norm/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -20,7 +18,6 @@ go_library( "transform.go", "trie.go", ], - tags = ["automanaged"], deps = ["//vendor/golang.org/x/text/transform:go_default_library"], ) diff --git a/vendor/golang.org/x/text/width/BUILD b/vendor/golang.org/x/text/width/BUILD index aa4a1726cf9..c5296de0c39 100644 --- a/vendor/golang.org/x/text/width/BUILD +++ b/vendor/golang.org/x/text/width/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "trieval.go", "width.go", ], - tags = ["automanaged"], deps = ["//vendor/golang.org/x/text/transform:go_default_library"], ) diff --git a/vendor/golang.org/x/time/rate/BUILD b/vendor/golang.org/x/time/rate/BUILD index df8379190e2..3eec700d66f 100644 --- a/vendor/golang.org/x/time/rate/BUILD +++ b/vendor/golang.org/x/time/rate/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["rate.go"], - tags = ["automanaged"], deps = ["//vendor/golang.org/x/net/context:go_default_library"], ) diff --git a/vendor/golang.org/x/tools/container/intsets/BUILD b/vendor/golang.org/x/tools/container/intsets/BUILD index c6b2fa906a0..26fb45f626f 100644 --- a/vendor/golang.org/x/tools/container/intsets/BUILD +++ b/vendor/golang.org/x/tools/container/intsets/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,12 +8,24 @@ load( go_library( name = "go_default_library", srcs = [ - "popcnt_amd64.go", - "popcnt_amd64.s", + "popcnt_generic.go", "sparse.go", "util.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": [ + "popcnt_amd64.go", + "popcnt_amd64.s", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "popcnt_amd64.go", + "popcnt_amd64.s", + ], + "@io_bazel_rules_go//go/platform:windows_amd64": [ + "popcnt_amd64.go", + "popcnt_amd64.s", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/google.golang.org/api/cloudkms/v1/BUILD b/vendor/google.golang.org/api/cloudkms/v1/BUILD index 36e0dbf0dbb..e396adb7e00 100644 --- a/vendor/google.golang.org/api/cloudkms/v1/BUILD +++ b/vendor/google.golang.org/api/cloudkms/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["cloudkms-gen.go"], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/net/context/ctxhttp:go_default_library", diff --git a/vendor/google.golang.org/api/cloudmonitoring/v2beta2/BUILD b/vendor/google.golang.org/api/cloudmonitoring/v2beta2/BUILD index 49ca6471f46..d4a3153aa46 100644 --- a/vendor/google.golang.org/api/cloudmonitoring/v2beta2/BUILD +++ b/vendor/google.golang.org/api/cloudmonitoring/v2beta2/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["cloudmonitoring-gen.go"], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/net/context/ctxhttp:go_default_library", diff --git a/vendor/google.golang.org/api/compute/v0.alpha/BUILD b/vendor/google.golang.org/api/compute/v0.alpha/BUILD index 5c25b75f590..0a2dfc68d05 100644 --- a/vendor/google.golang.org/api/compute/v0.alpha/BUILD +++ b/vendor/google.golang.org/api/compute/v0.alpha/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["compute-gen.go"], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/net/context/ctxhttp:go_default_library", diff --git a/vendor/google.golang.org/api/compute/v0.beta/BUILD b/vendor/google.golang.org/api/compute/v0.beta/BUILD index 5c25b75f590..0a2dfc68d05 100644 --- a/vendor/google.golang.org/api/compute/v0.beta/BUILD +++ b/vendor/google.golang.org/api/compute/v0.beta/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["compute-gen.go"], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/net/context/ctxhttp:go_default_library", diff --git a/vendor/google.golang.org/api/compute/v1/BUILD b/vendor/google.golang.org/api/compute/v1/BUILD index 5c25b75f590..0a2dfc68d05 100644 --- a/vendor/google.golang.org/api/compute/v1/BUILD +++ b/vendor/google.golang.org/api/compute/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["compute-gen.go"], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/net/context/ctxhttp:go_default_library", diff --git a/vendor/google.golang.org/api/container/v1/BUILD b/vendor/google.golang.org/api/container/v1/BUILD index 32738c10365..f1512213e43 100644 --- a/vendor/google.golang.org/api/container/v1/BUILD +++ b/vendor/google.golang.org/api/container/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["container-gen.go"], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/net/context/ctxhttp:go_default_library", diff --git a/vendor/google.golang.org/api/dns/v1/BUILD b/vendor/google.golang.org/api/dns/v1/BUILD index 786c56a6581..6a69266990a 100644 --- a/vendor/google.golang.org/api/dns/v1/BUILD +++ b/vendor/google.golang.org/api/dns/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["dns-gen.go"], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/net/context/ctxhttp:go_default_library", diff --git a/vendor/google.golang.org/api/gensupport/BUILD b/vendor/google.golang.org/api/gensupport/BUILD index 40e68622550..c0a6e483bcc 100644 --- a/vendor/google.golang.org/api/gensupport/BUILD +++ b/vendor/google.golang.org/api/gensupport/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -22,7 +20,6 @@ go_library( "retry.go", "send.go", ], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/net/context/ctxhttp:go_default_library", diff --git a/vendor/google.golang.org/api/googleapi/BUILD b/vendor/google.golang.org/api/googleapi/BUILD index 9483e60ba1a..0a70027594c 100644 --- a/vendor/google.golang.org/api/googleapi/BUILD +++ b/vendor/google.golang.org/api/googleapi/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "googleapi.go", "types.go", ], - tags = ["automanaged"], deps = ["//vendor/google.golang.org/api/googleapi/internal/uritemplates:go_default_library"], ) diff --git a/vendor/google.golang.org/api/googleapi/internal/uritemplates/BUILD b/vendor/google.golang.org/api/googleapi/internal/uritemplates/BUILD index e1eeab6831b..a1f401f0eb6 100644 --- a/vendor/google.golang.org/api/googleapi/internal/uritemplates/BUILD +++ b/vendor/google.golang.org/api/googleapi/internal/uritemplates/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "uritemplates.go", "utils.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/google.golang.org/api/logging/v2beta1/BUILD b/vendor/google.golang.org/api/logging/v2beta1/BUILD index 215d304c26c..482777221d8 100644 --- a/vendor/google.golang.org/api/logging/v2beta1/BUILD +++ b/vendor/google.golang.org/api/logging/v2beta1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["logging-gen.go"], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/net/context/ctxhttp:go_default_library", diff --git a/vendor/google.golang.org/api/monitoring/v3/BUILD b/vendor/google.golang.org/api/monitoring/v3/BUILD index 9fb3f091e9f..fc2f8d34ec8 100644 --- a/vendor/google.golang.org/api/monitoring/v3/BUILD +++ b/vendor/google.golang.org/api/monitoring/v3/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["monitoring-gen.go"], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/net/context/ctxhttp:go_default_library", diff --git a/vendor/google.golang.org/api/pubsub/v1/BUILD b/vendor/google.golang.org/api/pubsub/v1/BUILD index 25ad62bf16a..17f7f74b2f5 100644 --- a/vendor/google.golang.org/api/pubsub/v1/BUILD +++ b/vendor/google.golang.org/api/pubsub/v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["pubsub-gen.go"], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/net/context/ctxhttp:go_default_library", diff --git a/vendor/google.golang.org/grpc/BUILD b/vendor/google.golang.org/grpc/BUILD index 387f8bb1590..83be39d6196 100644 --- a/vendor/google.golang.org/grpc/BUILD +++ b/vendor/google.golang.org/grpc/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -21,7 +19,6 @@ go_library( "stream.go", "trace.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/protobuf/proto:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", diff --git a/vendor/google.golang.org/grpc/codes/BUILD b/vendor/google.golang.org/grpc/codes/BUILD index 5b8ddfc3ec8..1afad5e13b7 100644 --- a/vendor/google.golang.org/grpc/codes/BUILD +++ b/vendor/google.golang.org/grpc/codes/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "code_string.go", "codes.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/google.golang.org/grpc/credentials/BUILD b/vendor/google.golang.org/grpc/credentials/BUILD index 4a779eddbf9..261ac342a32 100644 --- a/vendor/google.golang.org/grpc/credentials/BUILD +++ b/vendor/google.golang.org/grpc/credentials/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,8 +10,8 @@ go_library( srcs = [ "credentials.go", "credentials_util_go17.go", + "credentials_util_pre_go17.go", ], - tags = ["automanaged"], deps = ["//vendor/golang.org/x/net/context:go_default_library"], ) diff --git a/vendor/google.golang.org/grpc/grpclog/BUILD b/vendor/google.golang.org/grpc/grpclog/BUILD index 13f3617af17..bb0da35d63b 100644 --- a/vendor/google.golang.org/grpc/grpclog/BUILD +++ b/vendor/google.golang.org/grpc/grpclog/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["logger.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/google.golang.org/grpc/internal/BUILD b/vendor/google.golang.org/grpc/internal/BUILD index e63dc22b422..103aa168909 100644 --- a/vendor/google.golang.org/grpc/internal/BUILD +++ b/vendor/google.golang.org/grpc/internal/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["internal.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/google.golang.org/grpc/metadata/BUILD b/vendor/google.golang.org/grpc/metadata/BUILD index 541435f2f5a..a2cacce7995 100644 --- a/vendor/google.golang.org/grpc/metadata/BUILD +++ b/vendor/google.golang.org/grpc/metadata/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["metadata.go"], - tags = ["automanaged"], deps = ["//vendor/golang.org/x/net/context:go_default_library"], ) diff --git a/vendor/google.golang.org/grpc/naming/BUILD b/vendor/google.golang.org/grpc/naming/BUILD index 5010b772efc..cedcc150322 100644 --- a/vendor/google.golang.org/grpc/naming/BUILD +++ b/vendor/google.golang.org/grpc/naming/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["naming.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/google.golang.org/grpc/peer/BUILD b/vendor/google.golang.org/grpc/peer/BUILD index f08c2707891..b1bea90e750 100644 --- a/vendor/google.golang.org/grpc/peer/BUILD +++ b/vendor/google.golang.org/grpc/peer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["peer.go"], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/context:go_default_library", "//vendor/google.golang.org/grpc/credentials:go_default_library", diff --git a/vendor/google.golang.org/grpc/transport/BUILD b/vendor/google.golang.org/grpc/transport/BUILD index 4fb3cecea90..b12e7a3a8c9 100644 --- a/vendor/google.golang.org/grpc/transport/BUILD +++ b/vendor/google.golang.org/grpc/transport/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -11,14 +9,15 @@ go_library( name = "go_default_library", srcs = [ "control.go", + "go16.go", "go17.go", "handler_server.go", "http2_client.go", "http2_server.go", "http_util.go", + "pre_go16.go", "transport.go", ], - tags = ["automanaged"], deps = [ "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/net/http2:go_default_library", diff --git a/vendor/gopkg.in/gcfg.v1/BUILD b/vendor/gopkg.in/gcfg.v1/BUILD index 7f584416c68..31ca6f35644 100644 --- a/vendor/gopkg.in/gcfg.v1/BUILD +++ b/vendor/gopkg.in/gcfg.v1/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -12,11 +10,11 @@ go_library( srcs = [ "doc.go", "errors.go", + "go1_0.go", "go1_2.go", "read.go", "set.go", ], - tags = ["automanaged"], deps = [ "//vendor/gopkg.in/gcfg.v1/scanner:go_default_library", "//vendor/gopkg.in/gcfg.v1/token:go_default_library", diff --git a/vendor/gopkg.in/gcfg.v1/scanner/BUILD b/vendor/gopkg.in/gcfg.v1/scanner/BUILD index 0448e2f1dd8..5bf94f6611e 100644 --- a/vendor/gopkg.in/gcfg.v1/scanner/BUILD +++ b/vendor/gopkg.in/gcfg.v1/scanner/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "errors.go", "scanner.go", ], - tags = ["automanaged"], deps = ["//vendor/gopkg.in/gcfg.v1/token:go_default_library"], ) diff --git a/vendor/gopkg.in/gcfg.v1/token/BUILD b/vendor/gopkg.in/gcfg.v1/token/BUILD index 3e66d4c9a53..7e10630366d 100644 --- a/vendor/gopkg.in/gcfg.v1/token/BUILD +++ b/vendor/gopkg.in/gcfg.v1/token/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "serialize.go", "token.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/gopkg.in/gcfg.v1/types/BUILD b/vendor/gopkg.in/gcfg.v1/types/BUILD index ab08d32782f..06997039631 100644 --- a/vendor/gopkg.in/gcfg.v1/types/BUILD +++ b/vendor/gopkg.in/gcfg.v1/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "int.go", "scan.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/gopkg.in/inf.v0/BUILD b/vendor/gopkg.in/inf.v0/BUILD index 0fea2554ddb..b4c1ec95a04 100644 --- a/vendor/gopkg.in/inf.v0/BUILD +++ b/vendor/gopkg.in/inf.v0/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "dec.go", "rounder.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/gopkg.in/natefinch/lumberjack.v2/BUILD b/vendor/gopkg.in/natefinch/lumberjack.v2/BUILD index e8827c50339..7190fefe21b 100644 --- a/vendor/gopkg.in/natefinch/lumberjack.v2/BUILD +++ b/vendor/gopkg.in/natefinch/lumberjack.v2/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,10 +8,14 @@ load( go_library( name = "go_default_library", srcs = [ - "chown_linux.go", + "chown.go", "lumberjack.go", - ], - tags = ["automanaged"], + ] + select({ + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "chown_linux.go", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/vendor/gopkg.in/warnings.v0/BUILD b/vendor/gopkg.in/warnings.v0/BUILD index c2d0a12d102..2c91be054b6 100644 --- a/vendor/gopkg.in/warnings.v0/BUILD +++ b/vendor/gopkg.in/warnings.v0/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["warnings.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/gopkg.in/yaml.v2/BUILD b/vendor/gopkg.in/yaml.v2/BUILD index c6872b0d97f..b40dbfa18e0 100644 --- a/vendor/gopkg.in/yaml.v2/BUILD +++ b/vendor/gopkg.in/yaml.v2/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -24,7 +22,6 @@ go_library( "yamlh.go", "yamlprivateh.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/k8s.io/gengo/args/BUILD b/vendor/k8s.io/gengo/args/BUILD index e34d3497f7a..3906cdd6c04 100644 --- a/vendor/k8s.io/gengo/args/BUILD +++ b/vendor/k8s.io/gengo/args/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["args.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/spf13/pflag:go_default_library", "//vendor/k8s.io/gengo/generator:go_default_library", diff --git a/vendor/k8s.io/gengo/examples/deepcopy-gen/generators/BUILD b/vendor/k8s.io/gengo/examples/deepcopy-gen/generators/BUILD index ad58ea7f4e8..1b2e0db5c54 100644 --- a/vendor/k8s.io/gengo/examples/deepcopy-gen/generators/BUILD +++ b/vendor/k8s.io/gengo/examples/deepcopy-gen/generators/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["deepcopy.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", diff --git a/vendor/k8s.io/gengo/examples/defaulter-gen/generators/BUILD b/vendor/k8s.io/gengo/examples/defaulter-gen/generators/BUILD index 4b9a8012f2b..aae32bf992e 100644 --- a/vendor/k8s.io/gengo/examples/defaulter-gen/generators/BUILD +++ b/vendor/k8s.io/gengo/examples/defaulter-gen/generators/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["defaulter.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", diff --git a/vendor/k8s.io/gengo/examples/import-boss/generators/BUILD b/vendor/k8s.io/gengo/examples/import-boss/generators/BUILD index af454efe5d4..3aec8d17e55 100644 --- a/vendor/k8s.io/gengo/examples/import-boss/generators/BUILD +++ b/vendor/k8s.io/gengo/examples/import-boss/generators/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["import_restrict.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", diff --git a/vendor/k8s.io/gengo/examples/set-gen/generators/BUILD b/vendor/k8s.io/gengo/examples/set-gen/generators/BUILD index 8ceb4cf2331..cba2169a5e5 100644 --- a/vendor/k8s.io/gengo/examples/set-gen/generators/BUILD +++ b/vendor/k8s.io/gengo/examples/set-gen/generators/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "sets.go", "tags.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", diff --git a/vendor/k8s.io/gengo/examples/set-gen/sets/BUILD b/vendor/k8s.io/gengo/examples/set-gen/sets/BUILD index 666bfc7bfaf..b68ae7170fb 100644 --- a/vendor/k8s.io/gengo/examples/set-gen/sets/BUILD +++ b/vendor/k8s.io/gengo/examples/set-gen/sets/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -17,7 +15,6 @@ go_library( "int64.go", "string.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/k8s.io/gengo/generator/BUILD b/vendor/k8s.io/gengo/generator/BUILD index 9b272067edf..2acae9f1b81 100644 --- a/vendor/k8s.io/gengo/generator/BUILD +++ b/vendor/k8s.io/gengo/generator/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -19,7 +17,6 @@ go_library( "import_tracker.go", "snippet_writer.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/gengo/namer:go_default_library", diff --git a/vendor/k8s.io/gengo/namer/BUILD b/vendor/k8s.io/gengo/namer/BUILD index 5ce6165ed24..f98c0f9bfcb 100644 --- a/vendor/k8s.io/gengo/namer/BUILD +++ b/vendor/k8s.io/gengo/namer/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -16,7 +14,6 @@ go_library( "order.go", "plural_namer.go", ], - tags = ["automanaged"], deps = ["//vendor/k8s.io/gengo/types:go_default_library"], ) diff --git a/vendor/k8s.io/gengo/parser/BUILD b/vendor/k8s.io/gengo/parser/BUILD index e2f618fe9e1..7c139474767 100644 --- a/vendor/k8s.io/gengo/parser/BUILD +++ b/vendor/k8s.io/gengo/parser/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "parse.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/gengo/types:go_default_library", diff --git a/vendor/k8s.io/gengo/types/BUILD b/vendor/k8s.io/gengo/types/BUILD index 85e6bec816c..77e5086f018 100644 --- a/vendor/k8s.io/gengo/types/BUILD +++ b/vendor/k8s.io/gengo/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -15,7 +13,6 @@ go_library( "flatten.go", "types.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/k8s.io/heapster/metrics/api/v1/types/BUILD b/vendor/k8s.io/heapster/metrics/api/v1/types/BUILD index 927c9b1fb7c..20bfb766998 100644 --- a/vendor/k8s.io/heapster/metrics/api/v1/types/BUILD +++ b/vendor/k8s.io/heapster/metrics/api/v1/types/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "model_types.go", "types.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/k8s.io/kube-openapi/pkg/aggregator/BUILD b/vendor/k8s.io/kube-openapi/pkg/aggregator/BUILD index fdf593919e4..2670fed0744 100644 --- a/vendor/k8s.io/kube-openapi/pkg/aggregator/BUILD +++ b/vendor/k8s.io/kube-openapi/pkg/aggregator/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["aggregator.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/go-openapi/spec:go_default_library", "//vendor/k8s.io/kube-openapi/pkg/util:go_default_library", diff --git a/vendor/k8s.io/kube-openapi/pkg/builder/BUILD b/vendor/k8s.io/kube-openapi/pkg/builder/BUILD index 5a7eec577bd..3ae3365ead2 100644 --- a/vendor/k8s.io/kube-openapi/pkg/builder/BUILD +++ b/vendor/k8s.io/kube-openapi/pkg/builder/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -14,7 +12,6 @@ go_library( "openapi.go", "util.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/emicklei/go-restful:go_default_library", "//vendor/github.com/go-openapi/spec:go_default_library", diff --git a/vendor/k8s.io/kube-openapi/pkg/common/BUILD b/vendor/k8s.io/kube-openapi/pkg/common/BUILD index d681ed3f76d..a753617b5a5 100644 --- a/vendor/k8s.io/kube-openapi/pkg/common/BUILD +++ b/vendor/k8s.io/kube-openapi/pkg/common/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "common.go", "doc.go", ], - tags = ["automanaged"], deps = [ "//vendor/github.com/emicklei/go-restful:go_default_library", "//vendor/github.com/go-openapi/spec:go_default_library", diff --git a/vendor/k8s.io/kube-openapi/pkg/generators/BUILD b/vendor/k8s.io/kube-openapi/pkg/generators/BUILD index e121430cefd..f843067a4d3 100644 --- a/vendor/k8s.io/kube-openapi/pkg/generators/BUILD +++ b/vendor/k8s.io/kube-openapi/pkg/generators/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["openapi.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", diff --git a/vendor/k8s.io/kube-openapi/pkg/handler/BUILD b/vendor/k8s.io/kube-openapi/pkg/handler/BUILD index 7683a18e4ed..25c8d529345 100644 --- a/vendor/k8s.io/kube-openapi/pkg/handler/BUILD +++ b/vendor/k8s.io/kube-openapi/pkg/handler/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["handler.go"], - tags = ["automanaged"], deps = [ "//vendor/github.com/NYTimes/gziphandler:go_default_library", "//vendor/github.com/emicklei/go-restful:go_default_library", diff --git a/vendor/k8s.io/kube-openapi/pkg/util/BUILD b/vendor/k8s.io/kube-openapi/pkg/util/BUILD index d749f9c257f..a0d3a47cb72 100644 --- a/vendor/k8s.io/kube-openapi/pkg/util/BUILD +++ b/vendor/k8s.io/kube-openapi/pkg/util/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["trie.go"], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/k8s.io/utils/exec/BUILD b/vendor/k8s.io/utils/exec/BUILD index fc449980efa..1e59b57d7d4 100644 --- a/vendor/k8s.io/utils/exec/BUILD +++ b/vendor/k8s.io/utils/exec/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "exec.go", ], - tags = ["automanaged"], ) filegroup( diff --git a/vendor/k8s.io/utils/exec/testing/BUILD b/vendor/k8s.io/utils/exec/testing/BUILD index 130edf6f3a4..eab4f5f2c25 100644 --- a/vendor/k8s.io/utils/exec/testing/BUILD +++ b/vendor/k8s.io/utils/exec/testing/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -10,7 +8,6 @@ load( go_library( name = "go_default_library", srcs = ["fake_exec.go"], - tags = ["automanaged"], deps = ["//vendor/k8s.io/utils/exec:go_default_library"], ) diff --git a/vendor/vbom.ml/util/sortorder/BUILD b/vendor/vbom.ml/util/sortorder/BUILD index a2743053ab5..51010587246 100644 --- a/vendor/vbom.ml/util/sortorder/BUILD +++ b/vendor/vbom.ml/util/sortorder/BUILD @@ -1,7 +1,5 @@ package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) - load( "@io_bazel_rules_go//go:def.bzl", "go_library", @@ -13,7 +11,6 @@ go_library( "doc.go", "natsort.go", ], - tags = ["automanaged"], ) filegroup(