mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-10-31 02:08:13 +00:00 
			
		
		
		
	Merge pull request #42128 from jsafrane/v1-2-combined
Automatic merge from submit-queue (batch tested with PRs 42128, 42064, 42253, 42309, 42322) Add storage.k8s.io/v1 API This is combined version of reverted #40088 (first 4 commits) and #41646. The difference is that all controllers and tests use old `storage.k8s.io/v1beta1` API so in theory all tests can pass on GKE. Release note: ```release-note StorageClassName attribute has been added to PersistentVolume and PersistentVolumeClaim objects and should be used instead of annotation `volume.beta.kubernetes.io/storage-class`. The beta annotation is still working in this release, however it will be removed in a future release. ```
This commit is contained in:
		| @@ -36418,6 +36418,589 @@ | |||||||
|      } |      } | ||||||
|     } |     } | ||||||
|    }, |    }, | ||||||
|  |    "/apis/storage.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": [ | ||||||
|  |       "storage_v1" | ||||||
|  |      ], | ||||||
|  |      "operationId": "getStorageV1APIResources", | ||||||
|  |      "responses": { | ||||||
|  |       "200": { | ||||||
|  |        "description": "OK", | ||||||
|  |        "schema": { | ||||||
|  |         "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" | ||||||
|  |        } | ||||||
|  |       }, | ||||||
|  |       "401": { | ||||||
|  |        "description": "Unauthorized" | ||||||
|  |       } | ||||||
|  |      } | ||||||
|  |     } | ||||||
|  |    }, | ||||||
|  |    "/apis/storage.k8s.io/v1/storageclasses": { | ||||||
|  |     "get": { | ||||||
|  |      "description": "list or watch objects of kind StorageClass", | ||||||
|  |      "consumes": [ | ||||||
|  |       "*/*" | ||||||
|  |      ], | ||||||
|  |      "produces": [ | ||||||
|  |       "application/json", | ||||||
|  |       "application/yaml", | ||||||
|  |       "application/vnd.kubernetes.protobuf", | ||||||
|  |       "application/json;stream=watch", | ||||||
|  |       "application/vnd.kubernetes.protobuf;stream=watch" | ||||||
|  |      ], | ||||||
|  |      "schemes": [ | ||||||
|  |       "https" | ||||||
|  |      ], | ||||||
|  |      "tags": [ | ||||||
|  |       "storage_v1" | ||||||
|  |      ], | ||||||
|  |      "operationId": "listStorageV1StorageClass", | ||||||
|  |      "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": "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.kubernetes.pkg.apis.storage.v1.StorageClassList" | ||||||
|  |        } | ||||||
|  |       }, | ||||||
|  |       "401": { | ||||||
|  |        "description": "Unauthorized" | ||||||
|  |       } | ||||||
|  |      } | ||||||
|  |     }, | ||||||
|  |     "post": { | ||||||
|  |      "description": "create a StorageClass", | ||||||
|  |      "consumes": [ | ||||||
|  |       "*/*" | ||||||
|  |      ], | ||||||
|  |      "produces": [ | ||||||
|  |       "application/json", | ||||||
|  |       "application/yaml", | ||||||
|  |       "application/vnd.kubernetes.protobuf" | ||||||
|  |      ], | ||||||
|  |      "schemes": [ | ||||||
|  |       "https" | ||||||
|  |      ], | ||||||
|  |      "tags": [ | ||||||
|  |       "storage_v1" | ||||||
|  |      ], | ||||||
|  |      "operationId": "createStorageV1StorageClass", | ||||||
|  |      "parameters": [ | ||||||
|  |       { | ||||||
|  |        "name": "body", | ||||||
|  |        "in": "body", | ||||||
|  |        "required": true, | ||||||
|  |        "schema": { | ||||||
|  |         "$ref": "#/definitions/io.k8s.kubernetes.pkg.apis.storage.v1.StorageClass" | ||||||
|  |        } | ||||||
|  |       } | ||||||
|  |      ], | ||||||
|  |      "responses": { | ||||||
|  |       "200": { | ||||||
|  |        "description": "OK", | ||||||
|  |        "schema": { | ||||||
|  |         "$ref": "#/definitions/io.k8s.kubernetes.pkg.apis.storage.v1.StorageClass" | ||||||
|  |        } | ||||||
|  |       }, | ||||||
|  |       "401": { | ||||||
|  |        "description": "Unauthorized" | ||||||
|  |       } | ||||||
|  |      } | ||||||
|  |     }, | ||||||
|  |     "delete": { | ||||||
|  |      "description": "delete collection of StorageClass", | ||||||
|  |      "consumes": [ | ||||||
|  |       "*/*" | ||||||
|  |      ], | ||||||
|  |      "produces": [ | ||||||
|  |       "application/json", | ||||||
|  |       "application/yaml", | ||||||
|  |       "application/vnd.kubernetes.protobuf" | ||||||
|  |      ], | ||||||
|  |      "schemes": [ | ||||||
|  |       "https" | ||||||
|  |      ], | ||||||
|  |      "tags": [ | ||||||
|  |       "storage_v1" | ||||||
|  |      ], | ||||||
|  |      "operationId": "deleteStorageV1CollectionStorageClass", | ||||||
|  |      "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": "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" | ||||||
|  |       } | ||||||
|  |      } | ||||||
|  |     }, | ||||||
|  |     "parameters": [ | ||||||
|  |      { | ||||||
|  |       "uniqueItems": true, | ||||||
|  |       "type": "string", | ||||||
|  |       "description": "If 'true', then the output is pretty printed.", | ||||||
|  |       "name": "pretty", | ||||||
|  |       "in": "query" | ||||||
|  |      } | ||||||
|  |     ] | ||||||
|  |    }, | ||||||
|  |    "/apis/storage.k8s.io/v1/storageclasses/{name}": { | ||||||
|  |     "get": { | ||||||
|  |      "description": "read the specified StorageClass", | ||||||
|  |      "consumes": [ | ||||||
|  |       "*/*" | ||||||
|  |      ], | ||||||
|  |      "produces": [ | ||||||
|  |       "application/json", | ||||||
|  |       "application/yaml", | ||||||
|  |       "application/vnd.kubernetes.protobuf" | ||||||
|  |      ], | ||||||
|  |      "schemes": [ | ||||||
|  |       "https" | ||||||
|  |      ], | ||||||
|  |      "tags": [ | ||||||
|  |       "storage_v1" | ||||||
|  |      ], | ||||||
|  |      "operationId": "readStorageV1StorageClass", | ||||||
|  |      "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.kubernetes.pkg.apis.storage.v1.StorageClass" | ||||||
|  |        } | ||||||
|  |       }, | ||||||
|  |       "401": { | ||||||
|  |        "description": "Unauthorized" | ||||||
|  |       } | ||||||
|  |      } | ||||||
|  |     }, | ||||||
|  |     "put": { | ||||||
|  |      "description": "replace the specified StorageClass", | ||||||
|  |      "consumes": [ | ||||||
|  |       "*/*" | ||||||
|  |      ], | ||||||
|  |      "produces": [ | ||||||
|  |       "application/json", | ||||||
|  |       "application/yaml", | ||||||
|  |       "application/vnd.kubernetes.protobuf" | ||||||
|  |      ], | ||||||
|  |      "schemes": [ | ||||||
|  |       "https" | ||||||
|  |      ], | ||||||
|  |      "tags": [ | ||||||
|  |       "storage_v1" | ||||||
|  |      ], | ||||||
|  |      "operationId": "replaceStorageV1StorageClass", | ||||||
|  |      "parameters": [ | ||||||
|  |       { | ||||||
|  |        "name": "body", | ||||||
|  |        "in": "body", | ||||||
|  |        "required": true, | ||||||
|  |        "schema": { | ||||||
|  |         "$ref": "#/definitions/io.k8s.kubernetes.pkg.apis.storage.v1.StorageClass" | ||||||
|  |        } | ||||||
|  |       } | ||||||
|  |      ], | ||||||
|  |      "responses": { | ||||||
|  |       "200": { | ||||||
|  |        "description": "OK", | ||||||
|  |        "schema": { | ||||||
|  |         "$ref": "#/definitions/io.k8s.kubernetes.pkg.apis.storage.v1.StorageClass" | ||||||
|  |        } | ||||||
|  |       }, | ||||||
|  |       "401": { | ||||||
|  |        "description": "Unauthorized" | ||||||
|  |       } | ||||||
|  |      } | ||||||
|  |     }, | ||||||
|  |     "delete": { | ||||||
|  |      "description": "delete a StorageClass", | ||||||
|  |      "consumes": [ | ||||||
|  |       "*/*" | ||||||
|  |      ], | ||||||
|  |      "produces": [ | ||||||
|  |       "application/json", | ||||||
|  |       "application/yaml", | ||||||
|  |       "application/vnd.kubernetes.protobuf" | ||||||
|  |      ], | ||||||
|  |      "schemes": [ | ||||||
|  |       "https" | ||||||
|  |      ], | ||||||
|  |      "tags": [ | ||||||
|  |       "storage_v1" | ||||||
|  |      ], | ||||||
|  |      "operationId": "deleteStorageV1StorageClass", | ||||||
|  |      "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. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", | ||||||
|  |        "name": "propagationPolicy", | ||||||
|  |        "in": "query" | ||||||
|  |       } | ||||||
|  |      ], | ||||||
|  |      "responses": { | ||||||
|  |       "200": { | ||||||
|  |        "description": "OK", | ||||||
|  |        "schema": { | ||||||
|  |         "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" | ||||||
|  |        } | ||||||
|  |       }, | ||||||
|  |       "401": { | ||||||
|  |        "description": "Unauthorized" | ||||||
|  |       } | ||||||
|  |      } | ||||||
|  |     }, | ||||||
|  |     "patch": { | ||||||
|  |      "description": "partially update the specified StorageClass", | ||||||
|  |      "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": [ | ||||||
|  |       "storage_v1" | ||||||
|  |      ], | ||||||
|  |      "operationId": "patchStorageV1StorageClass", | ||||||
|  |      "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.kubernetes.pkg.apis.storage.v1.StorageClass" | ||||||
|  |        } | ||||||
|  |       }, | ||||||
|  |       "401": { | ||||||
|  |        "description": "Unauthorized" | ||||||
|  |       } | ||||||
|  |      } | ||||||
|  |     }, | ||||||
|  |     "parameters": [ | ||||||
|  |      { | ||||||
|  |       "uniqueItems": true, | ||||||
|  |       "type": "string", | ||||||
|  |       "description": "name of the StorageClass", | ||||||
|  |       "name": "name", | ||||||
|  |       "in": "path", | ||||||
|  |       "required": true | ||||||
|  |      }, | ||||||
|  |      { | ||||||
|  |       "uniqueItems": true, | ||||||
|  |       "type": "string", | ||||||
|  |       "description": "If 'true', then the output is pretty printed.", | ||||||
|  |       "name": "pretty", | ||||||
|  |       "in": "query" | ||||||
|  |      } | ||||||
|  |     ] | ||||||
|  |    }, | ||||||
|  |    "/apis/storage.k8s.io/v1/watch/storageclasses": { | ||||||
|  |     "get": { | ||||||
|  |      "description": "watch individual changes to a list of StorageClass", | ||||||
|  |      "consumes": [ | ||||||
|  |       "*/*" | ||||||
|  |      ], | ||||||
|  |      "produces": [ | ||||||
|  |       "application/json", | ||||||
|  |       "application/yaml", | ||||||
|  |       "application/vnd.kubernetes.protobuf", | ||||||
|  |       "application/json;stream=watch", | ||||||
|  |       "application/vnd.kubernetes.protobuf;stream=watch" | ||||||
|  |      ], | ||||||
|  |      "schemes": [ | ||||||
|  |       "https" | ||||||
|  |      ], | ||||||
|  |      "tags": [ | ||||||
|  |       "storage_v1" | ||||||
|  |      ], | ||||||
|  |      "operationId": "watchStorageV1StorageClassList", | ||||||
|  |      "responses": { | ||||||
|  |       "200": { | ||||||
|  |        "description": "OK", | ||||||
|  |        "schema": { | ||||||
|  |         "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" | ||||||
|  |        } | ||||||
|  |       }, | ||||||
|  |       "401": { | ||||||
|  |        "description": "Unauthorized" | ||||||
|  |       } | ||||||
|  |      } | ||||||
|  |     }, | ||||||
|  |     "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": "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/storage.k8s.io/v1/watch/storageclasses/{name}": { | ||||||
|  |     "get": { | ||||||
|  |      "description": "watch changes to an object of kind StorageClass", | ||||||
|  |      "consumes": [ | ||||||
|  |       "*/*" | ||||||
|  |      ], | ||||||
|  |      "produces": [ | ||||||
|  |       "application/json", | ||||||
|  |       "application/yaml", | ||||||
|  |       "application/vnd.kubernetes.protobuf", | ||||||
|  |       "application/json;stream=watch", | ||||||
|  |       "application/vnd.kubernetes.protobuf;stream=watch" | ||||||
|  |      ], | ||||||
|  |      "schemes": [ | ||||||
|  |       "https" | ||||||
|  |      ], | ||||||
|  |      "tags": [ | ||||||
|  |       "storage_v1" | ||||||
|  |      ], | ||||||
|  |      "operationId": "watchStorageV1StorageClass", | ||||||
|  |      "responses": { | ||||||
|  |       "200": { | ||||||
|  |        "description": "OK", | ||||||
|  |        "schema": { | ||||||
|  |         "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" | ||||||
|  |        } | ||||||
|  |       }, | ||||||
|  |       "401": { | ||||||
|  |        "description": "Unauthorized" | ||||||
|  |       } | ||||||
|  |      } | ||||||
|  |     }, | ||||||
|  |     "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": "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 StorageClass", | ||||||
|  |       "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/storage.k8s.io/v1beta1/": { |    "/apis/storage.k8s.io/v1beta1/": { | ||||||
|     "get": { |     "get": { | ||||||
|      "description": "get available resources", |      "description": "get available resources", | ||||||
| @@ -46139,6 +46722,78 @@ | |||||||
|      } |      } | ||||||
|     } |     } | ||||||
|    }, |    }, | ||||||
|  |    "io.k8s.kubernetes.pkg.apis.storage.v1.StorageClass": { | ||||||
|  |     "description": "StorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned.\n\nStorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.", | ||||||
|  |     "required": [ | ||||||
|  |      "provisioner" | ||||||
|  |     ], | ||||||
|  |     "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: http://releases.k8s.io/HEAD/docs/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: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds", | ||||||
|  |       "type": "string" | ||||||
|  |      }, | ||||||
|  |      "metadata": { | ||||||
|  |       "description": "Standard object's metadata. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata", | ||||||
|  |       "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" | ||||||
|  |      }, | ||||||
|  |      "parameters": { | ||||||
|  |       "description": "Parameters holds the parameters for the provisioner that should create volumes of this storage class.", | ||||||
|  |       "type": "object", | ||||||
|  |       "additionalProperties": { | ||||||
|  |        "type": "string" | ||||||
|  |       } | ||||||
|  |      }, | ||||||
|  |      "provisioner": { | ||||||
|  |       "description": "Provisioner indicates the type of the provisioner.", | ||||||
|  |       "type": "string" | ||||||
|  |      } | ||||||
|  |     }, | ||||||
|  |     "x-kubernetes-group-version-kind": [ | ||||||
|  |      { | ||||||
|  |       "Group": "storage.k8s.io", | ||||||
|  |       "Version": "v1", | ||||||
|  |       "Kind": "StorageClass" | ||||||
|  |      } | ||||||
|  |     ] | ||||||
|  |    }, | ||||||
|  |    "io.k8s.kubernetes.pkg.apis.storage.v1.StorageClassList": { | ||||||
|  |     "description": "StorageClassList is a collection of storage classes.", | ||||||
|  |     "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: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources", | ||||||
|  |       "type": "string" | ||||||
|  |      }, | ||||||
|  |      "items": { | ||||||
|  |       "description": "Items is the list of StorageClasses", | ||||||
|  |       "type": "array", | ||||||
|  |       "items": { | ||||||
|  |        "$ref": "#/definitions/io.k8s.kubernetes.pkg.apis.storage.v1.StorageClass" | ||||||
|  |       } | ||||||
|  |      }, | ||||||
|  |      "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: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds", | ||||||
|  |       "type": "string" | ||||||
|  |      }, | ||||||
|  |      "metadata": { | ||||||
|  |       "description": "Standard list metadata More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata", | ||||||
|  |       "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" | ||||||
|  |      } | ||||||
|  |     }, | ||||||
|  |     "x-kubernetes-group-version-kind": [ | ||||||
|  |      { | ||||||
|  |       "Group": "storage.k8s.io", | ||||||
|  |       "Version": "v1", | ||||||
|  |       "Kind": "StorageClassList" | ||||||
|  |      } | ||||||
|  |     ] | ||||||
|  |    }, | ||||||
|    "io.k8s.kubernetes.pkg.apis.storage.v1beta1.StorageClass": { |    "io.k8s.kubernetes.pkg.apis.storage.v1beta1.StorageClass": { | ||||||
|     "description": "StorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned.\n\nStorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.", |     "description": "StorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned.\n\nStorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.", | ||||||
|     "required": [ |     "required": [ | ||||||
|   | |||||||
| @@ -117,6 +117,10 @@ | |||||||
|     "path": "/apis/storage.k8s.io/v1beta1", |     "path": "/apis/storage.k8s.io/v1beta1", | ||||||
|     "description": "API at /apis/storage.k8s.io/v1beta1" |     "description": "API at /apis/storage.k8s.io/v1beta1" | ||||||
|    }, |    }, | ||||||
|  |    { | ||||||
|  |     "path": "/apis/storage.k8s.io/v1", | ||||||
|  |     "description": "API at /apis/storage.k8s.io/v1" | ||||||
|  |    }, | ||||||
|    { |    { | ||||||
|     "path": "/apis/storage.k8s.io", |     "path": "/apis/storage.k8s.io", | ||||||
|     "description": "get information of a group" |     "description": "get information of a group" | ||||||
|   | |||||||
							
								
								
									
										1024
									
								
								api/swagger-spec/storage.k8s.io_v1.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1024
									
								
								api/swagger-spec/storage.k8s.io_v1.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -87,6 +87,7 @@ func New() *Generator { | |||||||
| 			`k8s.io/kubernetes/pkg/apis/imagepolicy/v1alpha1`, | 			`k8s.io/kubernetes/pkg/apis/imagepolicy/v1alpha1`, | ||||||
| 			`k8s.io/kubernetes/pkg/apis/settings/v1alpha1`, | 			`k8s.io/kubernetes/pkg/apis/settings/v1alpha1`, | ||||||
| 			`k8s.io/kubernetes/pkg/apis/storage/v1beta1`, | 			`k8s.io/kubernetes/pkg/apis/storage/v1beta1`, | ||||||
|  | 			`k8s.io/kubernetes/pkg/apis/storage/v1`, | ||||||
| 		}, ","), | 		}, ","), | ||||||
| 		DropEmbeddedFields: "k8s.io/apimachinery/pkg/apis/meta/v1.TypeMeta", | 		DropEmbeddedFields: "k8s.io/apimachinery/pkg/apis/meta/v1.TypeMeta", | ||||||
| 	} | 	} | ||||||
|   | |||||||
							
								
								
									
										1245
									
								
								docs/api-reference/storage.k8s.io/v1/definitions.html
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										1245
									
								
								docs/api-reference/storage.k8s.io/v1/definitions.html
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1677
									
								
								docs/api-reference/storage.k8s.io/v1/operations.html
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										1677
									
								
								docs/api-reference/storage.k8s.io/v1/operations.html
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -108,6 +108,7 @@ pkg/client/informers/informers_generated/externalversions/rbac/v1beta1 | |||||||
| pkg/client/informers/informers_generated/externalversions/settings | pkg/client/informers/informers_generated/externalversions/settings | ||||||
| pkg/client/informers/informers_generated/externalversions/settings/v1alpha1 | pkg/client/informers/informers_generated/externalversions/settings/v1alpha1 | ||||||
| pkg/client/informers/informers_generated/externalversions/storage | pkg/client/informers/informers_generated/externalversions/storage | ||||||
|  | pkg/client/informers/informers_generated/externalversions/storage/v1 | ||||||
| pkg/client/informers/informers_generated/externalversions/storage/v1beta1 | pkg/client/informers/informers_generated/externalversions/storage/v1beta1 | ||||||
| pkg/client/informers/informers_generated/internalversion | pkg/client/informers/informers_generated/internalversion | ||||||
| pkg/client/informers/informers_generated/internalversion/apps | pkg/client/informers/informers_generated/internalversion/apps | ||||||
| @@ -161,6 +162,7 @@ pkg/client/listers/rbac/v1beta1 | |||||||
| pkg/client/listers/settings/internalversion | pkg/client/listers/settings/internalversion | ||||||
| pkg/client/listers/settings/v1alpha1 | pkg/client/listers/settings/v1alpha1 | ||||||
| pkg/client/listers/storage/internalversion | pkg/client/listers/storage/internalversion | ||||||
|  | pkg/client/listers/storage/v1 | ||||||
| pkg/client/listers/storage/v1beta1 | pkg/client/listers/storage/v1beta1 | ||||||
| pkg/client/metrics | pkg/client/metrics | ||||||
| pkg/client/metrics/prometheus | pkg/client/metrics/prometheus | ||||||
| @@ -345,6 +347,7 @@ staging/src/k8s.io/client-go/informers/rbac/v1beta1 | |||||||
| staging/src/k8s.io/client-go/informers/settings | staging/src/k8s.io/client-go/informers/settings | ||||||
| staging/src/k8s.io/client-go/informers/settings/v1alpha1 | staging/src/k8s.io/client-go/informers/settings/v1alpha1 | ||||||
| staging/src/k8s.io/client-go/informers/storage | staging/src/k8s.io/client-go/informers/storage | ||||||
|  | staging/src/k8s.io/client-go/informers/storage/v1 | ||||||
| staging/src/k8s.io/client-go/informers/storage/v1beta1 | staging/src/k8s.io/client-go/informers/storage/v1beta1 | ||||||
| staging/src/k8s.io/client-go/listers/apps/v1beta1 | staging/src/k8s.io/client-go/listers/apps/v1beta1 | ||||||
| staging/src/k8s.io/client-go/listers/autoscaling/v1 | staging/src/k8s.io/client-go/listers/autoscaling/v1 | ||||||
| @@ -358,6 +361,7 @@ staging/src/k8s.io/client-go/listers/policy/v1beta1 | |||||||
| staging/src/k8s.io/client-go/listers/rbac/v1alpha1 | staging/src/k8s.io/client-go/listers/rbac/v1alpha1 | ||||||
| staging/src/k8s.io/client-go/listers/rbac/v1beta1 | staging/src/k8s.io/client-go/listers/rbac/v1beta1 | ||||||
| staging/src/k8s.io/client-go/listers/settings/v1alpha1 | staging/src/k8s.io/client-go/listers/settings/v1alpha1 | ||||||
|  | staging/src/k8s.io/client-go/listers/storage/v1 | ||||||
| staging/src/k8s.io/client-go/listers/storage/v1beta1 | staging/src/k8s.io/client-go/listers/storage/v1beta1 | ||||||
| staging/src/k8s.io/client-go/plugin/pkg/client/auth | staging/src/k8s.io/client-go/plugin/pkg/client/auth | ||||||
| staging/src/k8s.io/client-go/plugin/pkg/client/auth/gcp | staging/src/k8s.io/client-go/plugin/pkg/client/auth/gcp | ||||||
|   | |||||||
| @@ -70,6 +70,7 @@ rbac.authorization.k8s.io/v1beta1 \ | |||||||
| rbac.authorization.k8s.io/v1alpha1 \ | rbac.authorization.k8s.io/v1alpha1 \ | ||||||
| settings.k8s.io/v1alpha1 \ | settings.k8s.io/v1alpha1 \ | ||||||
| storage.k8s.io/v1beta1 \ | storage.k8s.io/v1beta1 \ | ||||||
|  | storage.k8s.io/v1\ | ||||||
| }" | }" | ||||||
|  |  | ||||||
| # not all group versions are exposed by the server.  This list contains those | # not all group versions are exposed by the server.  This list contains those | ||||||
|   | |||||||
| @@ -3282,7 +3282,7 @@ runTests() { | |||||||
|     kubectl create -f - "${kube_flags[@]}" << __EOF__ |     kubectl create -f - "${kube_flags[@]}" << __EOF__ | ||||||
| { | { | ||||||
|   "kind": "StorageClass", |   "kind": "StorageClass", | ||||||
|   "apiVersion": "storage.k8s.io/v1beta1", |   "apiVersion": "storage.k8s.io/v1", | ||||||
|   "metadata": { |   "metadata": { | ||||||
|     "name": "storage-class-name" |     "name": "storage-class-name" | ||||||
|   }, |   }, | ||||||
|   | |||||||
| @@ -72,6 +72,7 @@ filegroup( | |||||||
|         "//pkg/client/listers/settings/internalversion:all-srcs", |         "//pkg/client/listers/settings/internalversion:all-srcs", | ||||||
|         "//pkg/client/listers/settings/v1alpha1:all-srcs", |         "//pkg/client/listers/settings/v1alpha1:all-srcs", | ||||||
|         "//pkg/client/listers/storage/internalversion:all-srcs", |         "//pkg/client/listers/storage/internalversion:all-srcs", | ||||||
|  |         "//pkg/client/listers/storage/v1:all-srcs", | ||||||
|         "//pkg/client/listers/storage/v1beta1:all-srcs", |         "//pkg/client/listers/storage/v1beta1:all-srcs", | ||||||
|         "//pkg/client/metrics:all-srcs", |         "//pkg/client/metrics:all-srcs", | ||||||
|         "//pkg/client/retry:all-srcs", |         "//pkg/client/retry:all-srcs", | ||||||
|   | |||||||
| @@ -557,3 +557,42 @@ func PodAnnotationsFromSysctls(sysctls []Sysctl) string { | |||||||
| 	} | 	} | ||||||
| 	return strings.Join(kvs, ",") | 	return strings.Join(kvs, ",") | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetPersistentVolumeClass returns StorageClassName. | ||||||
|  | func GetPersistentVolumeClass(volume *PersistentVolume) string { | ||||||
|  | 	// Use beta annotation first | ||||||
|  | 	if class, found := volume.Annotations[BetaStorageClassAnnotation]; found { | ||||||
|  | 		return class | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return volume.Spec.StorageClassName | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPersistentVolumeClaimClass returns StorageClassName. If no storage class was | ||||||
|  | // requested, it returns "". | ||||||
|  | func GetPersistentVolumeClaimClass(claim *PersistentVolumeClaim) string { | ||||||
|  | 	// Use beta annotation first | ||||||
|  | 	if class, found := claim.Annotations[BetaStorageClassAnnotation]; found { | ||||||
|  | 		return class | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if claim.Spec.StorageClassName != nil { | ||||||
|  | 		return *claim.Spec.StorageClassName | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return "" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // PersistentVolumeClaimHasClass returns true if given claim has set StorageClassName field. | ||||||
|  | func PersistentVolumeClaimHasClass(claim *PersistentVolumeClaim) bool { | ||||||
|  | 	// Use beta annotation first | ||||||
|  | 	if _, found := claim.Annotations[BetaStorageClassAnnotation]; found { | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if claim.Spec.StorageClassName != nil { | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|   | |||||||
| @@ -375,6 +375,12 @@ type PersistentVolumeClaimVolumeSource struct { | |||||||
| 	ReadOnly bool | 	ReadOnly bool | ||||||
| } | } | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	// BetaStorageClassAnnotation represents the beta/previous StorageClass annotation. | ||||||
|  | 	// It's currently still used and will be held for backwards compatibility | ||||||
|  | 	BetaStorageClassAnnotation = "volume.beta.kubernetes.io/storage-class" | ||||||
|  | ) | ||||||
|  |  | ||||||
| // +genclient=true | // +genclient=true | ||||||
| // +nonNamespaced=true | // +nonNamespaced=true | ||||||
|  |  | ||||||
|   | |||||||
| @@ -591,3 +591,42 @@ func GetAffinityFromPodAnnotations(annotations map[string]string) (*Affinity, er | |||||||
| 	} | 	} | ||||||
| 	return nil, nil | 	return nil, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetPersistentVolumeClass returns StorageClassName. | ||||||
|  | func GetPersistentVolumeClass(volume *PersistentVolume) string { | ||||||
|  | 	// Use beta annotation first | ||||||
|  | 	if class, found := volume.Annotations[BetaStorageClassAnnotation]; found { | ||||||
|  | 		return class | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return volume.Spec.StorageClassName | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPersistentVolumeClaimClass returns StorageClassName. If no storage class was | ||||||
|  | // requested, it returns "". | ||||||
|  | func GetPersistentVolumeClaimClass(claim *PersistentVolumeClaim) string { | ||||||
|  | 	// Use beta annotation first | ||||||
|  | 	if class, found := claim.Annotations[BetaStorageClassAnnotation]; found { | ||||||
|  | 		return class | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if claim.Spec.StorageClassName != nil { | ||||||
|  | 		return *claim.Spec.StorageClassName | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return "" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // PersistentVolumeClaimHasClass returns true if given claim has set StorageClassName field. | ||||||
|  | func PersistentVolumeClaimHasClass(claim *PersistentVolumeClaim) bool { | ||||||
|  | 	// Use beta annotation first | ||||||
|  | 	if _, found := claim.Annotations[BetaStorageClassAnnotation]; found { | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if claim.Spec.StorageClassName != nil { | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|   | |||||||
| @@ -421,6 +421,17 @@ type PersistentVolumeSource struct { | |||||||
| 	PortworxVolume *PortworxVolumeSource `json:"portworxVolume,omitempty" protobuf:"bytes,18,opt,name=portworxVolume"` | 	PortworxVolume *PortworxVolumeSource `json:"portworxVolume,omitempty" protobuf:"bytes,18,opt,name=portworxVolume"` | ||||||
| } | } | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	// AlphaStorageClassAnnotation represents the previous alpha storage class | ||||||
|  | 	// annotation.  It's currently still used and will be held for backwards | ||||||
|  | 	// compatibility | ||||||
|  | 	AlphaStorageClassAnnotation = "volume.alpha.kubernetes.io/storage-class" | ||||||
|  |  | ||||||
|  | 	// BetaStorageClassAnnotation represents the beta/previous StorageClass annotation. | ||||||
|  | 	// It's currently still used and will be held for backwards compatibility | ||||||
|  | 	BetaStorageClassAnnotation = "volume.beta.kubernetes.io/storage-class" | ||||||
|  | ) | ||||||
|  |  | ||||||
| // +genclient=true | // +genclient=true | ||||||
| // +nonNamespaced=true | // +nonNamespaced=true | ||||||
|  |  | ||||||
|   | |||||||
| @@ -24,7 +24,6 @@ go_library( | |||||||
|         "//pkg/api/service:go_default_library", |         "//pkg/api/service:go_default_library", | ||||||
|         "//pkg/api/util:go_default_library", |         "//pkg/api/util:go_default_library", | ||||||
|         "//pkg/api/v1:go_default_library", |         "//pkg/api/v1:go_default_library", | ||||||
|         "//pkg/apis/storage/util:go_default_library", |  | ||||||
|         "//pkg/capabilities:go_default_library", |         "//pkg/capabilities:go_default_library", | ||||||
|         "//pkg/features:go_default_library", |         "//pkg/features:go_default_library", | ||||||
|         "//pkg/security/apparmor:go_default_library", |         "//pkg/security/apparmor:go_default_library", | ||||||
| @@ -99,7 +98,6 @@ go_test( | |||||||
|         "//pkg/api/testing:go_default_library", |         "//pkg/api/testing:go_default_library", | ||||||
|         "//pkg/api/v1:go_default_library", |         "//pkg/api/v1:go_default_library", | ||||||
|         "//pkg/apis/extensions/v1beta1:go_default_library", |         "//pkg/apis/extensions/v1beta1:go_default_library", | ||||||
|         "//pkg/apis/storage/util:go_default_library", |  | ||||||
|         "//pkg/capabilities:go_default_library", |         "//pkg/capabilities:go_default_library", | ||||||
|         "//pkg/security/apparmor:go_default_library", |         "//pkg/security/apparmor:go_default_library", | ||||||
|         "//pkg/volume:go_default_library", |         "//pkg/volume:go_default_library", | ||||||
|   | |||||||
| @@ -44,7 +44,6 @@ import ( | |||||||
| 	utilpod "k8s.io/kubernetes/pkg/api/pod" | 	utilpod "k8s.io/kubernetes/pkg/api/pod" | ||||||
| 	apiservice "k8s.io/kubernetes/pkg/api/service" | 	apiservice "k8s.io/kubernetes/pkg/api/service" | ||||||
| 	"k8s.io/kubernetes/pkg/api/v1" | 	"k8s.io/kubernetes/pkg/api/v1" | ||||||
| 	storageutil "k8s.io/kubernetes/pkg/apis/storage/util" |  | ||||||
| 	"k8s.io/kubernetes/pkg/capabilities" | 	"k8s.io/kubernetes/pkg/capabilities" | ||||||
| 	"k8s.io/kubernetes/pkg/features" | 	"k8s.io/kubernetes/pkg/features" | ||||||
| 	"k8s.io/kubernetes/pkg/security/apparmor" | 	"k8s.io/kubernetes/pkg/security/apparmor" | ||||||
| @@ -248,6 +247,11 @@ var ValidateEndpointsName = NameIsDNSSubdomain | |||||||
| // ValidateClusterName can be used to check whether the given cluster name is valid. | // ValidateClusterName can be used to check whether the given cluster name is valid. | ||||||
| var ValidateClusterName = genericvalidation.ValidateClusterName | var ValidateClusterName = genericvalidation.ValidateClusterName | ||||||
|  |  | ||||||
|  | // ValidateClassName can be used to check whether the given class name is valid. | ||||||
|  | // It is defined here to avoid import cycle between pkg/apis/storage/validation | ||||||
|  | // (where it should be) and this file. | ||||||
|  | var ValidateClassName = NameIsDNSSubdomain | ||||||
|  |  | ||||||
| // TODO update all references to these functions to point to the genericvalidation ones | // TODO update all references to these functions to point to the genericvalidation ones | ||||||
| // NameIsDNSSubdomain is a ValidateNameFunc for names that must be a DNS subdomain. | // NameIsDNSSubdomain is a ValidateNameFunc for names that must be a DNS subdomain. | ||||||
| func NameIsDNSSubdomain(name string, prefix bool) []string { | func NameIsDNSSubdomain(name string, prefix bool) []string { | ||||||
| @@ -1195,6 +1199,12 @@ func ValidatePersistentVolume(pv *api.PersistentVolume) field.ErrorList { | |||||||
| 		allErrs = append(allErrs, field.Forbidden(specPath.Child("persistentVolumeReclaimPolicy"), "may not be 'recycle' for a hostPath mount of '/'")) | 		allErrs = append(allErrs, field.Forbidden(specPath.Child("persistentVolumeReclaimPolicy"), "may not be 'recycle' for a hostPath mount of '/'")) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if len(pv.Spec.StorageClassName) > 0 { | ||||||
|  | 		for _, msg := range ValidateClassName(pv.Spec.StorageClassName, false) { | ||||||
|  | 			allErrs = append(allErrs, field.Invalid(specPath.Child("storageClassName"), pv.Spec.StorageClassName, msg)) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return allErrs | 	return allErrs | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -1245,6 +1255,12 @@ func ValidatePersistentVolumeClaimSpec(spec *api.PersistentVolumeClaimSpec, fldP | |||||||
| 	} else { | 	} else { | ||||||
| 		allErrs = append(allErrs, ValidateResourceQuantityValue(string(api.ResourceStorage), storageValue, fldPath.Child("resources").Key(string(api.ResourceStorage)))...) | 		allErrs = append(allErrs, ValidateResourceQuantityValue(string(api.ResourceStorage), storageValue, fldPath.Child("resources").Key(string(api.ResourceStorage)))...) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if spec.StorageClassName != nil && len(*spec.StorageClassName) > 0 { | ||||||
|  | 		for _, msg := range ValidateClassName(*spec.StorageClassName, false) { | ||||||
|  | 			allErrs = append(allErrs, field.Invalid(fldPath.Child("storageClassName"), *spec.StorageClassName, msg)) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| 	return allErrs | 	return allErrs | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -1267,7 +1283,8 @@ func ValidatePersistentVolumeClaimUpdate(newPvc, oldPvc *api.PersistentVolumeCla | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// storageclass annotation should be immutable after creation | 	// storageclass annotation should be immutable after creation | ||||||
| 	allErrs = append(allErrs, ValidateImmutableAnnotation(newPvc.ObjectMeta.Annotations[storageutil.StorageClassAnnotation], oldPvc.ObjectMeta.Annotations[storageutil.StorageClassAnnotation], storageutil.StorageClassAnnotation, field.NewPath("metadata"))...) | 	// TODO: remove Beta when no longer needed | ||||||
|  | 	allErrs = append(allErrs, ValidateImmutableAnnotation(newPvc.ObjectMeta.Annotations[v1.BetaStorageClassAnnotation], oldPvc.ObjectMeta.Annotations[v1.BetaStorageClassAnnotation], v1.BetaStorageClassAnnotation, field.NewPath("metadata"))...) | ||||||
|  |  | ||||||
| 	newPvc.Status = oldPvc.Status | 	newPvc.Status = oldPvc.Status | ||||||
| 	return allErrs | 	return allErrs | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ import ( | |||||||
| 	"k8s.io/apimachinery/pkg/util/validation/field" | 	"k8s.io/apimachinery/pkg/util/validation/field" | ||||||
| 	"k8s.io/kubernetes/pkg/api" | 	"k8s.io/kubernetes/pkg/api" | ||||||
| 	"k8s.io/kubernetes/pkg/api/service" | 	"k8s.io/kubernetes/pkg/api/service" | ||||||
| 	storageutil "k8s.io/kubernetes/pkg/apis/storage/util" | 	"k8s.io/kubernetes/pkg/api/v1" | ||||||
| 	"k8s.io/kubernetes/pkg/capabilities" | 	"k8s.io/kubernetes/pkg/capabilities" | ||||||
| 	"k8s.io/kubernetes/pkg/security/apparmor" | 	"k8s.io/kubernetes/pkg/security/apparmor" | ||||||
| 	"k8s.io/kubernetes/pkg/volume" | 	"k8s.io/kubernetes/pkg/volume" | ||||||
| @@ -80,6 +80,7 @@ func TestValidatePersistentVolumes(t *testing.T) { | |||||||
| 				PersistentVolumeSource: api.PersistentVolumeSource{ | 				PersistentVolumeSource: api.PersistentVolumeSource{ | ||||||
| 					HostPath: &api.HostPathVolumeSource{Path: "/foo"}, | 					HostPath: &api.HostPathVolumeSource{Path: "/foo"}, | ||||||
| 				}, | 				}, | ||||||
|  | 				StorageClassName: "valid", | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		"good-volume-with-retain-policy": { | 		"good-volume-with-retain-policy": { | ||||||
| @@ -230,6 +231,19 @@ func TestValidatePersistentVolumes(t *testing.T) { | |||||||
| 				}, | 				}, | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
|  | 		"invalid-storage-class-name": { | ||||||
|  | 			isExpectedFailure: true, | ||||||
|  | 			volume: testVolume("invalid-storage-class-name", "", api.PersistentVolumeSpec{ | ||||||
|  | 				Capacity: api.ResourceList{ | ||||||
|  | 					api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), | ||||||
|  | 				}, | ||||||
|  | 				AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, | ||||||
|  | 				PersistentVolumeSource: api.PersistentVolumeSource{ | ||||||
|  | 					HostPath: &api.HostPathVolumeSource{Path: "/foo"}, | ||||||
|  | 				}, | ||||||
|  | 				StorageClassName: "-invalid-", | ||||||
|  | 			}), | ||||||
|  | 		}, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for name, scenario := range scenarios { | 	for name, scenario := range scenarios { | ||||||
| @@ -253,7 +267,7 @@ func testVolumeClaim(name string, namespace string, spec api.PersistentVolumeCla | |||||||
|  |  | ||||||
| func testVolumeClaimStorageClass(name string, namespace string, annval string, spec api.PersistentVolumeClaimSpec) *api.PersistentVolumeClaim { | func testVolumeClaimStorageClass(name string, namespace string, annval string, spec api.PersistentVolumeClaimSpec) *api.PersistentVolumeClaim { | ||||||
| 	annotations := map[string]string{ | 	annotations := map[string]string{ | ||||||
| 		storageutil.StorageClassAnnotation: annval, | 		v1.BetaStorageClassAnnotation: annval, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return &api.PersistentVolumeClaim{ | 	return &api.PersistentVolumeClaim{ | ||||||
| @@ -301,6 +315,8 @@ func testVolumeClaimAnnotation(name string, namespace string, ann string, annval | |||||||
| } | } | ||||||
|  |  | ||||||
| func TestValidatePersistentVolumeClaim(t *testing.T) { | func TestValidatePersistentVolumeClaim(t *testing.T) { | ||||||
|  | 	invalidClassName := "-invalid-" | ||||||
|  | 	validClassName := "valid" | ||||||
| 	scenarios := map[string]struct { | 	scenarios := map[string]struct { | ||||||
| 		isExpectedFailure bool | 		isExpectedFailure bool | ||||||
| 		claim             *api.PersistentVolumeClaim | 		claim             *api.PersistentVolumeClaim | ||||||
| @@ -325,6 +341,7 @@ func TestValidatePersistentVolumeClaim(t *testing.T) { | |||||||
| 						api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), | 						api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), | ||||||
| 					}, | 					}, | ||||||
| 				}, | 				}, | ||||||
|  | 				StorageClassName: &validClassName, | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		"invalid-label-selector": { | 		"invalid-label-selector": { | ||||||
| @@ -428,6 +445,29 @@ func TestValidatePersistentVolumeClaim(t *testing.T) { | |||||||
| 				}, | 				}, | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
|  | 		"invalid-storage-class-name": { | ||||||
|  | 			isExpectedFailure: true, | ||||||
|  | 			claim: testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ | ||||||
|  | 				Selector: &metav1.LabelSelector{ | ||||||
|  | 					MatchExpressions: []metav1.LabelSelectorRequirement{ | ||||||
|  | 						{ | ||||||
|  | 							Key:      "key2", | ||||||
|  | 							Operator: "Exists", | ||||||
|  | 						}, | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 				AccessModes: []api.PersistentVolumeAccessMode{ | ||||||
|  | 					api.ReadWriteOnce, | ||||||
|  | 					api.ReadOnlyMany, | ||||||
|  | 				}, | ||||||
|  | 				Resources: api.ResourceRequirements{ | ||||||
|  | 					Requests: api.ResourceList{ | ||||||
|  | 						api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 				StorageClassName: &invalidClassName, | ||||||
|  | 			}), | ||||||
|  | 		}, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for name, scenario := range scenarios { | 	for name, scenario := range scenarios { | ||||||
|   | |||||||
| @@ -37,6 +37,7 @@ filegroup( | |||||||
|         ":package-srcs", |         ":package-srcs", | ||||||
|         "//pkg/apis/storage/install:all-srcs", |         "//pkg/apis/storage/install:all-srcs", | ||||||
|         "//pkg/apis/storage/util:all-srcs", |         "//pkg/apis/storage/util:all-srcs", | ||||||
|  |         "//pkg/apis/storage/v1:all-srcs", | ||||||
|         "//pkg/apis/storage/v1beta1:all-srcs", |         "//pkg/apis/storage/v1beta1:all-srcs", | ||||||
|         "//pkg/apis/storage/validation:all-srcs", |         "//pkg/apis/storage/validation:all-srcs", | ||||||
|     ], |     ], | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ go_library( | |||||||
|     deps = [ |     deps = [ | ||||||
|         "//pkg/api:go_default_library", |         "//pkg/api:go_default_library", | ||||||
|         "//pkg/apis/storage:go_default_library", |         "//pkg/apis/storage:go_default_library", | ||||||
|  |         "//pkg/apis/storage/v1:go_default_library", | ||||||
|         "//pkg/apis/storage/v1beta1:go_default_library", |         "//pkg/apis/storage/v1beta1:go_default_library", | ||||||
|         "//vendor:k8s.io/apimachinery/pkg/apimachinery/announced", |         "//vendor:k8s.io/apimachinery/pkg/apimachinery/announced", | ||||||
|         "//vendor:k8s.io/apimachinery/pkg/apimachinery/registered", |         "//vendor:k8s.io/apimachinery/pkg/apimachinery/registered", | ||||||
|   | |||||||
| @@ -25,6 +25,7 @@ import ( | |||||||
| 	"k8s.io/apimachinery/pkg/util/sets" | 	"k8s.io/apimachinery/pkg/util/sets" | ||||||
| 	"k8s.io/kubernetes/pkg/api" | 	"k8s.io/kubernetes/pkg/api" | ||||||
| 	"k8s.io/kubernetes/pkg/apis/storage" | 	"k8s.io/kubernetes/pkg/apis/storage" | ||||||
|  | 	"k8s.io/kubernetes/pkg/apis/storage/v1" | ||||||
| 	"k8s.io/kubernetes/pkg/apis/storage/v1beta1" | 	"k8s.io/kubernetes/pkg/apis/storage/v1beta1" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -37,12 +38,14 @@ func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *r | |||||||
| 	if err := announced.NewGroupMetaFactory( | 	if err := announced.NewGroupMetaFactory( | ||||||
| 		&announced.GroupMetaFactoryArgs{ | 		&announced.GroupMetaFactoryArgs{ | ||||||
| 			GroupName: storage.GroupName, | 			GroupName: storage.GroupName, | ||||||
| 			VersionPreferenceOrder:     []string{v1beta1.SchemeGroupVersion.Version}, | 			// TODO:  change the order when GKE supports v1 | ||||||
|  | 			VersionPreferenceOrder:     []string{v1beta1.SchemeGroupVersion.Version, v1.SchemeGroupVersion.Version}, | ||||||
| 			ImportPrefix:               "k8s.io/kubernetes/pkg/apis/storage", | 			ImportPrefix:               "k8s.io/kubernetes/pkg/apis/storage", | ||||||
| 			RootScopedKinds:            sets.NewString("StorageClass"), | 			RootScopedKinds:            sets.NewString("StorageClass"), | ||||||
| 			AddInternalObjectsToScheme: storage.AddToScheme, | 			AddInternalObjectsToScheme: storage.AddToScheme, | ||||||
| 		}, | 		}, | ||||||
| 		announced.VersionToSchemeFunc{ | 		announced.VersionToSchemeFunc{ | ||||||
|  | 			v1.SchemeGroupVersion.Version:      v1.AddToScheme, | ||||||
| 			v1beta1.SchemeGroupVersion.Version: v1beta1.AddToScheme, | 			v1beta1.SchemeGroupVersion.Version: v1beta1.AddToScheme, | ||||||
| 		}, | 		}, | ||||||
| 	).Announce(groupFactoryRegistry).RegisterAndEnable(registry, scheme); err != nil { | 	).Announce(groupFactoryRegistry).RegisterAndEnable(registry, scheme); err != nil { | ||||||
|   | |||||||
| @@ -11,10 +11,7 @@ go_library( | |||||||
|     name = "go_default_library", |     name = "go_default_library", | ||||||
|     srcs = ["helpers.go"], |     srcs = ["helpers.go"], | ||||||
|     tags = ["automanaged"], |     tags = ["automanaged"], | ||||||
|     deps = [ |     deps = ["//vendor:k8s.io/apimachinery/pkg/apis/meta/v1"], | ||||||
|         "//pkg/api:go_default_library", |  | ||||||
|         "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", |  | ||||||
|     ], |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| filegroup( | filegroup( | ||||||
|   | |||||||
| @@ -16,10 +16,7 @@ limitations under the License. | |||||||
|  |  | ||||||
| package util | package util | ||||||
|  |  | ||||||
| import ( | import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |  | ||||||
| 	"k8s.io/kubernetes/pkg/api" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // IsDefaultStorageClassAnnotation represents a StorageClass annotation that | // IsDefaultStorageClassAnnotation represents a StorageClass annotation that | ||||||
| // marks a class as the default StorageClass | // marks a class as the default StorageClass | ||||||
| @@ -27,87 +24,6 @@ import ( | |||||||
| const IsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class" | const IsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class" | ||||||
| const BetaIsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class" | const BetaIsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class" | ||||||
|  |  | ||||||
| // AlphaStorageClassAnnotation represents the previous alpha storage class |  | ||||||
| // annotation.  it's no longer used and held here for posterity. |  | ||||||
| const AlphaStorageClassAnnotation = "volume.alpha.kubernetes.io/storage-class" |  | ||||||
|  |  | ||||||
| // BetaStorageClassAnnotation represents the beta/previous StorageClass annotation. |  | ||||||
| // It's currently still used and will be held for backwards compatibility |  | ||||||
| const BetaStorageClassAnnotation = "volume.beta.kubernetes.io/storage-class" |  | ||||||
|  |  | ||||||
| // StorageClassAnnotation represents the storage class associated with a resource. |  | ||||||
| // It currently matches the Beta value and can change when official is set. |  | ||||||
| // - in PersistentVolumeClaim it represents required class to match. |  | ||||||
| //   Only PersistentVolumes with the same class (i.e. annotation with the same |  | ||||||
| //   value) can be bound to the claim. In case no such volume exists, the |  | ||||||
| //   controller will provision a new one using StorageClass instance with |  | ||||||
| //   the same name as the annotation value. |  | ||||||
| // - in PersistentVolume it represents storage class to which the persistent |  | ||||||
| //   volume belongs. |  | ||||||
| //TODO: Update this to final annotation value as it matches BetaStorageClassAnnotation for now |  | ||||||
| const StorageClassAnnotation = "volume.beta.kubernetes.io/storage-class" |  | ||||||
|  |  | ||||||
| // GetVolumeStorageClass returns value of StorageClassAnnotation or empty string in case |  | ||||||
| // the annotation does not exist. |  | ||||||
| // TODO: change to PersistentVolume.Spec.Class value when this attribute is |  | ||||||
| // introduced. |  | ||||||
| func GetVolumeStorageClass(volume *api.PersistentVolume) string { |  | ||||||
| 	if class, found := volume.Annotations[StorageClassAnnotation]; found { |  | ||||||
| 		return class |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// 'nil' is interpreted as "", i.e. the volume does not belong to any class. |  | ||||||
| 	return "" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // GetClaimStorageClass returns name of class that is requested by given claim. |  | ||||||
| // Request for `nil` class is interpreted as request for class "", |  | ||||||
| // i.e. for a classless PV. |  | ||||||
| // TODO: change to PersistentVolumeClaim.Spec.Class value when this |  | ||||||
| // attribute is introduced. |  | ||||||
| func GetClaimStorageClass(claim *api.PersistentVolumeClaim) string { |  | ||||||
| 	if class, found := claim.Annotations[StorageClassAnnotation]; found { |  | ||||||
| 		return class |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return "" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // GetStorageClassAnnotation returns the StorageClass value |  | ||||||
| // if the annotation is set, empty string if not |  | ||||||
| // TODO: remove Alpha and Beta when no longer used or needed |  | ||||||
| func GetStorageClassAnnotation(obj metav1.ObjectMeta) string { |  | ||||||
| 	if class, ok := obj.Annotations[StorageClassAnnotation]; ok { |  | ||||||
| 		return class |  | ||||||
| 	} |  | ||||||
| 	if class, ok := obj.Annotations[BetaStorageClassAnnotation]; ok { |  | ||||||
| 		return class |  | ||||||
| 	} |  | ||||||
| 	if class, ok := obj.Annotations[AlphaStorageClassAnnotation]; ok { |  | ||||||
| 		return class |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return "" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // HasStorageClassAnnotation returns a boolean |  | ||||||
| // if the annotation is set |  | ||||||
| // TODO: remove Alpha and Beta when no longer used or needed |  | ||||||
| func HasStorageClassAnnotation(obj metav1.ObjectMeta) bool { |  | ||||||
| 	if _, found := obj.Annotations[StorageClassAnnotation]; found { |  | ||||||
| 		return found |  | ||||||
| 	} |  | ||||||
| 	if _, found := obj.Annotations[BetaStorageClassAnnotation]; found { |  | ||||||
| 		return found |  | ||||||
| 	} |  | ||||||
| 	if _, found := obj.Annotations[AlphaStorageClassAnnotation]; found { |  | ||||||
| 		return found |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return false |  | ||||||
|  |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // IsDefaultAnnotationText returns a pretty Yes/No String if | // IsDefaultAnnotationText returns a pretty Yes/No String if | ||||||
| // the annotation is set | // the annotation is set | ||||||
| // TODO: remove Beta when no longer needed | // TODO: remove Beta when no longer needed | ||||||
|   | |||||||
							
								
								
									
										48
									
								
								pkg/apis/storage/v1/BUILD
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								pkg/apis/storage/v1/BUILD
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | |||||||
|  | package(default_visibility = ["//visibility:public"]) | ||||||
|  |  | ||||||
|  | licenses(["notice"]) | ||||||
|  |  | ||||||
|  | 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.go", | ||||||
|  |         "types_swagger_doc_generated.go", | ||||||
|  |         "zz_generated.conversion.go", | ||||||
|  |         "zz_generated.deepcopy.go", | ||||||
|  |         "zz_generated.defaults.go", | ||||||
|  |     ], | ||||||
|  |     tags = ["automanaged"], | ||||||
|  |     deps = [ | ||||||
|  |         "//pkg/apis/storage:go_default_library", | ||||||
|  |         "//vendor:github.com/gogo/protobuf/proto", | ||||||
|  |         "//vendor:github.com/gogo/protobuf/sortkeys", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/conversion", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/runtime", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/runtime/schema", | ||||||
|  |     ], | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | filegroup( | ||||||
|  |     name = "package-srcs", | ||||||
|  |     srcs = glob(["**"]), | ||||||
|  |     tags = ["automanaged"], | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | filegroup( | ||||||
|  |     name = "all-srcs", | ||||||
|  |     srcs = [ | ||||||
|  |         ":package-srcs", | ||||||
|  |         "//pkg/apis/storage/v1/util:all-srcs", | ||||||
|  |     ], | ||||||
|  |     tags = ["automanaged"], | ||||||
|  | ) | ||||||
							
								
								
									
										22
									
								
								pkg/apis/storage/v1/doc.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								pkg/apis/storage/v1/doc.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | |||||||
|  | /* | ||||||
|  | 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:conversion-gen=k8s.io/kubernetes/pkg/apis/storage | ||||||
|  | // +groupName=storage.k8s.io | ||||||
|  | // +k8s:openapi-gen=true | ||||||
|  | // +k8s:defaulter-gen=TypeMeta | ||||||
|  | package v1 | ||||||
							
								
								
									
										730
									
								
								pkg/apis/storage/v1/generated.pb.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										730
									
								
								pkg/apis/storage/v1/generated.pb.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,730 @@ | |||||||
|  | /* | ||||||
|  | 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/pkg/apis/storage/v1/generated.proto | ||||||
|  | // DO NOT EDIT! | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  | 	Package v1 is a generated protocol buffer package. | ||||||
|  | 
 | ||||||
|  | 	It is generated from these files: | ||||||
|  | 		k8s.io/kubernetes/pkg/apis/storage/v1/generated.proto | ||||||
|  | 
 | ||||||
|  | 	It has these top-level messages: | ||||||
|  | 		StorageClass | ||||||
|  | 		StorageClassList | ||||||
|  | */ | ||||||
|  | package v1 | ||||||
|  | 
 | ||||||
|  | import proto "github.com/gogo/protobuf/proto" | ||||||
|  | import fmt "fmt" | ||||||
|  | import math "math" | ||||||
|  | 
 | ||||||
|  | import strings "strings" | ||||||
|  | import reflect "reflect" | ||||||
|  | import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" | ||||||
|  | 
 | ||||||
|  | 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. | ||||||
|  | const _ = proto.GoGoProtoPackageIsVersion1 | ||||||
|  | 
 | ||||||
|  | func (m *StorageClass) Reset()                    { *m = StorageClass{} } | ||||||
|  | func (*StorageClass) ProtoMessage()               {} | ||||||
|  | func (*StorageClass) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{0} } | ||||||
|  | 
 | ||||||
|  | func (m *StorageClassList) Reset()                    { *m = StorageClassList{} } | ||||||
|  | func (*StorageClassList) ProtoMessage()               {} | ||||||
|  | func (*StorageClassList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{1} } | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	proto.RegisterType((*StorageClass)(nil), "k8s.io.kubernetes.pkg.apis.storage.v1.StorageClass") | ||||||
|  | 	proto.RegisterType((*StorageClassList)(nil), "k8s.io.kubernetes.pkg.apis.storage.v1.StorageClassList") | ||||||
|  | } | ||||||
|  | func (m *StorageClass) 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 *StorageClass) 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 | ||||||
|  | 	data[i] = 0x12 | ||||||
|  | 	i++ | ||||||
|  | 	i = encodeVarintGenerated(data, i, uint64(len(m.Provisioner))) | ||||||
|  | 	i += copy(data[i:], m.Provisioner) | ||||||
|  | 	if len(m.Parameters) > 0 { | ||||||
|  | 		for k := range m.Parameters { | ||||||
|  | 			data[i] = 0x1a | ||||||
|  | 			i++ | ||||||
|  | 			v := m.Parameters[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) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return i, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *StorageClassList) 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 *StorageClassList) 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())) | ||||||
|  | 	n2, err := m.ListMeta.MarshalTo(data[i:]) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  | 	i += n2 | ||||||
|  | 	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 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 *StorageClass) Size() (n int) { | ||||||
|  | 	var l int | ||||||
|  | 	_ = l | ||||||
|  | 	l = m.ObjectMeta.Size() | ||||||
|  | 	n += 1 + l + sovGenerated(uint64(l)) | ||||||
|  | 	l = len(m.Provisioner) | ||||||
|  | 	n += 1 + l + sovGenerated(uint64(l)) | ||||||
|  | 	if len(m.Parameters) > 0 { | ||||||
|  | 		for k, v := range m.Parameters { | ||||||
|  | 			_ = k | ||||||
|  | 			_ = v | ||||||
|  | 			mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) | ||||||
|  | 			n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return n | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *StorageClassList) 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 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 *StorageClass) String() string { | ||||||
|  | 	if this == nil { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	keysForParameters := make([]string, 0, len(this.Parameters)) | ||||||
|  | 	for k := range this.Parameters { | ||||||
|  | 		keysForParameters = append(keysForParameters, k) | ||||||
|  | 	} | ||||||
|  | 	github_com_gogo_protobuf_sortkeys.Strings(keysForParameters) | ||||||
|  | 	mapStringForParameters := "map[string]string{" | ||||||
|  | 	for _, k := range keysForParameters { | ||||||
|  | 		mapStringForParameters += fmt.Sprintf("%v: %v,", k, this.Parameters[k]) | ||||||
|  | 	} | ||||||
|  | 	mapStringForParameters += "}" | ||||||
|  | 	s := strings.Join([]string{`&StorageClass{`, | ||||||
|  | 		`ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`, | ||||||
|  | 		`Provisioner:` + fmt.Sprintf("%v", this.Provisioner) + `,`, | ||||||
|  | 		`Parameters:` + mapStringForParameters + `,`, | ||||||
|  | 		`}`, | ||||||
|  | 	}, "") | ||||||
|  | 	return s | ||||||
|  | } | ||||||
|  | func (this *StorageClassList) String() string { | ||||||
|  | 	if this == nil { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	s := strings.Join([]string{`&StorageClassList{`, | ||||||
|  | 		`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), "StorageClass", "StorageClass", 1), `&`, ``, 1) + `,`, | ||||||
|  | 		`}`, | ||||||
|  | 	}, "") | ||||||
|  | 	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 *StorageClass) 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: StorageClass: wiretype end group for non-group") | ||||||
|  | 		} | ||||||
|  | 		if fieldNum <= 0 { | ||||||
|  | 			return fmt.Errorf("proto: StorageClass: 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 Provisioner", 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.Provisioner = string(data[iNdEx:postIndex]) | ||||||
|  | 			iNdEx = postIndex | ||||||
|  | 		case 3: | ||||||
|  | 			if wireType != 2 { | ||||||
|  | 				return fmt.Errorf("proto: wrong wireType = %d for field Parameters", 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 | ||||||
|  | 			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 | ||||||
|  | 			if m.Parameters == nil { | ||||||
|  | 				m.Parameters = make(map[string]string) | ||||||
|  | 			} | ||||||
|  | 			m.Parameters[mapkey] = mapvalue | ||||||
|  | 			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 *StorageClassList) 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: StorageClassList: wiretype end group for non-group") | ||||||
|  | 		} | ||||||
|  | 		if fieldNum <= 0 { | ||||||
|  | 			return fmt.Errorf("proto: StorageClassList: 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, StorageClass{}) | ||||||
|  | 			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 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") | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var fileDescriptorGenerated = []byte{ | ||||||
|  | 	// 474 bytes of a gzipped FileDescriptorProto | ||||||
|  | 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x9c, 0x92, 0x4f, 0x6f, 0xd3, 0x30, | ||||||
|  | 	0x18, 0xc6, 0xe3, 0x54, 0x95, 0x36, 0x17, 0x44, 0x15, 0x38, 0x54, 0x3d, 0x64, 0xd5, 0x04, 0x52, | ||||||
|  | 	0x2f, 0xd8, 0x74, 0x63, 0x68, 0x42, 0xe2, 0xd2, 0x89, 0x03, 0x12, 0x88, 0x29, 0x5c, 0x10, 0xe2, | ||||||
|  | 	0x80, 0xdb, 0xbd, 0xa4, 0x26, 0x4d, 0x1c, 0xd9, 0x6f, 0x02, 0xbd, 0xf1, 0x11, 0xf8, 0x58, 0x15, | ||||||
|  | 	0xa7, 0x1d, 0x39, 0x0d, 0x1a, 0xbe, 0x08, 0xca, 0x1f, 0x96, 0x88, 0x6c, 0xa2, 0xda, 0x2d, 0xaf, | ||||||
|  | 	0xed, 0xdf, 0xe3, 0xe7, 0x79, 0x1c, 0x7a, 0x14, 0x1c, 0x1b, 0x26, 0x15, 0x0f, 0x92, 0x19, 0xe8, | ||||||
|  | 	0x08, 0x10, 0x0c, 0x8f, 0x03, 0x9f, 0x8b, 0x58, 0x1a, 0x6e, 0x50, 0x69, 0xe1, 0x03, 0x4f, 0x27, | ||||||
|  | 	0xdc, 0x87, 0x08, 0xb4, 0x40, 0x38, 0x63, 0xb1, 0x56, 0xa8, 0x9c, 0x07, 0x25, 0xc6, 0x6a, 0x8c, | ||||||
|  | 	0xc5, 0x81, 0xcf, 0x72, 0x8c, 0x55, 0x18, 0x4b, 0x27, 0xc3, 0x87, 0xbe, 0xc4, 0x45, 0x32, 0x63, | ||||||
|  | 	0x73, 0x15, 0x72, 0x5f, 0xf9, 0x8a, 0x17, 0xf4, 0x2c, 0xf9, 0x58, 0x4c, 0xc5, 0x50, 0x7c, 0x95, | ||||||
|  | 	0xaa, 0xc3, 0xc7, 0x95, 0x19, 0x11, 0xcb, 0x50, 0xcc, 0x17, 0x32, 0x02, 0xbd, 0xaa, 0xed, 0x84, | ||||||
|  | 	0x80, 0xe2, 0x0a, 0x2f, 0x43, 0x7e, 0x1d, 0xa5, 0x93, 0x08, 0x65, 0x08, 0x2d, 0xe0, 0xc9, 0xff, | ||||||
|  | 	0x00, 0x33, 0x5f, 0x40, 0x28, 0x5a, 0xdc, 0xe1, 0x75, 0x5c, 0x82, 0x72, 0xc9, 0x65, 0x84, 0x06, | ||||||
|  | 	0x75, 0x0b, 0x6a, 0x64, 0x32, 0xa0, 0x53, 0xd0, 0x75, 0x20, 0xf8, 0x22, 0xc2, 0x78, 0x79, 0x55, | ||||||
|  | 	0xbf, 0xfb, 0x3f, 0x6d, 0x7a, 0xeb, 0x4d, 0xd9, 0xe3, 0xc9, 0x52, 0x18, 0xe3, 0x7c, 0xa0, 0x3b, | ||||||
|  | 	0x79, 0xfe, 0x33, 0x81, 0x62, 0x40, 0x46, 0x64, 0xdc, 0x3b, 0x78, 0xc4, 0xaa, 0x37, 0x68, 0xda, | ||||||
|  | 	0xa9, 0x5f, 0x21, 0x3f, 0xcd, 0xd2, 0x09, 0x7b, 0x3d, 0xfb, 0x04, 0x73, 0x7c, 0x05, 0x28, 0xa6, | ||||||
|  | 	0xce, 0xfa, 0x62, 0xcf, 0xca, 0x2e, 0xf6, 0x68, 0xbd, 0xe6, 0x5d, 0xaa, 0x3a, 0x47, 0xb4, 0x17, | ||||||
|  | 	0x6b, 0x95, 0x4a, 0x23, 0x55, 0x04, 0x7a, 0x60, 0x8f, 0xc8, 0x78, 0x77, 0x7a, 0xb7, 0x42, 0x7a, | ||||||
|  | 	0xa7, 0xf5, 0x96, 0xd7, 0x3c, 0xe7, 0x7c, 0xa6, 0x34, 0x16, 0x5a, 0x84, 0x80, 0xa0, 0xcd, 0xa0, | ||||||
|  | 	0x33, 0xea, 0x8c, 0x7b, 0x07, 0x27, 0x6c, 0xab, 0xdf, 0x83, 0x35, 0x13, 0xb2, 0xd3, 0x4b, 0x95, | ||||||
|  | 	0xe7, 0x11, 0xea, 0x55, 0xed, 0xb6, 0xde, 0xf0, 0x1a, 0x57, 0x0d, 0x9f, 0xd1, 0x3b, 0xff, 0x20, | ||||||
|  | 	0x4e, 0x9f, 0x76, 0x02, 0x58, 0x15, 0xfd, 0xec, 0x7a, 0xf9, 0xa7, 0x73, 0x8f, 0x76, 0x53, 0xb1, | ||||||
|  | 	0x4c, 0xa0, 0x8c, 0xe3, 0x95, 0xc3, 0x53, 0xfb, 0x98, 0xec, 0x7f, 0x27, 0xb4, 0xdf, 0xbc, 0xff, | ||||||
|  | 	0xa5, 0x34, 0xe8, 0xbc, 0x6f, 0xb5, 0xcc, 0xb6, 0x6b, 0x39, 0xa7, 0x8b, 0x8e, 0xfb, 0x95, 0xeb, | ||||||
|  | 	0x9d, 0xbf, 0x2b, 0x8d, 0x86, 0xdf, 0xd2, 0xae, 0x44, 0x08, 0xcd, 0xc0, 0x2e, 0x5a, 0x3a, 0xbc, | ||||||
|  | 	0x41, 0x4b, 0xd3, 0xdb, 0x95, 0x7e, 0xf7, 0x45, 0xae, 0xe4, 0x95, 0x82, 0xd3, 0xfb, 0xeb, 0x8d, | ||||||
|  | 	0x6b, 0x9d, 0x6f, 0x5c, 0xeb, 0xc7, 0xc6, 0xb5, 0xbe, 0x66, 0x2e, 0x59, 0x67, 0x2e, 0x39, 0xcf, | ||||||
|  | 	0x5c, 0xf2, 0x2b, 0x73, 0xc9, 0xb7, 0xdf, 0xae, 0xf5, 0xce, 0x4e, 0x27, 0x7f, 0x02, 0x00, 0x00, | ||||||
|  | 	0xff, 0xff, 0xe8, 0xe1, 0xb9, 0x93, 0xec, 0x03, 0x00, 0x00, | ||||||
|  | } | ||||||
							
								
								
									
										63
									
								
								pkg/apis/storage/v1/generated.proto
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								pkg/apis/storage/v1/generated.proto
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | |||||||
|  | /* | ||||||
|  | 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.kubernetes.pkg.apis.storage.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"; | ||||||
|  | import "k8s.io/apiserver/pkg/apis/example/v1/generated.proto"; | ||||||
|  | 
 | ||||||
|  | // Package-wide variables from generator "generated". | ||||||
|  | option go_package = "v1"; | ||||||
|  | 
 | ||||||
|  | // StorageClass describes the parameters for a class of storage for | ||||||
|  | // which PersistentVolumes can be dynamically provisioned. | ||||||
|  | //  | ||||||
|  | // StorageClasses are non-namespaced; the name of the storage class | ||||||
|  | // according to etcd is in ObjectMeta.Name. | ||||||
|  | message StorageClass { | ||||||
|  |   // Standard object's metadata. | ||||||
|  |   // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata | ||||||
|  |   // +optional | ||||||
|  |   optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; | ||||||
|  | 
 | ||||||
|  |   // Provisioner indicates the type of the provisioner. | ||||||
|  |   optional string provisioner = 2; | ||||||
|  | 
 | ||||||
|  |   // Parameters holds the parameters for the provisioner that should | ||||||
|  |   // create volumes of this storage class. | ||||||
|  |   // +optional | ||||||
|  |   map<string, string> parameters = 3; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // StorageClassList is a collection of storage classes. | ||||||
|  | message StorageClassList { | ||||||
|  |   // Standard list metadata | ||||||
|  |   // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata | ||||||
|  |   // +optional | ||||||
|  |   optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; | ||||||
|  | 
 | ||||||
|  |   // Items is the list of StorageClasses | ||||||
|  |   repeated StorageClass items = 2; | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										50
									
								
								pkg/apis/storage/v1/register.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								pkg/apis/storage/v1/register.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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 v1 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
|  | 	"k8s.io/apimachinery/pkg/runtime" | ||||||
|  | 	"k8s.io/apimachinery/pkg/runtime/schema" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // GroupName is the group name use in this package | ||||||
|  | const GroupName = "storage.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 ( | ||||||
|  | 	SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) | ||||||
|  | 	AddToScheme   = SchemeBuilder.AddToScheme | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // Adds the list of known types to api.Scheme. | ||||||
|  | func addKnownTypes(scheme *runtime.Scheme) error { | ||||||
|  | 	scheme.AddKnownTypes(SchemeGroupVersion, | ||||||
|  | 		&StorageClass{}, | ||||||
|  | 		&StorageClassList{}, | ||||||
|  | 	) | ||||||
|  |  | ||||||
|  | 	metav1.AddToGroupVersion(scheme, SchemeGroupVersion) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										57
									
								
								pkg/apis/storage/v1/types.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								pkg/apis/storage/v1/types.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | |||||||
|  | /* | ||||||
|  | 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" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // +genclient=true | ||||||
|  | // +nonNamespaced=true | ||||||
|  |  | ||||||
|  | // StorageClass describes the parameters for a class of storage for | ||||||
|  | // which PersistentVolumes can be dynamically provisioned. | ||||||
|  | // | ||||||
|  | // StorageClasses are non-namespaced; the name of the storage class | ||||||
|  | // according to etcd is in ObjectMeta.Name. | ||||||
|  | type StorageClass struct { | ||||||
|  | 	metav1.TypeMeta `json:",inline"` | ||||||
|  | 	// Standard object's metadata. | ||||||
|  | 	// More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata | ||||||
|  | 	// +optional | ||||||
|  | 	metav1.ObjectMeta `json:"metadata,omitempty"` | ||||||
|  |  | ||||||
|  | 	// Provisioner indicates the type of the provisioner. | ||||||
|  | 	Provisioner string `json:"provisioner"` | ||||||
|  |  | ||||||
|  | 	// Parameters holds the parameters for the provisioner that should | ||||||
|  | 	// create volumes of this storage class. | ||||||
|  | 	// +optional | ||||||
|  | 	Parameters map[string]string `json:"parameters,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // StorageClassList is a collection of storage classes. | ||||||
|  | type StorageClassList struct { | ||||||
|  | 	metav1.TypeMeta `json:",inline"` | ||||||
|  | 	// Standard list metadata | ||||||
|  | 	// More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata | ||||||
|  | 	// +optional | ||||||
|  | 	metav1.ListMeta `json:"metadata,omitempty"` | ||||||
|  |  | ||||||
|  | 	// Items is the list of StorageClasses | ||||||
|  | 	Items []StorageClass `json:"items"` | ||||||
|  | } | ||||||
							
								
								
									
										51
									
								
								pkg/apis/storage/v1/types_swagger_doc_generated.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								pkg/apis/storage/v1/types_swagger_doc_generated.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | |||||||
|  | /* | ||||||
|  | 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_StorageClass = map[string]string{ | ||||||
|  | 	"":            "StorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned.\n\nStorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.", | ||||||
|  | 	"metadata":    "Standard object's metadata. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata", | ||||||
|  | 	"provisioner": "Provisioner indicates the type of the provisioner.", | ||||||
|  | 	"parameters":  "Parameters holds the parameters for the provisioner that should create volumes of this storage class.", | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (StorageClass) SwaggerDoc() map[string]string { | ||||||
|  | 	return map_StorageClass | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var map_StorageClassList = map[string]string{ | ||||||
|  | 	"":         "StorageClassList is a collection of storage classes.", | ||||||
|  | 	"metadata": "Standard list metadata More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata", | ||||||
|  | 	"items":    "Items is the list of StorageClasses", | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (StorageClassList) SwaggerDoc() map[string]string { | ||||||
|  | 	return map_StorageClassList | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // AUTO-GENERATED FUNCTIONS END HERE | ||||||
							
								
								
									
										28
									
								
								pkg/apis/storage/v1/util/BUILD
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								pkg/apis/storage/v1/util/BUILD
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | package(default_visibility = ["//visibility:public"]) | ||||||
|  |  | ||||||
|  | licenses(["notice"]) | ||||||
|  |  | ||||||
|  | load( | ||||||
|  |     "@io_bazel_rules_go//go:def.bzl", | ||||||
|  |     "go_library", | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | go_library( | ||||||
|  |     name = "go_default_library", | ||||||
|  |     srcs = ["helpers.go"], | ||||||
|  |     tags = ["automanaged"], | ||||||
|  |     deps = ["//vendor:k8s.io/apimachinery/pkg/apis/meta/v1"], | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | filegroup( | ||||||
|  |     name = "package-srcs", | ||||||
|  |     srcs = glob(["**"]), | ||||||
|  |     tags = ["automanaged"], | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | filegroup( | ||||||
|  |     name = "all-srcs", | ||||||
|  |     srcs = [":package-srcs"], | ||||||
|  |     tags = ["automanaged"], | ||||||
|  | ) | ||||||
							
								
								
									
										53
									
								
								pkg/apis/storage/v1/util/helpers.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								pkg/apis/storage/v1/util/helpers.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | |||||||
|  | /* | ||||||
|  | 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 util | ||||||
|  |  | ||||||
|  | import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
|  |  | ||||||
|  | // IsDefaultStorageClassAnnotation represents a StorageClass annotation that | ||||||
|  | // marks a class as the default StorageClass | ||||||
|  | //TODO: Update IsDefaultStorageClassannotation and remove Beta when no longer used | ||||||
|  | const IsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class" | ||||||
|  | const BetaIsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class" | ||||||
|  |  | ||||||
|  | // IsDefaultAnnotationText returns a pretty Yes/No String if | ||||||
|  | // the annotation is set | ||||||
|  | // TODO: remove Beta when no longer needed | ||||||
|  | func IsDefaultAnnotationText(obj metav1.ObjectMeta) string { | ||||||
|  | 	if obj.Annotations[IsDefaultStorageClassAnnotation] == "true" { | ||||||
|  | 		return "Yes" | ||||||
|  | 	} | ||||||
|  | 	if obj.Annotations[BetaIsDefaultStorageClassAnnotation] == "true" { | ||||||
|  | 		return "Yes" | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return "No" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // IsDefaultAnnotation returns a boolean if | ||||||
|  | // the annotation is set | ||||||
|  | // TODO: remove Beta when no longer needed | ||||||
|  | func IsDefaultAnnotation(obj metav1.ObjectMeta) bool { | ||||||
|  | 	if obj.Annotations[IsDefaultStorageClassAnnotation] == "true" { | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  | 	if obj.Annotations[BetaIsDefaultStorageClassAnnotation] == "true" { | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return false | ||||||
|  | } | ||||||
							
								
								
									
										85
									
								
								pkg/apis/storage/v1/zz_generated.conversion.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								pkg/apis/storage/v1/zz_generated.conversion.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | |||||||
|  | // +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 ( | ||||||
|  | 	conversion "k8s.io/apimachinery/pkg/conversion" | ||||||
|  | 	runtime "k8s.io/apimachinery/pkg/runtime" | ||||||
|  | 	storage "k8s.io/kubernetes/pkg/apis/storage" | ||||||
|  | 	unsafe "unsafe" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	SchemeBuilder.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_StorageClass_To_storage_StorageClass, | ||||||
|  | 		Convert_storage_StorageClass_To_v1_StorageClass, | ||||||
|  | 		Convert_v1_StorageClassList_To_storage_StorageClassList, | ||||||
|  | 		Convert_storage_StorageClassList_To_v1_StorageClassList, | ||||||
|  | 	) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func autoConvert_v1_StorageClass_To_storage_StorageClass(in *StorageClass, out *storage.StorageClass, s conversion.Scope) error { | ||||||
|  | 	out.ObjectMeta = in.ObjectMeta | ||||||
|  | 	out.Provisioner = in.Provisioner | ||||||
|  | 	out.Parameters = *(*map[string]string)(unsafe.Pointer(&in.Parameters)) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Convert_v1_StorageClass_To_storage_StorageClass(in *StorageClass, out *storage.StorageClass, s conversion.Scope) error { | ||||||
|  | 	return autoConvert_v1_StorageClass_To_storage_StorageClass(in, out, s) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func autoConvert_storage_StorageClass_To_v1_StorageClass(in *storage.StorageClass, out *StorageClass, s conversion.Scope) error { | ||||||
|  | 	out.ObjectMeta = in.ObjectMeta | ||||||
|  | 	out.Provisioner = in.Provisioner | ||||||
|  | 	out.Parameters = *(*map[string]string)(unsafe.Pointer(&in.Parameters)) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Convert_storage_StorageClass_To_v1_StorageClass(in *storage.StorageClass, out *StorageClass, s conversion.Scope) error { | ||||||
|  | 	return autoConvert_storage_StorageClass_To_v1_StorageClass(in, out, s) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func autoConvert_v1_StorageClassList_To_storage_StorageClassList(in *StorageClassList, out *storage.StorageClassList, s conversion.Scope) error { | ||||||
|  | 	out.ListMeta = in.ListMeta | ||||||
|  | 	out.Items = *(*[]storage.StorageClass)(unsafe.Pointer(&in.Items)) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Convert_v1_StorageClassList_To_storage_StorageClassList(in *StorageClassList, out *storage.StorageClassList, s conversion.Scope) error { | ||||||
|  | 	return autoConvert_v1_StorageClassList_To_storage_StorageClassList(in, out, s) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func autoConvert_storage_StorageClassList_To_v1_StorageClassList(in *storage.StorageClassList, out *StorageClassList, s conversion.Scope) error { | ||||||
|  | 	out.ListMeta = in.ListMeta | ||||||
|  | 	out.Items = *(*[]StorageClass)(unsafe.Pointer(&in.Items)) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Convert_storage_StorageClassList_To_v1_StorageClassList(in *storage.StorageClassList, out *StorageClassList, s conversion.Scope) error { | ||||||
|  | 	return autoConvert_storage_StorageClassList_To_v1_StorageClassList(in, out, s) | ||||||
|  | } | ||||||
							
								
								
									
										80
									
								
								pkg/apis/storage/v1/zz_generated.deepcopy.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								pkg/apis/storage/v1/zz_generated.deepcopy.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | |||||||
|  | // +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 ( | ||||||
|  | 	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
|  | 	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. | ||||||
|  | func RegisterDeepCopies(scheme *runtime.Scheme) error { | ||||||
|  | 	return scheme.AddGeneratedDeepCopyFuncs( | ||||||
|  | 		conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_StorageClass, InType: reflect.TypeOf(&StorageClass{})}, | ||||||
|  | 		conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_StorageClassList, InType: reflect.TypeOf(&StorageClassList{})}, | ||||||
|  | 	) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func DeepCopy_v1_StorageClass(in interface{}, out interface{}, c *conversion.Cloner) error { | ||||||
|  | 	{ | ||||||
|  | 		in := in.(*StorageClass) | ||||||
|  | 		out := out.(*StorageClass) | ||||||
|  | 		*out = *in | ||||||
|  | 		if newVal, err := c.DeepCopy(&in.ObjectMeta); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} else { | ||||||
|  | 			out.ObjectMeta = *newVal.(*meta_v1.ObjectMeta) | ||||||
|  | 		} | ||||||
|  | 		if in.Parameters != nil { | ||||||
|  | 			in, out := &in.Parameters, &out.Parameters | ||||||
|  | 			*out = make(map[string]string) | ||||||
|  | 			for key, val := range *in { | ||||||
|  | 				(*out)[key] = val | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func DeepCopy_v1_StorageClassList(in interface{}, out interface{}, c *conversion.Cloner) error { | ||||||
|  | 	{ | ||||||
|  | 		in := in.(*StorageClassList) | ||||||
|  | 		out := out.(*StorageClassList) | ||||||
|  | 		*out = *in | ||||||
|  | 		if in.Items != nil { | ||||||
|  | 			in, out := &in.Items, &out.Items | ||||||
|  | 			*out = make([]StorageClass, len(*in)) | ||||||
|  | 			for i := range *in { | ||||||
|  | 				if err := DeepCopy_v1_StorageClass(&(*in)[i], &(*out)[i], c); err != nil { | ||||||
|  | 					return err | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										32
									
								
								pkg/apis/storage/v1/zz_generated.defaults.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								pkg/apis/storage/v1/zz_generated.defaults.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | // +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 ( | ||||||
|  | 	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 { | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
| @@ -11,10 +11,7 @@ go_library( | |||||||
|     name = "go_default_library", |     name = "go_default_library", | ||||||
|     srcs = ["helpers.go"], |     srcs = ["helpers.go"], | ||||||
|     tags = ["automanaged"], |     tags = ["automanaged"], | ||||||
|     deps = [ |     deps = ["//vendor:k8s.io/apimachinery/pkg/apis/meta/v1"], | ||||||
|         "//pkg/api/v1:go_default_library", |  | ||||||
|         "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", |  | ||||||
|     ], |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| filegroup( | filegroup( | ||||||
|   | |||||||
| @@ -16,10 +16,7 @@ limitations under the License. | |||||||
|  |  | ||||||
| package util | package util | ||||||
|  |  | ||||||
| import ( | import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |  | ||||||
| 	"k8s.io/kubernetes/pkg/api/v1" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // IsDefaultStorageClassAnnotation represents a StorageClass annotation that | // IsDefaultStorageClassAnnotation represents a StorageClass annotation that | ||||||
| // marks a class as the default StorageClass | // marks a class as the default StorageClass | ||||||
| @@ -27,87 +24,6 @@ import ( | |||||||
| const IsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class" | const IsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class" | ||||||
| const BetaIsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class" | const BetaIsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class" | ||||||
|  |  | ||||||
| // AlphaStorageClassAnnotation represents the previous alpha storage class |  | ||||||
| // annotation.  it's no longer used and held here for posterity. |  | ||||||
| const AlphaStorageClassAnnotation = "volume.alpha.kubernetes.io/storage-class" |  | ||||||
|  |  | ||||||
| // BetaStorageClassAnnotation represents the beta/previous StorageClass annotation. |  | ||||||
| // It's currently still used and will be held for backwards compatibility |  | ||||||
| const BetaStorageClassAnnotation = "volume.beta.kubernetes.io/storage-class" |  | ||||||
|  |  | ||||||
| // StorageClassAnnotation represents the storage class associated with a resource. |  | ||||||
| // It currently matches the Beta value and can change when official is set. |  | ||||||
| // - in PersistentVolumeClaim it represents required class to match. |  | ||||||
| //   Only PersistentVolumes with the same class (i.e. annotation with the same |  | ||||||
| //   value) can be bound to the claim. In case no such volume exists, the |  | ||||||
| //   controller will provision a new one using StorageClass instance with |  | ||||||
| //   the same name as the annotation value. |  | ||||||
| // - in PersistentVolume it represents storage class to which the persistent |  | ||||||
| //   volume belongs. |  | ||||||
| //TODO: Update this to final annotation value as it matches BetaStorageClassAnnotation for now |  | ||||||
| const StorageClassAnnotation = "volume.beta.kubernetes.io/storage-class" |  | ||||||
|  |  | ||||||
| // GetVolumeStorageClass returns value of StorageClassAnnotation or empty string in case |  | ||||||
| // the annotation does not exist. |  | ||||||
| // TODO: change to PersistentVolume.Spec.Class value when this attribute is |  | ||||||
| // introduced. |  | ||||||
| func GetVolumeStorageClass(volume *v1.PersistentVolume) string { |  | ||||||
| 	if class, found := volume.Annotations[StorageClassAnnotation]; found { |  | ||||||
| 		return class |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// 'nil' is interpreted as "", i.e. the volume does not belong to any class. |  | ||||||
| 	return "" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // GetClaimStorageClass returns name of class that is requested by given claim. |  | ||||||
| // Request for `nil` class is interpreted as request for class "", |  | ||||||
| // i.e. for a classless PV. |  | ||||||
| // TODO: change to PersistentVolumeClaim.Spec.Class value when this |  | ||||||
| // attribute is introduced. |  | ||||||
| func GetClaimStorageClass(claim *v1.PersistentVolumeClaim) string { |  | ||||||
| 	if class, found := claim.Annotations[StorageClassAnnotation]; found { |  | ||||||
| 		return class |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return "" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // GetStorageClassAnnotation returns the StorageClass value |  | ||||||
| // if the annotation is set, empty string if not |  | ||||||
| // TODO: remove Alpha and Beta when no longer used or needed |  | ||||||
| func GetStorageClassAnnotation(obj metav1.ObjectMeta) string { |  | ||||||
| 	if class, ok := obj.Annotations[StorageClassAnnotation]; ok { |  | ||||||
| 		return class |  | ||||||
| 	} |  | ||||||
| 	if class, ok := obj.Annotations[BetaStorageClassAnnotation]; ok { |  | ||||||
| 		return class |  | ||||||
| 	} |  | ||||||
| 	if class, ok := obj.Annotations[AlphaStorageClassAnnotation]; ok { |  | ||||||
| 		return class |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return "" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // HasStorageClassAnnotation returns a boolean |  | ||||||
| // if the annotation is set |  | ||||||
| // TODO: remove Alpha and Beta when no longer used or needed |  | ||||||
| func HasStorageClassAnnotation(obj metav1.ObjectMeta) bool { |  | ||||||
| 	if _, found := obj.Annotations[StorageClassAnnotation]; found { |  | ||||||
| 		return found |  | ||||||
| 	} |  | ||||||
| 	if _, found := obj.Annotations[BetaStorageClassAnnotation]; found { |  | ||||||
| 		return found |  | ||||||
| 	} |  | ||||||
| 	if _, found := obj.Annotations[AlphaStorageClassAnnotation]; found { |  | ||||||
| 		return found |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return false |  | ||||||
|  |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // IsDefaultAnnotationText returns a pretty Yes/No String if | // IsDefaultAnnotationText returns a pretty Yes/No String if | ||||||
| // the annotation is set | // the annotation is set | ||||||
| // TODO: remove Beta when no longer needed | // TODO: remove Beta when no longer needed | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ import ( | |||||||
|  |  | ||||||
| // ValidateStorageClass validates a StorageClass. | // ValidateStorageClass validates a StorageClass. | ||||||
| func ValidateStorageClass(storageClass *storage.StorageClass) field.ErrorList { | func ValidateStorageClass(storageClass *storage.StorageClass) field.ErrorList { | ||||||
| 	allErrs := apivalidation.ValidateObjectMeta(&storageClass.ObjectMeta, false, apivalidation.NameIsDNSSubdomain, field.NewPath("metadata")) | 	allErrs := apivalidation.ValidateObjectMeta(&storageClass.ObjectMeta, false, apivalidation.ValidateClassName, field.NewPath("metadata")) | ||||||
| 	allErrs = append(allErrs, validateProvisioner(storageClass.Provisioner, field.NewPath("provisioner"))...) | 	allErrs = append(allErrs, validateProvisioner(storageClass.Provisioner, field.NewPath("provisioner"))...) | ||||||
| 	allErrs = append(allErrs, validateParameters(storageClass.Parameters, field.NewPath("parameters"))...) | 	allErrs = append(allErrs, validateParameters(storageClass.Parameters, field.NewPath("parameters"))...) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -45,6 +45,7 @@ go_library( | |||||||
|         "//pkg/client/clientset_generated/clientset/typed/rbac/v1alpha1:go_default_library", |         "//pkg/client/clientset_generated/clientset/typed/rbac/v1alpha1:go_default_library", | ||||||
|         "//pkg/client/clientset_generated/clientset/typed/rbac/v1beta1:go_default_library", |         "//pkg/client/clientset_generated/clientset/typed/rbac/v1beta1:go_default_library", | ||||||
|         "//pkg/client/clientset_generated/clientset/typed/settings/v1alpha1:go_default_library", |         "//pkg/client/clientset_generated/clientset/typed/settings/v1alpha1:go_default_library", | ||||||
|  |         "//pkg/client/clientset_generated/clientset/typed/storage/v1:go_default_library", | ||||||
|         "//pkg/client/clientset_generated/clientset/typed/storage/v1beta1:go_default_library", |         "//pkg/client/clientset_generated/clientset/typed/storage/v1beta1:go_default_library", | ||||||
|         "//vendor:github.com/golang/glog", |         "//vendor:github.com/golang/glog", | ||||||
|         "//vendor:k8s.io/client-go/discovery", |         "//vendor:k8s.io/client-go/discovery", | ||||||
| @@ -82,6 +83,7 @@ filegroup( | |||||||
|         "//pkg/client/clientset_generated/clientset/typed/rbac/v1alpha1:all-srcs", |         "//pkg/client/clientset_generated/clientset/typed/rbac/v1alpha1:all-srcs", | ||||||
|         "//pkg/client/clientset_generated/clientset/typed/rbac/v1beta1:all-srcs", |         "//pkg/client/clientset_generated/clientset/typed/rbac/v1beta1:all-srcs", | ||||||
|         "//pkg/client/clientset_generated/clientset/typed/settings/v1alpha1:all-srcs", |         "//pkg/client/clientset_generated/clientset/typed/settings/v1alpha1:all-srcs", | ||||||
|  |         "//pkg/client/clientset_generated/clientset/typed/storage/v1:all-srcs", | ||||||
|         "//pkg/client/clientset_generated/clientset/typed/storage/v1beta1:all-srcs", |         "//pkg/client/clientset_generated/clientset/typed/storage/v1beta1:all-srcs", | ||||||
|     ], |     ], | ||||||
|     tags = ["automanaged"], |     tags = ["automanaged"], | ||||||
|   | |||||||
| @@ -37,6 +37,7 @@ import ( | |||||||
| 	rbacv1alpha1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/rbac/v1alpha1" | 	rbacv1alpha1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/rbac/v1alpha1" | ||||||
| 	rbacv1beta1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/rbac/v1beta1" | 	rbacv1beta1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/rbac/v1beta1" | ||||||
| 	settingsv1alpha1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/settings/v1alpha1" | 	settingsv1alpha1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/settings/v1alpha1" | ||||||
|  | 	storagev1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/storage/v1" | ||||||
| 	storagev1beta1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/storage/v1beta1" | 	storagev1beta1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/storage/v1beta1" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -81,8 +82,9 @@ type Interface interface { | |||||||
| 	// Deprecated: please explicitly pick a version if possible. | 	// Deprecated: please explicitly pick a version if possible. | ||||||
| 	Settings() settingsv1alpha1.SettingsV1alpha1Interface | 	Settings() settingsv1alpha1.SettingsV1alpha1Interface | ||||||
| 	StorageV1beta1() storagev1beta1.StorageV1beta1Interface | 	StorageV1beta1() storagev1beta1.StorageV1beta1Interface | ||||||
|  | 	StorageV1() storagev1.StorageV1Interface | ||||||
| 	// Deprecated: please explicitly pick a version if possible. | 	// Deprecated: please explicitly pick a version if possible. | ||||||
| 	Storage() storagev1beta1.StorageV1beta1Interface | 	Storage() storagev1.StorageV1Interface | ||||||
| } | } | ||||||
|  |  | ||||||
| // Clientset contains the clients for groups. Each group has exactly one | // Clientset contains the clients for groups. Each group has exactly one | ||||||
| @@ -106,6 +108,7 @@ type Clientset struct { | |||||||
| 	*rbacv1alpha1.RbacV1alpha1Client | 	*rbacv1alpha1.RbacV1alpha1Client | ||||||
| 	*settingsv1alpha1.SettingsV1alpha1Client | 	*settingsv1alpha1.SettingsV1alpha1Client | ||||||
| 	*storagev1beta1.StorageV1beta1Client | 	*storagev1beta1.StorageV1beta1Client | ||||||
|  | 	*storagev1.StorageV1Client | ||||||
| } | } | ||||||
|  |  | ||||||
| // CoreV1 retrieves the CoreV1Client | // CoreV1 retrieves the CoreV1Client | ||||||
| @@ -343,13 +346,21 @@ func (c *Clientset) StorageV1beta1() storagev1beta1.StorageV1beta1Interface { | |||||||
| 	return c.StorageV1beta1Client | 	return c.StorageV1beta1Client | ||||||
| } | } | ||||||
|  |  | ||||||
| // Deprecated: Storage retrieves the default version of StorageClient. | // StorageV1 retrieves the StorageV1Client | ||||||
| // Please explicitly pick a version. | func (c *Clientset) StorageV1() storagev1.StorageV1Interface { | ||||||
| func (c *Clientset) Storage() storagev1beta1.StorageV1beta1Interface { |  | ||||||
| 	if c == nil { | 	if c == nil { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| 	return c.StorageV1beta1Client | 	return c.StorageV1Client | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Deprecated: Storage retrieves the default version of StorageClient. | ||||||
|  | // Please explicitly pick a version. | ||||||
|  | func (c *Clientset) Storage() storagev1.StorageV1Interface { | ||||||
|  | 	if c == nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	return c.StorageV1Client | ||||||
| } | } | ||||||
|  |  | ||||||
| // Discovery retrieves the DiscoveryClient | // Discovery retrieves the DiscoveryClient | ||||||
| @@ -436,6 +447,10 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | 	cs.StorageV1Client, err = storagev1.NewForConfig(&configShallowCopy) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) | 	cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -466,6 +481,7 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { | |||||||
| 	cs.RbacV1alpha1Client = rbacv1alpha1.NewForConfigOrDie(c) | 	cs.RbacV1alpha1Client = rbacv1alpha1.NewForConfigOrDie(c) | ||||||
| 	cs.SettingsV1alpha1Client = settingsv1alpha1.NewForConfigOrDie(c) | 	cs.SettingsV1alpha1Client = settingsv1alpha1.NewForConfigOrDie(c) | ||||||
| 	cs.StorageV1beta1Client = storagev1beta1.NewForConfigOrDie(c) | 	cs.StorageV1beta1Client = storagev1beta1.NewForConfigOrDie(c) | ||||||
|  | 	cs.StorageV1Client = storagev1.NewForConfigOrDie(c) | ||||||
|  |  | ||||||
| 	cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) | 	cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) | ||||||
| 	return &cs | 	return &cs | ||||||
| @@ -491,6 +507,7 @@ func New(c rest.Interface) *Clientset { | |||||||
| 	cs.RbacV1alpha1Client = rbacv1alpha1.New(c) | 	cs.RbacV1alpha1Client = rbacv1alpha1.New(c) | ||||||
| 	cs.SettingsV1alpha1Client = settingsv1alpha1.New(c) | 	cs.SettingsV1alpha1Client = settingsv1alpha1.New(c) | ||||||
| 	cs.StorageV1beta1Client = storagev1beta1.New(c) | 	cs.StorageV1beta1Client = storagev1beta1.New(c) | ||||||
|  | 	cs.StorageV1Client = storagev1.New(c) | ||||||
|  |  | ||||||
| 	cs.DiscoveryClient = discovery.NewDiscoveryClient(c) | 	cs.DiscoveryClient = discovery.NewDiscoveryClient(c) | ||||||
| 	return &cs | 	return &cs | ||||||
|   | |||||||
| @@ -61,6 +61,8 @@ go_library( | |||||||
|         "//pkg/client/clientset_generated/clientset/typed/rbac/v1beta1/fake:go_default_library", |         "//pkg/client/clientset_generated/clientset/typed/rbac/v1beta1/fake:go_default_library", | ||||||
|         "//pkg/client/clientset_generated/clientset/typed/settings/v1alpha1:go_default_library", |         "//pkg/client/clientset_generated/clientset/typed/settings/v1alpha1:go_default_library", | ||||||
|         "//pkg/client/clientset_generated/clientset/typed/settings/v1alpha1/fake:go_default_library", |         "//pkg/client/clientset_generated/clientset/typed/settings/v1alpha1/fake:go_default_library", | ||||||
|  |         "//pkg/client/clientset_generated/clientset/typed/storage/v1:go_default_library", | ||||||
|  |         "//pkg/client/clientset_generated/clientset/typed/storage/v1/fake:go_default_library", | ||||||
|         "//pkg/client/clientset_generated/clientset/typed/storage/v1beta1:go_default_library", |         "//pkg/client/clientset_generated/clientset/typed/storage/v1beta1:go_default_library", | ||||||
|         "//pkg/client/clientset_generated/clientset/typed/storage/v1beta1/fake:go_default_library", |         "//pkg/client/clientset_generated/clientset/typed/storage/v1beta1/fake:go_default_library", | ||||||
|         "//vendor:k8s.io/apimachinery/pkg/apimachinery/announced", |         "//vendor:k8s.io/apimachinery/pkg/apimachinery/announced", | ||||||
|   | |||||||
| @@ -55,6 +55,8 @@ import ( | |||||||
| 	fakerbacv1beta1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/rbac/v1beta1/fake" | 	fakerbacv1beta1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/rbac/v1beta1/fake" | ||||||
| 	settingsv1alpha1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/settings/v1alpha1" | 	settingsv1alpha1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/settings/v1alpha1" | ||||||
| 	fakesettingsv1alpha1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/settings/v1alpha1/fake" | 	fakesettingsv1alpha1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/settings/v1alpha1/fake" | ||||||
|  | 	storagev1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/storage/v1" | ||||||
|  | 	fakestoragev1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/storage/v1/fake" | ||||||
| 	storagev1beta1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/storage/v1beta1" | 	storagev1beta1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/storage/v1beta1" | ||||||
| 	fakestoragev1beta1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/storage/v1beta1/fake" | 	fakestoragev1beta1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/storage/v1beta1/fake" | ||||||
| ) | ) | ||||||
| @@ -232,7 +234,12 @@ func (c *Clientset) StorageV1beta1() storagev1beta1.StorageV1beta1Interface { | |||||||
| 	return &fakestoragev1beta1.FakeStorageV1beta1{Fake: &c.Fake} | 	return &fakestoragev1beta1.FakeStorageV1beta1{Fake: &c.Fake} | ||||||
| } | } | ||||||
|  |  | ||||||
| // Storage retrieves the StorageV1beta1Client | // StorageV1 retrieves the StorageV1Client | ||||||
| func (c *Clientset) Storage() storagev1beta1.StorageV1beta1Interface { | func (c *Clientset) StorageV1() storagev1.StorageV1Interface { | ||||||
| 	return &fakestoragev1beta1.FakeStorageV1beta1{Fake: &c.Fake} | 	return &fakestoragev1.FakeStorageV1{Fake: &c.Fake} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Storage retrieves the StorageV1Client | ||||||
|  | func (c *Clientset) Storage() storagev1.StorageV1Interface { | ||||||
|  | 	return &fakestoragev1.FakeStorageV1{Fake: &c.Fake} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -31,6 +31,7 @@ go_library( | |||||||
|         "//pkg/apis/rbac/v1alpha1:go_default_library", |         "//pkg/apis/rbac/v1alpha1:go_default_library", | ||||||
|         "//pkg/apis/rbac/v1beta1:go_default_library", |         "//pkg/apis/rbac/v1beta1:go_default_library", | ||||||
|         "//pkg/apis/settings/v1alpha1:go_default_library", |         "//pkg/apis/settings/v1alpha1:go_default_library", | ||||||
|  |         "//pkg/apis/storage/v1:go_default_library", | ||||||
|         "//pkg/apis/storage/v1beta1:go_default_library", |         "//pkg/apis/storage/v1beta1:go_default_library", | ||||||
|         "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", |         "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", | ||||||
|         "//vendor:k8s.io/apimachinery/pkg/runtime", |         "//vendor:k8s.io/apimachinery/pkg/runtime", | ||||||
|   | |||||||
| @@ -37,6 +37,7 @@ import ( | |||||||
| 	rbacv1alpha1 "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1" | 	rbacv1alpha1 "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1" | ||||||
| 	rbacv1beta1 "k8s.io/kubernetes/pkg/apis/rbac/v1beta1" | 	rbacv1beta1 "k8s.io/kubernetes/pkg/apis/rbac/v1beta1" | ||||||
| 	settingsv1alpha1 "k8s.io/kubernetes/pkg/apis/settings/v1alpha1" | 	settingsv1alpha1 "k8s.io/kubernetes/pkg/apis/settings/v1alpha1" | ||||||
|  | 	storagev1 "k8s.io/kubernetes/pkg/apis/storage/v1" | ||||||
| 	storagev1beta1 "k8s.io/kubernetes/pkg/apis/storage/v1beta1" | 	storagev1beta1 "k8s.io/kubernetes/pkg/apis/storage/v1beta1" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -81,5 +82,6 @@ func AddToScheme(scheme *runtime.Scheme) { | |||||||
| 	rbacv1alpha1.AddToScheme(scheme) | 	rbacv1alpha1.AddToScheme(scheme) | ||||||
| 	settingsv1alpha1.AddToScheme(scheme) | 	settingsv1alpha1.AddToScheme(scheme) | ||||||
| 	storagev1beta1.AddToScheme(scheme) | 	storagev1beta1.AddToScheme(scheme) | ||||||
|  | 	storagev1.AddToScheme(scheme) | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -0,0 +1,44 @@ | |||||||
|  | package(default_visibility = ["//visibility:public"]) | ||||||
|  |  | ||||||
|  | licenses(["notice"]) | ||||||
|  |  | ||||||
|  | load( | ||||||
|  |     "@io_bazel_rules_go//go:def.bzl", | ||||||
|  |     "go_library", | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | go_library( | ||||||
|  |     name = "go_default_library", | ||||||
|  |     srcs = [ | ||||||
|  |         "doc.go", | ||||||
|  |         "generated_expansion.go", | ||||||
|  |         "storage_client.go", | ||||||
|  |         "storageclass.go", | ||||||
|  |     ], | ||||||
|  |     tags = ["automanaged"], | ||||||
|  |     deps = [ | ||||||
|  |         "//pkg/apis/storage/v1:go_default_library", | ||||||
|  |         "//pkg/client/clientset_generated/clientset/scheme:go_default_library", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/runtime/serializer", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/types", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/watch", | ||||||
|  |         "//vendor:k8s.io/client-go/rest", | ||||||
|  |     ], | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | filegroup( | ||||||
|  |     name = "package-srcs", | ||||||
|  |     srcs = glob(["**"]), | ||||||
|  |     tags = ["automanaged"], | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | filegroup( | ||||||
|  |     name = "all-srcs", | ||||||
|  |     srcs = [ | ||||||
|  |         ":package-srcs", | ||||||
|  |         "//pkg/client/clientset_generated/clientset/typed/storage/v1/fake:all-srcs", | ||||||
|  |     ], | ||||||
|  |     tags = ["automanaged"], | ||||||
|  | ) | ||||||
| @@ -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 | ||||||
| @@ -0,0 +1,42 @@ | |||||||
|  | package(default_visibility = ["//visibility:public"]) | ||||||
|  |  | ||||||
|  | licenses(["notice"]) | ||||||
|  |  | ||||||
|  | load( | ||||||
|  |     "@io_bazel_rules_go//go:def.bzl", | ||||||
|  |     "go_library", | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | go_library( | ||||||
|  |     name = "go_default_library", | ||||||
|  |     srcs = [ | ||||||
|  |         "doc.go", | ||||||
|  |         "fake_storage_client.go", | ||||||
|  |         "fake_storageclass.go", | ||||||
|  |     ], | ||||||
|  |     tags = ["automanaged"], | ||||||
|  |     deps = [ | ||||||
|  |         "//pkg/apis/storage/v1:go_default_library", | ||||||
|  |         "//pkg/client/clientset_generated/clientset/typed/storage/v1:go_default_library", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/labels", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/runtime/schema", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/types", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/watch", | ||||||
|  |         "//vendor:k8s.io/client-go/rest", | ||||||
|  |         "//vendor:k8s.io/client-go/testing", | ||||||
|  |     ], | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | filegroup( | ||||||
|  |     name = "package-srcs", | ||||||
|  |     srcs = glob(["**"]), | ||||||
|  |     tags = ["automanaged"], | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | filegroup( | ||||||
|  |     name = "all-srcs", | ||||||
|  |     srcs = [":package-srcs"], | ||||||
|  |     tags = ["automanaged"], | ||||||
|  | ) | ||||||
| @@ -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 | ||||||
| @@ -0,0 +1,38 @@ | |||||||
|  | /* | ||||||
|  | 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 ( | ||||||
|  | 	rest "k8s.io/client-go/rest" | ||||||
|  | 	testing "k8s.io/client-go/testing" | ||||||
|  | 	v1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/storage/v1" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type FakeStorageV1 struct { | ||||||
|  | 	*testing.Fake | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *FakeStorageV1) StorageClasses() v1.StorageClassInterface { | ||||||
|  | 	return &FakeStorageClasses{c} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RESTClient returns a RESTClient that is used to communicate | ||||||
|  | // with API server by this client implementation. | ||||||
|  | func (c *FakeStorageV1) RESTClient() rest.Interface { | ||||||
|  | 	var ret *rest.RESTClient | ||||||
|  | 	return ret | ||||||
|  | } | ||||||
| @@ -0,0 +1,110 @@ | |||||||
|  | /* | ||||||
|  | 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 ( | ||||||
|  | 	meta_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" | ||||||
|  | 	v1 "k8s.io/kubernetes/pkg/apis/storage/v1" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // FakeStorageClasses implements StorageClassInterface | ||||||
|  | type FakeStorageClasses struct { | ||||||
|  | 	Fake *FakeStorageV1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | var storageclassesResource = schema.GroupVersionResource{Group: "storage.k8s.io", Version: "v1", Resource: "storageclasses"} | ||||||
|  |  | ||||||
|  | func (c *FakeStorageClasses) Create(storageClass *v1.StorageClass) (result *v1.StorageClass, err error) { | ||||||
|  | 	obj, err := c.Fake. | ||||||
|  | 		Invokes(testing.NewRootCreateAction(storageclassesResource, storageClass), &v1.StorageClass{}) | ||||||
|  | 	if obj == nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return obj.(*v1.StorageClass), err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *FakeStorageClasses) Update(storageClass *v1.StorageClass) (result *v1.StorageClass, err error) { | ||||||
|  | 	obj, err := c.Fake. | ||||||
|  | 		Invokes(testing.NewRootUpdateAction(storageclassesResource, storageClass), &v1.StorageClass{}) | ||||||
|  | 	if obj == nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return obj.(*v1.StorageClass), err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *FakeStorageClasses) Delete(name string, options *meta_v1.DeleteOptions) error { | ||||||
|  | 	_, err := c.Fake. | ||||||
|  | 		Invokes(testing.NewRootDeleteAction(storageclassesResource, name), &v1.StorageClass{}) | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *FakeStorageClasses) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { | ||||||
|  | 	action := testing.NewRootDeleteCollectionAction(storageclassesResource, listOptions) | ||||||
|  |  | ||||||
|  | 	_, err := c.Fake.Invokes(action, &v1.StorageClassList{}) | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *FakeStorageClasses) Get(name string, options meta_v1.GetOptions) (result *v1.StorageClass, err error) { | ||||||
|  | 	obj, err := c.Fake. | ||||||
|  | 		Invokes(testing.NewRootGetAction(storageclassesResource, name), &v1.StorageClass{}) | ||||||
|  | 	if obj == nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return obj.(*v1.StorageClass), err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *FakeStorageClasses) List(opts meta_v1.ListOptions) (result *v1.StorageClassList, err error) { | ||||||
|  | 	obj, err := c.Fake. | ||||||
|  | 		Invokes(testing.NewRootListAction(storageclassesResource, opts), &v1.StorageClassList{}) | ||||||
|  | 	if obj == nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	label, _, _ := testing.ExtractFromListOptions(opts) | ||||||
|  | 	if label == nil { | ||||||
|  | 		label = labels.Everything() | ||||||
|  | 	} | ||||||
|  | 	list := &v1.StorageClassList{} | ||||||
|  | 	for _, item := range obj.(*v1.StorageClassList).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 storageClasses. | ||||||
|  | func (c *FakeStorageClasses) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { | ||||||
|  | 	return c.Fake. | ||||||
|  | 		InvokesWatch(testing.NewRootWatchAction(storageclassesResource, opts)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Patch applies the patch and returns the patched storageClass. | ||||||
|  | func (c *FakeStorageClasses) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.StorageClass, err error) { | ||||||
|  | 	obj, err := c.Fake. | ||||||
|  | 		Invokes(testing.NewRootPatchSubresourceAction(storageclassesResource, name, data, subresources...), &v1.StorageClass{}) | ||||||
|  | 	if obj == nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return obj.(*v1.StorageClass), err | ||||||
|  | } | ||||||
| @@ -0,0 +1,19 @@ | |||||||
|  | /* | ||||||
|  | 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 StorageClassExpansion interface{} | ||||||
| @@ -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 v1 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	serializer "k8s.io/apimachinery/pkg/runtime/serializer" | ||||||
|  | 	rest "k8s.io/client-go/rest" | ||||||
|  | 	v1 "k8s.io/kubernetes/pkg/apis/storage/v1" | ||||||
|  | 	"k8s.io/kubernetes/pkg/client/clientset_generated/clientset/scheme" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type StorageV1Interface interface { | ||||||
|  | 	RESTClient() rest.Interface | ||||||
|  | 	StorageClassesGetter | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // StorageV1Client is used to interact with features provided by the storage.k8s.io group. | ||||||
|  | type StorageV1Client struct { | ||||||
|  | 	restClient rest.Interface | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *StorageV1Client) StorageClasses() StorageClassInterface { | ||||||
|  | 	return newStorageClasses(c) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // NewForConfig creates a new StorageV1Client for the given config. | ||||||
|  | func NewForConfig(c *rest.Config) (*StorageV1Client, error) { | ||||||
|  | 	config := *c | ||||||
|  | 	if err := setConfigDefaults(&config); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	client, err := rest.RESTClientFor(&config) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return &StorageV1Client{client}, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // NewForConfigOrDie creates a new StorageV1Client for the given config and | ||||||
|  | // panics if there is an error in the config. | ||||||
|  | func NewForConfigOrDie(c *rest.Config) *StorageV1Client { | ||||||
|  | 	client, err := NewForConfig(c) | ||||||
|  | 	if err != nil { | ||||||
|  | 		panic(err) | ||||||
|  | 	} | ||||||
|  | 	return client | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // New creates a new StorageV1Client for the given RESTClient. | ||||||
|  | func New(c rest.Interface) *StorageV1Client { | ||||||
|  | 	return &StorageV1Client{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 *StorageV1Client) RESTClient() rest.Interface { | ||||||
|  | 	if c == nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	return c.restClient | ||||||
|  | } | ||||||
| @@ -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 ( | ||||||
|  | 	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
|  | 	types "k8s.io/apimachinery/pkg/types" | ||||||
|  | 	watch "k8s.io/apimachinery/pkg/watch" | ||||||
|  | 	rest "k8s.io/client-go/rest" | ||||||
|  | 	v1 "k8s.io/kubernetes/pkg/apis/storage/v1" | ||||||
|  | 	scheme "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/scheme" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // StorageClassesGetter has a method to return a StorageClassInterface. | ||||||
|  | // A group's client should implement this interface. | ||||||
|  | type StorageClassesGetter interface { | ||||||
|  | 	StorageClasses() StorageClassInterface | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // StorageClassInterface has methods to work with StorageClass resources. | ||||||
|  | type StorageClassInterface interface { | ||||||
|  | 	Create(*v1.StorageClass) (*v1.StorageClass, error) | ||||||
|  | 	Update(*v1.StorageClass) (*v1.StorageClass, 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.StorageClass, error) | ||||||
|  | 	List(opts meta_v1.ListOptions) (*v1.StorageClassList, error) | ||||||
|  | 	Watch(opts meta_v1.ListOptions) (watch.Interface, error) | ||||||
|  | 	Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.StorageClass, err error) | ||||||
|  | 	StorageClassExpansion | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // storageClasses implements StorageClassInterface | ||||||
|  | type storageClasses struct { | ||||||
|  | 	client rest.Interface | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // newStorageClasses returns a StorageClasses | ||||||
|  | func newStorageClasses(c *StorageV1Client) *storageClasses { | ||||||
|  | 	return &storageClasses{ | ||||||
|  | 		client: c.RESTClient(), | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Create takes the representation of a storageClass and creates it.  Returns the server's representation of the storageClass, and an error, if there is any. | ||||||
|  | func (c *storageClasses) Create(storageClass *v1.StorageClass) (result *v1.StorageClass, err error) { | ||||||
|  | 	result = &v1.StorageClass{} | ||||||
|  | 	err = c.client.Post(). | ||||||
|  | 		Resource("storageclasses"). | ||||||
|  | 		Body(storageClass). | ||||||
|  | 		Do(). | ||||||
|  | 		Into(result) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update takes the representation of a storageClass and updates it. Returns the server's representation of the storageClass, and an error, if there is any. | ||||||
|  | func (c *storageClasses) Update(storageClass *v1.StorageClass) (result *v1.StorageClass, err error) { | ||||||
|  | 	result = &v1.StorageClass{} | ||||||
|  | 	err = c.client.Put(). | ||||||
|  | 		Resource("storageclasses"). | ||||||
|  | 		Name(storageClass.Name). | ||||||
|  | 		Body(storageClass). | ||||||
|  | 		Do(). | ||||||
|  | 		Into(result) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Delete takes name of the storageClass and deletes it. Returns an error if one occurs. | ||||||
|  | func (c *storageClasses) Delete(name string, options *meta_v1.DeleteOptions) error { | ||||||
|  | 	return c.client.Delete(). | ||||||
|  | 		Resource("storageclasses"). | ||||||
|  | 		Name(name). | ||||||
|  | 		Body(options). | ||||||
|  | 		Do(). | ||||||
|  | 		Error() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DeleteCollection deletes a collection of objects. | ||||||
|  | func (c *storageClasses) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { | ||||||
|  | 	return c.client.Delete(). | ||||||
|  | 		Resource("storageclasses"). | ||||||
|  | 		VersionedParams(&listOptions, scheme.ParameterCodec). | ||||||
|  | 		Body(options). | ||||||
|  | 		Do(). | ||||||
|  | 		Error() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get takes name of the storageClass, and returns the corresponding storageClass object, and an error if there is any. | ||||||
|  | func (c *storageClasses) Get(name string, options meta_v1.GetOptions) (result *v1.StorageClass, err error) { | ||||||
|  | 	result = &v1.StorageClass{} | ||||||
|  | 	err = c.client.Get(). | ||||||
|  | 		Resource("storageclasses"). | ||||||
|  | 		Name(name). | ||||||
|  | 		VersionedParams(&options, scheme.ParameterCodec). | ||||||
|  | 		Do(). | ||||||
|  | 		Into(result) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // List takes label and field selectors, and returns the list of StorageClasses that match those selectors. | ||||||
|  | func (c *storageClasses) List(opts meta_v1.ListOptions) (result *v1.StorageClassList, err error) { | ||||||
|  | 	result = &v1.StorageClassList{} | ||||||
|  | 	err = c.client.Get(). | ||||||
|  | 		Resource("storageclasses"). | ||||||
|  | 		VersionedParams(&opts, scheme.ParameterCodec). | ||||||
|  | 		Do(). | ||||||
|  | 		Into(result) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Watch returns a watch.Interface that watches the requested storageClasses. | ||||||
|  | func (c *storageClasses) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { | ||||||
|  | 	opts.Watch = true | ||||||
|  | 	return c.client.Get(). | ||||||
|  | 		Resource("storageclasses"). | ||||||
|  | 		VersionedParams(&opts, scheme.ParameterCodec). | ||||||
|  | 		Watch() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Patch applies the patch and returns the patched storageClass. | ||||||
|  | func (c *storageClasses) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.StorageClass, err error) { | ||||||
|  | 	result = &v1.StorageClass{} | ||||||
|  | 	err = c.client.Patch(pt). | ||||||
|  | 		Resource("storageclasses"). | ||||||
|  | 		SubResource(subresources...). | ||||||
|  | 		Name(name). | ||||||
|  | 		Body(data). | ||||||
|  | 		Do(). | ||||||
|  | 		Into(result) | ||||||
|  | 	return | ||||||
|  | } | ||||||
| @@ -27,6 +27,7 @@ go_library( | |||||||
|         "//pkg/apis/rbac/v1alpha1:go_default_library", |         "//pkg/apis/rbac/v1alpha1:go_default_library", | ||||||
|         "//pkg/apis/rbac/v1beta1:go_default_library", |         "//pkg/apis/rbac/v1beta1:go_default_library", | ||||||
|         "//pkg/apis/settings/v1alpha1:go_default_library", |         "//pkg/apis/settings/v1alpha1:go_default_library", | ||||||
|  |         "//pkg/apis/storage/v1:go_default_library", | ||||||
|         "//pkg/apis/storage/v1beta1:go_default_library", |         "//pkg/apis/storage/v1beta1:go_default_library", | ||||||
|         "//pkg/client/clientset_generated/clientset:go_default_library", |         "//pkg/client/clientset_generated/clientset:go_default_library", | ||||||
|         "//pkg/client/informers/informers_generated/externalversions/apps:go_default_library", |         "//pkg/client/informers/informers_generated/externalversions/apps:go_default_library", | ||||||
|   | |||||||
| @@ -34,6 +34,7 @@ import ( | |||||||
| 	v1alpha1 "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1" | 	v1alpha1 "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1" | ||||||
| 	rbac_v1beta1 "k8s.io/kubernetes/pkg/apis/rbac/v1beta1" | 	rbac_v1beta1 "k8s.io/kubernetes/pkg/apis/rbac/v1beta1" | ||||||
| 	settings_v1alpha1 "k8s.io/kubernetes/pkg/apis/settings/v1alpha1" | 	settings_v1alpha1 "k8s.io/kubernetes/pkg/apis/settings/v1alpha1" | ||||||
|  | 	storage_v1 "k8s.io/kubernetes/pkg/apis/storage/v1" | ||||||
| 	storage_v1beta1 "k8s.io/kubernetes/pkg/apis/storage/v1beta1" | 	storage_v1beta1 "k8s.io/kubernetes/pkg/apis/storage/v1beta1" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -167,6 +168,10 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource | |||||||
| 	case settings_v1alpha1.SchemeGroupVersion.WithResource("podpresets"): | 	case settings_v1alpha1.SchemeGroupVersion.WithResource("podpresets"): | ||||||
| 		return &genericInformer{resource: resource.GroupResource(), informer: f.Settings().V1alpha1().PodPresets().Informer()}, nil | 		return &genericInformer{resource: resource.GroupResource(), informer: f.Settings().V1alpha1().PodPresets().Informer()}, nil | ||||||
|  |  | ||||||
|  | 		// Group=Storage, Version=V1 | ||||||
|  | 	case storage_v1.SchemeGroupVersion.WithResource("storageclasses"): | ||||||
|  | 		return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1().StorageClasses().Informer()}, nil | ||||||
|  |  | ||||||
| 		// Group=Storage, Version=V1beta1 | 		// Group=Storage, Version=V1beta1 | ||||||
| 	case storage_v1beta1.SchemeGroupVersion.WithResource("storageclasses"): | 	case storage_v1beta1.SchemeGroupVersion.WithResource("storageclasses"): | ||||||
| 		return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1beta1().StorageClasses().Informer()}, nil | 		return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1beta1().StorageClasses().Informer()}, nil | ||||||
|   | |||||||
| @@ -13,6 +13,7 @@ go_library( | |||||||
|     tags = ["automanaged"], |     tags = ["automanaged"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         "//pkg/client/informers/informers_generated/externalversions/internalinterfaces:go_default_library", |         "//pkg/client/informers/informers_generated/externalversions/internalinterfaces:go_default_library", | ||||||
|  |         "//pkg/client/informers/informers_generated/externalversions/storage/v1:go_default_library", | ||||||
|         "//pkg/client/informers/informers_generated/externalversions/storage/v1beta1:go_default_library", |         "//pkg/client/informers/informers_generated/externalversions/storage/v1beta1:go_default_library", | ||||||
|     ], |     ], | ||||||
| ) | ) | ||||||
| @@ -28,6 +29,7 @@ filegroup( | |||||||
|     name = "all-srcs", |     name = "all-srcs", | ||||||
|     srcs = [ |     srcs = [ | ||||||
|         ":package-srcs", |         ":package-srcs", | ||||||
|  |         "//pkg/client/informers/informers_generated/externalversions/storage/v1:all-srcs", | ||||||
|         "//pkg/client/informers/informers_generated/externalversions/storage/v1beta1:all-srcs", |         "//pkg/client/informers/informers_generated/externalversions/storage/v1beta1:all-srcs", | ||||||
|     ], |     ], | ||||||
|     tags = ["automanaged"], |     tags = ["automanaged"], | ||||||
|   | |||||||
| @@ -20,11 +20,14 @@ package storage | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	internalinterfaces "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions/internalinterfaces" | 	internalinterfaces "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions/internalinterfaces" | ||||||
|  | 	v1 "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions/storage/v1" | ||||||
| 	v1beta1 "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions/storage/v1beta1" | 	v1beta1 "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions/storage/v1beta1" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // Interface provides access to each of this group's versions. | // Interface provides access to each of this group's versions. | ||||||
| type Interface interface { | type Interface interface { | ||||||
|  | 	// V1 provides access to shared informers for resources in V1. | ||||||
|  | 	V1() v1.Interface | ||||||
| 	// V1beta1 provides access to shared informers for resources in V1beta1. | 	// V1beta1 provides access to shared informers for resources in V1beta1. | ||||||
| 	V1beta1() v1beta1.Interface | 	V1beta1() v1beta1.Interface | ||||||
| } | } | ||||||
| @@ -38,6 +41,11 @@ func New(f internalinterfaces.SharedInformerFactory) Interface { | |||||||
| 	return &group{f} | 	return &group{f} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // V1 returns a new v1.Interface. | ||||||
|  | func (g *group) V1() v1.Interface { | ||||||
|  | 	return v1.New(g.SharedInformerFactory) | ||||||
|  | } | ||||||
|  |  | ||||||
| // V1beta1 returns a new v1beta1.Interface. | // V1beta1 returns a new v1beta1.Interface. | ||||||
| func (g *group) V1beta1() v1beta1.Interface { | func (g *group) V1beta1() v1beta1.Interface { | ||||||
| 	return v1beta1.New(g.SharedInformerFactory) | 	return v1beta1.New(g.SharedInformerFactory) | ||||||
|   | |||||||
| @@ -0,0 +1,40 @@ | |||||||
|  | package(default_visibility = ["//visibility:public"]) | ||||||
|  |  | ||||||
|  | licenses(["notice"]) | ||||||
|  |  | ||||||
|  | load( | ||||||
|  |     "@io_bazel_rules_go//go:def.bzl", | ||||||
|  |     "go_library", | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | go_library( | ||||||
|  |     name = "go_default_library", | ||||||
|  |     srcs = [ | ||||||
|  |         "interface.go", | ||||||
|  |         "storageclass.go", | ||||||
|  |     ], | ||||||
|  |     tags = ["automanaged"], | ||||||
|  |     deps = [ | ||||||
|  |         "//pkg/apis/storage/v1:go_default_library", | ||||||
|  |         "//pkg/client/clientset_generated/clientset:go_default_library", | ||||||
|  |         "//pkg/client/informers/informers_generated/externalversions/internalinterfaces:go_default_library", | ||||||
|  |         "//pkg/client/listers/storage/v1:go_default_library", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/runtime", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/watch", | ||||||
|  |         "//vendor:k8s.io/client-go/tools/cache", | ||||||
|  |     ], | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | filegroup( | ||||||
|  |     name = "package-srcs", | ||||||
|  |     srcs = glob(["**"]), | ||||||
|  |     tags = ["automanaged"], | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | filegroup( | ||||||
|  |     name = "all-srcs", | ||||||
|  |     srcs = [":package-srcs"], | ||||||
|  |     tags = ["automanaged"], | ||||||
|  | ) | ||||||
| @@ -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 informer-gen | ||||||
|  |  | ||||||
|  | package v1 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	internalinterfaces "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions/internalinterfaces" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // Interface provides access to all the informers in this group version. | ||||||
|  | type Interface interface { | ||||||
|  | 	// StorageClasses returns a StorageClassInformer. | ||||||
|  | 	StorageClasses() StorageClassInformer | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type version struct { | ||||||
|  | 	internalinterfaces.SharedInformerFactory | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // New returns a new Interface. | ||||||
|  | func New(f internalinterfaces.SharedInformerFactory) Interface { | ||||||
|  | 	return &version{f} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // StorageClasses returns a StorageClassInformer. | ||||||
|  | func (v *version) StorageClasses() StorageClassInformer { | ||||||
|  | 	return &storageClassInformer{factory: v.SharedInformerFactory} | ||||||
|  | } | ||||||
| @@ -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. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | // This file was automatically generated by informer-gen | ||||||
|  |  | ||||||
|  | package v1 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
|  | 	runtime "k8s.io/apimachinery/pkg/runtime" | ||||||
|  | 	watch "k8s.io/apimachinery/pkg/watch" | ||||||
|  | 	cache "k8s.io/client-go/tools/cache" | ||||||
|  | 	storage_v1 "k8s.io/kubernetes/pkg/apis/storage/v1" | ||||||
|  | 	clientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" | ||||||
|  | 	internalinterfaces "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions/internalinterfaces" | ||||||
|  | 	v1 "k8s.io/kubernetes/pkg/client/listers/storage/v1" | ||||||
|  | 	time "time" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // StorageClassInformer provides access to a shared informer and lister for | ||||||
|  | // StorageClasses. | ||||||
|  | type StorageClassInformer interface { | ||||||
|  | 	Informer() cache.SharedIndexInformer | ||||||
|  | 	Lister() v1.StorageClassLister | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type storageClassInformer struct { | ||||||
|  | 	factory internalinterfaces.SharedInformerFactory | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func newStorageClassInformer(client clientset.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { | ||||||
|  | 	sharedIndexInformer := cache.NewSharedIndexInformer( | ||||||
|  | 		&cache.ListWatch{ | ||||||
|  | 			ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { | ||||||
|  | 				return client.StorageV1().StorageClasses().List(options) | ||||||
|  | 			}, | ||||||
|  | 			WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { | ||||||
|  | 				return client.StorageV1().StorageClasses().Watch(options) | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		&storage_v1.StorageClass{}, | ||||||
|  | 		resyncPeriod, | ||||||
|  | 		cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, | ||||||
|  | 	) | ||||||
|  |  | ||||||
|  | 	return sharedIndexInformer | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (f *storageClassInformer) Informer() cache.SharedIndexInformer { | ||||||
|  | 	return f.factory.InformerFor(&storage_v1.StorageClass{}, newStorageClassInformer) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (f *storageClassInformer) Lister() v1.StorageClassLister { | ||||||
|  | 	return v1.NewStorageClassLister(f.Informer().GetIndexer()) | ||||||
|  | } | ||||||
							
								
								
									
										38
									
								
								pkg/client/listers/storage/v1/BUILD
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								pkg/client/listers/storage/v1/BUILD
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | package(default_visibility = ["//visibility:public"]) | ||||||
|  |  | ||||||
|  | licenses(["notice"]) | ||||||
|  |  | ||||||
|  | load( | ||||||
|  |     "@io_bazel_rules_go//go:def.bzl", | ||||||
|  |     "go_library", | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | go_library( | ||||||
|  |     name = "go_default_library", | ||||||
|  |     srcs = [ | ||||||
|  |         "expansion_generated.go", | ||||||
|  |         "storageclass.go", | ||||||
|  |     ], | ||||||
|  |     tags = ["automanaged"], | ||||||
|  |     deps = [ | ||||||
|  |         "//pkg/apis/storage:go_default_library", | ||||||
|  |         "//pkg/apis/storage/v1:go_default_library", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/api/errors", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", | ||||||
|  |         "//vendor:k8s.io/apimachinery/pkg/labels", | ||||||
|  |         "//vendor:k8s.io/client-go/tools/cache", | ||||||
|  |     ], | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | filegroup( | ||||||
|  |     name = "package-srcs", | ||||||
|  |     srcs = glob(["**"]), | ||||||
|  |     tags = ["automanaged"], | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | filegroup( | ||||||
|  |     name = "all-srcs", | ||||||
|  |     srcs = [":package-srcs"], | ||||||
|  |     tags = ["automanaged"], | ||||||
|  | ) | ||||||
							
								
								
									
										23
									
								
								pkg/client/listers/storage/v1/expansion_generated.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								pkg/client/listers/storage/v1/expansion_generated.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | // This file was automatically generated by lister-gen | ||||||
|  |  | ||||||
|  | package v1 | ||||||
|  |  | ||||||
|  | // StorageClassListerExpansion allows custom methods to be added to | ||||||
|  | // StorageClassLister. | ||||||
|  | type StorageClassListerExpansion interface{} | ||||||
							
								
								
									
										68
									
								
								pkg/client/listers/storage/v1/storageclass.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								pkg/client/listers/storage/v1/storageclass.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | // This file was automatically generated by lister-gen | ||||||
|  |  | ||||||
|  | package v1 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"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" | ||||||
|  | 	storage "k8s.io/kubernetes/pkg/apis/storage" | ||||||
|  | 	v1 "k8s.io/kubernetes/pkg/apis/storage/v1" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // StorageClassLister helps list StorageClasses. | ||||||
|  | type StorageClassLister interface { | ||||||
|  | 	// List lists all StorageClasses in the indexer. | ||||||
|  | 	List(selector labels.Selector) (ret []*v1.StorageClass, err error) | ||||||
|  | 	// Get retrieves the StorageClass from the index for a given name. | ||||||
|  | 	Get(name string) (*v1.StorageClass, error) | ||||||
|  | 	StorageClassListerExpansion | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // storageClassLister implements the StorageClassLister interface. | ||||||
|  | type storageClassLister struct { | ||||||
|  | 	indexer cache.Indexer | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // NewStorageClassLister returns a new StorageClassLister. | ||||||
|  | func NewStorageClassLister(indexer cache.Indexer) StorageClassLister { | ||||||
|  | 	return &storageClassLister{indexer: indexer} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // List lists all StorageClasses in the indexer. | ||||||
|  | func (s *storageClassLister) List(selector labels.Selector) (ret []*v1.StorageClass, err error) { | ||||||
|  | 	err = cache.ListAll(s.indexer, selector, func(m interface{}) { | ||||||
|  | 		ret = append(ret, m.(*v1.StorageClass)) | ||||||
|  | 	}) | ||||||
|  | 	return ret, err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get retrieves the StorageClass from the index for a given name. | ||||||
|  | func (s *storageClassLister) Get(name string) (*v1.StorageClass, error) { | ||||||
|  | 	key := &v1.StorageClass{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(storage.Resource("storageclass"), name) | ||||||
|  | 	} | ||||||
|  | 	return obj.(*v1.StorageClass), nil | ||||||
|  | } | ||||||
| @@ -21,7 +21,6 @@ go_library( | |||||||
|         "//pkg/api:go_default_library", |         "//pkg/api:go_default_library", | ||||||
|         "//pkg/api/v1:go_default_library", |         "//pkg/api/v1:go_default_library", | ||||||
|         "//pkg/apis/storage/v1beta1:go_default_library", |         "//pkg/apis/storage/v1beta1:go_default_library", | ||||||
|         "//pkg/apis/storage/v1beta1/util:go_default_library", |  | ||||||
|         "//pkg/client/clientset_generated/clientset:go_default_library", |         "//pkg/client/clientset_generated/clientset:go_default_library", | ||||||
|         "//pkg/client/informers/informers_generated/externalversions/core/v1:go_default_library", |         "//pkg/client/informers/informers_generated/externalversions/core/v1:go_default_library", | ||||||
|         "//pkg/client/informers/informers_generated/externalversions/storage/v1beta1:go_default_library", |         "//pkg/client/informers/informers_generated/externalversions/storage/v1beta1:go_default_library", | ||||||
| @@ -68,7 +67,6 @@ go_test( | |||||||
|         "//pkg/api/testapi:go_default_library", |         "//pkg/api/testapi:go_default_library", | ||||||
|         "//pkg/api/v1:go_default_library", |         "//pkg/api/v1:go_default_library", | ||||||
|         "//pkg/apis/storage/v1beta1:go_default_library", |         "//pkg/apis/storage/v1beta1:go_default_library", | ||||||
|         "//pkg/apis/storage/v1beta1/util:go_default_library", |  | ||||||
|         "//pkg/client/clientset_generated/clientset:go_default_library", |         "//pkg/client/clientset_generated/clientset:go_default_library", | ||||||
|         "//pkg/client/clientset_generated/clientset/fake:go_default_library", |         "//pkg/client/clientset_generated/clientset/fake:go_default_library", | ||||||
|         "//pkg/client/informers/informers_generated/externalversions:go_default_library", |         "//pkg/client/informers/informers_generated/externalversions:go_default_library", | ||||||
|   | |||||||
| @@ -21,7 +21,6 @@ import ( | |||||||
|  |  | ||||||
| 	"k8s.io/kubernetes/pkg/api/v1" | 	"k8s.io/kubernetes/pkg/api/v1" | ||||||
| 	storage "k8s.io/kubernetes/pkg/apis/storage/v1beta1" | 	storage "k8s.io/kubernetes/pkg/apis/storage/v1beta1" | ||||||
| 	storageutil "k8s.io/kubernetes/pkg/apis/storage/v1beta1/util" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // Test single call to syncClaim and syncVolume methods. | // Test single call to syncClaim and syncVolume methods. | ||||||
| @@ -42,19 +41,19 @@ func TestSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// syncClaim binds to a matching unbound volume. | 			// syncClaim binds to a matching unbound volume. | ||||||
| 			"1-1 - successful bind", | 			"1-1 - successful bind", | ||||||
| 			newVolumeArray("volume1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume1-1", "1Gi", "uid1-1", "claim1-1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume1-1", "1Gi", "uid1-1", "claim1-1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			newClaimArray("claim1-1", "uid1-1", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim1-1", "uid1-1", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim1-1", "uid1-1", "1Gi", "volume1-1", v1.ClaimBound, annBoundByController, annBindCompleted), | 			newClaimArray("claim1-1", "uid1-1", "1Gi", "volume1-1", v1.ClaimBound, nil, annBoundByController, annBindCompleted), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncClaim does not do anything when there is no matching volume. | 			// syncClaim does not do anything when there is no matching volume. | ||||||
| 			"1-2 - noop", | 			"1-2 - noop", | ||||||
| 			newVolumeArray("volume1-2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume1-2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume1-2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume1-2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newClaimArray("claim1-2", "uid1-2", "10Gi", "", v1.ClaimPending), | 			newClaimArray("claim1-2", "uid1-2", "10Gi", "", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim1-2", "uid1-2", "10Gi", "", v1.ClaimPending), | 			newClaimArray("claim1-2", "uid1-2", "10Gi", "", v1.ClaimPending, nil), | ||||||
| 			[]string{"Normal FailedBinding"}, | 			[]string{"Normal FailedBinding"}, | ||||||
| 			noerrors, testSyncClaim, | 			noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| @@ -62,10 +61,10 @@ func TestSync(t *testing.T) { | |||||||
| 			// syncClaim resets claim.Status to Pending when there is no | 			// syncClaim resets claim.Status to Pending when there is no | ||||||
| 			// matching volume. | 			// matching volume. | ||||||
| 			"1-3 - reset to Pending", | 			"1-3 - reset to Pending", | ||||||
| 			newVolumeArray("volume1-3", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume1-3", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume1-3", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume1-3", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newClaimArray("claim1-3", "uid1-3", "10Gi", "", v1.ClaimBound), | 			newClaimArray("claim1-3", "uid1-3", "10Gi", "", v1.ClaimBound, nil), | ||||||
| 			newClaimArray("claim1-3", "uid1-3", "10Gi", "", v1.ClaimPending), | 			newClaimArray("claim1-3", "uid1-3", "10Gi", "", v1.ClaimPending, nil), | ||||||
| 			[]string{"Normal FailedBinding"}, | 			[]string{"Normal FailedBinding"}, | ||||||
| 			noerrors, testSyncClaim, | 			noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| @@ -73,15 +72,15 @@ func TestSync(t *testing.T) { | |||||||
| 			// syncClaim binds claims to the smallest matching volume | 			// syncClaim binds claims to the smallest matching volume | ||||||
| 			"1-4 - smallest volume", | 			"1-4 - smallest volume", | ||||||
| 			[]*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume1-4_1", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume1-4_1", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 				newVolume("volume1-4_2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume1-4_2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			}, | 			}, | ||||||
| 			[]*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume1-4_1", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume1-4_1", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 				newVolume("volume1-4_2", "1Gi", "uid1-4", "claim1-4", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 				newVolume("volume1-4_2", "1Gi", "uid1-4", "claim1-4", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			}, | 			}, | ||||||
| 			newClaimArray("claim1-4", "uid1-4", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim1-4", "uid1-4", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim1-4", "uid1-4", "1Gi", "volume1-4_2", v1.ClaimBound, annBoundByController, annBindCompleted), | 			newClaimArray("claim1-4", "uid1-4", "1Gi", "volume1-4_2", v1.ClaimBound, nil, annBoundByController, annBindCompleted), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| @@ -89,15 +88,15 @@ func TestSync(t *testing.T) { | |||||||
| 			// name), even though a smaller one is available. | 			// name), even though a smaller one is available. | ||||||
| 			"1-5 - prebound volume by name - success", | 			"1-5 - prebound volume by name - success", | ||||||
| 			[]*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume1-5_1", "10Gi", "", "claim1-5", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume1-5_1", "10Gi", "", "claim1-5", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 				newVolume("volume1-5_2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume1-5_2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			}, | 			}, | ||||||
| 			[]*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume1-5_1", "10Gi", "uid1-5", "claim1-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume1-5_1", "10Gi", "uid1-5", "claim1-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 				newVolume("volume1-5_2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume1-5_2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			}, | 			}, | ||||||
| 			newClaimArray("claim1-5", "uid1-5", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim1-5", "uid1-5", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			withExpectedCapacity("10Gi", newClaimArray("claim1-5", "uid1-5", "1Gi", "volume1-5_1", v1.ClaimBound, annBoundByController, annBindCompleted)), | 			withExpectedCapacity("10Gi", newClaimArray("claim1-5", "uid1-5", "1Gi", "volume1-5_1", v1.ClaimBound, nil, annBoundByController, annBindCompleted)), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| @@ -105,25 +104,25 @@ func TestSync(t *testing.T) { | |||||||
| 			// UID), even though a smaller one is available. | 			// UID), even though a smaller one is available. | ||||||
| 			"1-6 - prebound volume by UID - success", | 			"1-6 - prebound volume by UID - success", | ||||||
| 			[]*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume1-6_1", "10Gi", "uid1-6", "claim1-6", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume1-6_1", "10Gi", "uid1-6", "claim1-6", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 				newVolume("volume1-6_2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume1-6_2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			}, | 			}, | ||||||
| 			[]*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume1-6_1", "10Gi", "uid1-6", "claim1-6", v1.VolumeBound, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume1-6_1", "10Gi", "uid1-6", "claim1-6", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 				newVolume("volume1-6_2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume1-6_2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			}, | 			}, | ||||||
| 			newClaimArray("claim1-6", "uid1-6", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim1-6", "uid1-6", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			withExpectedCapacity("10Gi", newClaimArray("claim1-6", "uid1-6", "1Gi", "volume1-6_1", v1.ClaimBound, annBoundByController, annBindCompleted)), | 			withExpectedCapacity("10Gi", newClaimArray("claim1-6", "uid1-6", "1Gi", "volume1-6_1", v1.ClaimBound, nil, annBoundByController, annBindCompleted)), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncClaim does not bind claim to a volume prebound to a claim with | 			// syncClaim does not bind claim to a volume prebound to a claim with | ||||||
| 			// same name and different UID | 			// same name and different UID | ||||||
| 			"1-7 - prebound volume to different claim", | 			"1-7 - prebound volume to different claim", | ||||||
| 			newVolumeArray("volume1-7", "10Gi", "uid1-777", "claim1-7", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume1-7", "10Gi", "uid1-777", "claim1-7", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume1-7", "10Gi", "uid1-777", "claim1-7", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume1-7", "10Gi", "uid1-777", "claim1-7", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newClaimArray("claim1-7", "uid1-7", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim1-7", "uid1-7", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim1-7", "uid1-7", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim1-7", "uid1-7", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			[]string{"Normal FailedBinding"}, | 			[]string{"Normal FailedBinding"}, | ||||||
| 			noerrors, testSyncClaim, | 			noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| @@ -131,48 +130,48 @@ func TestSync(t *testing.T) { | |||||||
| 			// syncClaim completes binding - simulates controller crash after | 			// syncClaim completes binding - simulates controller crash after | ||||||
| 			// PV.ClaimRef is saved | 			// PV.ClaimRef is saved | ||||||
| 			"1-8 - complete bind after crash - PV bound", | 			"1-8 - complete bind after crash - PV bound", | ||||||
| 			newVolumeArray("volume1-8", "1Gi", "uid1-8", "claim1-8", v1.VolumePending, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume1-8", "1Gi", "uid1-8", "claim1-8", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			newVolumeArray("volume1-8", "1Gi", "uid1-8", "claim1-8", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume1-8", "1Gi", "uid1-8", "claim1-8", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			newClaimArray("claim1-8", "uid1-8", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim1-8", "uid1-8", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim1-8", "uid1-8", "1Gi", "volume1-8", v1.ClaimBound, annBoundByController, annBindCompleted), | 			newClaimArray("claim1-8", "uid1-8", "1Gi", "volume1-8", v1.ClaimBound, nil, annBoundByController, annBindCompleted), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncClaim completes binding - simulates controller crash after | 			// syncClaim completes binding - simulates controller crash after | ||||||
| 			// PV.Status is saved | 			// PV.Status is saved | ||||||
| 			"1-9 - complete bind after crash - PV status saved", | 			"1-9 - complete bind after crash - PV status saved", | ||||||
| 			newVolumeArray("volume1-9", "1Gi", "uid1-9", "claim1-9", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume1-9", "1Gi", "uid1-9", "claim1-9", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			newVolumeArray("volume1-9", "1Gi", "uid1-9", "claim1-9", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume1-9", "1Gi", "uid1-9", "claim1-9", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			newClaimArray("claim1-9", "uid1-9", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim1-9", "uid1-9", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim1-9", "uid1-9", "1Gi", "volume1-9", v1.ClaimBound, annBoundByController, annBindCompleted), | 			newClaimArray("claim1-9", "uid1-9", "1Gi", "volume1-9", v1.ClaimBound, nil, annBoundByController, annBindCompleted), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncClaim completes binding - simulates controller crash after | 			// syncClaim completes binding - simulates controller crash after | ||||||
| 			// PVC.VolumeName is saved | 			// PVC.VolumeName is saved | ||||||
| 			"1-10 - complete bind after crash - PVC bound", | 			"1-10 - complete bind after crash - PVC bound", | ||||||
| 			newVolumeArray("volume1-10", "1Gi", "uid1-10", "claim1-10", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume1-10", "1Gi", "uid1-10", "claim1-10", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			newVolumeArray("volume1-10", "1Gi", "uid1-10", "claim1-10", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume1-10", "1Gi", "uid1-10", "claim1-10", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			newClaimArray("claim1-10", "uid1-10", "1Gi", "volume1-10", v1.ClaimPending, annBoundByController, annBindCompleted), | 			newClaimArray("claim1-10", "uid1-10", "1Gi", "volume1-10", v1.ClaimPending, nil, annBoundByController, annBindCompleted), | ||||||
| 			newClaimArray("claim1-10", "uid1-10", "1Gi", "volume1-10", v1.ClaimBound, annBoundByController, annBindCompleted), | 			newClaimArray("claim1-10", "uid1-10", "1Gi", "volume1-10", v1.ClaimBound, nil, annBoundByController, annBindCompleted), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncClaim binds a claim only when the label selector matches the volume | 			// syncClaim binds a claim only when the label selector matches the volume | ||||||
| 			"1-11 - bind when selector matches", | 			"1-11 - bind when selector matches", | ||||||
| 			withLabels(labels, newVolumeArray("volume1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain)), | 			withLabels(labels, newVolumeArray("volume1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty)), | ||||||
| 			withLabels(labels, newVolumeArray("volume1-1", "1Gi", "uid1-1", "claim1-1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController)), | 			withLabels(labels, newVolumeArray("volume1-1", "1Gi", "uid1-1", "claim1-1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController)), | ||||||
| 			withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", v1.ClaimPending)), | 			withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", v1.ClaimPending, nil)), | ||||||
| 			withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "volume1-1", v1.ClaimBound, annBoundByController, annBindCompleted)), | 			withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "volume1-1", v1.ClaimBound, nil, annBoundByController, annBindCompleted)), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncClaim does not bind a claim when the label selector doesn't match | 			// syncClaim does not bind a claim when the label selector doesn't match | ||||||
| 			"1-12 - do not bind when selector does not match", | 			"1-12 - do not bind when selector does not match", | ||||||
| 			newVolumeArray("volume1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", v1.ClaimPending)), | 			withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", v1.ClaimPending, nil)), | ||||||
| 			withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", v1.ClaimPending)), | 			withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", v1.ClaimPending, nil)), | ||||||
| 			[]string{"Normal FailedBinding"}, | 			[]string{"Normal FailedBinding"}, | ||||||
| 			noerrors, testSyncClaim, | 			noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| @@ -185,8 +184,8 @@ func TestSync(t *testing.T) { | |||||||
| 			"2-1 - claim prebound to non-existing volume - noop", | 			"2-1 - claim prebound to non-existing volume - noop", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newClaimArray("claim2-1", "uid2-1", "10Gi", "volume2-1", v1.ClaimPending), | 			newClaimArray("claim2-1", "uid2-1", "10Gi", "volume2-1", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim2-1", "uid2-1", "10Gi", "volume2-1", v1.ClaimPending), | 			newClaimArray("claim2-1", "uid2-1", "10Gi", "volume2-1", v1.ClaimPending, nil), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| @@ -195,28 +194,28 @@ func TestSync(t *testing.T) { | |||||||
| 			"2-2 - claim prebound to non-existing volume - reset status", | 			"2-2 - claim prebound to non-existing volume - reset status", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newClaimArray("claim2-2", "uid2-2", "10Gi", "volume2-2", v1.ClaimBound), | 			newClaimArray("claim2-2", "uid2-2", "10Gi", "volume2-2", v1.ClaimBound, nil), | ||||||
| 			newClaimArray("claim2-2", "uid2-2", "10Gi", "volume2-2", v1.ClaimPending), | 			newClaimArray("claim2-2", "uid2-2", "10Gi", "volume2-2", v1.ClaimPending, nil), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncClaim with claim pre-bound to a PV that exists and is | 			// syncClaim with claim pre-bound to a PV that exists and is | ||||||
| 			// unbound. Check it gets bound and no annBoundByController is set. | 			// unbound. Check it gets bound and no annBoundByController is set. | ||||||
| 			"2-3 - claim prebound to unbound volume", | 			"2-3 - claim prebound to unbound volume", | ||||||
| 			newVolumeArray("volume2-3", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume2-3", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume2-3", "1Gi", "uid2-3", "claim2-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume2-3", "1Gi", "uid2-3", "claim2-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", v1.ClaimPending), | 			newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", v1.ClaimBound, annBindCompleted), | 			newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", v1.ClaimBound, nil, annBindCompleted), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// claim with claim pre-bound to a PV that is pre-bound to the claim | 			// claim with claim pre-bound to a PV that is pre-bound to the claim | ||||||
| 			// by name. Check it gets bound and no annBoundByController is set. | 			// by name. Check it gets bound and no annBoundByController is set. | ||||||
| 			"2-4 - claim prebound to prebound volume by name", | 			"2-4 - claim prebound to prebound volume by name", | ||||||
| 			newVolumeArray("volume2-4", "1Gi", "", "claim2-4", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume2-4", "1Gi", "", "claim2-4", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume2-4", "1Gi", "uid2-4", "claim2-4", v1.VolumeBound, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume2-4", "1Gi", "uid2-4", "claim2-4", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newClaimArray("claim2-4", "uid2-4", "1Gi", "volume2-4", v1.ClaimPending), | 			newClaimArray("claim2-4", "uid2-4", "1Gi", "volume2-4", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim2-4", "uid2-4", "1Gi", "volume2-4", v1.ClaimBound, annBindCompleted), | 			newClaimArray("claim2-4", "uid2-4", "1Gi", "volume2-4", v1.ClaimBound, nil, annBindCompleted), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| @@ -224,30 +223,30 @@ func TestSync(t *testing.T) { | |||||||
| 			// claim by UID. Check it gets bound and no annBoundByController is | 			// claim by UID. Check it gets bound and no annBoundByController is | ||||||
| 			// set. | 			// set. | ||||||
| 			"2-5 - claim prebound to prebound volume by UID", | 			"2-5 - claim prebound to prebound volume by UID", | ||||||
| 			newVolumeArray("volume2-5", "1Gi", "uid2-5", "claim2-5", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume2-5", "1Gi", "uid2-5", "claim2-5", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume2-5", "1Gi", "uid2-5", "claim2-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume2-5", "1Gi", "uid2-5", "claim2-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newClaimArray("claim2-5", "uid2-5", "1Gi", "volume2-5", v1.ClaimPending), | 			newClaimArray("claim2-5", "uid2-5", "1Gi", "volume2-5", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim2-5", "uid2-5", "1Gi", "volume2-5", v1.ClaimBound, annBindCompleted), | 			newClaimArray("claim2-5", "uid2-5", "1Gi", "volume2-5", v1.ClaimBound, nil, annBindCompleted), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncClaim with claim pre-bound to a PV that is bound to different | 			// syncClaim with claim pre-bound to a PV that is bound to different | ||||||
| 			// claim. Check it's reset to Pending. | 			// claim. Check it's reset to Pending. | ||||||
| 			"2-6 - claim prebound to already bound volume", | 			"2-6 - claim prebound to already bound volume", | ||||||
| 			newVolumeArray("volume2-6", "1Gi", "uid2-6_1", "claim2-6_1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume2-6", "1Gi", "uid2-6_1", "claim2-6_1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume2-6", "1Gi", "uid2-6_1", "claim2-6_1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume2-6", "1Gi", "uid2-6_1", "claim2-6_1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newClaimArray("claim2-6", "uid2-6", "1Gi", "volume2-6", v1.ClaimBound), | 			newClaimArray("claim2-6", "uid2-6", "1Gi", "volume2-6", v1.ClaimBound, nil), | ||||||
| 			newClaimArray("claim2-6", "uid2-6", "1Gi", "volume2-6", v1.ClaimPending), | 			newClaimArray("claim2-6", "uid2-6", "1Gi", "volume2-6", v1.ClaimPending, nil), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncClaim with claim bound by controller to a PV that is bound to | 			// syncClaim with claim bound by controller to a PV that is bound to | ||||||
| 			// different claim. Check it throws an error. | 			// different claim. Check it throws an error. | ||||||
| 			"2-7 - claim bound by controller to already bound volume", | 			"2-7 - claim bound by controller to already bound volume", | ||||||
| 			newVolumeArray("volume2-7", "1Gi", "uid2-7_1", "claim2-7_1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume2-7", "1Gi", "uid2-7_1", "claim2-7_1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume2-7", "1Gi", "uid2-7_1", "claim2-7_1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume2-7", "1Gi", "uid2-7_1", "claim2-7_1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newClaimArray("claim2-7", "uid2-7", "1Gi", "volume2-7", v1.ClaimBound, annBoundByController), | 			newClaimArray("claim2-7", "uid2-7", "1Gi", "volume2-7", v1.ClaimBound, nil, annBoundByController), | ||||||
| 			newClaimArray("claim2-7", "uid2-7", "1Gi", "volume2-7", v1.ClaimBound, annBoundByController), | 			newClaimArray("claim2-7", "uid2-7", "1Gi", "volume2-7", v1.ClaimBound, nil, annBoundByController), | ||||||
| 			noevents, noerrors, testSyncClaimError, | 			noevents, noerrors, testSyncClaimError, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| @@ -255,10 +254,10 @@ func TestSync(t *testing.T) { | |||||||
| 			// unbound, but does not match the selector. Check it gets bound | 			// unbound, but does not match the selector. Check it gets bound | ||||||
| 			// and no annBoundByController is set. | 			// and no annBoundByController is set. | ||||||
| 			"2-8 - claim prebound to unbound volume that does not match the selector", | 			"2-8 - claim prebound to unbound volume that does not match the selector", | ||||||
| 			newVolumeArray("volume2-3", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume2-3", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume2-3", "1Gi", "uid2-3", "claim2-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume2-3", "1Gi", "uid2-3", "claim2-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			withLabelSelector(labels, newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", v1.ClaimPending)), | 			withLabelSelector(labels, newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", v1.ClaimPending, nil)), | ||||||
| 			withLabelSelector(labels, newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", v1.ClaimBound, annBindCompleted)), | 			withLabelSelector(labels, newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", v1.ClaimBound, nil, annBindCompleted)), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
| @@ -269,8 +268,8 @@ func TestSync(t *testing.T) { | |||||||
| 			"3-1 - bound claim with missing VolumeName", | 			"3-1 - bound claim with missing VolumeName", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newClaimArray("claim3-1", "uid3-1", "10Gi", "", v1.ClaimBound, annBoundByController, annBindCompleted), | 			newClaimArray("claim3-1", "uid3-1", "10Gi", "", v1.ClaimBound, nil, annBoundByController, annBindCompleted), | ||||||
| 			newClaimArray("claim3-1", "uid3-1", "10Gi", "", v1.ClaimLost, annBoundByController, annBindCompleted), | 			newClaimArray("claim3-1", "uid3-1", "10Gi", "", v1.ClaimLost, nil, annBoundByController, annBindCompleted), | ||||||
| 			[]string{"Warning ClaimLost"}, noerrors, testSyncClaim, | 			[]string{"Warning ClaimLost"}, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| @@ -279,28 +278,28 @@ func TestSync(t *testing.T) { | |||||||
| 			"3-2 - bound claim with missing volume", | 			"3-2 - bound claim with missing volume", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newClaimArray("claim3-2", "uid3-2", "10Gi", "volume3-2", v1.ClaimBound, annBoundByController, annBindCompleted), | 			newClaimArray("claim3-2", "uid3-2", "10Gi", "volume3-2", v1.ClaimBound, nil, annBoundByController, annBindCompleted), | ||||||
| 			newClaimArray("claim3-2", "uid3-2", "10Gi", "volume3-2", v1.ClaimLost, annBoundByController, annBindCompleted), | 			newClaimArray("claim3-2", "uid3-2", "10Gi", "volume3-2", v1.ClaimLost, nil, annBoundByController, annBindCompleted), | ||||||
| 			[]string{"Warning ClaimLost"}, noerrors, testSyncClaim, | 			[]string{"Warning ClaimLost"}, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncClaim with claim bound to unbound volume. Check it's bound. | 			// syncClaim with claim bound to unbound volume. Check it's bound. | ||||||
| 			// Also check that Pending phase is set to Bound | 			// Also check that Pending phase is set to Bound | ||||||
| 			"3-3 - bound claim with unbound volume", | 			"3-3 - bound claim with unbound volume", | ||||||
| 			newVolumeArray("volume3-3", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume3-3", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume3-3", "10Gi", "uid3-3", "claim3-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume3-3", "10Gi", "uid3-3", "claim3-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", v1.ClaimPending, annBoundByController, annBindCompleted), | 			newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", v1.ClaimPending, nil, annBoundByController, annBindCompleted), | ||||||
| 			newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", v1.ClaimBound, annBoundByController, annBindCompleted), | 			newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", v1.ClaimBound, nil, annBoundByController, annBindCompleted), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncClaim with claim bound to volume with missing (or different) | 			// syncClaim with claim bound to volume with missing (or different) | ||||||
| 			// volume.Spec.ClaimRef.UID. Check that the claim is marked as lost. | 			// volume.Spec.ClaimRef.UID. Check that the claim is marked as lost. | ||||||
| 			"3-4 - bound claim with prebound volume", | 			"3-4 - bound claim with prebound volume", | ||||||
| 			newVolumeArray("volume3-4", "10Gi", "claim3-4-x", "claim3-4", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume3-4", "10Gi", "claim3-4-x", "claim3-4", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume3-4", "10Gi", "claim3-4-x", "claim3-4", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume3-4", "10Gi", "claim3-4-x", "claim3-4", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newClaimArray("claim3-4", "uid3-4", "10Gi", "volume3-4", v1.ClaimPending, annBoundByController, annBindCompleted), | 			newClaimArray("claim3-4", "uid3-4", "10Gi", "volume3-4", v1.ClaimPending, nil, annBoundByController, annBindCompleted), | ||||||
| 			newClaimArray("claim3-4", "uid3-4", "10Gi", "volume3-4", v1.ClaimLost, annBoundByController, annBindCompleted), | 			newClaimArray("claim3-4", "uid3-4", "10Gi", "volume3-4", v1.ClaimLost, nil, annBoundByController, annBindCompleted), | ||||||
| 			[]string{"Warning ClaimMisbound"}, noerrors, testSyncClaim, | 			[]string{"Warning ClaimMisbound"}, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| @@ -308,10 +307,10 @@ func TestSync(t *testing.T) { | |||||||
| 			// controller does not do anything. Also check that Pending phase is | 			// controller does not do anything. Also check that Pending phase is | ||||||
| 			// set to Bound | 			// set to Bound | ||||||
| 			"3-5 - bound claim with bound volume", | 			"3-5 - bound claim with bound volume", | ||||||
| 			newVolumeArray("volume3-5", "10Gi", "uid3-5", "claim3-5", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume3-5", "10Gi", "uid3-5", "claim3-5", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume3-5", "10Gi", "uid3-5", "claim3-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume3-5", "10Gi", "uid3-5", "claim3-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newClaimArray("claim3-5", "uid3-5", "10Gi", "volume3-5", v1.ClaimPending, annBindCompleted), | 			newClaimArray("claim3-5", "uid3-5", "10Gi", "volume3-5", v1.ClaimPending, nil, annBindCompleted), | ||||||
| 			newClaimArray("claim3-5", "uid3-5", "10Gi", "volume3-5", v1.ClaimBound, annBindCompleted), | 			newClaimArray("claim3-5", "uid3-5", "10Gi", "volume3-5", v1.ClaimBound, nil, annBindCompleted), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| @@ -319,10 +318,10 @@ func TestSync(t *testing.T) { | |||||||
| 			// claim. Check that the claim is marked as lost. | 			// claim. Check that the claim is marked as lost. | ||||||
| 			// TODO: test that an event is emitted | 			// TODO: test that an event is emitted | ||||||
| 			"3-6 - bound claim with bound volume", | 			"3-6 - bound claim with bound volume", | ||||||
| 			newVolumeArray("volume3-6", "10Gi", "uid3-6-x", "claim3-6-x", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume3-6", "10Gi", "uid3-6-x", "claim3-6-x", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume3-6", "10Gi", "uid3-6-x", "claim3-6-x", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume3-6", "10Gi", "uid3-6-x", "claim3-6-x", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newClaimArray("claim3-6", "uid3-6", "10Gi", "volume3-6", v1.ClaimPending, annBindCompleted), | 			newClaimArray("claim3-6", "uid3-6", "10Gi", "volume3-6", v1.ClaimPending, nil, annBindCompleted), | ||||||
| 			newClaimArray("claim3-6", "uid3-6", "10Gi", "volume3-6", v1.ClaimLost, annBindCompleted), | 			newClaimArray("claim3-6", "uid3-6", "10Gi", "volume3-6", v1.ClaimLost, nil, annBindCompleted), | ||||||
| 			[]string{"Warning ClaimMisbound"}, noerrors, testSyncClaim, | 			[]string{"Warning ClaimMisbound"}, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| @@ -330,18 +329,18 @@ func TestSync(t *testing.T) { | |||||||
| 			// even if the claim's selector doesn't match the volume. Also | 			// even if the claim's selector doesn't match the volume. Also | ||||||
| 			// check that Pending phase is set to Bound | 			// check that Pending phase is set to Bound | ||||||
| 			"3-7 - bound claim with unbound volume where selector doesn't match", | 			"3-7 - bound claim with unbound volume where selector doesn't match", | ||||||
| 			newVolumeArray("volume3-3", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume3-3", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume3-3", "10Gi", "uid3-3", "claim3-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume3-3", "10Gi", "uid3-3", "claim3-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			withLabelSelector(labels, newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", v1.ClaimPending, annBoundByController, annBindCompleted)), | 			withLabelSelector(labels, newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", v1.ClaimPending, nil, annBoundByController, annBindCompleted)), | ||||||
| 			withLabelSelector(labels, newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", v1.ClaimBound, annBoundByController, annBindCompleted)), | 			withLabelSelector(labels, newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", v1.ClaimBound, nil, annBoundByController, annBindCompleted)), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		// [Unit test set 4] All syncVolume tests. | 		// [Unit test set 4] All syncVolume tests. | ||||||
| 		{ | 		{ | ||||||
| 			// syncVolume with pending volume. Check it's marked as Available. | 			// syncVolume with pending volume. Check it's marked as Available. | ||||||
| 			"4-1 - pending volume", | 			"4-1 - pending volume", | ||||||
| 			newVolumeArray("volume4-1", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume4-1", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume4-1", "10Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume4-1", "10Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noevents, noerrors, testSyncVolume, | 			noevents, noerrors, testSyncVolume, | ||||||
| @@ -350,8 +349,8 @@ func TestSync(t *testing.T) { | |||||||
| 			// syncVolume with prebound pending volume. Check it's marked as | 			// syncVolume with prebound pending volume. Check it's marked as | ||||||
| 			// Available. | 			// Available. | ||||||
| 			"4-2 - pending prebound volume", | 			"4-2 - pending prebound volume", | ||||||
| 			newVolumeArray("volume4-2", "10Gi", "", "claim4-2", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume4-2", "10Gi", "", "claim4-2", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume4-2", "10Gi", "", "claim4-2", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume4-2", "10Gi", "", "claim4-2", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noevents, noerrors, testSyncVolume, | 			noevents, noerrors, testSyncVolume, | ||||||
| @@ -360,8 +359,8 @@ func TestSync(t *testing.T) { | |||||||
| 			// syncVolume with volume bound to missing claim. | 			// syncVolume with volume bound to missing claim. | ||||||
| 			// Check the volume gets Released | 			// Check the volume gets Released | ||||||
| 			"4-3 - bound volume with missing claim", | 			"4-3 - bound volume with missing claim", | ||||||
| 			newVolumeArray("volume4-3", "10Gi", "uid4-3", "claim4-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume4-3", "10Gi", "uid4-3", "claim4-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume4-3", "10Gi", "uid4-3", "claim4-3", v1.VolumeReleased, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume4-3", "10Gi", "uid4-3", "claim4-3", v1.VolumeReleased, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noevents, noerrors, testSyncVolume, | 			noevents, noerrors, testSyncVolume, | ||||||
| @@ -370,50 +369,50 @@ func TestSync(t *testing.T) { | |||||||
| 			// syncVolume with volume bound to claim with different UID. | 			// syncVolume with volume bound to claim with different UID. | ||||||
| 			// Check the volume gets Released. | 			// Check the volume gets Released. | ||||||
| 			"4-4 - volume bound to claim with different UID", | 			"4-4 - volume bound to claim with different UID", | ||||||
| 			newVolumeArray("volume4-4", "10Gi", "uid4-4", "claim4-4", v1.VolumeBound, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume4-4", "10Gi", "uid4-4", "claim4-4", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume4-4", "10Gi", "uid4-4", "claim4-4", v1.VolumeReleased, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume4-4", "10Gi", "uid4-4", "claim4-4", v1.VolumeReleased, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newClaimArray("claim4-4", "uid4-4-x", "10Gi", "volume4-4", v1.ClaimBound, annBindCompleted), | 			newClaimArray("claim4-4", "uid4-4-x", "10Gi", "volume4-4", v1.ClaimBound, nil, annBindCompleted), | ||||||
| 			newClaimArray("claim4-4", "uid4-4-x", "10Gi", "volume4-4", v1.ClaimBound, annBindCompleted), | 			newClaimArray("claim4-4", "uid4-4-x", "10Gi", "volume4-4", v1.ClaimBound, nil, annBindCompleted), | ||||||
| 			noevents, noerrors, testSyncVolume, | 			noevents, noerrors, testSyncVolume, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncVolume with volume bound by controller to unbound claim. | 			// syncVolume with volume bound by controller to unbound claim. | ||||||
| 			// Check syncVolume does not do anything. | 			// Check syncVolume does not do anything. | ||||||
| 			"4-5 - volume bound by controller to unbound claim", | 			"4-5 - volume bound by controller to unbound claim", | ||||||
| 			newVolumeArray("volume4-5", "10Gi", "uid4-5", "claim4-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume4-5", "10Gi", "uid4-5", "claim4-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			newVolumeArray("volume4-5", "10Gi", "uid4-5", "claim4-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume4-5", "10Gi", "uid4-5", "claim4-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			newClaimArray("claim4-5", "uid4-5", "10Gi", "", v1.ClaimPending), | 			newClaimArray("claim4-5", "uid4-5", "10Gi", "", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim4-5", "uid4-5", "10Gi", "", v1.ClaimPending), | 			newClaimArray("claim4-5", "uid4-5", "10Gi", "", v1.ClaimPending, nil), | ||||||
| 			noevents, noerrors, testSyncVolume, | 			noevents, noerrors, testSyncVolume, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncVolume with volume bound by user to unbound claim. | 			// syncVolume with volume bound by user to unbound claim. | ||||||
| 			// Check syncVolume does not do anything. | 			// Check syncVolume does not do anything. | ||||||
| 			"4-5 - volume bound by user to bound claim", | 			"4-5 - volume bound by user to bound claim", | ||||||
| 			newVolumeArray("volume4-5", "10Gi", "uid4-5", "claim4-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume4-5", "10Gi", "uid4-5", "claim4-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume4-5", "10Gi", "uid4-5", "claim4-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume4-5", "10Gi", "uid4-5", "claim4-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newClaimArray("claim4-5", "uid4-5", "10Gi", "", v1.ClaimPending), | 			newClaimArray("claim4-5", "uid4-5", "10Gi", "", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim4-5", "uid4-5", "10Gi", "", v1.ClaimPending), | 			newClaimArray("claim4-5", "uid4-5", "10Gi", "", v1.ClaimPending, nil), | ||||||
| 			noevents, noerrors, testSyncVolume, | 			noevents, noerrors, testSyncVolume, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncVolume with volume bound to bound claim. | 			// syncVolume with volume bound to bound claim. | ||||||
| 			// Check that the volume is marked as Bound. | 			// Check that the volume is marked as Bound. | ||||||
| 			"4-6 - volume bound by to bound claim", | 			"4-6 - volume bound by to bound claim", | ||||||
| 			newVolumeArray("volume4-6", "10Gi", "uid4-6", "claim4-6", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume4-6", "10Gi", "uid4-6", "claim4-6", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume4-6", "10Gi", "uid4-6", "claim4-6", v1.VolumeBound, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume4-6", "10Gi", "uid4-6", "claim4-6", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newClaimArray("claim4-6", "uid4-6", "10Gi", "volume4-6", v1.ClaimBound), | 			newClaimArray("claim4-6", "uid4-6", "10Gi", "volume4-6", v1.ClaimBound, nil), | ||||||
| 			newClaimArray("claim4-6", "uid4-6", "10Gi", "volume4-6", v1.ClaimBound), | 			newClaimArray("claim4-6", "uid4-6", "10Gi", "volume4-6", v1.ClaimBound, nil), | ||||||
| 			noevents, noerrors, testSyncVolume, | 			noevents, noerrors, testSyncVolume, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncVolume with volume bound by controller to claim bound to | 			// syncVolume with volume bound by controller to claim bound to | ||||||
| 			// another volume. Check that the volume is rolled back. | 			// another volume. Check that the volume is rolled back. | ||||||
| 			"4-7 - volume bound by controller to claim bound somewhere else", | 			"4-7 - volume bound by controller to claim bound somewhere else", | ||||||
| 			newVolumeArray("volume4-7", "10Gi", "uid4-7", "claim4-7", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume4-7", "10Gi", "uid4-7", "claim4-7", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			newVolumeArray("volume4-7", "10Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume4-7", "10Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newClaimArray("claim4-7", "uid4-7", "10Gi", "volume4-7-x", v1.ClaimBound), | 			newClaimArray("claim4-7", "uid4-7", "10Gi", "volume4-7-x", v1.ClaimBound, nil), | ||||||
| 			newClaimArray("claim4-7", "uid4-7", "10Gi", "volume4-7-x", v1.ClaimBound), | 			newClaimArray("claim4-7", "uid4-7", "10Gi", "volume4-7-x", v1.ClaimBound, nil), | ||||||
| 			noevents, noerrors, testSyncVolume, | 			noevents, noerrors, testSyncVolume, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| @@ -421,10 +420,10 @@ func TestSync(t *testing.T) { | |||||||
| 			// another volume. Check that the volume is marked as Available | 			// another volume. Check that the volume is marked as Available | ||||||
| 			// and its UID is reset. | 			// and its UID is reset. | ||||||
| 			"4-8 - volume bound by user to claim bound somewhere else", | 			"4-8 - volume bound by user to claim bound somewhere else", | ||||||
| 			newVolumeArray("volume4-8", "10Gi", "uid4-8", "claim4-8", v1.VolumeBound, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume4-8", "10Gi", "uid4-8", "claim4-8", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume4-8", "10Gi", "", "claim4-8", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume4-8", "10Gi", "", "claim4-8", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newClaimArray("claim4-8", "uid4-8", "10Gi", "volume4-8-x", v1.ClaimBound), | 			newClaimArray("claim4-8", "uid4-8", "10Gi", "volume4-8-x", v1.ClaimBound, nil), | ||||||
| 			newClaimArray("claim4-8", "uid4-8", "10Gi", "volume4-8-x", v1.ClaimBound), | 			newClaimArray("claim4-8", "uid4-8", "10Gi", "volume4-8-x", v1.ClaimBound, nil), | ||||||
| 			noevents, noerrors, testSyncVolume, | 			noevents, noerrors, testSyncVolume, | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
| @@ -434,15 +433,15 @@ func TestSync(t *testing.T) { | |||||||
| 			// smaller PV available | 			// smaller PV available | ||||||
| 			"13-1 - binding to class", | 			"13-1 - binding to class", | ||||||
| 			[]*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume13-1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume13-1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 				newVolume("volume13-1-2", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, storageutil.StorageClassAnnotation), | 				newVolume("volume13-1-2", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classGold), | ||||||
| 			}, | 			}, | ||||||
| 			[]*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume13-1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume13-1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 				newVolume("volume13-1-2", "10Gi", "uid13-1", "claim13-1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController, storageutil.StorageClassAnnotation), | 				newVolume("volume13-1-2", "10Gi", "uid13-1", "claim13-1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classGold, annBoundByController), | ||||||
| 			}, | 			}, | ||||||
| 			newClaimArray("claim13-1", "uid13-1", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation), | 			newClaimArray("claim13-1", "uid13-1", "1Gi", "", v1.ClaimPending, &classGold), | ||||||
| 			withExpectedCapacity("10Gi", newClaimArray("claim13-1", "uid13-1", "1Gi", "volume13-1-2", v1.ClaimBound, annBoundByController, storageutil.StorageClassAnnotation, annBindCompleted)), | 			withExpectedCapacity("10Gi", newClaimArray("claim13-1", "uid13-1", "1Gi", "volume13-1-2", v1.ClaimBound, &classGold, annBoundByController, annBindCompleted)), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| @@ -450,61 +449,51 @@ func TestSync(t *testing.T) { | |||||||
| 			// smaller PV with a class available | 			// smaller PV with a class available | ||||||
| 			"13-2 - binding without a class", | 			"13-2 - binding without a class", | ||||||
| 			[]*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume13-2-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, storageutil.StorageClassAnnotation), | 				newVolume("volume13-2-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classGold), | ||||||
| 				newVolume("volume13-2-2", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume13-2-2", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			}, | 			}, | ||||||
| 			[]*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume13-2-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, storageutil.StorageClassAnnotation), | 				newVolume("volume13-2-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classGold), | ||||||
| 				newVolume("volume13-2-2", "10Gi", "uid13-2", "claim13-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 				newVolume("volume13-2-2", "10Gi", "uid13-2", "claim13-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			}, | 			}, | ||||||
| 			newClaimArray("claim13-2", "uid13-2", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim13-2", "uid13-2", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			withExpectedCapacity("10Gi", newClaimArray("claim13-2", "uid13-2", "1Gi", "volume13-2-2", v1.ClaimBound, annBoundByController, annBindCompleted)), | 			withExpectedCapacity("10Gi", newClaimArray("claim13-2", "uid13-2", "1Gi", "volume13-2-2", v1.ClaimBound, nil, annBoundByController, annBindCompleted)), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncVolume binds a claim with given class even if there is a | 			// syncVolume binds a claim with given class even if there is a | ||||||
| 			// smaller PV with different class available | 			// smaller PV with different class available | ||||||
| 			"13-3 - binding to specific a class", | 			"13-3 - binding to specific a class", | ||||||
| 			volumeWithClass("silver", []*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume13-3-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume13-3-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classSilver), | ||||||
| 				newVolume("volume13-3-2", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, storageutil.StorageClassAnnotation), | 				newVolume("volume13-3-2", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classGold), | ||||||
| 			}), | 			}, | ||||||
| 			volumeWithClass("silver", []*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume13-3-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume13-3-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classSilver), | ||||||
| 				newVolume("volume13-3-2", "10Gi", "uid13-3", "claim13-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController, storageutil.StorageClassAnnotation), | 				newVolume("volume13-3-2", "10Gi", "uid13-3", "claim13-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classGold, annBoundByController), | ||||||
| 			}), | 			}, | ||||||
| 			newClaimArray("claim13-3", "uid13-3", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation), | 			newClaimArray("claim13-3", "uid13-3", "1Gi", "", v1.ClaimPending, &classGold), | ||||||
| 			withExpectedCapacity("10Gi", newClaimArray("claim13-3", "uid13-3", "1Gi", "volume13-3-2", v1.ClaimBound, annBoundByController, annBindCompleted, storageutil.StorageClassAnnotation)), | 			withExpectedCapacity("10Gi", newClaimArray("claim13-3", "uid13-3", "1Gi", "volume13-3-2", v1.ClaimBound, &classGold, annBoundByController, annBindCompleted)), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncVolume binds claim requesting class "" to claim to PV with | 			// syncVolume binds claim requesting class "" to claim to PV with | ||||||
| 			// class="" | 			// class="" | ||||||
| 			"13-4 - empty class", | 			"13-4 - empty class", | ||||||
| 			volumeWithClass("", newVolumeArray("volume13-4", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain)), | 			newVolumeArray("volume13-4", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			volumeWithClass("", newVolumeArray("volume13-4", "1Gi", "uid13-4", "claim13-4", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController)), | 			newVolumeArray("volume13-4", "1Gi", "uid13-4", "claim13-4", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			claimWithClass("", newClaimArray("claim13-4", "uid13-4", "1Gi", "", v1.ClaimPending)), | 			newClaimArray("claim13-4", "uid13-4", "1Gi", "", v1.ClaimPending, &classEmpty), | ||||||
| 			claimWithClass("", newClaimArray("claim13-4", "uid13-4", "1Gi", "volume13-4", v1.ClaimBound, annBoundByController, annBindCompleted)), | 			newClaimArray("claim13-4", "uid13-4", "1Gi", "volume13-4", v1.ClaimBound, &classEmpty, annBoundByController, annBindCompleted), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// syncVolume binds claim requesting class nil to claim to PV with | 			// syncVolume binds claim requesting class nil to claim to PV with | ||||||
| 			// class = "" | 			// class = "" | ||||||
| 			"13-5 - nil class", | 			"13-5 - nil class", | ||||||
| 			volumeWithClass("", newVolumeArray("volume13-5", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain)), | 			newVolumeArray("volume13-5", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			volumeWithClass("", newVolumeArray("volume13-5", "1Gi", "uid13-5", "claim13-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController)), | 			newVolumeArray("volume13-5", "1Gi", "uid13-5", "claim13-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			newClaimArray("claim13-5", "uid13-5", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim13-5", "uid13-5", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim13-5", "uid13-5", "1Gi", "volume13-5", v1.ClaimBound, annBoundByController, annBindCompleted), | 			newClaimArray("claim13-5", "uid13-5", "1Gi", "volume13-5", v1.ClaimBound, nil, annBoundByController, annBindCompleted), | ||||||
| 			noevents, noerrors, testSyncClaim, |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			// syncVolume binds claim requesting class "" to claim to PV with |  | ||||||
| 			// class=nil |  | ||||||
| 			"13-6 - nil class in PV, '' class in claim", |  | ||||||
| 			newVolumeArray("volume13-6", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), |  | ||||||
| 			newVolumeArray("volume13-6", "1Gi", "uid13-6", "claim13-6", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), |  | ||||||
| 			claimWithClass("", newClaimArray("claim13-6", "uid13-6", "1Gi", "", v1.ClaimPending)), |  | ||||||
| 			claimWithClass("", newClaimArray("claim13-6", "uid13-6", "1Gi", "volume13-6", v1.ClaimBound, annBoundByController, annBindCompleted)), |  | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| @@ -531,10 +520,10 @@ func TestMultiSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// syncClaim binds to a matching unbound volume. | 			// syncClaim binds to a matching unbound volume. | ||||||
| 			"10-1 - successful bind", | 			"10-1 - successful bind", | ||||||
| 			newVolumeArray("volume10-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume10-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume10-1", "1Gi", "uid10-1", "claim10-1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume10-1", "1Gi", "uid10-1", "claim10-1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			newClaimArray("claim10-1", "uid10-1", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim10-1", "uid10-1", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim10-1", "uid10-1", "1Gi", "volume10-1", v1.ClaimBound, annBoundByController, annBindCompleted), | 			newClaimArray("claim10-1", "uid10-1", "1Gi", "volume10-1", v1.ClaimBound, nil, annBoundByController, annBindCompleted), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| @@ -542,15 +531,15 @@ func TestMultiSync(t *testing.T) { | |||||||
| 			// wins and the second rolls back. | 			// wins and the second rolls back. | ||||||
| 			"10-2 - bind PV race", | 			"10-2 - bind PV race", | ||||||
| 			[]*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume10-2-1", "1Gi", "uid10-2", "claim10-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 				newVolume("volume10-2-1", "1Gi", "uid10-2", "claim10-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 				newVolume("volume10-2-2", "1Gi", "uid10-2", "claim10-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 				newVolume("volume10-2-2", "1Gi", "uid10-2", "claim10-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			}, | 			}, | ||||||
| 			[]*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume10-2-1", "1Gi", "uid10-2", "claim10-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 				newVolume("volume10-2-1", "1Gi", "uid10-2", "claim10-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 				newVolume("volume10-2-2", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume10-2-2", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			}, | 			}, | ||||||
| 			newClaimArray("claim10-2", "uid10-2", "1Gi", "volume10-2-1", v1.ClaimBound, annBoundByController, annBindCompleted), | 			newClaimArray("claim10-2", "uid10-2", "1Gi", "volume10-2-1", v1.ClaimBound, nil, annBoundByController, annBindCompleted), | ||||||
| 			newClaimArray("claim10-2", "uid10-2", "1Gi", "volume10-2-1", v1.ClaimBound, annBoundByController, annBindCompleted), | 			newClaimArray("claim10-2", "uid10-2", "1Gi", "volume10-2-1", v1.ClaimBound, nil, annBoundByController, annBindCompleted), | ||||||
| 			noevents, noerrors, testSyncClaim, | 			noevents, noerrors, testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ func TestDeleteSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// delete volume bound by controller | 			// delete volume bound by controller | ||||||
| 			"8-1 - successful delete", | 			"8-1 - successful delete", | ||||||
| 			newVolumeArray("volume8-1", "1Gi", "uid8-1", "claim8-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController), | 			newVolumeArray("volume8-1", "1Gi", "uid8-1", "claim8-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty, annBoundByController), | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| @@ -45,7 +45,7 @@ func TestDeleteSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// delete volume bound by user | 			// delete volume bound by user | ||||||
| 			"8-2 - successful delete with prebound volume", | 			"8-2 - successful delete with prebound volume", | ||||||
| 			newVolumeArray("volume8-2", "1Gi", "uid8-2", "claim8-2", v1.VolumeBound, v1.PersistentVolumeReclaimDelete), | 			newVolumeArray("volume8-2", "1Gi", "uid8-2", "claim8-2", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty), | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| @@ -57,8 +57,8 @@ func TestDeleteSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// delete failure - plugin not found | 			// delete failure - plugin not found | ||||||
| 			"8-3 - plugin not found", | 			"8-3 - plugin not found", | ||||||
| 			newVolumeArray("volume8-3", "1Gi", "uid8-3", "claim8-3", v1.VolumeBound, v1.PersistentVolumeReclaimDelete), | 			newVolumeArray("volume8-3", "1Gi", "uid8-3", "claim8-3", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty), | ||||||
| 			withMessage("Error getting deleter volume plugin for volume \"volume8-3\": no volume plugin matched", newVolumeArray("volume8-3", "1Gi", "uid8-3", "claim8-3", v1.VolumeFailed, v1.PersistentVolumeReclaimDelete)), | 			withMessage("Error getting deleter volume plugin for volume \"volume8-3\": no volume plugin matched", newVolumeArray("volume8-3", "1Gi", "uid8-3", "claim8-3", v1.VolumeFailed, v1.PersistentVolumeReclaimDelete, classEmpty)), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			[]string{"Warning VolumeFailedDelete"}, noerrors, testSyncVolume, | 			[]string{"Warning VolumeFailedDelete"}, noerrors, testSyncVolume, | ||||||
| @@ -66,8 +66,8 @@ func TestDeleteSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// delete failure - newDeleter returns error | 			// delete failure - newDeleter returns error | ||||||
| 			"8-4 - newDeleter returns error", | 			"8-4 - newDeleter returns error", | ||||||
| 			newVolumeArray("volume8-4", "1Gi", "uid8-4", "claim8-4", v1.VolumeBound, v1.PersistentVolumeReclaimDelete), | 			newVolumeArray("volume8-4", "1Gi", "uid8-4", "claim8-4", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty), | ||||||
| 			withMessage("Failed to create deleter for volume \"volume8-4\": Mock plugin error: no deleteCalls configured", newVolumeArray("volume8-4", "1Gi", "uid8-4", "claim8-4", v1.VolumeFailed, v1.PersistentVolumeReclaimDelete)), | 			withMessage("Failed to create deleter for volume \"volume8-4\": Mock plugin error: no deleteCalls configured", newVolumeArray("volume8-4", "1Gi", "uid8-4", "claim8-4", v1.VolumeFailed, v1.PersistentVolumeReclaimDelete, classEmpty)), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			[]string{"Warning VolumeFailedDelete"}, noerrors, | 			[]string{"Warning VolumeFailedDelete"}, noerrors, | ||||||
| @@ -76,8 +76,8 @@ func TestDeleteSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// delete failure - delete() returns error | 			// delete failure - delete() returns error | ||||||
| 			"8-5 - delete returns error", | 			"8-5 - delete returns error", | ||||||
| 			newVolumeArray("volume8-5", "1Gi", "uid8-5", "claim8-5", v1.VolumeBound, v1.PersistentVolumeReclaimDelete), | 			newVolumeArray("volume8-5", "1Gi", "uid8-5", "claim8-5", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty), | ||||||
| 			withMessage("Mock delete error", newVolumeArray("volume8-5", "1Gi", "uid8-5", "claim8-5", v1.VolumeFailed, v1.PersistentVolumeReclaimDelete)), | 			withMessage("Mock delete error", newVolumeArray("volume8-5", "1Gi", "uid8-5", "claim8-5", v1.VolumeFailed, v1.PersistentVolumeReclaimDelete, classEmpty)), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			[]string{"Warning VolumeFailedDelete"}, noerrors, | 			[]string{"Warning VolumeFailedDelete"}, noerrors, | ||||||
| @@ -86,7 +86,7 @@ func TestDeleteSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// delete success(?) - volume is deleted before doDelete() starts | 			// delete success(?) - volume is deleted before doDelete() starts | ||||||
| 			"8-6 - volume is deleted before deleting", | 			"8-6 - volume is deleted before deleting", | ||||||
| 			newVolumeArray("volume8-6", "1Gi", "uid8-6", "claim8-6", v1.VolumeBound, v1.PersistentVolumeReclaimDelete), | 			newVolumeArray("volume8-6", "1Gi", "uid8-6", "claim8-6", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty), | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| @@ -103,17 +103,17 @@ func TestDeleteSync(t *testing.T) { | |||||||
| 			// starts. This simulates "volume no longer needs recycling, | 			// starts. This simulates "volume no longer needs recycling, | ||||||
| 			// skipping". | 			// skipping". | ||||||
| 			"8-7 - volume is bound before deleting", | 			"8-7 - volume is bound before deleting", | ||||||
| 			newVolumeArray("volume8-7", "1Gi", "uid8-7", "claim8-7", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController), | 			newVolumeArray("volume8-7", "1Gi", "uid8-7", "claim8-7", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty, annBoundByController), | ||||||
| 			newVolumeArray("volume8-7", "1Gi", "uid8-7", "claim8-7", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController), | 			newVolumeArray("volume8-7", "1Gi", "uid8-7", "claim8-7", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty, annBoundByController), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			newClaimArray("claim8-7", "uid8-7", "10Gi", "volume8-7", v1.ClaimBound), | 			newClaimArray("claim8-7", "uid8-7", "10Gi", "volume8-7", v1.ClaimBound, nil), | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| 			wrapTestWithInjectedOperation(wrapTestWithReclaimCalls(operationDelete, []error{}, testSyncVolume), func(ctrl *PersistentVolumeController, reactor *volumeReactor) { | 			wrapTestWithInjectedOperation(wrapTestWithReclaimCalls(operationDelete, []error{}, testSyncVolume), func(ctrl *PersistentVolumeController, reactor *volumeReactor) { | ||||||
| 				reactor.lock.Lock() | 				reactor.lock.Lock() | ||||||
| 				defer reactor.lock.Unlock() | 				defer reactor.lock.Unlock() | ||||||
| 				// Bind the volume to resurrected claim (this should never | 				// Bind the volume to resurrected claim (this should never | ||||||
| 				// happen) | 				// happen) | ||||||
| 				claim := newClaim("claim8-7", "uid8-7", "10Gi", "volume8-7", v1.ClaimBound) | 				claim := newClaim("claim8-7", "uid8-7", "10Gi", "volume8-7", v1.ClaimBound, nil) | ||||||
| 				reactor.claims[claim.Name] = claim | 				reactor.claims[claim.Name] = claim | ||||||
| 				ctrl.claims.Add(claim) | 				ctrl.claims.Add(claim) | ||||||
| 				volume := reactor.volumes["volume8-7"] | 				volume := reactor.volumes["volume8-7"] | ||||||
| @@ -124,10 +124,10 @@ func TestDeleteSync(t *testing.T) { | |||||||
| 			// delete success - volume bound by user is deleted, while a new | 			// delete success - volume bound by user is deleted, while a new | ||||||
| 			// claim is created with another UID. | 			// claim is created with another UID. | ||||||
| 			"8-9 - prebound volume is deleted while the claim exists", | 			"8-9 - prebound volume is deleted while the claim exists", | ||||||
| 			newVolumeArray("volume8-9", "1Gi", "uid8-9", "claim8-9", v1.VolumeBound, v1.PersistentVolumeReclaimDelete), | 			newVolumeArray("volume8-9", "1Gi", "uid8-9", "claim8-9", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty), | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newClaimArray("claim8-9", "uid8-9-x", "10Gi", "", v1.ClaimPending), | 			newClaimArray("claim8-9", "uid8-9-x", "10Gi", "", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim8-9", "uid8-9-x", "10Gi", "", v1.ClaimPending), | 			newClaimArray("claim8-9", "uid8-9-x", "10Gi", "", v1.ClaimPending, nil), | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| 			// Inject deleter into the controller and call syncVolume. The | 			// Inject deleter into the controller and call syncVolume. The | ||||||
| 			// deleter simulates one delete() call that succeeds. | 			// deleter simulates one delete() call that succeeds. | ||||||
| @@ -136,8 +136,8 @@ func TestDeleteSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// PV requires external deleter | 			// PV requires external deleter | ||||||
| 			"8-10 - external deleter", | 			"8-10 - external deleter", | ||||||
| 			newVolumeArray("volume8-10", "1Gi", "uid10-1", "claim10-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController), | 			newVolumeArray("volume8-10", "1Gi", "uid10-1", "claim10-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty, annBoundByController), | ||||||
| 			newVolumeArray("volume8-10", "1Gi", "uid10-1", "claim10-1", v1.VolumeReleased, v1.PersistentVolumeReclaimDelete, annBoundByController), | 			newVolumeArray("volume8-10", "1Gi", "uid10-1", "claim10-1", v1.VolumeReleased, v1.PersistentVolumeReclaimDelete, classEmpty, annBoundByController), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| @@ -153,15 +153,15 @@ func TestDeleteSync(t *testing.T) { | |||||||
| 			// One of the PVs is deleted. | 			// One of the PVs is deleted. | ||||||
| 			"8-11 - two PVs provisioned for a single claim", | 			"8-11 - two PVs provisioned for a single claim", | ||||||
| 			[]*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume8-11-1", "1Gi", "uid8-11", "claim8-11", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annDynamicallyProvisioned), | 				newVolume("volume8-11-1", "1Gi", "uid8-11", "claim8-11", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty, annDynamicallyProvisioned), | ||||||
| 				newVolume("volume8-11-2", "1Gi", "uid8-11", "claim8-11", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annDynamicallyProvisioned), | 				newVolume("volume8-11-2", "1Gi", "uid8-11", "claim8-11", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty, annDynamicallyProvisioned), | ||||||
| 			}, | 			}, | ||||||
| 			[]*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume8-11-2", "1Gi", "uid8-11", "claim8-11", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annDynamicallyProvisioned), | 				newVolume("volume8-11-2", "1Gi", "uid8-11", "claim8-11", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty, annDynamicallyProvisioned), | ||||||
| 			}, | 			}, | ||||||
| 			// the claim is bound to volume8-11-2 -> volume8-11-1 has lost the race and will be deleted | 			// the claim is bound to volume8-11-2 -> volume8-11-1 has lost the race and will be deleted | ||||||
| 			newClaimArray("claim8-11", "uid8-11", "10Gi", "volume8-11-2", v1.ClaimBound), | 			newClaimArray("claim8-11", "uid8-11", "10Gi", "volume8-11-2", v1.ClaimBound, nil), | ||||||
| 			newClaimArray("claim8-11", "uid8-11", "10Gi", "volume8-11-2", v1.ClaimBound), | 			newClaimArray("claim8-11", "uid8-11", "10Gi", "volume8-11-2", v1.ClaimBound, nil), | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| 			// Inject deleter into the controller and call syncVolume. The | 			// Inject deleter into the controller and call syncVolume. The | ||||||
| 			// deleter simulates one delete() call that succeeds. | 			// deleter simulates one delete() call that succeeds. | ||||||
| @@ -173,16 +173,16 @@ func TestDeleteSync(t *testing.T) { | |||||||
| 			// external provisioner. | 			// external provisioner. | ||||||
| 			"8-12 - two PVs externally provisioned for a single claim", | 			"8-12 - two PVs externally provisioned for a single claim", | ||||||
| 			[]*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume8-12-1", "1Gi", "uid8-12", "claim8-12", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annDynamicallyProvisioned), | 				newVolume("volume8-12-1", "1Gi", "uid8-12", "claim8-12", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty, annDynamicallyProvisioned), | ||||||
| 				newVolume("volume8-12-2", "1Gi", "uid8-12", "claim8-12", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annDynamicallyProvisioned), | 				newVolume("volume8-12-2", "1Gi", "uid8-12", "claim8-12", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty, annDynamicallyProvisioned), | ||||||
| 			}, | 			}, | ||||||
| 			[]*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume8-12-1", "1Gi", "uid8-12", "claim8-12", v1.VolumeReleased, v1.PersistentVolumeReclaimDelete, annDynamicallyProvisioned), | 				newVolume("volume8-12-1", "1Gi", "uid8-12", "claim8-12", v1.VolumeReleased, v1.PersistentVolumeReclaimDelete, classEmpty, annDynamicallyProvisioned), | ||||||
| 				newVolume("volume8-12-2", "1Gi", "uid8-12", "claim8-12", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annDynamicallyProvisioned), | 				newVolume("volume8-12-2", "1Gi", "uid8-12", "claim8-12", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty, annDynamicallyProvisioned), | ||||||
| 			}, | 			}, | ||||||
| 			// the claim is bound to volume8-12-2 -> volume8-12-1 has lost the race and will be "Released" | 			// the claim is bound to volume8-12-2 -> volume8-12-1 has lost the race and will be "Released" | ||||||
| 			newClaimArray("claim8-12", "uid8-12", "10Gi", "volume8-12-2", v1.ClaimBound), | 			newClaimArray("claim8-12", "uid8-12", "10Gi", "volume8-12-2", v1.ClaimBound, nil), | ||||||
| 			newClaimArray("claim8-12", "uid8-12", "10Gi", "volume8-12-2", v1.ClaimBound), | 			newClaimArray("claim8-12", "uid8-12", "10Gi", "volume8-12-2", v1.ClaimBound, nil), | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| 			func(ctrl *PersistentVolumeController, reactor *volumeReactor, test controllerTest) error { | 			func(ctrl *PersistentVolumeController, reactor *volumeReactor, test controllerTest) error { | ||||||
| 				// Inject external deleter annotation | 				// Inject external deleter annotation | ||||||
| @@ -215,7 +215,7 @@ func TestDeleteMultiSync(t *testing.T) { | |||||||
| 			// delete failure - delete returns error. The controller should | 			// delete failure - delete returns error. The controller should | ||||||
| 			// try again. | 			// try again. | ||||||
| 			"9-1 - delete returns error", | 			"9-1 - delete returns error", | ||||||
| 			newVolumeArray("volume9-1", "1Gi", "uid9-1", "claim9-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete), | 			newVolumeArray("volume9-1", "1Gi", "uid9-1", "claim9-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty), | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
|   | |||||||
| @@ -43,7 +43,6 @@ import ( | |||||||
| 	"k8s.io/kubernetes/pkg/api/testapi" | 	"k8s.io/kubernetes/pkg/api/testapi" | ||||||
| 	"k8s.io/kubernetes/pkg/api/v1" | 	"k8s.io/kubernetes/pkg/api/v1" | ||||||
| 	storage "k8s.io/kubernetes/pkg/apis/storage/v1beta1" | 	storage "k8s.io/kubernetes/pkg/apis/storage/v1beta1" | ||||||
| 	storageutil "k8s.io/kubernetes/pkg/apis/storage/v1beta1/util" |  | ||||||
| 	"k8s.io/kubernetes/pkg/client/clientset_generated/clientset" | 	"k8s.io/kubernetes/pkg/client/clientset_generated/clientset" | ||||||
| 	"k8s.io/kubernetes/pkg/client/clientset_generated/clientset/fake" | 	"k8s.io/kubernetes/pkg/client/clientset_generated/clientset/fake" | ||||||
| 	informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions" | 	informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions" | ||||||
| @@ -621,7 +620,7 @@ func newTestController(kubeClient clientset.Interface, informerFactory informers | |||||||
| } | } | ||||||
|  |  | ||||||
| // newVolume returns a new volume with given attributes | // newVolume returns a new volume with given attributes | ||||||
| func newVolume(name, capacity, boundToClaimUID, boundToClaimName string, phase v1.PersistentVolumePhase, reclaimPolicy v1.PersistentVolumeReclaimPolicy, annotations ...string) *v1.PersistentVolume { | func newVolume(name, capacity, boundToClaimUID, boundToClaimName string, phase v1.PersistentVolumePhase, reclaimPolicy v1.PersistentVolumeReclaimPolicy, class string, annotations ...string) *v1.PersistentVolume { | ||||||
| 	volume := v1.PersistentVolume{ | 	volume := v1.PersistentVolume{ | ||||||
| 		ObjectMeta: metav1.ObjectMeta{ | 		ObjectMeta: metav1.ObjectMeta{ | ||||||
| 			Name:            name, | 			Name:            name, | ||||||
| @@ -636,6 +635,7 @@ func newVolume(name, capacity, boundToClaimUID, boundToClaimName string, phase v | |||||||
| 			}, | 			}, | ||||||
| 			AccessModes:                   []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce, v1.ReadOnlyMany}, | 			AccessModes:                   []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce, v1.ReadOnlyMany}, | ||||||
| 			PersistentVolumeReclaimPolicy: reclaimPolicy, | 			PersistentVolumeReclaimPolicy: reclaimPolicy, | ||||||
|  | 			StorageClassName:              class, | ||||||
| 		}, | 		}, | ||||||
| 		Status: v1.PersistentVolumeStatus{ | 		Status: v1.PersistentVolumeStatus{ | ||||||
| 			Phase: phase, | 			Phase: phase, | ||||||
| @@ -658,8 +658,6 @@ func newVolume(name, capacity, boundToClaimUID, boundToClaimName string, phase v | |||||||
| 			switch a { | 			switch a { | ||||||
| 			case annDynamicallyProvisioned: | 			case annDynamicallyProvisioned: | ||||||
| 				volume.Annotations[a] = mockPluginName | 				volume.Annotations[a] = mockPluginName | ||||||
| 			case storageutil.StorageClassAnnotation: |  | ||||||
| 				volume.Annotations[a] = "gold" |  | ||||||
| 			default: | 			default: | ||||||
| 				volume.Annotations[a] = "yes" | 				volume.Annotations[a] = "yes" | ||||||
| 			} | 			} | ||||||
| @@ -707,27 +705,16 @@ func withMessage(message string, volumes []*v1.PersistentVolume) []*v1.Persisten | |||||||
| 	return volumes | 	return volumes | ||||||
| } | } | ||||||
|  |  | ||||||
| // volumeWithClass saves given class into storage.StorageClassAnnotation annotation. |  | ||||||
| // Meant to be used to compose claims specified inline in a test. |  | ||||||
| func volumeWithClass(className string, volumes []*v1.PersistentVolume) []*v1.PersistentVolume { |  | ||||||
| 	if volumes[0].Annotations == nil { |  | ||||||
| 		volumes[0].Annotations = map[string]string{storageutil.StorageClassAnnotation: className} |  | ||||||
| 	} else { |  | ||||||
| 		volumes[0].Annotations[storageutil.StorageClassAnnotation] = className |  | ||||||
| 	} |  | ||||||
| 	return volumes |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // newVolumeArray returns array with a single volume that would be returned by | // newVolumeArray returns array with a single volume that would be returned by | ||||||
| // newVolume() with the same parameters. | // newVolume() with the same parameters. | ||||||
| func newVolumeArray(name, capacity, boundToClaimUID, boundToClaimName string, phase v1.PersistentVolumePhase, reclaimPolicy v1.PersistentVolumeReclaimPolicy, annotations ...string) []*v1.PersistentVolume { | func newVolumeArray(name, capacity, boundToClaimUID, boundToClaimName string, phase v1.PersistentVolumePhase, reclaimPolicy v1.PersistentVolumeReclaimPolicy, class string, annotations ...string) []*v1.PersistentVolume { | ||||||
| 	return []*v1.PersistentVolume{ | 	return []*v1.PersistentVolume{ | ||||||
| 		newVolume(name, capacity, boundToClaimUID, boundToClaimName, phase, reclaimPolicy, annotations...), | 		newVolume(name, capacity, boundToClaimUID, boundToClaimName, phase, reclaimPolicy, class, annotations...), | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| // newClaim returns a new claim with given attributes | // newClaim returns a new claim with given attributes | ||||||
| func newClaim(name, claimUID, capacity, boundToVolume string, phase v1.PersistentVolumeClaimPhase, annotations ...string) *v1.PersistentVolumeClaim { | func newClaim(name, claimUID, capacity, boundToVolume string, phase v1.PersistentVolumeClaimPhase, class *string, annotations ...string) *v1.PersistentVolumeClaim { | ||||||
| 	claim := v1.PersistentVolumeClaim{ | 	claim := v1.PersistentVolumeClaim{ | ||||||
| 		ObjectMeta: metav1.ObjectMeta{ | 		ObjectMeta: metav1.ObjectMeta{ | ||||||
| 			Name:            name, | 			Name:            name, | ||||||
| @@ -743,6 +730,7 @@ func newClaim(name, claimUID, capacity, boundToVolume string, phase v1.Persisten | |||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			VolumeName:       boundToVolume, | 			VolumeName:       boundToVolume, | ||||||
|  | 			StorageClassName: class, | ||||||
| 		}, | 		}, | ||||||
| 		Status: v1.PersistentVolumeClaimStatus{ | 		Status: v1.PersistentVolumeClaimStatus{ | ||||||
| 			Phase: phase, | 			Phase: phase, | ||||||
| @@ -755,8 +743,6 @@ func newClaim(name, claimUID, capacity, boundToVolume string, phase v1.Persisten | |||||||
| 		claim.Annotations = make(map[string]string) | 		claim.Annotations = make(map[string]string) | ||||||
| 		for _, a := range annotations { | 		for _, a := range annotations { | ||||||
| 			switch a { | 			switch a { | ||||||
| 			case storageutil.StorageClassAnnotation: |  | ||||||
| 				claim.Annotations[a] = "gold" |  | ||||||
| 			case annStorageProvisioner: | 			case annStorageProvisioner: | ||||||
| 				claim.Annotations[a] = mockPluginName | 				claim.Annotations[a] = mockPluginName | ||||||
| 			default: | 			default: | ||||||
| @@ -778,23 +764,12 @@ func newClaim(name, claimUID, capacity, boundToVolume string, phase v1.Persisten | |||||||
|  |  | ||||||
| // newClaimArray returns array with a single claim that would be returned by | // newClaimArray returns array with a single claim that would be returned by | ||||||
| // newClaim() with the same parameters. | // newClaim() with the same parameters. | ||||||
| func newClaimArray(name, claimUID, capacity, boundToVolume string, phase v1.PersistentVolumeClaimPhase, annotations ...string) []*v1.PersistentVolumeClaim { | func newClaimArray(name, claimUID, capacity, boundToVolume string, phase v1.PersistentVolumeClaimPhase, class *string, annotations ...string) []*v1.PersistentVolumeClaim { | ||||||
| 	return []*v1.PersistentVolumeClaim{ | 	return []*v1.PersistentVolumeClaim{ | ||||||
| 		newClaim(name, claimUID, capacity, boundToVolume, phase, annotations...), | 		newClaim(name, claimUID, capacity, boundToVolume, phase, class, annotations...), | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| // claimWithClass saves given class into storage.StorageClassAnnotation annotation. |  | ||||||
| // Meant to be used to compose claims specified inline in a test. |  | ||||||
| func claimWithClass(className string, claims []*v1.PersistentVolumeClaim) []*v1.PersistentVolumeClaim { |  | ||||||
| 	if claims[0].Annotations == nil { |  | ||||||
| 		claims[0].Annotations = map[string]string{storageutil.StorageClassAnnotation: className} |  | ||||||
| 	} else { |  | ||||||
| 		claims[0].Annotations[storageutil.StorageClassAnnotation] = className |  | ||||||
| 	} |  | ||||||
| 	return claims |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // claimWithAnnotation saves given annotation into given claims. | // claimWithAnnotation saves given annotation into given claims. | ||||||
| // Meant to be used to compose claims specified inline in a test. | // Meant to be used to compose claims specified inline in a test. | ||||||
| func claimWithAnnotation(name, value string, claims []*v1.PersistentVolumeClaim) []*v1.PersistentVolumeClaim { | func claimWithAnnotation(name, value string, claims []*v1.PersistentVolumeClaim) []*v1.PersistentVolumeClaim { | ||||||
| @@ -828,6 +803,15 @@ type operationType string | |||||||
| const operationDelete = "Delete" | const operationDelete = "Delete" | ||||||
| const operationRecycle = "Recycle" | const operationRecycle = "Recycle" | ||||||
|  |  | ||||||
|  | var ( | ||||||
|  | 	classGold            string = "gold" | ||||||
|  | 	classSilver          string = "silver" | ||||||
|  | 	classEmpty           string = "" | ||||||
|  | 	classNonExisting     string = "non-existing" | ||||||
|  | 	classExternal        string = "external" | ||||||
|  | 	classUnknownInternal string = "unknown-internal" | ||||||
|  | ) | ||||||
|  |  | ||||||
| // wrapTestWithPluginCalls returns a testCall that: | // wrapTestWithPluginCalls returns a testCall that: | ||||||
| // - configures controller with a volume plugin that implements recycler, | // - configures controller with a volume plugin that implements recycler, | ||||||
| //   deleter and provisioner. The plugin retunrs provided errors when a volume | //   deleter and provisioner. The plugin retunrs provided errors when a volume | ||||||
|   | |||||||
| @@ -24,7 +24,6 @@ import ( | |||||||
| 	"k8s.io/apimachinery/pkg/labels" | 	"k8s.io/apimachinery/pkg/labels" | ||||||
| 	"k8s.io/client-go/tools/cache" | 	"k8s.io/client-go/tools/cache" | ||||||
| 	"k8s.io/kubernetes/pkg/api/v1" | 	"k8s.io/kubernetes/pkg/api/v1" | ||||||
| 	storageutil "k8s.io/kubernetes/pkg/apis/storage/v1beta1/util" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // persistentVolumeOrderedIndex is a cache.Store that keeps persistent volumes | // persistentVolumeOrderedIndex is a cache.Store that keeps persistent volumes | ||||||
| @@ -93,7 +92,7 @@ func (pvIndex *persistentVolumeOrderedIndex) findByClaim(claim *v1.PersistentVol | |||||||
| 	var smallestVolumeSize int64 | 	var smallestVolumeSize int64 | ||||||
| 	requestedQty := claim.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] | 	requestedQty := claim.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] | ||||||
| 	requestedSize := requestedQty.Value() | 	requestedSize := requestedQty.Value() | ||||||
| 	requestedClass := storageutil.GetClaimStorageClass(claim) | 	requestedClass := v1.GetPersistentVolumeClaimClass(claim) | ||||||
|  |  | ||||||
| 	var selector labels.Selector | 	var selector labels.Selector | ||||||
| 	if claim.Spec.Selector != nil { | 	if claim.Spec.Selector != nil { | ||||||
| @@ -134,7 +133,7 @@ func (pvIndex *persistentVolumeOrderedIndex) findByClaim(claim *v1.PersistentVol | |||||||
| 			// with existing PVs, findByClaim must find only PVs that are | 			// with existing PVs, findByClaim must find only PVs that are | ||||||
| 			// pre-bound to the claim (by dynamic provisioning). TODO: remove in | 			// pre-bound to the claim (by dynamic provisioning). TODO: remove in | ||||||
| 			// 1.5 | 			// 1.5 | ||||||
| 			if metav1.HasAnnotation(claim.ObjectMeta, storageutil.AlphaStorageClassAnnotation) { | 			if metav1.HasAnnotation(claim.ObjectMeta, v1.AlphaStorageClassAnnotation) { | ||||||
| 				continue | 				continue | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| @@ -147,7 +146,7 @@ func (pvIndex *persistentVolumeOrderedIndex) findByClaim(claim *v1.PersistentVol | |||||||
| 			} else if selector != nil && !selector.Matches(labels.Set(volume.Labels)) { | 			} else if selector != nil && !selector.Matches(labels.Set(volume.Labels)) { | ||||||
| 				continue | 				continue | ||||||
| 			} | 			} | ||||||
| 			if storageutil.GetVolumeStorageClass(volume) != requestedClass { | 			if v1.GetPersistentVolumeClass(volume) != requestedClass { | ||||||
| 				continue | 				continue | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -25,7 +25,6 @@ import ( | |||||||
| 	"k8s.io/kubernetes/pkg/api" | 	"k8s.io/kubernetes/pkg/api" | ||||||
| 	"k8s.io/kubernetes/pkg/api/testapi" | 	"k8s.io/kubernetes/pkg/api/testapi" | ||||||
| 	"k8s.io/kubernetes/pkg/api/v1" | 	"k8s.io/kubernetes/pkg/api/v1" | ||||||
| 	storageutil "k8s.io/kubernetes/pkg/apis/storage/v1beta1/util" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func makePVC(size string, modfn func(*v1.PersistentVolumeClaim)) *v1.PersistentVolumeClaim { | func makePVC(size string, modfn func(*v1.PersistentVolumeClaim)) *v1.PersistentVolumeClaim { | ||||||
| @@ -112,24 +111,20 @@ func TestMatchVolume(t *testing.T) { | |||||||
| 		"successful-match-with-class": { | 		"successful-match-with-class": { | ||||||
| 			expectedMatch: "gce-pd-silver1", | 			expectedMatch: "gce-pd-silver1", | ||||||
| 			claim: makePVC("1G", func(pvc *v1.PersistentVolumeClaim) { | 			claim: makePVC("1G", func(pvc *v1.PersistentVolumeClaim) { | ||||||
| 				pvc.ObjectMeta.Annotations = map[string]string{ |  | ||||||
| 					storageutil.StorageClassAnnotation: "silver", |  | ||||||
| 				} |  | ||||||
| 				pvc.Spec.Selector = &metav1.LabelSelector{ | 				pvc.Spec.Selector = &metav1.LabelSelector{ | ||||||
| 					MatchLabels: map[string]string{ | 					MatchLabels: map[string]string{ | ||||||
| 						"should-exist": "true", | 						"should-exist": "true", | ||||||
| 					}, | 					}, | ||||||
| 				} | 				} | ||||||
| 				pvc.Spec.AccessModes = []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce} | 				pvc.Spec.AccessModes = []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce} | ||||||
|  | 				pvc.Spec.StorageClassName = &classSilver | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		"successful-match-with-class-and-labels": { | 		"successful-match-with-class-and-labels": { | ||||||
| 			expectedMatch: "gce-pd-silver2", | 			expectedMatch: "gce-pd-silver2", | ||||||
| 			claim: makePVC("1G", func(pvc *v1.PersistentVolumeClaim) { | 			claim: makePVC("1G", func(pvc *v1.PersistentVolumeClaim) { | ||||||
| 				pvc.ObjectMeta.Annotations = map[string]string{ |  | ||||||
| 					storageutil.StorageClassAnnotation: "silver", |  | ||||||
| 				} |  | ||||||
| 				pvc.Spec.AccessModes = []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce} | 				pvc.Spec.AccessModes = []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce} | ||||||
|  | 				pvc.Spec.StorageClassName = &classSilver | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| @@ -542,9 +537,6 @@ func createTestVolumes() []*v1.PersistentVolume { | |||||||
| 				Labels: map[string]string{ | 				Labels: map[string]string{ | ||||||
| 					"should-exist": "true", | 					"should-exist": "true", | ||||||
| 				}, | 				}, | ||||||
| 				Annotations: map[string]string{ |  | ||||||
| 					storageutil.StorageClassAnnotation: "silver", |  | ||||||
| 				}, |  | ||||||
| 			}, | 			}, | ||||||
| 			Spec: v1.PersistentVolumeSpec{ | 			Spec: v1.PersistentVolumeSpec{ | ||||||
| 				Capacity: v1.ResourceList{ | 				Capacity: v1.ResourceList{ | ||||||
| @@ -556,15 +548,13 @@ func createTestVolumes() []*v1.PersistentVolume { | |||||||
| 				AccessModes: []v1.PersistentVolumeAccessMode{ | 				AccessModes: []v1.PersistentVolumeAccessMode{ | ||||||
| 					v1.ReadWriteOnce, | 					v1.ReadWriteOnce, | ||||||
| 				}, | 				}, | ||||||
|  | 				StorageClassName: classSilver, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			ObjectMeta: metav1.ObjectMeta{ | 			ObjectMeta: metav1.ObjectMeta{ | ||||||
| 				UID:  "gce-pd-silver2", | 				UID:  "gce-pd-silver2", | ||||||
| 				Name: "gce0024", | 				Name: "gce0024", | ||||||
| 				Annotations: map[string]string{ |  | ||||||
| 					storageutil.StorageClassAnnotation: "silver", |  | ||||||
| 				}, |  | ||||||
| 			}, | 			}, | ||||||
| 			Spec: v1.PersistentVolumeSpec{ | 			Spec: v1.PersistentVolumeSpec{ | ||||||
| 				Capacity: v1.ResourceList{ | 				Capacity: v1.ResourceList{ | ||||||
| @@ -576,15 +566,13 @@ func createTestVolumes() []*v1.PersistentVolume { | |||||||
| 				AccessModes: []v1.PersistentVolumeAccessMode{ | 				AccessModes: []v1.PersistentVolumeAccessMode{ | ||||||
| 					v1.ReadWriteOnce, | 					v1.ReadWriteOnce, | ||||||
| 				}, | 				}, | ||||||
|  | 				StorageClassName: classSilver, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			ObjectMeta: metav1.ObjectMeta{ | 			ObjectMeta: metav1.ObjectMeta{ | ||||||
| 				UID:  "gce-pd-gold", | 				UID:  "gce-pd-gold", | ||||||
| 				Name: "gce0025", | 				Name: "gce0025", | ||||||
| 				Annotations: map[string]string{ |  | ||||||
| 					storageutil.StorageClassAnnotation: "gold", |  | ||||||
| 				}, |  | ||||||
| 			}, | 			}, | ||||||
| 			Spec: v1.PersistentVolumeSpec{ | 			Spec: v1.PersistentVolumeSpec{ | ||||||
| 				Capacity: v1.ResourceList{ | 				Capacity: v1.ResourceList{ | ||||||
| @@ -596,6 +584,7 @@ func createTestVolumes() []*v1.PersistentVolume { | |||||||
| 				AccessModes: []v1.PersistentVolumeAccessMode{ | 				AccessModes: []v1.PersistentVolumeAccessMode{ | ||||||
| 					v1.ReadWriteOnce, | 					v1.ReadWriteOnce, | ||||||
| 				}, | 				}, | ||||||
|  | 				StorageClassName: classGold, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -23,7 +23,6 @@ import ( | |||||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
| 	"k8s.io/kubernetes/pkg/api/v1" | 	"k8s.io/kubernetes/pkg/api/v1" | ||||||
| 	storage "k8s.io/kubernetes/pkg/apis/storage/v1beta1" | 	storage "k8s.io/kubernetes/pkg/apis/storage/v1beta1" | ||||||
| 	storageutil "k8s.io/kubernetes/pkg/apis/storage/v1beta1/util" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var class1Parameters = map[string]string{ | var class1Parameters = map[string]string{ | ||||||
| @@ -109,10 +108,10 @@ func TestProvisionSync(t *testing.T) { | |||||||
| 			// Provision a volume (with a default class) | 			// Provision a volume (with a default class) | ||||||
| 			"11-1 - successful provision with storage class 1", | 			"11-1 - successful provision with storage class 1", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newVolumeArray("pvc-uid11-1", "1Gi", "uid11-1", "claim11-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController, annDynamicallyProvisioned, storageutil.StorageClassAnnotation), | 			newVolumeArray("pvc-uid11-1", "1Gi", "uid11-1", "claim11-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classGold, annBoundByController, annDynamicallyProvisioned), | ||||||
| 			newClaimArray("claim11-1", "uid11-1", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation), | 			newClaimArray("claim11-1", "uid11-1", "1Gi", "", v1.ClaimPending, &classGold), | ||||||
| 			// Binding will be completed in the next syncClaim | 			// Binding will be completed in the next syncClaim | ||||||
| 			newClaimArray("claim11-1", "uid11-1", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation, annStorageProvisioner), | 			newClaimArray("claim11-1", "uid11-1", "1Gi", "", v1.ClaimPending, &classGold, annStorageProvisioner), | ||||||
| 			[]string{"Normal ProvisioningSucceeded"}, noerrors, wrapTestWithProvisionCalls([]provisionCall{provision1Success}, testSyncClaim), | 			[]string{"Normal ProvisioningSucceeded"}, noerrors, wrapTestWithProvisionCalls([]provisionCall{provision1Success}, testSyncClaim), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| @@ -120,8 +119,8 @@ func TestProvisionSync(t *testing.T) { | |||||||
| 			"11-2 - plugin not found", | 			"11-2 - plugin not found", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newClaimArray("claim11-2", "uid11-2", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation), | 			newClaimArray("claim11-2", "uid11-2", "1Gi", "", v1.ClaimPending, &classGold), | ||||||
| 			newClaimArray("claim11-2", "uid11-2", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation), | 			newClaimArray("claim11-2", "uid11-2", "1Gi", "", v1.ClaimPending, &classGold), | ||||||
| 			[]string{"Warning ProvisioningFailed"}, noerrors, | 			[]string{"Warning ProvisioningFailed"}, noerrors, | ||||||
| 			testSyncClaim, | 			testSyncClaim, | ||||||
| 		}, | 		}, | ||||||
| @@ -130,8 +129,8 @@ func TestProvisionSync(t *testing.T) { | |||||||
| 			"11-3 - newProvisioner failure", | 			"11-3 - newProvisioner failure", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newClaimArray("claim11-3", "uid11-3", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation), | 			newClaimArray("claim11-3", "uid11-3", "1Gi", "", v1.ClaimPending, &classGold), | ||||||
| 			newClaimArray("claim11-3", "uid11-3", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation, annStorageProvisioner), | 			newClaimArray("claim11-3", "uid11-3", "1Gi", "", v1.ClaimPending, &classGold, annStorageProvisioner), | ||||||
| 			[]string{"Warning ProvisioningFailed"}, noerrors, | 			[]string{"Warning ProvisioningFailed"}, noerrors, | ||||||
| 			wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), | 			wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), | ||||||
| 		}, | 		}, | ||||||
| @@ -140,18 +139,18 @@ func TestProvisionSync(t *testing.T) { | |||||||
| 			"11-4 - provision failure", | 			"11-4 - provision failure", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newClaimArray("claim11-4", "uid11-4", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation), | 			newClaimArray("claim11-4", "uid11-4", "1Gi", "", v1.ClaimPending, &classGold), | ||||||
| 			newClaimArray("claim11-4", "uid11-4", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation, annStorageProvisioner), | 			newClaimArray("claim11-4", "uid11-4", "1Gi", "", v1.ClaimPending, &classGold, annStorageProvisioner), | ||||||
| 			[]string{"Warning ProvisioningFailed"}, noerrors, | 			[]string{"Warning ProvisioningFailed"}, noerrors, | ||||||
| 			wrapTestWithProvisionCalls([]provisionCall{provision1Error}, testSyncClaim), | 			wrapTestWithProvisionCalls([]provisionCall{provision1Error}, testSyncClaim), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// No provisioning if there is a matching volume available | 			// No provisioning if there is a matching volume available | ||||||
| 			"11-6 - provisioning when there is a volume available", | 			"11-6 - provisioning when there is a volume available", | ||||||
| 			newVolumeArray("volume11-6", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, storageutil.StorageClassAnnotation), | 			newVolumeArray("volume11-6", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classGold), | ||||||
| 			newVolumeArray("volume11-6", "1Gi", "uid11-6", "claim11-6", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController, storageutil.StorageClassAnnotation), | 			newVolumeArray("volume11-6", "1Gi", "uid11-6", "claim11-6", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classGold, annBoundByController), | ||||||
| 			newClaimArray("claim11-6", "uid11-6", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation), | 			newClaimArray("claim11-6", "uid11-6", "1Gi", "", v1.ClaimPending, &classGold), | ||||||
| 			newClaimArray("claim11-6", "uid11-6", "1Gi", "volume11-6", v1.ClaimBound, storageutil.StorageClassAnnotation, annBoundByController, annBindCompleted), | 			newClaimArray("claim11-6", "uid11-6", "1Gi", "volume11-6", v1.ClaimBound, &classGold, annBoundByController, annBindCompleted), | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| 			// No provisioning plugin confingure - makes the test fail when | 			// No provisioning plugin confingure - makes the test fail when | ||||||
| 			// the controller errorneously tries to provision something | 			// the controller errorneously tries to provision something | ||||||
| @@ -162,16 +161,16 @@ func TestProvisionSync(t *testing.T) { | |||||||
| 			// a volume. | 			// a volume. | ||||||
| 			"11-7 - claim is bound before provisioning", | 			"11-7 - claim is bound before provisioning", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newVolumeArray("pvc-uid11-7", "1Gi", "uid11-7", "claim11-7", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController, annDynamicallyProvisioned, storageutil.StorageClassAnnotation), | 			newVolumeArray("pvc-uid11-7", "1Gi", "uid11-7", "claim11-7", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classGold, annBoundByController, annDynamicallyProvisioned), | ||||||
| 			newClaimArray("claim11-7", "uid11-7", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation), | 			newClaimArray("claim11-7", "uid11-7", "1Gi", "", v1.ClaimPending, &classGold), | ||||||
| 			// The claim would be bound in next syncClaim | 			// The claim would be bound in next syncClaim | ||||||
| 			newClaimArray("claim11-7", "uid11-7", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation, annStorageProvisioner), | 			newClaimArray("claim11-7", "uid11-7", "1Gi", "", v1.ClaimPending, &classGold, annStorageProvisioner), | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| 			wrapTestWithInjectedOperation(wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), func(ctrl *PersistentVolumeController, reactor *volumeReactor) { | 			wrapTestWithInjectedOperation(wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), func(ctrl *PersistentVolumeController, reactor *volumeReactor) { | ||||||
| 				// Create a volume before provisionClaimOperation starts. | 				// Create a volume before provisionClaimOperation starts. | ||||||
| 				// This similates a parallel controller provisioning the volume. | 				// This similates a parallel controller provisioning the volume. | ||||||
| 				reactor.lock.Lock() | 				reactor.lock.Lock() | ||||||
| 				volume := newVolume("pvc-uid11-7", "1Gi", "uid11-7", "claim11-7", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController, annDynamicallyProvisioned, storageutil.StorageClassAnnotation) | 				volume := newVolume("pvc-uid11-7", "1Gi", "uid11-7", "claim11-7", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classGold, annBoundByController, annDynamicallyProvisioned) | ||||||
| 				reactor.volumes[volume.Name] = volume | 				reactor.volumes[volume.Name] = volume | ||||||
| 				reactor.lock.Unlock() | 				reactor.lock.Unlock() | ||||||
| 			}), | 			}), | ||||||
| @@ -181,10 +180,10 @@ func TestProvisionSync(t *testing.T) { | |||||||
| 			// second retry succeeds | 			// second retry succeeds | ||||||
| 			"11-8 - cannot save provisioned volume", | 			"11-8 - cannot save provisioned volume", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newVolumeArray("pvc-uid11-8", "1Gi", "uid11-8", "claim11-8", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController, annDynamicallyProvisioned, storageutil.StorageClassAnnotation), | 			newVolumeArray("pvc-uid11-8", "1Gi", "uid11-8", "claim11-8", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classGold, annBoundByController, annDynamicallyProvisioned), | ||||||
| 			newClaimArray("claim11-8", "uid11-8", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation), | 			newClaimArray("claim11-8", "uid11-8", "1Gi", "", v1.ClaimPending, &classGold), | ||||||
| 			// Binding will be completed in the next syncClaim | 			// Binding will be completed in the next syncClaim | ||||||
| 			newClaimArray("claim11-8", "uid11-8", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation, annStorageProvisioner), | 			newClaimArray("claim11-8", "uid11-8", "1Gi", "", v1.ClaimPending, &classGold, annStorageProvisioner), | ||||||
| 			[]string{"Normal ProvisioningSucceeded"}, | 			[]string{"Normal ProvisioningSucceeded"}, | ||||||
| 			[]reactorError{ | 			[]reactorError{ | ||||||
| 				// Inject error to the first | 				// Inject error to the first | ||||||
| @@ -200,8 +199,8 @@ func TestProvisionSync(t *testing.T) { | |||||||
| 			"11-9 - cannot save provisioned volume, delete succeeds", | 			"11-9 - cannot save provisioned volume, delete succeeds", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newClaimArray("claim11-9", "uid11-9", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation), | 			newClaimArray("claim11-9", "uid11-9", "1Gi", "", v1.ClaimPending, &classGold), | ||||||
| 			newClaimArray("claim11-9", "uid11-9", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation, annStorageProvisioner), | 			newClaimArray("claim11-9", "uid11-9", "1Gi", "", v1.ClaimPending, &classGold, annStorageProvisioner), | ||||||
| 			[]string{"Warning ProvisioningFailed"}, | 			[]string{"Warning ProvisioningFailed"}, | ||||||
| 			[]reactorError{ | 			[]reactorError{ | ||||||
| 				// Inject error to five kubeclient.PersistentVolumes.Create() | 				// Inject error to five kubeclient.PersistentVolumes.Create() | ||||||
| @@ -225,8 +224,8 @@ func TestProvisionSync(t *testing.T) { | |||||||
| 			"11-10 - cannot save provisioned volume, no delete plugin found", | 			"11-10 - cannot save provisioned volume, no delete plugin found", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newClaimArray("claim11-10", "uid11-10", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation), | 			newClaimArray("claim11-10", "uid11-10", "1Gi", "", v1.ClaimPending, &classGold), | ||||||
| 			newClaimArray("claim11-10", "uid11-10", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation, annStorageProvisioner), | 			newClaimArray("claim11-10", "uid11-10", "1Gi", "", v1.ClaimPending, &classGold, annStorageProvisioner), | ||||||
| 			[]string{"Warning ProvisioningFailed", "Warning ProvisioningCleanupFailed"}, | 			[]string{"Warning ProvisioningFailed", "Warning ProvisioningCleanupFailed"}, | ||||||
| 			[]reactorError{ | 			[]reactorError{ | ||||||
| 				// Inject error to five kubeclient.PersistentVolumes.Create() | 				// Inject error to five kubeclient.PersistentVolumes.Create() | ||||||
| @@ -246,8 +245,8 @@ func TestProvisionSync(t *testing.T) { | |||||||
| 			"11-11 - cannot save provisioned volume, deleter fails", | 			"11-11 - cannot save provisioned volume, deleter fails", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newClaimArray("claim11-11", "uid11-11", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation), | 			newClaimArray("claim11-11", "uid11-11", "1Gi", "", v1.ClaimPending, &classGold), | ||||||
| 			newClaimArray("claim11-11", "uid11-11", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation, annStorageProvisioner), | 			newClaimArray("claim11-11", "uid11-11", "1Gi", "", v1.ClaimPending, &classGold, annStorageProvisioner), | ||||||
| 			[]string{"Warning ProvisioningFailed", "Warning ProvisioningCleanupFailed"}, | 			[]string{"Warning ProvisioningFailed", "Warning ProvisioningCleanupFailed"}, | ||||||
| 			[]reactorError{ | 			[]reactorError{ | ||||||
| 				// Inject error to five kubeclient.PersistentVolumes.Create() | 				// Inject error to five kubeclient.PersistentVolumes.Create() | ||||||
| @@ -276,8 +275,8 @@ func TestProvisionSync(t *testing.T) { | |||||||
| 			"11-12 - cannot save provisioned volume, delete succeeds 2nd time", | 			"11-12 - cannot save provisioned volume, delete succeeds 2nd time", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newClaimArray("claim11-12", "uid11-12", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation), | 			newClaimArray("claim11-12", "uid11-12", "1Gi", "", v1.ClaimPending, &classGold), | ||||||
| 			newClaimArray("claim11-12", "uid11-12", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation, annStorageProvisioner), | 			newClaimArray("claim11-12", "uid11-12", "1Gi", "", v1.ClaimPending, &classGold, annStorageProvisioner), | ||||||
| 			[]string{"Warning ProvisioningFailed"}, | 			[]string{"Warning ProvisioningFailed"}, | ||||||
| 			[]reactorError{ | 			[]reactorError{ | ||||||
| 				// Inject error to five kubeclient.PersistentVolumes.Create() | 				// Inject error to five kubeclient.PersistentVolumes.Create() | ||||||
| @@ -302,10 +301,10 @@ func TestProvisionSync(t *testing.T) { | |||||||
| 			// Provision a volume (with non-default class) | 			// Provision a volume (with non-default class) | ||||||
| 			"11-13 - successful provision with storage class 2", | 			"11-13 - successful provision with storage class 2", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			volumeWithClass("silver", newVolumeArray("pvc-uid11-13", "1Gi", "uid11-13", "claim11-13", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController, annDynamicallyProvisioned)), | 			newVolumeArray("pvc-uid11-13", "1Gi", "uid11-13", "claim11-13", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classSilver, annBoundByController, annDynamicallyProvisioned), | ||||||
| 			claimWithClass("silver", newClaimArray("claim11-13", "uid11-13", "1Gi", "", v1.ClaimPending)), | 			newClaimArray("claim11-13", "uid11-13", "1Gi", "", v1.ClaimPending, &classSilver), | ||||||
| 			// Binding will be completed in the next syncClaim | 			// Binding will be completed in the next syncClaim | ||||||
| 			claimWithClass("silver", newClaimArray("claim11-13", "uid11-13", "1Gi", "", v1.ClaimPending, annStorageProvisioner)), | 			newClaimArray("claim11-13", "uid11-13", "1Gi", "", v1.ClaimPending, &classSilver, annStorageProvisioner), | ||||||
| 			[]string{"Normal ProvisioningSucceeded"}, noerrors, wrapTestWithProvisionCalls([]provisionCall{provision2Success}, testSyncClaim), | 			[]string{"Normal ProvisioningSucceeded"}, noerrors, wrapTestWithProvisionCalls([]provisionCall{provision2Success}, testSyncClaim), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| @@ -313,8 +312,8 @@ func TestProvisionSync(t *testing.T) { | |||||||
| 			"11-14 - fail due to non-existing class", | 			"11-14 - fail due to non-existing class", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			claimWithClass("non-existing", newClaimArray("claim11-14", "uid11-14", "1Gi", "", v1.ClaimPending)), | 			newClaimArray("claim11-14", "uid11-14", "1Gi", "", v1.ClaimPending, &classNonExisting), | ||||||
| 			claimWithClass("non-existing", newClaimArray("claim11-14", "uid11-14", "1Gi", "", v1.ClaimPending)), | 			newClaimArray("claim11-14", "uid11-14", "1Gi", "", v1.ClaimPending, &classNonExisting), | ||||||
| 			noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), | 			noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| @@ -322,8 +321,8 @@ func TestProvisionSync(t *testing.T) { | |||||||
| 			"11-15 - no provisioning with class=''", | 			"11-15 - no provisioning with class=''", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			claimWithClass("", newClaimArray("claim11-15", "uid11-15", "1Gi", "", v1.ClaimPending)), | 			newClaimArray("claim11-15", "uid11-15", "1Gi", "", v1.ClaimPending, &classEmpty), | ||||||
| 			claimWithClass("", newClaimArray("claim11-15", "uid11-15", "1Gi", "", v1.ClaimPending)), | 			newClaimArray("claim11-15", "uid11-15", "1Gi", "", v1.ClaimPending, &classEmpty), | ||||||
| 			noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), | 			noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| @@ -331,8 +330,8 @@ func TestProvisionSync(t *testing.T) { | |||||||
| 			"11-16 - no provisioning with class=nil", | 			"11-16 - no provisioning with class=nil", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newClaimArray("claim11-15", "uid11-15", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim11-15", "uid11-15", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim11-15", "uid11-15", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim11-15", "uid11-15", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), | 			noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| @@ -340,9 +339,9 @@ func TestProvisionSync(t *testing.T) { | |||||||
| 			"11-17 - external provisioner", | 			"11-17 - external provisioner", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			claimWithClass("external", newClaimArray("claim11-17", "uid11-17", "1Gi", "", v1.ClaimPending)), | 			newClaimArray("claim11-17", "uid11-17", "1Gi", "", v1.ClaimPending, &classExternal), | ||||||
| 			claimWithAnnotation(annStorageProvisioner, "vendor.com/my-volume", | 			claimWithAnnotation(annStorageProvisioner, "vendor.com/my-volume", | ||||||
| 				claimWithClass("external", newClaimArray("claim11-17", "uid11-17", "1Gi", "", v1.ClaimPending))), | 				newClaimArray("claim11-17", "uid11-17", "1Gi", "", v1.ClaimPending, &classExternal)), | ||||||
| 			[]string{"Normal ExternalProvisioning"}, | 			[]string{"Normal ExternalProvisioning"}, | ||||||
| 			noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), | 			noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), | ||||||
| 		}, | 		}, | ||||||
| @@ -351,8 +350,8 @@ func TestProvisionSync(t *testing.T) { | |||||||
| 			"11-18 - unknown internal provisioner", | 			"11-18 - unknown internal provisioner", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			claimWithClass("unknown-internal", newClaimArray("claim11-18", "uid11-18", "1Gi", "", v1.ClaimPending)), | 			newClaimArray("claim11-18", "uid11-18", "1Gi", "", v1.ClaimPending, &classUnknownInternal), | ||||||
| 			claimWithClass("unknown-internal", newClaimArray("claim11-18", "uid11-18", "1Gi", "", v1.ClaimPending)), | 			newClaimArray("claim11-18", "uid11-18", "1Gi", "", v1.ClaimPending, &classUnknownInternal), | ||||||
| 			[]string{"Warning ProvisioningFailed"}, | 			[]string{"Warning ProvisioningFailed"}, | ||||||
| 			noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), | 			noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), | ||||||
| 		}, | 		}, | ||||||
| @@ -366,24 +365,24 @@ func TestAlphaProvisionSync(t *testing.T) { | |||||||
| 			// Provision a volume with alpha annotation | 			// Provision a volume with alpha annotation | ||||||
| 			"14-1 - successful alpha provisioning", | 			"14-1 - successful alpha provisioning", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newVolumeArray("pvc-uid14-1", "1Gi", "uid14-1", "claim14-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController, annDynamicallyProvisioned), | 			newVolumeArray("pvc-uid14-1", "1Gi", "uid14-1", "claim14-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty, annBoundByController, annDynamicallyProvisioned), | ||||||
| 			newClaimArray("claim14-1", "uid14-1", "1Gi", "", v1.ClaimPending, storageutil.AlphaStorageClassAnnotation), | 			newClaimArray("claim14-1", "uid14-1", "1Gi", "", v1.ClaimPending, nil, v1.AlphaStorageClassAnnotation), | ||||||
| 			// Binding will be completed in the next syncClaim | 			// Binding will be completed in the next syncClaim | ||||||
| 			newClaimArray("claim14-1", "uid14-1", "1Gi", "", v1.ClaimPending, storageutil.AlphaStorageClassAnnotation, annStorageProvisioner), | 			newClaimArray("claim14-1", "uid14-1", "1Gi", "", v1.ClaimPending, nil, v1.AlphaStorageClassAnnotation, annStorageProvisioner), | ||||||
| 			noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{provisionAlphaSuccess}, testSyncClaim), | 			noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{provisionAlphaSuccess}, testSyncClaim), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			// Provision success - there is already a volume available, still | 			// Provision success - there is already a volume available, still | ||||||
| 			// we provision a new one when requested. | 			// we provision a new one when requested. | ||||||
| 			"14-2 - no alpha provisioning when there is a volume available", | 			"14-2 - no alpha provisioning when there is a volume available", | ||||||
| 			newVolumeArray("volume14-2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume14-2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			[]*v1.PersistentVolume{ | 			[]*v1.PersistentVolume{ | ||||||
| 				newVolume("volume14-2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain), | 				newVolume("volume14-2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 				newVolume("pvc-uid14-2", "1Gi", "uid14-2", "claim14-2", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController, annDynamicallyProvisioned), | 				newVolume("pvc-uid14-2", "1Gi", "uid14-2", "claim14-2", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty, annBoundByController, annDynamicallyProvisioned), | ||||||
| 			}, | 			}, | ||||||
| 			newClaimArray("claim14-2", "uid14-2", "1Gi", "", v1.ClaimPending, storageutil.AlphaStorageClassAnnotation), | 			newClaimArray("claim14-2", "uid14-2", "1Gi", "", v1.ClaimPending, nil, v1.AlphaStorageClassAnnotation), | ||||||
| 			// Binding will be completed in the next syncClaim | 			// Binding will be completed in the next syncClaim | ||||||
| 			newClaimArray("claim14-2", "uid14-2", "1Gi", "", v1.ClaimPending, storageutil.AlphaStorageClassAnnotation, annStorageProvisioner), | 			newClaimArray("claim14-2", "uid14-2", "1Gi", "", v1.ClaimPending, nil, v1.AlphaStorageClassAnnotation, annStorageProvisioner), | ||||||
| 			noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{provisionAlphaSuccess}, testSyncClaim), | 			noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{provisionAlphaSuccess}, testSyncClaim), | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| @@ -410,9 +409,9 @@ func TestProvisionMultiSync(t *testing.T) { | |||||||
| 			// Provision a volume with binding | 			// Provision a volume with binding | ||||||
| 			"12-1 - successful provision", | 			"12-1 - successful provision", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newVolumeArray("pvc-uid12-1", "1Gi", "uid12-1", "claim12-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController, annDynamicallyProvisioned, storageutil.StorageClassAnnotation), | 			newVolumeArray("pvc-uid12-1", "1Gi", "uid12-1", "claim12-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classGold, annBoundByController, annDynamicallyProvisioned), | ||||||
| 			newClaimArray("claim12-1", "uid12-1", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation), | 			newClaimArray("claim12-1", "uid12-1", "1Gi", "", v1.ClaimPending, &classGold), | ||||||
| 			newClaimArray("claim12-1", "uid12-1", "1Gi", "pvc-uid12-1", v1.ClaimBound, storageutil.StorageClassAnnotation, annBoundByController, annBindCompleted, annStorageProvisioner), | 			newClaimArray("claim12-1", "uid12-1", "1Gi", "pvc-uid12-1", v1.ClaimBound, &classGold, annBoundByController, annBindCompleted, annStorageProvisioner), | ||||||
| 			noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{provision1Success}, testSyncClaim), | 			noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{provision1Success}, testSyncClaim), | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -29,7 +29,6 @@ import ( | |||||||
| 	"k8s.io/kubernetes/pkg/api" | 	"k8s.io/kubernetes/pkg/api" | ||||||
| 	"k8s.io/kubernetes/pkg/api/v1" | 	"k8s.io/kubernetes/pkg/api/v1" | ||||||
| 	storage "k8s.io/kubernetes/pkg/apis/storage/v1beta1" | 	storage "k8s.io/kubernetes/pkg/apis/storage/v1beta1" | ||||||
| 	storageutil "k8s.io/kubernetes/pkg/apis/storage/v1beta1/util" |  | ||||||
| 	"k8s.io/kubernetes/pkg/client/clientset_generated/clientset" | 	"k8s.io/kubernetes/pkg/client/clientset_generated/clientset" | ||||||
| 	corelisters "k8s.io/kubernetes/pkg/client/listers/core/v1" | 	corelisters "k8s.io/kubernetes/pkg/client/listers/core/v1" | ||||||
| 	storagelisters "k8s.io/kubernetes/pkg/client/listers/storage/v1beta1" | 	storagelisters "k8s.io/kubernetes/pkg/client/listers/storage/v1beta1" | ||||||
| @@ -244,7 +243,7 @@ func (ctrl *PersistentVolumeController) syncUnboundClaim(claim *v1.PersistentVol | |||||||
| 			glog.V(4).Infof("synchronizing unbound PersistentVolumeClaim[%s]: no volume found", claimToClaimKey(claim)) | 			glog.V(4).Infof("synchronizing unbound PersistentVolumeClaim[%s]: no volume found", claimToClaimKey(claim)) | ||||||
| 			// No PV could be found | 			// No PV could be found | ||||||
| 			// OBSERVATION: pvc is "Pending", will retry | 			// OBSERVATION: pvc is "Pending", will retry | ||||||
| 			if storageutil.GetClaimStorageClass(claim) != "" || metav1.HasAnnotation(claim.ObjectMeta, storageutil.AlphaStorageClassAnnotation) { | 			if v1.GetPersistentVolumeClaimClass(claim) != "" || metav1.HasAnnotation(claim.ObjectMeta, v1.AlphaStorageClassAnnotation) { | ||||||
| 				if err = ctrl.provisionClaim(claim); err != nil { | 				if err = ctrl.provisionClaim(claim); err != nil { | ||||||
| 					return err | 					return err | ||||||
| 				} | 				} | ||||||
| @@ -1224,7 +1223,7 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claimObj interfa | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	claimClass := storageutil.GetClaimStorageClass(claim) | 	claimClass := v1.GetPersistentVolumeClaimClass(claim) | ||||||
| 	glog.V(4).Infof("provisionClaimOperation [%s] started, class: %q", claimToClaimKey(claim), claimClass) | 	glog.V(4).Infof("provisionClaimOperation [%s] started, class: %q", claimToClaimKey(claim), claimClass) | ||||||
|  |  | ||||||
| 	plugin, storageClass, err := ctrl.findProvisionablePlugin(claim) | 	plugin, storageClass, err := ctrl.findProvisionablePlugin(claim) | ||||||
| @@ -1332,7 +1331,7 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claimObj interfa | |||||||
| 	// by storage.AlphaStorageClassAnnotation | 	// by storage.AlphaStorageClassAnnotation | ||||||
| 	// TODO: remove this check in 1.5, storage.StorageClassAnnotation will be always non-empty there. | 	// TODO: remove this check in 1.5, storage.StorageClassAnnotation will be always non-empty there. | ||||||
| 	if claimClass != "" { | 	if claimClass != "" { | ||||||
| 		metav1.SetMetaDataAnnotation(&volume.ObjectMeta, storageutil.StorageClassAnnotation, claimClass) | 		volume.Spec.StorageClassName = claimClass | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Try to create the PV object several times | 	// Try to create the PV object several times | ||||||
| @@ -1439,12 +1438,12 @@ func (ctrl *PersistentVolumeController) newRecyclerEventRecorder(volume *v1.Pers | |||||||
| // provisioner is requested. | // provisioner is requested. | ||||||
| func (ctrl *PersistentVolumeController) findProvisionablePlugin(claim *v1.PersistentVolumeClaim) (vol.ProvisionableVolumePlugin, *storage.StorageClass, error) { | func (ctrl *PersistentVolumeController) findProvisionablePlugin(claim *v1.PersistentVolumeClaim) (vol.ProvisionableVolumePlugin, *storage.StorageClass, error) { | ||||||
| 	// TODO: remove this alpha behavior in 1.5 | 	// TODO: remove this alpha behavior in 1.5 | ||||||
| 	alpha := metav1.HasAnnotation(claim.ObjectMeta, storageutil.AlphaStorageClassAnnotation) | 	alpha := metav1.HasAnnotation(claim.ObjectMeta, v1.AlphaStorageClassAnnotation) | ||||||
| 	beta := metav1.HasAnnotation(claim.ObjectMeta, storageutil.BetaStorageClassAnnotation) | 	if alpha && v1.PersistentVolumeClaimHasClass(claim) { | ||||||
| 	if alpha && beta { | 		// Both Alpha annotation and storage class name is set. Use the storage | ||||||
| 		// Both Alpha and Beta annotations are set. Do beta. | 		// class name. | ||||||
| 		alpha = false | 		alpha = false | ||||||
| 		msg := fmt.Sprintf("both %q and %q annotations are present, using %q", storageutil.AlphaStorageClassAnnotation, storageutil.BetaStorageClassAnnotation, storageutil.BetaStorageClassAnnotation) | 		msg := fmt.Sprintf("both %q annotation and storageClassName are present, using storageClassName", v1.AlphaStorageClassAnnotation) | ||||||
| 		ctrl.eventRecorder.Event(claim, v1.EventTypeNormal, "ProvisioningIgnoreAlpha", msg) | 		ctrl.eventRecorder.Event(claim, v1.EventTypeNormal, "ProvisioningIgnoreAlpha", msg) | ||||||
| 	} | 	} | ||||||
| 	if alpha { | 	if alpha { | ||||||
| @@ -1454,7 +1453,7 @@ func (ctrl *PersistentVolumeController) findProvisionablePlugin(claim *v1.Persis | |||||||
|  |  | ||||||
| 	// provisionClaim() which leads here is never called with claimClass=="", we | 	// provisionClaim() which leads here is never called with claimClass=="", we | ||||||
| 	// can save some checks. | 	// can save some checks. | ||||||
| 	claimClass := storageutil.GetClaimStorageClass(claim) | 	claimClass := v1.GetPersistentVolumeClaimClass(claim) | ||||||
| 	class, err := ctrl.classLister.Get(claimClass) | 	class, err := ctrl.classLister.Get(claimClass) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
|   | |||||||
| @@ -45,14 +45,14 @@ func TestControllerSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// addClaim gets a new claim. Check it's bound to a volume. | 			// addClaim gets a new claim. Check it's bound to a volume. | ||||||
| 			"5-2 - complete bind", | 			"5-2 - complete bind", | ||||||
| 			newVolumeArray("volume5-2", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume5-2", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			newVolumeArray("volume5-2", "1Gi", "uid5-2", "claim5-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume5-2", "1Gi", "uid5-2", "claim5-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			noclaims, /* added in testAddClaim5_2 */ | 			noclaims, /* added in testAddClaim5_2 */ | ||||||
| 			newClaimArray("claim5-2", "uid5-2", "1Gi", "volume5-2", v1.ClaimBound, annBoundByController, annBindCompleted), | 			newClaimArray("claim5-2", "uid5-2", "1Gi", "volume5-2", v1.ClaimBound, nil, annBoundByController, annBindCompleted), | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| 			// Custom test function that generates an add event | 			// Custom test function that generates an add event | ||||||
| 			func(ctrl *PersistentVolumeController, reactor *volumeReactor, test controllerTest) error { | 			func(ctrl *PersistentVolumeController, reactor *volumeReactor, test controllerTest) error { | ||||||
| 				claim := newClaim("claim5-2", "uid5-2", "1Gi", "", v1.ClaimPending) | 				claim := newClaim("claim5-2", "uid5-2", "1Gi", "", v1.ClaimPending, nil) | ||||||
| 				reactor.addClaimEvent(claim) | 				reactor.addClaimEvent(claim) | ||||||
| 				return nil | 				return nil | ||||||
| 			}, | 			}, | ||||||
| @@ -60,9 +60,9 @@ func TestControllerSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// deleteClaim with a bound claim makes bound volume released. | 			// deleteClaim with a bound claim makes bound volume released. | ||||||
| 			"5-3 - delete claim", | 			"5-3 - delete claim", | ||||||
| 			newVolumeArray("volume5-3", "10Gi", "uid5-3", "claim5-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume5-3", "10Gi", "uid5-3", "claim5-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			newVolumeArray("volume5-3", "10Gi", "uid5-3", "claim5-3", v1.VolumeReleased, v1.PersistentVolumeReclaimRetain, annBoundByController), | 			newVolumeArray("volume5-3", "10Gi", "uid5-3", "claim5-3", v1.VolumeReleased, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController), | ||||||
| 			newClaimArray("claim5-3", "uid5-3", "1Gi", "volume5-3", v1.ClaimBound, annBoundByController, annBindCompleted), | 			newClaimArray("claim5-3", "uid5-3", "1Gi", "volume5-3", v1.ClaimBound, nil, annBoundByController, annBindCompleted), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| 			// Custom test function that generates a delete event | 			// Custom test function that generates a delete event | ||||||
| @@ -76,10 +76,10 @@ func TestControllerSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// deleteVolume with a bound volume. Check the claim is Lost. | 			// deleteVolume with a bound volume. Check the claim is Lost. | ||||||
| 			"5-4 - delete volume", | 			"5-4 - delete volume", | ||||||
| 			newVolumeArray("volume5-4", "1Gi", "uid5-4", "claim5-4", v1.VolumeBound, v1.PersistentVolumeReclaimRetain), | 			newVolumeArray("volume5-4", "1Gi", "uid5-4", "claim5-4", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty), | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newClaimArray("claim5-4", "uid5-4", "1Gi", "volume5-4", v1.ClaimBound, annBoundByController, annBindCompleted), | 			newClaimArray("claim5-4", "uid5-4", "1Gi", "volume5-4", v1.ClaimBound, nil, annBoundByController, annBindCompleted), | ||||||
| 			newClaimArray("claim5-4", "uid5-4", "1Gi", "volume5-4", v1.ClaimLost, annBoundByController, annBindCompleted), | 			newClaimArray("claim5-4", "uid5-4", "1Gi", "volume5-4", v1.ClaimLost, nil, annBoundByController, annBindCompleted), | ||||||
| 			[]string{"Warning ClaimLost"}, noerrors, | 			[]string{"Warning ClaimLost"}, noerrors, | ||||||
| 			// Custom test function that generates a delete event | 			// Custom test function that generates a delete event | ||||||
| 			func(ctrl *PersistentVolumeController, reactor *volumeReactor, test controllerTest) error { | 			func(ctrl *PersistentVolumeController, reactor *volumeReactor, test controllerTest) error { | ||||||
| @@ -94,13 +94,13 @@ func TestControllerSync(t *testing.T) { | |||||||
| 			// is expected - it should stay bound. | 			// is expected - it should stay bound. | ||||||
| 			"5-5 - add bound volume from 1.2", | 			"5-5 - add bound volume from 1.2", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			[]*v1.PersistentVolume{addVolumeAnnotation(newVolume("volume5-5", "1Gi", "uid5-5", "claim5-5", v1.VolumeBound, v1.PersistentVolumeReclaimDelete), pvProvisioningRequiredAnnotationKey, pvProvisioningCompletedAnnotationValue)}, | 			[]*v1.PersistentVolume{addVolumeAnnotation(newVolume("volume5-5", "1Gi", "uid5-5", "claim5-5", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty), pvProvisioningRequiredAnnotationKey, pvProvisioningCompletedAnnotationValue)}, | ||||||
| 			newClaimArray("claim5-5", "uid5-5", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim5-5", "uid5-5", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim5-5", "uid5-5", "1Gi", "volume5-5", v1.ClaimBound, annBindCompleted, annBoundByController), | 			newClaimArray("claim5-5", "uid5-5", "1Gi", "volume5-5", v1.ClaimBound, nil, annBindCompleted, annBoundByController), | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| 			// Custom test function that generates a add event | 			// Custom test function that generates a add event | ||||||
| 			func(ctrl *PersistentVolumeController, reactor *volumeReactor, test controllerTest) error { | 			func(ctrl *PersistentVolumeController, reactor *volumeReactor, test controllerTest) error { | ||||||
| 				volume := newVolume("volume5-5", "1Gi", "uid5-5", "claim5-5", v1.VolumeBound, v1.PersistentVolumeReclaimDelete) | 				volume := newVolume("volume5-5", "1Gi", "uid5-5", "claim5-5", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty) | ||||||
| 				volume = addVolumeAnnotation(volume, pvProvisioningRequiredAnnotationKey, pvProvisioningCompletedAnnotationValue) | 				volume = addVolumeAnnotation(volume, pvProvisioningRequiredAnnotationKey, pvProvisioningCompletedAnnotationValue) | ||||||
| 				reactor.addVolumeEvent(volume) | 				reactor.addVolumeEvent(volume) | ||||||
| 				return nil | 				return nil | ||||||
| @@ -110,14 +110,14 @@ func TestControllerSync(t *testing.T) { | |||||||
| 			// updateVolume with provisioned volume from Kubernetes 1.2. No | 			// updateVolume with provisioned volume from Kubernetes 1.2. No | ||||||
| 			// "action" is expected - it should stay bound. | 			// "action" is expected - it should stay bound. | ||||||
| 			"5-6 - update bound volume from 1.2", | 			"5-6 - update bound volume from 1.2", | ||||||
| 			[]*v1.PersistentVolume{addVolumeAnnotation(newVolume("volume5-6", "1Gi", "uid5-6", "claim5-6", v1.VolumeBound, v1.PersistentVolumeReclaimDelete), pvProvisioningRequiredAnnotationKey, pvProvisioningCompletedAnnotationValue)}, | 			[]*v1.PersistentVolume{addVolumeAnnotation(newVolume("volume5-6", "1Gi", "uid5-6", "claim5-6", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty), pvProvisioningRequiredAnnotationKey, pvProvisioningCompletedAnnotationValue)}, | ||||||
| 			[]*v1.PersistentVolume{addVolumeAnnotation(newVolume("volume5-6", "1Gi", "uid5-6", "claim5-6", v1.VolumeBound, v1.PersistentVolumeReclaimDelete), pvProvisioningRequiredAnnotationKey, pvProvisioningCompletedAnnotationValue)}, | 			[]*v1.PersistentVolume{addVolumeAnnotation(newVolume("volume5-6", "1Gi", "uid5-6", "claim5-6", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty), pvProvisioningRequiredAnnotationKey, pvProvisioningCompletedAnnotationValue)}, | ||||||
| 			newClaimArray("claim5-6", "uid5-6", "1Gi", "volume5-6", v1.ClaimBound), | 			newClaimArray("claim5-6", "uid5-6", "1Gi", "volume5-6", v1.ClaimBound, nil), | ||||||
| 			newClaimArray("claim5-6", "uid5-6", "1Gi", "volume5-6", v1.ClaimBound, annBindCompleted), | 			newClaimArray("claim5-6", "uid5-6", "1Gi", "volume5-6", v1.ClaimBound, nil, annBindCompleted), | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| 			// Custom test function that generates a add event | 			// Custom test function that generates a add event | ||||||
| 			func(ctrl *PersistentVolumeController, reactor *volumeReactor, test controllerTest) error { | 			func(ctrl *PersistentVolumeController, reactor *volumeReactor, test controllerTest) error { | ||||||
| 				volume := newVolume("volume5-6", "1Gi", "uid5-6", "claim5-6", v1.VolumeBound, v1.PersistentVolumeReclaimDelete) | 				volume := newVolume("volume5-6", "1Gi", "uid5-6", "claim5-6", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty) | ||||||
| 				volume = addVolumeAnnotation(volume, pvProvisioningRequiredAnnotationKey, pvProvisioningCompletedAnnotationValue) | 				volume = addVolumeAnnotation(volume, pvProvisioningRequiredAnnotationKey, pvProvisioningCompletedAnnotationValue) | ||||||
| 				reactor.modifyVolumeEvent(volume) | 				reactor.modifyVolumeEvent(volume) | ||||||
| 				return nil | 				return nil | ||||||
| @@ -129,12 +129,12 @@ func TestControllerSync(t *testing.T) { | |||||||
| 			"5-7 - add unprovisioned volume from 1.2", | 			"5-7 - add unprovisioned volume from 1.2", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newClaimArray("claim5-7", "uid5-7", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim5-7", "uid5-7", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim5-7", "uid5-7", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim5-7", "uid5-7", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| 			// Custom test function that generates a add event | 			// Custom test function that generates a add event | ||||||
| 			func(ctrl *PersistentVolumeController, reactor *volumeReactor, test controllerTest) error { | 			func(ctrl *PersistentVolumeController, reactor *volumeReactor, test controllerTest) error { | ||||||
| 				volume := newVolume("volume5-7", "1Gi", "uid5-7", "claim5-7", v1.VolumeBound, v1.PersistentVolumeReclaimDelete) | 				volume := newVolume("volume5-7", "1Gi", "uid5-7", "claim5-7", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty) | ||||||
| 				volume = addVolumeAnnotation(volume, pvProvisioningRequiredAnnotationKey, "yes") | 				volume = addVolumeAnnotation(volume, pvProvisioningRequiredAnnotationKey, "yes") | ||||||
| 				reactor.addVolumeEvent(volume) | 				reactor.addVolumeEvent(volume) | ||||||
| 				return nil | 				return nil | ||||||
| @@ -146,12 +146,12 @@ func TestControllerSync(t *testing.T) { | |||||||
| 			"5-8 - update bound volume from 1.2", | 			"5-8 - update bound volume from 1.2", | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			newClaimArray("claim5-8", "uid5-8", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim5-8", "uid5-8", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim5-8", "uid5-8", "1Gi", "", v1.ClaimPending), | 			newClaimArray("claim5-8", "uid5-8", "1Gi", "", v1.ClaimPending, nil), | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| 			// Custom test function that generates a add event | 			// Custom test function that generates a add event | ||||||
| 			func(ctrl *PersistentVolumeController, reactor *volumeReactor, test controllerTest) error { | 			func(ctrl *PersistentVolumeController, reactor *volumeReactor, test controllerTest) error { | ||||||
| 				volume := newVolume("volume5-8", "1Gi", "uid5-8", "claim5-8", v1.VolumeBound, v1.PersistentVolumeReclaimDelete) | 				volume := newVolume("volume5-8", "1Gi", "uid5-8", "claim5-8", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty) | ||||||
| 				volume = addVolumeAnnotation(volume, pvProvisioningRequiredAnnotationKey, "yes") | 				volume = addVolumeAnnotation(volume, pvProvisioningRequiredAnnotationKey, "yes") | ||||||
| 				reactor.modifyVolumeEvent(volume) | 				reactor.modifyVolumeEvent(volume) | ||||||
| 				return nil | 				return nil | ||||||
| @@ -224,7 +224,7 @@ func TestControllerSync(t *testing.T) { | |||||||
| } | } | ||||||
|  |  | ||||||
| func storeVersion(t *testing.T, prefix string, c cache.Store, version string, expectedReturn bool) { | func storeVersion(t *testing.T, prefix string, c cache.Store, version string, expectedReturn bool) { | ||||||
| 	pv := newVolume("pvName", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimDelete) | 	pv := newVolume("pvName", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimDelete, classEmpty) | ||||||
| 	pv.ResourceVersion = version | 	pv.ResourceVersion = version | ||||||
| 	ret, err := storeObjectUpdate(c, pv, "volume") | 	ret, err := storeObjectUpdate(c, pv, "volume") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -283,7 +283,7 @@ func TestControllerCacheParsingError(t *testing.T) { | |||||||
| 	// There must be something in the cache to compare with | 	// There must be something in the cache to compare with | ||||||
| 	storeVersion(t, "Step1", c, "1", true) | 	storeVersion(t, "Step1", c, "1", true) | ||||||
|  |  | ||||||
| 	pv := newVolume("pvName", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimDelete) | 	pv := newVolume("pvName", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimDelete, classEmpty) | ||||||
| 	pv.ResourceVersion = "xxx" | 	pv.ResourceVersion = "xxx" | ||||||
| 	_, err := storeObjectUpdate(c, pv, "volume") | 	_, err := storeObjectUpdate(c, pv, "volume") | ||||||
| 	if err == nil { | 	if err == nil { | ||||||
|   | |||||||
| @@ -33,8 +33,8 @@ func TestRecycleSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// recycle volume bound by controller | 			// recycle volume bound by controller | ||||||
| 			"6-1 - successful recycle", | 			"6-1 - successful recycle", | ||||||
| 			newVolumeArray("volume6-1", "1Gi", "uid6-1", "claim6-1", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle, annBoundByController), | 			newVolumeArray("volume6-1", "1Gi", "uid6-1", "claim6-1", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle, classEmpty, annBoundByController), | ||||||
| 			newVolumeArray("volume6-1", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle), | 			newVolumeArray("volume6-1", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle, classEmpty), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| @@ -45,8 +45,8 @@ func TestRecycleSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// recycle volume bound by user | 			// recycle volume bound by user | ||||||
| 			"6-2 - successful recycle with prebound volume", | 			"6-2 - successful recycle with prebound volume", | ||||||
| 			newVolumeArray("volume6-2", "1Gi", "uid6-2", "claim6-2", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle), | 			newVolumeArray("volume6-2", "1Gi", "uid6-2", "claim6-2", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle, classEmpty), | ||||||
| 			newVolumeArray("volume6-2", "1Gi", "", "claim6-2", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle), | 			newVolumeArray("volume6-2", "1Gi", "", "claim6-2", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle, classEmpty), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| @@ -57,8 +57,8 @@ func TestRecycleSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// recycle failure - plugin not found | 			// recycle failure - plugin not found | ||||||
| 			"6-3 - plugin not found", | 			"6-3 - plugin not found", | ||||||
| 			newVolumeArray("volume6-3", "1Gi", "uid6-3", "claim6-3", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle), | 			newVolumeArray("volume6-3", "1Gi", "uid6-3", "claim6-3", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle, classEmpty), | ||||||
| 			withMessage("No recycler plugin found for the volume!", newVolumeArray("volume6-3", "1Gi", "uid6-3", "claim6-3", v1.VolumeFailed, v1.PersistentVolumeReclaimRecycle)), | 			withMessage("No recycler plugin found for the volume!", newVolumeArray("volume6-3", "1Gi", "uid6-3", "claim6-3", v1.VolumeFailed, v1.PersistentVolumeReclaimRecycle, classEmpty)), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			[]string{"Warning VolumeFailedRecycle"}, noerrors, testSyncVolume, | 			[]string{"Warning VolumeFailedRecycle"}, noerrors, testSyncVolume, | ||||||
| @@ -66,8 +66,8 @@ func TestRecycleSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// recycle failure - Recycle returns error | 			// recycle failure - Recycle returns error | ||||||
| 			"6-4 - newRecycler returns error", | 			"6-4 - newRecycler returns error", | ||||||
| 			newVolumeArray("volume6-4", "1Gi", "uid6-4", "claim6-4", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle), | 			newVolumeArray("volume6-4", "1Gi", "uid6-4", "claim6-4", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle, classEmpty), | ||||||
| 			withMessage("Recycle failed: Mock plugin error: no recycleCalls configured", newVolumeArray("volume6-4", "1Gi", "uid6-4", "claim6-4", v1.VolumeFailed, v1.PersistentVolumeReclaimRecycle)), | 			withMessage("Recycle failed: Mock plugin error: no recycleCalls configured", newVolumeArray("volume6-4", "1Gi", "uid6-4", "claim6-4", v1.VolumeFailed, v1.PersistentVolumeReclaimRecycle, classEmpty)), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			[]string{"Warning VolumeFailedRecycle"}, noerrors, | 			[]string{"Warning VolumeFailedRecycle"}, noerrors, | ||||||
| @@ -76,8 +76,8 @@ func TestRecycleSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// recycle failure - recycle returns error | 			// recycle failure - recycle returns error | ||||||
| 			"6-5 - recycle returns error", | 			"6-5 - recycle returns error", | ||||||
| 			newVolumeArray("volume6-5", "1Gi", "uid6-5", "claim6-5", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle), | 			newVolumeArray("volume6-5", "1Gi", "uid6-5", "claim6-5", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle, classEmpty), | ||||||
| 			withMessage("Recycle failed: Mock recycle error", newVolumeArray("volume6-5", "1Gi", "uid6-5", "claim6-5", v1.VolumeFailed, v1.PersistentVolumeReclaimRecycle)), | 			withMessage("Recycle failed: Mock recycle error", newVolumeArray("volume6-5", "1Gi", "uid6-5", "claim6-5", v1.VolumeFailed, v1.PersistentVolumeReclaimRecycle, classEmpty)), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			[]string{"Warning VolumeFailedRecycle"}, noerrors, | 			[]string{"Warning VolumeFailedRecycle"}, noerrors, | ||||||
| @@ -86,7 +86,7 @@ func TestRecycleSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// recycle success(?) - volume is deleted before doRecycle() starts | 			// recycle success(?) - volume is deleted before doRecycle() starts | ||||||
| 			"6-6 - volume is deleted before recycling", | 			"6-6 - volume is deleted before recycling", | ||||||
| 			newVolumeArray("volume6-6", "1Gi", "uid6-6", "claim6-6", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle), | 			newVolumeArray("volume6-6", "1Gi", "uid6-6", "claim6-6", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle, classEmpty), | ||||||
| 			novolumes, | 			novolumes, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| @@ -103,8 +103,8 @@ func TestRecycleSync(t *testing.T) { | |||||||
| 			// at the time new doRecycle() starts. This simulates "volume no | 			// at the time new doRecycle() starts. This simulates "volume no | ||||||
| 			// longer needs recycling, skipping". | 			// longer needs recycling, skipping". | ||||||
| 			"6-7 - volume is deleted before recycling", | 			"6-7 - volume is deleted before recycling", | ||||||
| 			newVolumeArray("volume6-7", "1Gi", "uid6-7", "claim6-7", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle, annBoundByController), | 			newVolumeArray("volume6-7", "1Gi", "uid6-7", "claim6-7", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle, classEmpty, annBoundByController), | ||||||
| 			newVolumeArray("volume6-7", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle), | 			newVolumeArray("volume6-7", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle, classEmpty), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| @@ -124,8 +124,8 @@ func TestRecycleSync(t *testing.T) { | |||||||
| 			// "volume no longer needs recycling, skipping" with volume bound by | 			// "volume no longer needs recycling, skipping" with volume bound by | ||||||
| 			// user. | 			// user. | ||||||
| 			"6-8 - prebound volume is deleted before recycling", | 			"6-8 - prebound volume is deleted before recycling", | ||||||
| 			newVolumeArray("volume6-8", "1Gi", "uid6-8", "claim6-8", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle), | 			newVolumeArray("volume6-8", "1Gi", "uid6-8", "claim6-8", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle, classEmpty), | ||||||
| 			newVolumeArray("volume6-8", "1Gi", "", "claim6-8", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle), | 			newVolumeArray("volume6-8", "1Gi", "", "claim6-8", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle, classEmpty), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| @@ -142,10 +142,10 @@ func TestRecycleSync(t *testing.T) { | |||||||
| 			// recycle success - volume bound by user is recycled, while a new | 			// recycle success - volume bound by user is recycled, while a new | ||||||
| 			// claim is created with another UID. | 			// claim is created with another UID. | ||||||
| 			"6-9 - prebound volume is recycled while the claim exists", | 			"6-9 - prebound volume is recycled while the claim exists", | ||||||
| 			newVolumeArray("volume6-9", "1Gi", "uid6-9", "claim6-9", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle), | 			newVolumeArray("volume6-9", "1Gi", "uid6-9", "claim6-9", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle, classEmpty), | ||||||
| 			newVolumeArray("volume6-9", "1Gi", "", "claim6-9", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle), | 			newVolumeArray("volume6-9", "1Gi", "", "claim6-9", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle, classEmpty), | ||||||
| 			newClaimArray("claim6-9", "uid6-9-x", "10Gi", "", v1.ClaimPending), | 			newClaimArray("claim6-9", "uid6-9-x", "10Gi", "", v1.ClaimPending, nil), | ||||||
| 			newClaimArray("claim6-9", "uid6-9-x", "10Gi", "", v1.ClaimPending), | 			newClaimArray("claim6-9", "uid6-9-x", "10Gi", "", v1.ClaimPending, nil), | ||||||
| 			noevents, noerrors, | 			noevents, noerrors, | ||||||
| 			// Inject recycler into the controller and call syncVolume. The | 			// Inject recycler into the controller and call syncVolume. The | ||||||
| 			// recycler simulates one recycle() call that succeeds. | 			// recycler simulates one recycle() call that succeeds. | ||||||
| @@ -154,8 +154,8 @@ func TestRecycleSync(t *testing.T) { | |||||||
| 		{ | 		{ | ||||||
| 			// volume has unknown reclaim policy - failure expected | 			// volume has unknown reclaim policy - failure expected | ||||||
| 			"6-10 - unknown reclaim policy", | 			"6-10 - unknown reclaim policy", | ||||||
| 			newVolumeArray("volume6-10", "1Gi", "uid6-10", "claim6-10", v1.VolumeBound, "Unknown"), | 			newVolumeArray("volume6-10", "1Gi", "uid6-10", "claim6-10", v1.VolumeBound, "Unknown", classEmpty), | ||||||
| 			withMessage("Volume has unrecognized PersistentVolumeReclaimPolicy", newVolumeArray("volume6-10", "1Gi", "uid6-10", "claim6-10", v1.VolumeFailed, "Unknown")), | 			withMessage("Volume has unrecognized PersistentVolumeReclaimPolicy", newVolumeArray("volume6-10", "1Gi", "uid6-10", "claim6-10", v1.VolumeFailed, "Unknown", classEmpty)), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			[]string{"Warning VolumeUnknownReclaimPolicy"}, noerrors, testSyncVolume, | 			[]string{"Warning VolumeUnknownReclaimPolicy"}, noerrors, testSyncVolume, | ||||||
| @@ -184,8 +184,8 @@ func TestRecycleMultiSync(t *testing.T) { | |||||||
| 			// recycle failure - recycle returns error. The controller should | 			// recycle failure - recycle returns error. The controller should | ||||||
| 			// try again. | 			// try again. | ||||||
| 			"7-1 - recycle returns error", | 			"7-1 - recycle returns error", | ||||||
| 			newVolumeArray("volume7-1", "1Gi", "uid7-1", "claim7-1", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle), | 			newVolumeArray("volume7-1", "1Gi", "uid7-1", "claim7-1", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle, classEmpty), | ||||||
| 			newVolumeArray("volume7-1", "1Gi", "", "claim7-1", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle), | 			newVolumeArray("volume7-1", "1Gi", "", "claim7-1", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle, classEmpty), | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			noclaims, | 			noclaims, | ||||||
| 			[]string{"Warning VolumeFailedRecycle"}, noerrors, | 			[]string{"Warning VolumeFailedRecycle"}, noerrors, | ||||||
|   | |||||||
| @@ -17840,6 +17840,104 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope | |||||||
| 			Dependencies: []string{ | 			Dependencies: []string{ | ||||||
| 				"k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector", "k8s.io/kubernetes/pkg/api/v1.EnvFromSource", "k8s.io/kubernetes/pkg/api/v1.EnvVar", "k8s.io/kubernetes/pkg/api/v1.Volume", "k8s.io/kubernetes/pkg/api/v1.VolumeMount"}, | 				"k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector", "k8s.io/kubernetes/pkg/api/v1.EnvFromSource", "k8s.io/kubernetes/pkg/api/v1.EnvVar", "k8s.io/kubernetes/pkg/api/v1.Volume", "k8s.io/kubernetes/pkg/api/v1.VolumeMount"}, | ||||||
| 		}, | 		}, | ||||||
|  | 		"k8s.io/kubernetes/pkg/apis/storage/v1.StorageClass": { | ||||||
|  | 			Schema: spec.Schema{ | ||||||
|  | 				SchemaProps: spec.SchemaProps{ | ||||||
|  | 					Description: "StorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned.\n\nStorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.", | ||||||
|  | 					Properties: map[string]spec.Schema{ | ||||||
|  | 						"kind": { | ||||||
|  | 							SchemaProps: spec.SchemaProps{ | ||||||
|  | 								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: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds", | ||||||
|  | 								Type:        []string{"string"}, | ||||||
|  | 								Format:      "", | ||||||
|  | 							}, | ||||||
|  | 						}, | ||||||
|  | 						"apiVersion": { | ||||||
|  | 							SchemaProps: spec.SchemaProps{ | ||||||
|  | 								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: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources", | ||||||
|  | 								Type:        []string{"string"}, | ||||||
|  | 								Format:      "", | ||||||
|  | 							}, | ||||||
|  | 						}, | ||||||
|  | 						"metadata": { | ||||||
|  | 							SchemaProps: spec.SchemaProps{ | ||||||
|  | 								Description: "Standard object's metadata. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata", | ||||||
|  | 								Ref:         ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), | ||||||
|  | 							}, | ||||||
|  | 						}, | ||||||
|  | 						"provisioner": { | ||||||
|  | 							SchemaProps: spec.SchemaProps{ | ||||||
|  | 								Description: "Provisioner indicates the type of the provisioner.", | ||||||
|  | 								Type:        []string{"string"}, | ||||||
|  | 								Format:      "", | ||||||
|  | 							}, | ||||||
|  | 						}, | ||||||
|  | 						"parameters": { | ||||||
|  | 							SchemaProps: spec.SchemaProps{ | ||||||
|  | 								Description: "Parameters holds the parameters for the provisioner that should create volumes of this storage class.", | ||||||
|  | 								Type:        []string{"object"}, | ||||||
|  | 								AdditionalProperties: &spec.SchemaOrBool{ | ||||||
|  | 									Schema: &spec.Schema{ | ||||||
|  | 										SchemaProps: spec.SchemaProps{ | ||||||
|  | 											Type:   []string{"string"}, | ||||||
|  | 											Format: "", | ||||||
|  | 										}, | ||||||
|  | 									}, | ||||||
|  | 								}, | ||||||
|  | 							}, | ||||||
|  | 						}, | ||||||
|  | 					}, | ||||||
|  | 					Required: []string{"provisioner"}, | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 			Dependencies: []string{ | ||||||
|  | 				"k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, | ||||||
|  | 		}, | ||||||
|  | 		"k8s.io/kubernetes/pkg/apis/storage/v1.StorageClassList": { | ||||||
|  | 			Schema: spec.Schema{ | ||||||
|  | 				SchemaProps: spec.SchemaProps{ | ||||||
|  | 					Description: "StorageClassList is a collection of storage classes.", | ||||||
|  | 					Properties: map[string]spec.Schema{ | ||||||
|  | 						"kind": { | ||||||
|  | 							SchemaProps: spec.SchemaProps{ | ||||||
|  | 								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: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds", | ||||||
|  | 								Type:        []string{"string"}, | ||||||
|  | 								Format:      "", | ||||||
|  | 							}, | ||||||
|  | 						}, | ||||||
|  | 						"apiVersion": { | ||||||
|  | 							SchemaProps: spec.SchemaProps{ | ||||||
|  | 								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: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources", | ||||||
|  | 								Type:        []string{"string"}, | ||||||
|  | 								Format:      "", | ||||||
|  | 							}, | ||||||
|  | 						}, | ||||||
|  | 						"metadata": { | ||||||
|  | 							SchemaProps: spec.SchemaProps{ | ||||||
|  | 								Description: "Standard list metadata More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata", | ||||||
|  | 								Ref:         ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), | ||||||
|  | 							}, | ||||||
|  | 						}, | ||||||
|  | 						"items": { | ||||||
|  | 							SchemaProps: spec.SchemaProps{ | ||||||
|  | 								Description: "Items is the list of StorageClasses", | ||||||
|  | 								Type:        []string{"array"}, | ||||||
|  | 								Items: &spec.SchemaOrArray{ | ||||||
|  | 									Schema: &spec.Schema{ | ||||||
|  | 										SchemaProps: spec.SchemaProps{ | ||||||
|  | 											Ref: ref("k8s.io/kubernetes/pkg/apis/storage/v1.StorageClass"), | ||||||
|  | 										}, | ||||||
|  | 									}, | ||||||
|  | 								}, | ||||||
|  | 							}, | ||||||
|  | 						}, | ||||||
|  | 					}, | ||||||
|  | 					Required: []string{"items"}, | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 			Dependencies: []string{ | ||||||
|  | 				"k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta", "k8s.io/kubernetes/pkg/apis/storage/v1.StorageClass"}, | ||||||
|  | 		}, | ||||||
| 		"k8s.io/kubernetes/pkg/apis/storage/v1beta1.StorageClass": { | 		"k8s.io/kubernetes/pkg/apis/storage/v1beta1.StorageClass": { | ||||||
| 			Schema: spec.Schema{ | 			Schema: spec.Schema{ | ||||||
| 				SchemaProps: spec.SchemaProps{ | 				SchemaProps: spec.SchemaProps{ | ||||||
|   | |||||||
| @@ -51,6 +51,7 @@ go_library( | |||||||
|         "//pkg/apis/settings/install:go_default_library", |         "//pkg/apis/settings/install:go_default_library", | ||||||
|         "//pkg/apis/settings/v1alpha1:go_default_library", |         "//pkg/apis/settings/v1alpha1:go_default_library", | ||||||
|         "//pkg/apis/storage/install:go_default_library", |         "//pkg/apis/storage/install:go_default_library", | ||||||
|  |         "//pkg/apis/storage/v1:go_default_library", | ||||||
|         "//pkg/apis/storage/v1beta1:go_default_library", |         "//pkg/apis/storage/v1beta1:go_default_library", | ||||||
|         "//pkg/client/clientset_generated/clientset/typed/core/v1:go_default_library", |         "//pkg/client/clientset_generated/clientset/typed/core/v1:go_default_library", | ||||||
|         "//pkg/client/clientset_generated/internalclientset/typed/core/internalversion:go_default_library", |         "//pkg/client/clientset_generated/internalclientset/typed/core/internalversion:go_default_library", | ||||||
|   | |||||||
| @@ -46,6 +46,7 @@ import ( | |||||||
| 	rbacapi "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1" | 	rbacapi "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1" | ||||||
| 	rbacv1beta1 "k8s.io/kubernetes/pkg/apis/rbac/v1beta1" | 	rbacv1beta1 "k8s.io/kubernetes/pkg/apis/rbac/v1beta1" | ||||||
| 	settingsapi "k8s.io/kubernetes/pkg/apis/settings/v1alpha1" | 	settingsapi "k8s.io/kubernetes/pkg/apis/settings/v1alpha1" | ||||||
|  | 	storageapiv1 "k8s.io/kubernetes/pkg/apis/storage/v1" | ||||||
| 	storageapiv1beta1 "k8s.io/kubernetes/pkg/apis/storage/v1beta1" | 	storageapiv1beta1 "k8s.io/kubernetes/pkg/apis/storage/v1beta1" | ||||||
| 	corev1client "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/core/v1" | 	corev1client "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/core/v1" | ||||||
| 	coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" | 	coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" | ||||||
| @@ -375,6 +376,7 @@ func DefaultAPIResourceConfigSource() *serverstorage.ResourceConfig { | |||||||
| 		rbacv1beta1.SchemeGroupVersion, | 		rbacv1beta1.SchemeGroupVersion, | ||||||
| 		rbacapi.SchemeGroupVersion, | 		rbacapi.SchemeGroupVersion, | ||||||
| 		settingsapi.SchemeGroupVersion, | 		settingsapi.SchemeGroupVersion, | ||||||
|  | 		storageapiv1.SchemeGroupVersion, | ||||||
| 		storageapiv1beta1.SchemeGroupVersion, | 		storageapiv1beta1.SchemeGroupVersion, | ||||||
| 		certificatesapiv1beta1.SchemeGroupVersion, | 		certificatesapiv1beta1.SchemeGroupVersion, | ||||||
| 		authorizationapiv1.SchemeGroupVersion, | 		authorizationapiv1.SchemeGroupVersion, | ||||||
|   | |||||||
| @@ -812,7 +812,7 @@ func (d *PersistentVolumeDescriber) Describe(namespace, name string, describerSe | |||||||
| 		w.Write(LEVEL_0, "Name:\t%s\n", pv.Name) | 		w.Write(LEVEL_0, "Name:\t%s\n", pv.Name) | ||||||
| 		printLabelsMultiline(w, "Labels", pv.Labels) | 		printLabelsMultiline(w, "Labels", pv.Labels) | ||||||
| 		printAnnotationsMultiline(w, "Annotations", pv.Annotations) | 		printAnnotationsMultiline(w, "Annotations", pv.Annotations) | ||||||
| 		w.Write(LEVEL_0, "StorageClass:\t%s\n", storageutil.GetStorageClassAnnotation(pv.ObjectMeta)) | 		w.Write(LEVEL_0, "StorageClass:\t%s\n", api.GetPersistentVolumeClass(pv)) | ||||||
| 		w.Write(LEVEL_0, "Status:\t%s\n", pv.Status.Phase) | 		w.Write(LEVEL_0, "Status:\t%s\n", pv.Status.Phase) | ||||||
| 		if pv.Spec.ClaimRef != nil { | 		if pv.Spec.ClaimRef != nil { | ||||||
| 			w.Write(LEVEL_0, "Claim:\t%s\n", pv.Spec.ClaimRef.Namespace+"/"+pv.Spec.ClaimRef.Name) | 			w.Write(LEVEL_0, "Claim:\t%s\n", pv.Spec.ClaimRef.Namespace+"/"+pv.Spec.ClaimRef.Name) | ||||||
| @@ -889,7 +889,7 @@ func (d *PersistentVolumeClaimDescriber) Describe(namespace, name string, descri | |||||||
| 		w := &PrefixWriter{out} | 		w := &PrefixWriter{out} | ||||||
| 		w.Write(LEVEL_0, "Name:\t%s\n", pvc.Name) | 		w.Write(LEVEL_0, "Name:\t%s\n", pvc.Name) | ||||||
| 		w.Write(LEVEL_0, "Namespace:\t%s\n", pvc.Namespace) | 		w.Write(LEVEL_0, "Namespace:\t%s\n", pvc.Namespace) | ||||||
| 		w.Write(LEVEL_0, "StorageClass:\t%s\n", storageutil.GetStorageClassAnnotation(pvc.ObjectMeta)) | 		w.Write(LEVEL_0, "StorageClass:\t%s\n", api.GetPersistentVolumeClaimClass(pvc)) | ||||||
| 		w.Write(LEVEL_0, "Status:\t%v\n", pvc.Status.Phase) | 		w.Write(LEVEL_0, "Status:\t%v\n", pvc.Status.Phase) | ||||||
| 		w.Write(LEVEL_0, "Volume:\t%s\n", pvc.Spec.VolumeName) | 		w.Write(LEVEL_0, "Volume:\t%s\n", pvc.Spec.VolumeName) | ||||||
| 		printLabelsMultiline(w, "Labels", pvc.Labels) | 		printLabelsMultiline(w, "Labels", pvc.Labels) | ||||||
|   | |||||||
| @@ -1179,7 +1179,7 @@ func printPersistentVolume(pv *api.PersistentVolume, w io.Writer, options printe | |||||||
| 		aSize, modesStr, reclaimPolicyStr, | 		aSize, modesStr, reclaimPolicyStr, | ||||||
| 		pv.Status.Phase, | 		pv.Status.Phase, | ||||||
| 		claimRefUID, | 		claimRefUID, | ||||||
| 		storageutil.GetStorageClassAnnotation(pv.ObjectMeta), | 		api.GetPersistentVolumeClass(pv), | ||||||
| 		pv.Status.Reason, | 		pv.Status.Reason, | ||||||
| 		translateTimestamp(pv.CreationTimestamp), | 		translateTimestamp(pv.CreationTimestamp), | ||||||
| 	); err != nil { | 	); err != nil { | ||||||
| @@ -1222,7 +1222,7 @@ func printPersistentVolumeClaim(pvc *api.PersistentVolumeClaim, w io.Writer, opt | |||||||
| 		capacity = storage.String() | 		capacity = storage.String() | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\t%s", name, phase, pvc.Spec.VolumeName, capacity, accessModes, storageutil.GetStorageClassAnnotation(pvc.ObjectMeta), translateTimestamp(pvc.CreationTimestamp)); err != nil { | 	if _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\t%s", name, phase, pvc.Spec.VolumeName, capacity, accessModes, api.GetPersistentVolumeClaimClass(pvc), translateTimestamp(pvc.CreationTimestamp)); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	if _, err := fmt.Fprint(w, AppendLabels(pvc.Labels, options.ColumnLabels)); err != nil { | 	if _, err := fmt.Fprint(w, AppendLabels(pvc.Labels, options.ColumnLabels)); err != nil { | ||||||
|   | |||||||
| @@ -26,7 +26,6 @@ go_library( | |||||||
|         "//pkg/api:go_default_library", |         "//pkg/api:go_default_library", | ||||||
|         "//pkg/api/v1:go_default_library", |         "//pkg/api/v1:go_default_library", | ||||||
|         "//pkg/api/validation:go_default_library", |         "//pkg/api/validation:go_default_library", | ||||||
|         "//pkg/apis/storage/util:go_default_library", |  | ||||||
|         "//pkg/client/clientset_generated/clientset:go_default_library", |         "//pkg/client/clientset_generated/clientset:go_default_library", | ||||||
|         "//pkg/client/informers/informers_generated/externalversions:go_default_library", |         "//pkg/client/informers/informers_generated/externalversions:go_default_library", | ||||||
|         "//pkg/kubelet/qos:go_default_library", |         "//pkg/kubelet/qos:go_default_library", | ||||||
| @@ -53,7 +52,6 @@ go_test( | |||||||
|     tags = ["automanaged"], |     tags = ["automanaged"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         "//pkg/api:go_default_library", |         "//pkg/api:go_default_library", | ||||||
|         "//pkg/apis/storage/util:go_default_library", |  | ||||||
|         "//pkg/client/clientset_generated/clientset/fake:go_default_library", |         "//pkg/client/clientset_generated/clientset/fake:go_default_library", | ||||||
|         "//pkg/quota:go_default_library", |         "//pkg/quota:go_default_library", | ||||||
|         "//vendor:k8s.io/apimachinery/pkg/api/resource", |         "//vendor:k8s.io/apimachinery/pkg/api/resource", | ||||||
|   | |||||||
| @@ -28,7 +28,6 @@ import ( | |||||||
| 	"k8s.io/apiserver/pkg/admission" | 	"k8s.io/apiserver/pkg/admission" | ||||||
| 	"k8s.io/kubernetes/pkg/api" | 	"k8s.io/kubernetes/pkg/api" | ||||||
| 	"k8s.io/kubernetes/pkg/api/v1" | 	"k8s.io/kubernetes/pkg/api/v1" | ||||||
| 	"k8s.io/kubernetes/pkg/apis/storage/util" |  | ||||||
| 	"k8s.io/kubernetes/pkg/client/clientset_generated/clientset" | 	"k8s.io/kubernetes/pkg/client/clientset_generated/clientset" | ||||||
| 	informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions" | 	informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions" | ||||||
| 	"k8s.io/kubernetes/pkg/quota" | 	"k8s.io/kubernetes/pkg/quota" | ||||||
| @@ -105,7 +104,7 @@ func (p *pvcEvaluator) Constraints(required []api.ResourceName, item runtime.Obj | |||||||
|  |  | ||||||
| 	// these are the items that we will be handling based on the objects actual storage-class | 	// these are the items that we will be handling based on the objects actual storage-class | ||||||
| 	pvcRequiredSet := append([]api.ResourceName{}, pvcResources...) | 	pvcRequiredSet := append([]api.ResourceName{}, pvcResources...) | ||||||
| 	if storageClassRef := util.GetClaimStorageClass(pvc); len(storageClassRef) > 0 { | 	if storageClassRef := api.GetPersistentVolumeClaimClass(pvc); len(storageClassRef) > 0 { | ||||||
| 		pvcRequiredSet = append(pvcRequiredSet, ResourceByStorageClass(storageClassRef, api.ResourcePersistentVolumeClaims)) | 		pvcRequiredSet = append(pvcRequiredSet, ResourceByStorageClass(storageClassRef, api.ResourcePersistentVolumeClaims)) | ||||||
| 		pvcRequiredSet = append(pvcRequiredSet, ResourceByStorageClass(storageClassRef, api.ResourceRequestsStorage)) | 		pvcRequiredSet = append(pvcRequiredSet, ResourceByStorageClass(storageClassRef, api.ResourceRequestsStorage)) | ||||||
| 	} | 	} | ||||||
| @@ -176,7 +175,7 @@ func (p *pvcEvaluator) Usage(item runtime.Object) (api.ResourceList, error) { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return result, err | 		return result, err | ||||||
| 	} | 	} | ||||||
| 	storageClassRef := util.GetClaimStorageClass(pvc) | 	storageClassRef := api.GetPersistentVolumeClaimClass(pvc) | ||||||
|  |  | ||||||
| 	// charge for claim | 	// charge for claim | ||||||
| 	result[api.ResourcePersistentVolumeClaims] = resource.MustParse("1") | 	result[api.ResourcePersistentVolumeClaims] = resource.MustParse("1") | ||||||
|   | |||||||
| @@ -22,7 +22,6 @@ import ( | |||||||
| 	"k8s.io/apimachinery/pkg/api/resource" | 	"k8s.io/apimachinery/pkg/api/resource" | ||||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
| 	"k8s.io/kubernetes/pkg/api" | 	"k8s.io/kubernetes/pkg/api" | ||||||
| 	"k8s.io/kubernetes/pkg/apis/storage/util" |  | ||||||
| 	"k8s.io/kubernetes/pkg/client/clientset_generated/clientset/fake" | 	"k8s.io/kubernetes/pkg/client/clientset_generated/clientset/fake" | ||||||
| 	"k8s.io/kubernetes/pkg/quota" | 	"k8s.io/kubernetes/pkg/quota" | ||||||
| ) | ) | ||||||
| @@ -35,6 +34,9 @@ func testVolumeClaim(name string, namespace string, spec api.PersistentVolumeCla | |||||||
| } | } | ||||||
|  |  | ||||||
| func TestPersistentVolumeClaimsConstraintsFunc(t *testing.T) { | func TestPersistentVolumeClaimsConstraintsFunc(t *testing.T) { | ||||||
|  | 	classGold := "gold" | ||||||
|  | 	classBronze := "bronze" | ||||||
|  |  | ||||||
| 	validClaim := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ | 	validClaim := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ | ||||||
| 		Selector: &metav1.LabelSelector{ | 		Selector: &metav1.LabelSelector{ | ||||||
| 			MatchExpressions: []metav1.LabelSelectorRequirement{ | 			MatchExpressions: []metav1.LabelSelectorRequirement{ | ||||||
| @@ -72,10 +74,8 @@ func TestPersistentVolumeClaimsConstraintsFunc(t *testing.T) { | |||||||
| 				api.ResourceName(api.ResourceStorage): resource.MustParse("10Gi"), | 				api.ResourceName(api.ResourceStorage): resource.MustParse("10Gi"), | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
|  | 		StorageClassName: &classGold, | ||||||
| 	}) | 	}) | ||||||
| 	validClaimGoldStorageClass.Annotations = map[string]string{ |  | ||||||
| 		util.StorageClassAnnotation: "gold", |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	validClaimBronzeStorageClass := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ | 	validClaimBronzeStorageClass := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ | ||||||
| 		Selector: &metav1.LabelSelector{ | 		Selector: &metav1.LabelSelector{ | ||||||
| @@ -95,10 +95,8 @@ func TestPersistentVolumeClaimsConstraintsFunc(t *testing.T) { | |||||||
| 				api.ResourceName(api.ResourceStorage): resource.MustParse("10Gi"), | 				api.ResourceName(api.ResourceStorage): resource.MustParse("10Gi"), | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
|  | 		StorageClassName: &classBronze, | ||||||
| 	}) | 	}) | ||||||
| 	validClaimBronzeStorageClass.Annotations = map[string]string{ |  | ||||||
| 		util.StorageClassAnnotation: "bronze", |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	missingStorage := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ | 	missingStorage := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ | ||||||
| 		Selector: &metav1.LabelSelector{ | 		Selector: &metav1.LabelSelector{ | ||||||
| @@ -134,10 +132,8 @@ func TestPersistentVolumeClaimsConstraintsFunc(t *testing.T) { | |||||||
| 		Resources: api.ResourceRequirements{ | 		Resources: api.ResourceRequirements{ | ||||||
| 			Requests: api.ResourceList{}, | 			Requests: api.ResourceList{}, | ||||||
| 		}, | 		}, | ||||||
|  | 		StorageClassName: &classGold, | ||||||
| 	}) | 	}) | ||||||
| 	missingGoldStorage.Annotations = map[string]string{ |  | ||||||
| 		util.StorageClassAnnotation: "gold", |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	testCases := map[string]struct { | 	testCases := map[string]struct { | ||||||
| 		pvc      *api.PersistentVolumeClaim | 		pvc      *api.PersistentVolumeClaim | ||||||
| @@ -151,7 +147,7 @@ func TestPersistentVolumeClaimsConstraintsFunc(t *testing.T) { | |||||||
| 		}, | 		}, | ||||||
| 		"missing gold storage": { | 		"missing gold storage": { | ||||||
| 			pvc:      missingGoldStorage, | 			pvc:      missingGoldStorage, | ||||||
| 			required: []api.ResourceName{ResourceByStorageClass("gold", api.ResourceRequestsStorage)}, | 			required: []api.ResourceName{ResourceByStorageClass(classGold, api.ResourceRequestsStorage)}, | ||||||
| 			err:      `must specify gold.storageclass.storage.k8s.io/requests.storage`, | 			err:      `must specify gold.storageclass.storage.k8s.io/requests.storage`, | ||||||
| 		}, | 		}, | ||||||
| 		"valid-claim-quota-storage": { | 		"valid-claim-quota-storage": { | ||||||
| @@ -171,8 +167,8 @@ func TestPersistentVolumeClaimsConstraintsFunc(t *testing.T) { | |||||||
| 			required: []api.ResourceName{ | 			required: []api.ResourceName{ | ||||||
| 				api.ResourceRequestsStorage, | 				api.ResourceRequestsStorage, | ||||||
| 				api.ResourcePersistentVolumeClaims, | 				api.ResourcePersistentVolumeClaims, | ||||||
| 				ResourceByStorageClass("gold", api.ResourceRequestsStorage), | 				ResourceByStorageClass(classGold, api.ResourceRequestsStorage), | ||||||
| 				ResourceByStorageClass("gold", api.ResourcePersistentVolumeClaims), | 				ResourceByStorageClass(classGold, api.ResourcePersistentVolumeClaims), | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		"valid-claim-bronze-with-quota-gold": { | 		"valid-claim-bronze-with-quota-gold": { | ||||||
| @@ -180,8 +176,8 @@ func TestPersistentVolumeClaimsConstraintsFunc(t *testing.T) { | |||||||
| 			required: []api.ResourceName{ | 			required: []api.ResourceName{ | ||||||
| 				api.ResourceRequestsStorage, | 				api.ResourceRequestsStorage, | ||||||
| 				api.ResourcePersistentVolumeClaims, | 				api.ResourcePersistentVolumeClaims, | ||||||
| 				ResourceByStorageClass("gold", api.ResourceRequestsStorage), | 				ResourceByStorageClass(classGold, api.ResourceRequestsStorage), | ||||||
| 				ResourceByStorageClass("gold", api.ResourcePersistentVolumeClaims), | 				ResourceByStorageClass(classGold, api.ResourcePersistentVolumeClaims), | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| @@ -200,6 +196,7 @@ func TestPersistentVolumeClaimsConstraintsFunc(t *testing.T) { | |||||||
| } | } | ||||||
|  |  | ||||||
| func TestPersistentVolumeClaimEvaluatorUsage(t *testing.T) { | func TestPersistentVolumeClaimEvaluatorUsage(t *testing.T) { | ||||||
|  | 	classGold := "gold" | ||||||
| 	validClaim := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ | 	validClaim := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ | ||||||
| 		Selector: &metav1.LabelSelector{ | 		Selector: &metav1.LabelSelector{ | ||||||
| 			MatchExpressions: []metav1.LabelSelectorRequirement{ | 			MatchExpressions: []metav1.LabelSelectorRequirement{ | ||||||
| @@ -237,11 +234,8 @@ func TestPersistentVolumeClaimEvaluatorUsage(t *testing.T) { | |||||||
| 				api.ResourceName(api.ResourceStorage): resource.MustParse("10Gi"), | 				api.ResourceName(api.ResourceStorage): resource.MustParse("10Gi"), | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
|  | 		StorageClassName: &classGold, | ||||||
| 	}) | 	}) | ||||||
| 	storageClassName := "gold" |  | ||||||
| 	validClaimByStorageClass.Annotations = map[string]string{ |  | ||||||
| 		util.StorageClassAnnotation: storageClassName, |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	kubeClient := fake.NewSimpleClientset() | 	kubeClient := fake.NewSimpleClientset() | ||||||
| 	evaluator := NewPersistentVolumeClaimEvaluator(kubeClient, nil) | 	evaluator := NewPersistentVolumeClaimEvaluator(kubeClient, nil) | ||||||
| @@ -261,8 +255,8 @@ func TestPersistentVolumeClaimEvaluatorUsage(t *testing.T) { | |||||||
| 			usage: api.ResourceList{ | 			usage: api.ResourceList{ | ||||||
| 				api.ResourceRequestsStorage:                                           resource.MustParse("10Gi"), | 				api.ResourceRequestsStorage:                                           resource.MustParse("10Gi"), | ||||||
| 				api.ResourcePersistentVolumeClaims:                                    resource.MustParse("1"), | 				api.ResourcePersistentVolumeClaims:                                    resource.MustParse("1"), | ||||||
| 				ResourceByStorageClass(storageClassName, api.ResourceRequestsStorage):        resource.MustParse("10Gi"), | 				ResourceByStorageClass(classGold, api.ResourceRequestsStorage):        resource.MustParse("10Gi"), | ||||||
| 				ResourceByStorageClass(storageClassName, api.ResourcePersistentVolumeClaims): resource.MustParse("1"), | 				ResourceByStorageClass(classGold, api.ResourcePersistentVolumeClaims): resource.MustParse("1"), | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ go_library( | |||||||
|     deps = [ |     deps = [ | ||||||
|         "//pkg/api:go_default_library", |         "//pkg/api:go_default_library", | ||||||
|         "//pkg/apis/storage:go_default_library", |         "//pkg/apis/storage:go_default_library", | ||||||
|  |         "//pkg/apis/storage/v1:go_default_library", | ||||||
|         "//pkg/apis/storage/v1beta1:go_default_library", |         "//pkg/apis/storage/v1beta1:go_default_library", | ||||||
|         "//pkg/registry/storage/storageclass/storage:go_default_library", |         "//pkg/registry/storage/storageclass/storage:go_default_library", | ||||||
|         "//vendor:k8s.io/apiserver/pkg/registry/generic", |         "//vendor:k8s.io/apiserver/pkg/registry/generic", | ||||||
|   | |||||||
| @@ -23,6 +23,7 @@ import ( | |||||||
| 	serverstorage "k8s.io/apiserver/pkg/server/storage" | 	serverstorage "k8s.io/apiserver/pkg/server/storage" | ||||||
| 	"k8s.io/kubernetes/pkg/api" | 	"k8s.io/kubernetes/pkg/api" | ||||||
| 	storageapi "k8s.io/kubernetes/pkg/apis/storage" | 	storageapi "k8s.io/kubernetes/pkg/apis/storage" | ||||||
|  | 	storageapiv1 "k8s.io/kubernetes/pkg/apis/storage/v1" | ||||||
| 	storageapiv1beta1 "k8s.io/kubernetes/pkg/apis/storage/v1beta1" | 	storageapiv1beta1 "k8s.io/kubernetes/pkg/apis/storage/v1beta1" | ||||||
| 	storageclassstore "k8s.io/kubernetes/pkg/registry/storage/storageclass/storage" | 	storageclassstore "k8s.io/kubernetes/pkg/registry/storage/storageclass/storage" | ||||||
| ) | ) | ||||||
| @@ -37,6 +38,10 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorag | |||||||
| 		apiGroupInfo.VersionedResourcesStorageMap[storageapiv1beta1.SchemeGroupVersion.Version] = p.v1beta1Storage(apiResourceConfigSource, restOptionsGetter) | 		apiGroupInfo.VersionedResourcesStorageMap[storageapiv1beta1.SchemeGroupVersion.Version] = p.v1beta1Storage(apiResourceConfigSource, restOptionsGetter) | ||||||
| 		apiGroupInfo.GroupMeta.GroupVersion = storageapiv1beta1.SchemeGroupVersion | 		apiGroupInfo.GroupMeta.GroupVersion = storageapiv1beta1.SchemeGroupVersion | ||||||
| 	} | 	} | ||||||
|  | 	if apiResourceConfigSource.AnyResourcesForVersionEnabled(storageapiv1.SchemeGroupVersion) { | ||||||
|  | 		apiGroupInfo.VersionedResourcesStorageMap[storageapiv1.SchemeGroupVersion.Version] = p.v1Storage(apiResourceConfigSource, restOptionsGetter) | ||||||
|  | 		apiGroupInfo.GroupMeta.GroupVersion = storageapiv1.SchemeGroupVersion | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return apiGroupInfo, true | 	return apiGroupInfo, true | ||||||
| } | } | ||||||
| @@ -54,6 +59,19 @@ func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorag | |||||||
| 	return storage | 	return storage | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (p RESTStorageProvider) v1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { | ||||||
|  | 	version := storageapiv1.SchemeGroupVersion | ||||||
|  |  | ||||||
|  | 	storage := map[string]rest.Storage{} | ||||||
|  |  | ||||||
|  | 	if apiResourceConfigSource.ResourceEnabled(version.WithResource("storageclasses")) { | ||||||
|  | 		storageClassStorage := storageclassstore.NewREST(restOptionsGetter) | ||||||
|  | 		storage["storageclasses"] = storageClassStorage | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return storage | ||||||
|  | } | ||||||
|  |  | ||||||
| func (p RESTStorageProvider) GroupName() string { | func (p RESTStorageProvider) GroupName() string { | ||||||
| 	return storageapi.GroupName | 	return storageapi.GroupName | ||||||
| } | } | ||||||
|   | |||||||
| @@ -19,7 +19,6 @@ go_library( | |||||||
|     tags = ["automanaged"], |     tags = ["automanaged"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         "//pkg/api/v1:go_default_library", |         "//pkg/api/v1:go_default_library", | ||||||
|         "//pkg/apis/storage/v1beta1/util:go_default_library", |  | ||||||
|         "//pkg/client/clientset_generated/clientset:go_default_library", |         "//pkg/client/clientset_generated/clientset:go_default_library", | ||||||
|         "//pkg/util/exec:go_default_library", |         "//pkg/util/exec:go_default_library", | ||||||
|         "//pkg/util/mount:go_default_library", |         "//pkg/util/mount:go_default_library", | ||||||
|   | |||||||
| @@ -35,7 +35,6 @@ import ( | |||||||
| 	"k8s.io/apimachinery/pkg/labels" | 	"k8s.io/apimachinery/pkg/labels" | ||||||
| 	"k8s.io/apimachinery/pkg/types" | 	"k8s.io/apimachinery/pkg/types" | ||||||
| 	"k8s.io/kubernetes/pkg/api/v1" | 	"k8s.io/kubernetes/pkg/api/v1" | ||||||
| 	storageutil "k8s.io/kubernetes/pkg/apis/storage/v1beta1/util" |  | ||||||
| 	"k8s.io/kubernetes/pkg/client/clientset_generated/clientset" | 	"k8s.io/kubernetes/pkg/client/clientset_generated/clientset" | ||||||
| 	"k8s.io/kubernetes/pkg/util/exec" | 	"k8s.io/kubernetes/pkg/util/exec" | ||||||
| 	"k8s.io/kubernetes/pkg/util/mount" | 	"k8s.io/kubernetes/pkg/util/mount" | ||||||
| @@ -471,7 +470,7 @@ func (p *glusterfsPlugin) collectGids(className string, gidTable *MinMaxAllocato | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for _, pv := range pvList.Items { | 	for _, pv := range pvList.Items { | ||||||
| 		if storageutil.GetVolumeStorageClass(&pv) != className { | 		if v1.GetPersistentVolumeClass(&pv) != className { | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| @@ -650,7 +649,7 @@ func (r *glusterfsVolumeProvisioner) Provision() (*v1.PersistentVolume, error) { | |||||||
| 		return nil, fmt.Errorf("glusterfs: not able to parse your claim Selector") | 		return nil, fmt.Errorf("glusterfs: not able to parse your claim Selector") | ||||||
| 	} | 	} | ||||||
| 	glog.V(4).Infof("glusterfs: Provison VolumeOptions %v", r.options) | 	glog.V(4).Infof("glusterfs: Provison VolumeOptions %v", r.options) | ||||||
| 	scName := storageutil.GetClaimStorageClass(r.options.PVC) | 	scName := v1.GetPersistentVolumeClaimClass(r.options.PVC) | ||||||
| 	cfg, err := parseClassParameters(r.options.Parameters, r.plugin.host.GetKubeClient()) | 	cfg, err := parseClassParameters(r.options.Parameters, r.plugin.host.GetKubeClient()) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
|   | |||||||
| @@ -158,7 +158,7 @@ func GetClassForVolume(kubeClient clientset.Interface, pv *v1.PersistentVolume) | |||||||
| 		return nil, fmt.Errorf("Volume has no class annotation") | 		return nil, fmt.Errorf("Volume has no class annotation") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	class, err := kubeClient.Storage().StorageClasses().Get(className, metav1.GetOptions{}) | 	class, err := kubeClient.StorageV1beta1().StorageClasses().Get(className, metav1.GetOptions{}) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -96,7 +96,7 @@ func (c *claimDefaulterPlugin) Admit(a admission.Attributes) error { | |||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if storageutil.HasStorageClassAnnotation(pvc.ObjectMeta) { | 	if api.PersistentVolumeClaimHasClass(pvc) { | ||||||
| 		// The user asked for a class. | 		// The user asked for a class. | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| @@ -113,10 +113,7 @@ func (c *claimDefaulterPlugin) Admit(a admission.Attributes) error { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	glog.V(4).Infof("defaulting storage class for claim %s (generate: %s) to %s", pvc.Name, pvc.GenerateName, def.Name) | 	glog.V(4).Infof("defaulting storage class for claim %s (generate: %s) to %s", pvc.Name, pvc.GenerateName, def.Name) | ||||||
| 	if pvc.ObjectMeta.Annotations == nil { | 	pvc.Spec.StorageClassName = &def.Name | ||||||
| 		pvc.ObjectMeta.Annotations = map[string]string{} |  | ||||||
| 	} |  | ||||||
| 	pvc.Annotations[storageutil.StorageClassAnnotation] = def.Name |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -31,6 +31,9 @@ import ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestAdmission(t *testing.T) { | func TestAdmission(t *testing.T) { | ||||||
|  | 	empty := "" | ||||||
|  | 	foo := "foo" | ||||||
|  |  | ||||||
| 	defaultClass1 := &storage.StorageClass{ | 	defaultClass1 := &storage.StorageClass{ | ||||||
| 		TypeMeta: metav1.TypeMeta{ | 		TypeMeta: metav1.TypeMeta{ | ||||||
| 			Kind: "StorageClass", | 			Kind: "StorageClass", | ||||||
| @@ -99,9 +102,9 @@ func TestAdmission(t *testing.T) { | |||||||
| 		ObjectMeta: metav1.ObjectMeta{ | 		ObjectMeta: metav1.ObjectMeta{ | ||||||
| 			Name:      "claimWithClass", | 			Name:      "claimWithClass", | ||||||
| 			Namespace: "ns", | 			Namespace: "ns", | ||||||
| 			Annotations: map[string]string{ |  | ||||||
| 				storageutil.StorageClassAnnotation: "foo", |  | ||||||
| 		}, | 		}, | ||||||
|  | 		Spec: api.PersistentVolumeClaimSpec{ | ||||||
|  | 			StorageClassName: &foo, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 	claimWithEmptyClass := &api.PersistentVolumeClaim{ | 	claimWithEmptyClass := &api.PersistentVolumeClaim{ | ||||||
| @@ -111,9 +114,9 @@ func TestAdmission(t *testing.T) { | |||||||
| 		ObjectMeta: metav1.ObjectMeta{ | 		ObjectMeta: metav1.ObjectMeta{ | ||||||
| 			Name:      "claimWithEmptyClass", | 			Name:      "claimWithEmptyClass", | ||||||
| 			Namespace: "ns", | 			Namespace: "ns", | ||||||
| 			Annotations: map[string]string{ |  | ||||||
| 				storageutil.StorageClassAnnotation: "", |  | ||||||
| 		}, | 		}, | ||||||
|  | 		Spec: api.PersistentVolumeClaimSpec{ | ||||||
|  | 			StorageClassName: &empty, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 	claimWithNoClass := &api.PersistentVolumeClaim{ | 	claimWithNoClass := &api.PersistentVolumeClaim{ | ||||||
| @@ -221,10 +224,8 @@ func TestAdmission(t *testing.T) { | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		class := "" | 		class := "" | ||||||
| 		if claim.Annotations != nil { | 		if claim.Spec.StorageClassName != nil { | ||||||
| 			if value, ok := claim.Annotations[storageutil.StorageClassAnnotation]; ok { | 			class = *claim.Spec.StorageClassName | ||||||
| 				class = value |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 		if test.expectedClassName != "" && test.expectedClassName != class { | 		if test.expectedClassName != "" && test.expectedClassName != class { | ||||||
| 			t.Errorf("Test %q: expected class name %q, got %q", test.name, test.expectedClassName, class) | 			t.Errorf("Test %q: expected class name %q, got %q", test.name, test.expectedClassName, class) | ||||||
|   | |||||||
| @@ -33,6 +33,7 @@ import ( | |||||||
| 	v1alpha1 "k8s.io/client-go/pkg/apis/rbac/v1alpha1" | 	v1alpha1 "k8s.io/client-go/pkg/apis/rbac/v1alpha1" | ||||||
| 	rbac_v1beta1 "k8s.io/client-go/pkg/apis/rbac/v1beta1" | 	rbac_v1beta1 "k8s.io/client-go/pkg/apis/rbac/v1beta1" | ||||||
| 	settings_v1alpha1 "k8s.io/client-go/pkg/apis/settings/v1alpha1" | 	settings_v1alpha1 "k8s.io/client-go/pkg/apis/settings/v1alpha1" | ||||||
|  | 	storage_v1 "k8s.io/client-go/pkg/apis/storage/v1" | ||||||
| 	storage_v1beta1 "k8s.io/client-go/pkg/apis/storage/v1beta1" | 	storage_v1beta1 "k8s.io/client-go/pkg/apis/storage/v1beta1" | ||||||
| 	cache "k8s.io/client-go/tools/cache" | 	cache "k8s.io/client-go/tools/cache" | ||||||
| ) | ) | ||||||
| @@ -167,6 +168,10 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource | |||||||
| 	case settings_v1alpha1.SchemeGroupVersion.WithResource("podpresets"): | 	case settings_v1alpha1.SchemeGroupVersion.WithResource("podpresets"): | ||||||
| 		return &genericInformer{resource: resource.GroupResource(), informer: f.Settings().V1alpha1().PodPresets().Informer()}, nil | 		return &genericInformer{resource: resource.GroupResource(), informer: f.Settings().V1alpha1().PodPresets().Informer()}, nil | ||||||
|  |  | ||||||
|  | 		// Group=Storage, Version=V1 | ||||||
|  | 	case storage_v1.SchemeGroupVersion.WithResource("storageclasses"): | ||||||
|  | 		return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1().StorageClasses().Informer()}, nil | ||||||
|  |  | ||||||
| 		// Group=Storage, Version=V1beta1 | 		// Group=Storage, Version=V1beta1 | ||||||
| 	case storage_v1beta1.SchemeGroupVersion.WithResource("storageclasses"): | 	case storage_v1beta1.SchemeGroupVersion.WithResource("storageclasses"): | ||||||
| 		return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1beta1().StorageClasses().Informer()}, nil | 		return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1beta1().StorageClasses().Informer()}, nil | ||||||
|   | |||||||
| @@ -20,11 +20,14 @@ package storage | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	internalinterfaces "k8s.io/client-go/informers/internalinterfaces" | 	internalinterfaces "k8s.io/client-go/informers/internalinterfaces" | ||||||
|  | 	v1 "k8s.io/client-go/informers/storage/v1" | ||||||
| 	v1beta1 "k8s.io/client-go/informers/storage/v1beta1" | 	v1beta1 "k8s.io/client-go/informers/storage/v1beta1" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // Interface provides access to each of this group's versions. | // Interface provides access to each of this group's versions. | ||||||
| type Interface interface { | type Interface interface { | ||||||
|  | 	// V1 provides access to shared informers for resources in V1. | ||||||
|  | 	V1() v1.Interface | ||||||
| 	// V1beta1 provides access to shared informers for resources in V1beta1. | 	// V1beta1 provides access to shared informers for resources in V1beta1. | ||||||
| 	V1beta1() v1beta1.Interface | 	V1beta1() v1beta1.Interface | ||||||
| } | } | ||||||
| @@ -38,6 +41,11 @@ func New(f internalinterfaces.SharedInformerFactory) Interface { | |||||||
| 	return &group{f} | 	return &group{f} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // V1 returns a new v1.Interface. | ||||||
|  | func (g *group) V1() v1.Interface { | ||||||
|  | 	return v1.New(g.SharedInformerFactory) | ||||||
|  | } | ||||||
|  |  | ||||||
| // V1beta1 returns a new v1beta1.Interface. | // V1beta1 returns a new v1beta1.Interface. | ||||||
| func (g *group) V1beta1() v1beta1.Interface { | func (g *group) V1beta1() v1beta1.Interface { | ||||||
| 	return v1beta1.New(g.SharedInformerFactory) | 	return v1beta1.New(g.SharedInformerFactory) | ||||||
|   | |||||||
| @@ -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 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 { | ||||||
|  | 	// StorageClasses returns a StorageClassInformer. | ||||||
|  | 	StorageClasses() StorageClassInformer | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type version struct { | ||||||
|  | 	internalinterfaces.SharedInformerFactory | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // New returns a new Interface. | ||||||
|  | func New(f internalinterfaces.SharedInformerFactory) Interface { | ||||||
|  | 	return &version{f} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // StorageClasses returns a StorageClassInformer. | ||||||
|  | func (v *version) StorageClasses() StorageClassInformer { | ||||||
|  | 	return &storageClassInformer{factory: v.SharedInformerFactory} | ||||||
|  | } | ||||||
| @@ -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. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | // This file was automatically generated by informer-gen | ||||||
|  |  | ||||||
|  | package v1 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	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/storage/v1" | ||||||
|  | 	storage_v1 "k8s.io/client-go/pkg/apis/storage/v1" | ||||||
|  | 	cache "k8s.io/client-go/tools/cache" | ||||||
|  | 	time "time" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // StorageClassInformer provides access to a shared informer and lister for | ||||||
|  | // StorageClasses. | ||||||
|  | type StorageClassInformer interface { | ||||||
|  | 	Informer() cache.SharedIndexInformer | ||||||
|  | 	Lister() v1.StorageClassLister | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type storageClassInformer struct { | ||||||
|  | 	factory internalinterfaces.SharedInformerFactory | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func newStorageClassInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { | ||||||
|  | 	sharedIndexInformer := cache.NewSharedIndexInformer( | ||||||
|  | 		&cache.ListWatch{ | ||||||
|  | 			ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { | ||||||
|  | 				return client.StorageV1().StorageClasses().List(options) | ||||||
|  | 			}, | ||||||
|  | 			WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { | ||||||
|  | 				return client.StorageV1().StorageClasses().Watch(options) | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		&storage_v1.StorageClass{}, | ||||||
|  | 		resyncPeriod, | ||||||
|  | 		cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, | ||||||
|  | 	) | ||||||
|  |  | ||||||
|  | 	return sharedIndexInformer | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (f *storageClassInformer) Informer() cache.SharedIndexInformer { | ||||||
|  | 	return f.factory.InformerFor(&storage_v1.StorageClass{}, newStorageClassInformer) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (f *storageClassInformer) Lister() v1.StorageClassLister { | ||||||
|  | 	return v1.NewStorageClassLister(f.Informer().GetIndexer()) | ||||||
|  | } | ||||||
| @@ -35,6 +35,7 @@ import ( | |||||||
| 	rbacv1alpha1 "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1" | 	rbacv1alpha1 "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1" | ||||||
| 	rbacv1beta1 "k8s.io/client-go/kubernetes/typed/rbac/v1beta1" | 	rbacv1beta1 "k8s.io/client-go/kubernetes/typed/rbac/v1beta1" | ||||||
| 	settingsv1alpha1 "k8s.io/client-go/kubernetes/typed/settings/v1alpha1" | 	settingsv1alpha1 "k8s.io/client-go/kubernetes/typed/settings/v1alpha1" | ||||||
|  | 	storagev1 "k8s.io/client-go/kubernetes/typed/storage/v1" | ||||||
| 	storagev1beta1 "k8s.io/client-go/kubernetes/typed/storage/v1beta1" | 	storagev1beta1 "k8s.io/client-go/kubernetes/typed/storage/v1beta1" | ||||||
| 	rest "k8s.io/client-go/rest" | 	rest "k8s.io/client-go/rest" | ||||||
| 	flowcontrol "k8s.io/client-go/util/flowcontrol" | 	flowcontrol "k8s.io/client-go/util/flowcontrol" | ||||||
| @@ -81,8 +82,9 @@ type Interface interface { | |||||||
| 	// Deprecated: please explicitly pick a version if possible. | 	// Deprecated: please explicitly pick a version if possible. | ||||||
| 	Settings() settingsv1alpha1.SettingsV1alpha1Interface | 	Settings() settingsv1alpha1.SettingsV1alpha1Interface | ||||||
| 	StorageV1beta1() storagev1beta1.StorageV1beta1Interface | 	StorageV1beta1() storagev1beta1.StorageV1beta1Interface | ||||||
|  | 	StorageV1() storagev1.StorageV1Interface | ||||||
| 	// Deprecated: please explicitly pick a version if possible. | 	// Deprecated: please explicitly pick a version if possible. | ||||||
| 	Storage() storagev1beta1.StorageV1beta1Interface | 	Storage() storagev1.StorageV1Interface | ||||||
| } | } | ||||||
|  |  | ||||||
| // Clientset contains the clients for groups. Each group has exactly one | // Clientset contains the clients for groups. Each group has exactly one | ||||||
| @@ -106,6 +108,7 @@ type Clientset struct { | |||||||
| 	*rbacv1alpha1.RbacV1alpha1Client | 	*rbacv1alpha1.RbacV1alpha1Client | ||||||
| 	*settingsv1alpha1.SettingsV1alpha1Client | 	*settingsv1alpha1.SettingsV1alpha1Client | ||||||
| 	*storagev1beta1.StorageV1beta1Client | 	*storagev1beta1.StorageV1beta1Client | ||||||
|  | 	*storagev1.StorageV1Client | ||||||
| } | } | ||||||
|  |  | ||||||
| // CoreV1 retrieves the CoreV1Client | // CoreV1 retrieves the CoreV1Client | ||||||
| @@ -343,13 +346,21 @@ func (c *Clientset) StorageV1beta1() storagev1beta1.StorageV1beta1Interface { | |||||||
| 	return c.StorageV1beta1Client | 	return c.StorageV1beta1Client | ||||||
| } | } | ||||||
|  |  | ||||||
| // Deprecated: Storage retrieves the default version of StorageClient. | // StorageV1 retrieves the StorageV1Client | ||||||
| // Please explicitly pick a version. | func (c *Clientset) StorageV1() storagev1.StorageV1Interface { | ||||||
| func (c *Clientset) Storage() storagev1beta1.StorageV1beta1Interface { |  | ||||||
| 	if c == nil { | 	if c == nil { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| 	return c.StorageV1beta1Client | 	return c.StorageV1Client | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Deprecated: Storage retrieves the default version of StorageClient. | ||||||
|  | // Please explicitly pick a version. | ||||||
|  | func (c *Clientset) Storage() storagev1.StorageV1Interface { | ||||||
|  | 	if c == nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	return c.StorageV1Client | ||||||
| } | } | ||||||
|  |  | ||||||
| // Discovery retrieves the DiscoveryClient | // Discovery retrieves the DiscoveryClient | ||||||
| @@ -436,6 +447,10 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | 	cs.StorageV1Client, err = storagev1.NewForConfig(&configShallowCopy) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) | 	cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -466,6 +481,7 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { | |||||||
| 	cs.RbacV1alpha1Client = rbacv1alpha1.NewForConfigOrDie(c) | 	cs.RbacV1alpha1Client = rbacv1alpha1.NewForConfigOrDie(c) | ||||||
| 	cs.SettingsV1alpha1Client = settingsv1alpha1.NewForConfigOrDie(c) | 	cs.SettingsV1alpha1Client = settingsv1alpha1.NewForConfigOrDie(c) | ||||||
| 	cs.StorageV1beta1Client = storagev1beta1.NewForConfigOrDie(c) | 	cs.StorageV1beta1Client = storagev1beta1.NewForConfigOrDie(c) | ||||||
|  | 	cs.StorageV1Client = storagev1.NewForConfigOrDie(c) | ||||||
|  |  | ||||||
| 	cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) | 	cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) | ||||||
| 	return &cs | 	return &cs | ||||||
| @@ -491,6 +507,7 @@ func New(c rest.Interface) *Clientset { | |||||||
| 	cs.RbacV1alpha1Client = rbacv1alpha1.New(c) | 	cs.RbacV1alpha1Client = rbacv1alpha1.New(c) | ||||||
| 	cs.SettingsV1alpha1Client = settingsv1alpha1.New(c) | 	cs.SettingsV1alpha1Client = settingsv1alpha1.New(c) | ||||||
| 	cs.StorageV1beta1Client = storagev1beta1.New(c) | 	cs.StorageV1beta1Client = storagev1beta1.New(c) | ||||||
|  | 	cs.StorageV1Client = storagev1.New(c) | ||||||
|  |  | ||||||
| 	cs.DiscoveryClient = discovery.NewDiscoveryClient(c) | 	cs.DiscoveryClient = discovery.NewDiscoveryClient(c) | ||||||
| 	return &cs | 	return &cs | ||||||
|   | |||||||
| @@ -54,6 +54,8 @@ import ( | |||||||
| 	fakerbacv1beta1 "k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake" | 	fakerbacv1beta1 "k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake" | ||||||
| 	settingsv1alpha1 "k8s.io/client-go/kubernetes/typed/settings/v1alpha1" | 	settingsv1alpha1 "k8s.io/client-go/kubernetes/typed/settings/v1alpha1" | ||||||
| 	fakesettingsv1alpha1 "k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake" | 	fakesettingsv1alpha1 "k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake" | ||||||
|  | 	storagev1 "k8s.io/client-go/kubernetes/typed/storage/v1" | ||||||
|  | 	fakestoragev1 "k8s.io/client-go/kubernetes/typed/storage/v1/fake" | ||||||
| 	storagev1beta1 "k8s.io/client-go/kubernetes/typed/storage/v1beta1" | 	storagev1beta1 "k8s.io/client-go/kubernetes/typed/storage/v1beta1" | ||||||
| 	fakestoragev1beta1 "k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake" | 	fakestoragev1beta1 "k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake" | ||||||
| 	"k8s.io/client-go/testing" | 	"k8s.io/client-go/testing" | ||||||
| @@ -232,7 +234,12 @@ func (c *Clientset) StorageV1beta1() storagev1beta1.StorageV1beta1Interface { | |||||||
| 	return &fakestoragev1beta1.FakeStorageV1beta1{Fake: &c.Fake} | 	return &fakestoragev1beta1.FakeStorageV1beta1{Fake: &c.Fake} | ||||||
| } | } | ||||||
|  |  | ||||||
| // Storage retrieves the StorageV1beta1Client | // StorageV1 retrieves the StorageV1Client | ||||||
| func (c *Clientset) Storage() storagev1beta1.StorageV1beta1Interface { | func (c *Clientset) StorageV1() storagev1.StorageV1Interface { | ||||||
| 	return &fakestoragev1beta1.FakeStorageV1beta1{Fake: &c.Fake} | 	return &fakestoragev1.FakeStorageV1{Fake: &c.Fake} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Storage retrieves the StorageV1Client | ||||||
|  | func (c *Clientset) Storage() storagev1.StorageV1Interface { | ||||||
|  | 	return &fakestoragev1.FakeStorageV1{Fake: &c.Fake} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -37,6 +37,7 @@ import ( | |||||||
| 	rbacv1alpha1 "k8s.io/client-go/pkg/apis/rbac/v1alpha1" | 	rbacv1alpha1 "k8s.io/client-go/pkg/apis/rbac/v1alpha1" | ||||||
| 	rbacv1beta1 "k8s.io/client-go/pkg/apis/rbac/v1beta1" | 	rbacv1beta1 "k8s.io/client-go/pkg/apis/rbac/v1beta1" | ||||||
| 	settingsv1alpha1 "k8s.io/client-go/pkg/apis/settings/v1alpha1" | 	settingsv1alpha1 "k8s.io/client-go/pkg/apis/settings/v1alpha1" | ||||||
|  | 	storagev1 "k8s.io/client-go/pkg/apis/storage/v1" | ||||||
| 	storagev1beta1 "k8s.io/client-go/pkg/apis/storage/v1beta1" | 	storagev1beta1 "k8s.io/client-go/pkg/apis/storage/v1beta1" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -81,5 +82,6 @@ func AddToScheme(scheme *runtime.Scheme) { | |||||||
| 	rbacv1alpha1.AddToScheme(scheme) | 	rbacv1alpha1.AddToScheme(scheme) | ||||||
| 	settingsv1alpha1.AddToScheme(scheme) | 	settingsv1alpha1.AddToScheme(scheme) | ||||||
| 	storagev1beta1.AddToScheme(scheme) | 	storagev1beta1.AddToScheme(scheme) | ||||||
|  | 	storagev1.AddToScheme(scheme) | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -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 | ||||||
| @@ -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 | ||||||
| @@ -0,0 +1,38 @@ | |||||||
|  | /* | ||||||
|  | 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/storage/v1" | ||||||
|  | 	rest "k8s.io/client-go/rest" | ||||||
|  | 	testing "k8s.io/client-go/testing" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type FakeStorageV1 struct { | ||||||
|  | 	*testing.Fake | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *FakeStorageV1) StorageClasses() v1.StorageClassInterface { | ||||||
|  | 	return &FakeStorageClasses{c} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RESTClient returns a RESTClient that is used to communicate | ||||||
|  | // with API server by this client implementation. | ||||||
|  | func (c *FakeStorageV1) RESTClient() rest.Interface { | ||||||
|  | 	var ret *rest.RESTClient | ||||||
|  | 	return ret | ||||||
|  | } | ||||||
| @@ -0,0 +1,110 @@ | |||||||
|  | /* | ||||||
|  | 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 ( | ||||||
|  | 	meta_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" | ||||||
|  | 	v1 "k8s.io/client-go/pkg/apis/storage/v1" | ||||||
|  | 	testing "k8s.io/client-go/testing" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // FakeStorageClasses implements StorageClassInterface | ||||||
|  | type FakeStorageClasses struct { | ||||||
|  | 	Fake *FakeStorageV1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | var storageclassesResource = schema.GroupVersionResource{Group: "storage.k8s.io", Version: "v1", Resource: "storageclasses"} | ||||||
|  |  | ||||||
|  | func (c *FakeStorageClasses) Create(storageClass *v1.StorageClass) (result *v1.StorageClass, err error) { | ||||||
|  | 	obj, err := c.Fake. | ||||||
|  | 		Invokes(testing.NewRootCreateAction(storageclassesResource, storageClass), &v1.StorageClass{}) | ||||||
|  | 	if obj == nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return obj.(*v1.StorageClass), err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *FakeStorageClasses) Update(storageClass *v1.StorageClass) (result *v1.StorageClass, err error) { | ||||||
|  | 	obj, err := c.Fake. | ||||||
|  | 		Invokes(testing.NewRootUpdateAction(storageclassesResource, storageClass), &v1.StorageClass{}) | ||||||
|  | 	if obj == nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return obj.(*v1.StorageClass), err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *FakeStorageClasses) Delete(name string, options *meta_v1.DeleteOptions) error { | ||||||
|  | 	_, err := c.Fake. | ||||||
|  | 		Invokes(testing.NewRootDeleteAction(storageclassesResource, name), &v1.StorageClass{}) | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *FakeStorageClasses) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { | ||||||
|  | 	action := testing.NewRootDeleteCollectionAction(storageclassesResource, listOptions) | ||||||
|  |  | ||||||
|  | 	_, err := c.Fake.Invokes(action, &v1.StorageClassList{}) | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *FakeStorageClasses) Get(name string, options meta_v1.GetOptions) (result *v1.StorageClass, err error) { | ||||||
|  | 	obj, err := c.Fake. | ||||||
|  | 		Invokes(testing.NewRootGetAction(storageclassesResource, name), &v1.StorageClass{}) | ||||||
|  | 	if obj == nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return obj.(*v1.StorageClass), err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *FakeStorageClasses) List(opts meta_v1.ListOptions) (result *v1.StorageClassList, err error) { | ||||||
|  | 	obj, err := c.Fake. | ||||||
|  | 		Invokes(testing.NewRootListAction(storageclassesResource, opts), &v1.StorageClassList{}) | ||||||
|  | 	if obj == nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	label, _, _ := testing.ExtractFromListOptions(opts) | ||||||
|  | 	if label == nil { | ||||||
|  | 		label = labels.Everything() | ||||||
|  | 	} | ||||||
|  | 	list := &v1.StorageClassList{} | ||||||
|  | 	for _, item := range obj.(*v1.StorageClassList).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 storageClasses. | ||||||
|  | func (c *FakeStorageClasses) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { | ||||||
|  | 	return c.Fake. | ||||||
|  | 		InvokesWatch(testing.NewRootWatchAction(storageclassesResource, opts)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Patch applies the patch and returns the patched storageClass. | ||||||
|  | func (c *FakeStorageClasses) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.StorageClass, err error) { | ||||||
|  | 	obj, err := c.Fake. | ||||||
|  | 		Invokes(testing.NewRootPatchSubresourceAction(storageclassesResource, name, data, subresources...), &v1.StorageClass{}) | ||||||
|  | 	if obj == nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return obj.(*v1.StorageClass), err | ||||||
|  | } | ||||||
| @@ -0,0 +1,19 @@ | |||||||
|  | /* | ||||||
|  | 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 StorageClassExpansion interface{} | ||||||
| @@ -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 v1 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	serializer "k8s.io/apimachinery/pkg/runtime/serializer" | ||||||
|  | 	"k8s.io/client-go/kubernetes/scheme" | ||||||
|  | 	v1 "k8s.io/client-go/pkg/apis/storage/v1" | ||||||
|  | 	rest "k8s.io/client-go/rest" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type StorageV1Interface interface { | ||||||
|  | 	RESTClient() rest.Interface | ||||||
|  | 	StorageClassesGetter | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // StorageV1Client is used to interact with features provided by the storage.k8s.io group. | ||||||
|  | type StorageV1Client struct { | ||||||
|  | 	restClient rest.Interface | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *StorageV1Client) StorageClasses() StorageClassInterface { | ||||||
|  | 	return newStorageClasses(c) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // NewForConfig creates a new StorageV1Client for the given config. | ||||||
|  | func NewForConfig(c *rest.Config) (*StorageV1Client, error) { | ||||||
|  | 	config := *c | ||||||
|  | 	if err := setConfigDefaults(&config); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	client, err := rest.RESTClientFor(&config) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return &StorageV1Client{client}, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // NewForConfigOrDie creates a new StorageV1Client for the given config and | ||||||
|  | // panics if there is an error in the config. | ||||||
|  | func NewForConfigOrDie(c *rest.Config) *StorageV1Client { | ||||||
|  | 	client, err := NewForConfig(c) | ||||||
|  | 	if err != nil { | ||||||
|  | 		panic(err) | ||||||
|  | 	} | ||||||
|  | 	return client | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // New creates a new StorageV1Client for the given RESTClient. | ||||||
|  | func New(c rest.Interface) *StorageV1Client { | ||||||
|  | 	return &StorageV1Client{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 *StorageV1Client) RESTClient() rest.Interface { | ||||||
|  | 	if c == nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	return c.restClient | ||||||
|  | } | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	 Kubernetes Submit Queue
					Kubernetes Submit Queue