mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +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/": {
 | 
			
		||||
    "get": {
 | 
			
		||||
     "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": {
 | 
			
		||||
    "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": [
 | 
			
		||||
 
 | 
			
		||||
@@ -117,6 +117,10 @@
 | 
			
		||||
    "path": "/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",
 | 
			
		||||
    "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/settings/v1alpha1`,
 | 
			
		||||
			`k8s.io/kubernetes/pkg/apis/storage/v1beta1`,
 | 
			
		||||
			`k8s.io/kubernetes/pkg/apis/storage/v1`,
 | 
			
		||||
		}, ","),
 | 
			
		||||
		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/v1alpha1
 | 
			
		||||
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/internalversion
 | 
			
		||||
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/v1alpha1
 | 
			
		||||
pkg/client/listers/storage/internalversion
 | 
			
		||||
pkg/client/listers/storage/v1
 | 
			
		||||
pkg/client/listers/storage/v1beta1
 | 
			
		||||
pkg/client/metrics
 | 
			
		||||
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/v1alpha1
 | 
			
		||||
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/listers/apps/v1beta1
 | 
			
		||||
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/v1beta1
 | 
			
		||||
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/plugin/pkg/client/auth
 | 
			
		||||
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 \
 | 
			
		||||
settings.k8s.io/v1alpha1 \
 | 
			
		||||
storage.k8s.io/v1beta1 \
 | 
			
		||||
storage.k8s.io/v1\
 | 
			
		||||
}"
 | 
			
		||||
 | 
			
		||||
# not all group versions are exposed by the server.  This list contains those
 | 
			
		||||
 
 | 
			
		||||
@@ -3282,7 +3282,7 @@ runTests() {
 | 
			
		||||
    kubectl create -f - "${kube_flags[@]}" << __EOF__
 | 
			
		||||
{
 | 
			
		||||
  "kind": "StorageClass",
 | 
			
		||||
  "apiVersion": "storage.k8s.io/v1beta1",
 | 
			
		||||
  "apiVersion": "storage.k8s.io/v1",
 | 
			
		||||
  "metadata": {
 | 
			
		||||
    "name": "storage-class-name"
 | 
			
		||||
  },
 | 
			
		||||
 
 | 
			
		||||
@@ -72,6 +72,7 @@ filegroup(
 | 
			
		||||
        "//pkg/client/listers/settings/internalversion:all-srcs",
 | 
			
		||||
        "//pkg/client/listers/settings/v1alpha1: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/metrics:all-srcs",
 | 
			
		||||
        "//pkg/client/retry:all-srcs",
 | 
			
		||||
 
 | 
			
		||||
@@ -557,3 +557,42 @@ func PodAnnotationsFromSysctls(sysctls []Sysctl) string {
 | 
			
		||||
	}
 | 
			
		||||
	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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
// +nonNamespaced=true
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -591,3 +591,42 @@ func GetAffinityFromPodAnnotations(annotations map[string]string) (*Affinity, er
 | 
			
		||||
	}
 | 
			
		||||
	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"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
// +nonNamespaced=true
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,6 @@ go_library(
 | 
			
		||||
        "//pkg/api/service:go_default_library",
 | 
			
		||||
        "//pkg/api/util:go_default_library",
 | 
			
		||||
        "//pkg/api/v1:go_default_library",
 | 
			
		||||
        "//pkg/apis/storage/util:go_default_library",
 | 
			
		||||
        "//pkg/capabilities:go_default_library",
 | 
			
		||||
        "//pkg/features:go_default_library",
 | 
			
		||||
        "//pkg/security/apparmor:go_default_library",
 | 
			
		||||
@@ -99,7 +98,6 @@ go_test(
 | 
			
		||||
        "//pkg/api/testing:go_default_library",
 | 
			
		||||
        "//pkg/api/v1:go_default_library",
 | 
			
		||||
        "//pkg/apis/extensions/v1beta1:go_default_library",
 | 
			
		||||
        "//pkg/apis/storage/util:go_default_library",
 | 
			
		||||
        "//pkg/capabilities:go_default_library",
 | 
			
		||||
        "//pkg/security/apparmor:go_default_library",
 | 
			
		||||
        "//pkg/volume:go_default_library",
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,6 @@ import (
 | 
			
		||||
	utilpod "k8s.io/kubernetes/pkg/api/pod"
 | 
			
		||||
	apiservice "k8s.io/kubernetes/pkg/api/service"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/api/v1"
 | 
			
		||||
	storageutil "k8s.io/kubernetes/pkg/apis/storage/util"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/capabilities"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/features"
 | 
			
		||||
	"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.
 | 
			
		||||
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
 | 
			
		||||
// NameIsDNSSubdomain is a ValidateNameFunc for names that must be a DNS subdomain.
 | 
			
		||||
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 '/'"))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1245,6 +1255,12 @@ func ValidatePersistentVolumeClaimSpec(spec *api.PersistentVolumeClaimSpec, fldP
 | 
			
		||||
	} else {
 | 
			
		||||
		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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1267,7 +1283,8 @@ func ValidatePersistentVolumeClaimUpdate(newPvc, oldPvc *api.PersistentVolumeCla
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 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
 | 
			
		||||
	return allErrs
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ import (
 | 
			
		||||
	"k8s.io/apimachinery/pkg/util/validation/field"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/api"
 | 
			
		||||
	"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/security/apparmor"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/volume"
 | 
			
		||||
@@ -80,6 +80,7 @@ func TestValidatePersistentVolumes(t *testing.T) {
 | 
			
		||||
				PersistentVolumeSource: api.PersistentVolumeSource{
 | 
			
		||||
					HostPath: &api.HostPathVolumeSource{Path: "/foo"},
 | 
			
		||||
				},
 | 
			
		||||
				StorageClassName: "valid",
 | 
			
		||||
			}),
 | 
			
		||||
		},
 | 
			
		||||
		"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 {
 | 
			
		||||
@@ -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 {
 | 
			
		||||
	annotations := map[string]string{
 | 
			
		||||
		storageutil.StorageClassAnnotation: annval,
 | 
			
		||||
		v1.BetaStorageClassAnnotation: annval,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &api.PersistentVolumeClaim{
 | 
			
		||||
@@ -301,6 +315,8 @@ func testVolumeClaimAnnotation(name string, namespace string, ann string, annval
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestValidatePersistentVolumeClaim(t *testing.T) {
 | 
			
		||||
	invalidClassName := "-invalid-"
 | 
			
		||||
	validClassName := "valid"
 | 
			
		||||
	scenarios := map[string]struct {
 | 
			
		||||
		isExpectedFailure bool
 | 
			
		||||
		claim             *api.PersistentVolumeClaim
 | 
			
		||||
@@ -325,6 +341,7 @@ func TestValidatePersistentVolumeClaim(t *testing.T) {
 | 
			
		||||
						api.ResourceName(api.ResourceStorage): resource.MustParse("10G"),
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				StorageClassName: &validClassName,
 | 
			
		||||
			}),
 | 
			
		||||
		},
 | 
			
		||||
		"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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -37,6 +37,7 @@ filegroup(
 | 
			
		||||
        ":package-srcs",
 | 
			
		||||
        "//pkg/apis/storage/install:all-srcs",
 | 
			
		||||
        "//pkg/apis/storage/util:all-srcs",
 | 
			
		||||
        "//pkg/apis/storage/v1:all-srcs",
 | 
			
		||||
        "//pkg/apis/storage/v1beta1:all-srcs",
 | 
			
		||||
        "//pkg/apis/storage/validation:all-srcs",
 | 
			
		||||
    ],
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@ go_library(
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//pkg/api:go_default_library",
 | 
			
		||||
        "//pkg/apis/storage:go_default_library",
 | 
			
		||||
        "//pkg/apis/storage/v1:go_default_library",
 | 
			
		||||
        "//pkg/apis/storage/v1beta1:go_default_library",
 | 
			
		||||
        "//vendor:k8s.io/apimachinery/pkg/apimachinery/announced",
 | 
			
		||||
        "//vendor:k8s.io/apimachinery/pkg/apimachinery/registered",
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@ import (
 | 
			
		||||
	"k8s.io/apimachinery/pkg/util/sets"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/api"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/apis/storage"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/apis/storage/v1"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/apis/storage/v1beta1"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -37,12 +38,14 @@ func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *r
 | 
			
		||||
	if err := announced.NewGroupMetaFactory(
 | 
			
		||||
		&announced.GroupMetaFactoryArgs{
 | 
			
		||||
			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",
 | 
			
		||||
			RootScopedKinds:            sets.NewString("StorageClass"),
 | 
			
		||||
			AddInternalObjectsToScheme: storage.AddToScheme,
 | 
			
		||||
		},
 | 
			
		||||
		announced.VersionToSchemeFunc{
 | 
			
		||||
			v1.SchemeGroupVersion.Version:      v1.AddToScheme,
 | 
			
		||||
			v1beta1.SchemeGroupVersion.Version: v1beta1.AddToScheme,
 | 
			
		||||
		},
 | 
			
		||||
	).Announce(groupFactoryRegistry).RegisterAndEnable(registry, scheme); err != nil {
 | 
			
		||||
 
 | 
			
		||||
@@ -11,10 +11,7 @@ go_library(
 | 
			
		||||
    name = "go_default_library",
 | 
			
		||||
    srcs = ["helpers.go"],
 | 
			
		||||
    tags = ["automanaged"],
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//pkg/api:go_default_library",
 | 
			
		||||
        "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1",
 | 
			
		||||
    ],
 | 
			
		||||
    deps = ["//vendor:k8s.io/apimachinery/pkg/apis/meta/v1"],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
filegroup(
 | 
			
		||||
 
 | 
			
		||||
@@ -16,10 +16,7 @@ limitations under the License.
 | 
			
		||||
 | 
			
		||||
package util
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/api"
 | 
			
		||||
)
 | 
			
		||||
import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
 | 
			
		||||
// IsDefaultStorageClassAnnotation represents a StorageClass annotation that
 | 
			
		||||
// marks a class as the default StorageClass
 | 
			
		||||
@@ -27,87 +24,6 @@ import (
 | 
			
		||||
const IsDefaultStorageClassAnnotation = "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
 | 
			
		||||
// the annotation is set
 | 
			
		||||
// 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",
 | 
			
		||||
    srcs = ["helpers.go"],
 | 
			
		||||
    tags = ["automanaged"],
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//pkg/api/v1:go_default_library",
 | 
			
		||||
        "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1",
 | 
			
		||||
    ],
 | 
			
		||||
    deps = ["//vendor:k8s.io/apimachinery/pkg/apis/meta/v1"],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
filegroup(
 | 
			
		||||
 
 | 
			
		||||
@@ -16,10 +16,7 @@ limitations under the License.
 | 
			
		||||
 | 
			
		||||
package util
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/api/v1"
 | 
			
		||||
)
 | 
			
		||||
import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
 | 
			
		||||
// IsDefaultStorageClassAnnotation represents a StorageClass annotation that
 | 
			
		||||
// marks a class as the default StorageClass
 | 
			
		||||
@@ -27,87 +24,6 @@ import (
 | 
			
		||||
const IsDefaultStorageClassAnnotation = "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
 | 
			
		||||
// the annotation is set
 | 
			
		||||
// TODO: remove Beta when no longer needed
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ import (
 | 
			
		||||
 | 
			
		||||
// ValidateStorageClass validates a StorageClass.
 | 
			
		||||
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, 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/v1beta1: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",
 | 
			
		||||
        "//vendor:github.com/golang/glog",
 | 
			
		||||
        "//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/v1beta1: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",
 | 
			
		||||
    ],
 | 
			
		||||
    tags = ["automanaged"],
 | 
			
		||||
 
 | 
			
		||||
@@ -37,6 +37,7 @@ import (
 | 
			
		||||
	rbacv1alpha1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/rbac/v1alpha1"
 | 
			
		||||
	rbacv1beta1 "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/rbac/v1beta1"
 | 
			
		||||
	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"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -81,8 +82,9 @@ type Interface interface {
 | 
			
		||||
	// Deprecated: please explicitly pick a version if possible.
 | 
			
		||||
	Settings() settingsv1alpha1.SettingsV1alpha1Interface
 | 
			
		||||
	StorageV1beta1() storagev1beta1.StorageV1beta1Interface
 | 
			
		||||
	StorageV1() storagev1.StorageV1Interface
 | 
			
		||||
	// 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
 | 
			
		||||
@@ -106,6 +108,7 @@ type Clientset struct {
 | 
			
		||||
	*rbacv1alpha1.RbacV1alpha1Client
 | 
			
		||||
	*settingsv1alpha1.SettingsV1alpha1Client
 | 
			
		||||
	*storagev1beta1.StorageV1beta1Client
 | 
			
		||||
	*storagev1.StorageV1Client
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CoreV1 retrieves the CoreV1Client
 | 
			
		||||
@@ -343,13 +346,21 @@ func (c *Clientset) StorageV1beta1() storagev1beta1.StorageV1beta1Interface {
 | 
			
		||||
	return c.StorageV1beta1Client
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Deprecated: Storage retrieves the default version of StorageClient.
 | 
			
		||||
// Please explicitly pick a version.
 | 
			
		||||
func (c *Clientset) Storage() storagev1beta1.StorageV1beta1Interface {
 | 
			
		||||
// StorageV1 retrieves the StorageV1Client
 | 
			
		||||
func (c *Clientset) StorageV1() storagev1.StorageV1Interface {
 | 
			
		||||
	if c == 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
 | 
			
		||||
@@ -436,6 +447,10 @@ func NewForConfig(c *rest.Config) (*Clientset, error) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	cs.StorageV1Client, err = storagev1.NewForConfig(&configShallowCopy)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -466,6 +481,7 @@ func NewForConfigOrDie(c *rest.Config) *Clientset {
 | 
			
		||||
	cs.RbacV1alpha1Client = rbacv1alpha1.NewForConfigOrDie(c)
 | 
			
		||||
	cs.SettingsV1alpha1Client = settingsv1alpha1.NewForConfigOrDie(c)
 | 
			
		||||
	cs.StorageV1beta1Client = storagev1beta1.NewForConfigOrDie(c)
 | 
			
		||||
	cs.StorageV1Client = storagev1.NewForConfigOrDie(c)
 | 
			
		||||
 | 
			
		||||
	cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c)
 | 
			
		||||
	return &cs
 | 
			
		||||
@@ -491,6 +507,7 @@ func New(c rest.Interface) *Clientset {
 | 
			
		||||
	cs.RbacV1alpha1Client = rbacv1alpha1.New(c)
 | 
			
		||||
	cs.SettingsV1alpha1Client = settingsv1alpha1.New(c)
 | 
			
		||||
	cs.StorageV1beta1Client = storagev1beta1.New(c)
 | 
			
		||||
	cs.StorageV1Client = storagev1.New(c)
 | 
			
		||||
 | 
			
		||||
	cs.DiscoveryClient = discovery.NewDiscoveryClient(c)
 | 
			
		||||
	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/settings/v1alpha1: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/fake:go_default_library",
 | 
			
		||||
        "//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"
 | 
			
		||||
	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"
 | 
			
		||||
	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"
 | 
			
		||||
	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}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Storage retrieves the StorageV1beta1Client
 | 
			
		||||
func (c *Clientset) Storage() storagev1beta1.StorageV1beta1Interface {
 | 
			
		||||
	return &fakestoragev1beta1.FakeStorageV1beta1{Fake: &c.Fake}
 | 
			
		||||
// StorageV1 retrieves the StorageV1Client
 | 
			
		||||
func (c *Clientset) StorageV1() storagev1.StorageV1Interface {
 | 
			
		||||
	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/v1beta1:go_default_library",
 | 
			
		||||
        "//pkg/apis/settings/v1alpha1:go_default_library",
 | 
			
		||||
        "//pkg/apis/storage/v1:go_default_library",
 | 
			
		||||
        "//pkg/apis/storage/v1beta1:go_default_library",
 | 
			
		||||
        "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1",
 | 
			
		||||
        "//vendor:k8s.io/apimachinery/pkg/runtime",
 | 
			
		||||
 
 | 
			
		||||
@@ -37,6 +37,7 @@ import (
 | 
			
		||||
	rbacv1alpha1 "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1"
 | 
			
		||||
	rbacv1beta1 "k8s.io/kubernetes/pkg/apis/rbac/v1beta1"
 | 
			
		||||
	settingsv1alpha1 "k8s.io/kubernetes/pkg/apis/settings/v1alpha1"
 | 
			
		||||
	storagev1 "k8s.io/kubernetes/pkg/apis/storage/v1"
 | 
			
		||||
	storagev1beta1 "k8s.io/kubernetes/pkg/apis/storage/v1beta1"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -81,5 +82,6 @@ func AddToScheme(scheme *runtime.Scheme) {
 | 
			
		||||
	rbacv1alpha1.AddToScheme(scheme)
 | 
			
		||||
	settingsv1alpha1.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/v1beta1: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/client/clientset_generated/clientset: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"
 | 
			
		||||
	rbac_v1beta1 "k8s.io/kubernetes/pkg/apis/rbac/v1beta1"
 | 
			
		||||
	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"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -167,6 +168,10 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource
 | 
			
		||||
	case settings_v1alpha1.SchemeGroupVersion.WithResource("podpresets"):
 | 
			
		||||
		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
 | 
			
		||||
	case storage_v1beta1.SchemeGroupVersion.WithResource("storageclasses"):
 | 
			
		||||
		return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1beta1().StorageClasses().Informer()}, nil
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ go_library(
 | 
			
		||||
    tags = ["automanaged"],
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
@@ -28,6 +29,7 @@ filegroup(
 | 
			
		||||
    name = "all-srcs",
 | 
			
		||||
    srcs = [
 | 
			
		||||
        ":package-srcs",
 | 
			
		||||
        "//pkg/client/informers/informers_generated/externalversions/storage/v1:all-srcs",
 | 
			
		||||
        "//pkg/client/informers/informers_generated/externalversions/storage/v1beta1:all-srcs",
 | 
			
		||||
    ],
 | 
			
		||||
    tags = ["automanaged"],
 | 
			
		||||
 
 | 
			
		||||
@@ -20,11 +20,14 @@ package storage
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	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"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Interface provides access to each of this group's versions.
 | 
			
		||||
type Interface interface {
 | 
			
		||||
	// V1 provides access to shared informers for resources in V1.
 | 
			
		||||
	V1() v1.Interface
 | 
			
		||||
	// V1beta1 provides access to shared informers for resources in V1beta1.
 | 
			
		||||
	V1beta1() v1beta1.Interface
 | 
			
		||||
}
 | 
			
		||||
@@ -38,6 +41,11 @@ func New(f internalinterfaces.SharedInformerFactory) Interface {
 | 
			
		||||
	return &group{f}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// V1 returns a new v1.Interface.
 | 
			
		||||
func (g *group) V1() v1.Interface {
 | 
			
		||||
	return v1.New(g.SharedInformerFactory)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// V1beta1 returns a new v1beta1.Interface.
 | 
			
		||||
func (g *group) V1beta1() v1beta1.Interface {
 | 
			
		||||
	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/v1: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/informers/informers_generated/externalversions/core/v1: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/v1: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/fake:go_default_library",
 | 
			
		||||
        "//pkg/client/informers/informers_generated/externalversions:go_default_library",
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,6 @@ import (
 | 
			
		||||
 | 
			
		||||
	"k8s.io/kubernetes/pkg/api/v1"
 | 
			
		||||
	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.
 | 
			
		||||
@@ -42,19 +41,19 @@ func TestSync(t *testing.T) {
 | 
			
		||||
		{
 | 
			
		||||
			// syncClaim binds to a matching unbound volume.
 | 
			
		||||
			"1-1 - successful bind",
 | 
			
		||||
			newVolumeArray("volume1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newVolumeArray("volume1-1", "1Gi", "uid1-1", "claim1-1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController),
 | 
			
		||||
			newClaimArray("claim1-1", "uid1-1", "1Gi", "", v1.ClaimPending),
 | 
			
		||||
			newClaimArray("claim1-1", "uid1-1", "1Gi", "volume1-1", v1.ClaimBound, annBoundByController, annBindCompleted),
 | 
			
		||||
			newVolumeArray("volume1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newVolumeArray("volume1-1", "1Gi", "uid1-1", "claim1-1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController),
 | 
			
		||||
			newClaimArray("claim1-1", "uid1-1", "1Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			newClaimArray("claim1-1", "uid1-1", "1Gi", "volume1-1", v1.ClaimBound, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncClaim does not do anything when there is no matching volume.
 | 
			
		||||
			"1-2 - noop",
 | 
			
		||||
			newVolumeArray("volume1-2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newVolumeArray("volume1-2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newClaimArray("claim1-2", "uid1-2", "10Gi", "", v1.ClaimPending),
 | 
			
		||||
			newClaimArray("claim1-2", "uid1-2", "10Gi", "", v1.ClaimPending),
 | 
			
		||||
			newVolumeArray("volume1-2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newVolumeArray("volume1-2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newClaimArray("claim1-2", "uid1-2", "10Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			newClaimArray("claim1-2", "uid1-2", "10Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			[]string{"Normal FailedBinding"},
 | 
			
		||||
			noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
@@ -62,10 +61,10 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			// syncClaim resets claim.Status to Pending when there is no
 | 
			
		||||
			// matching volume.
 | 
			
		||||
			"1-3 - reset to Pending",
 | 
			
		||||
			newVolumeArray("volume1-3", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newVolumeArray("volume1-3", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newClaimArray("claim1-3", "uid1-3", "10Gi", "", v1.ClaimBound),
 | 
			
		||||
			newClaimArray("claim1-3", "uid1-3", "10Gi", "", v1.ClaimPending),
 | 
			
		||||
			newVolumeArray("volume1-3", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newVolumeArray("volume1-3", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newClaimArray("claim1-3", "uid1-3", "10Gi", "", v1.ClaimBound, nil),
 | 
			
		||||
			newClaimArray("claim1-3", "uid1-3", "10Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			[]string{"Normal FailedBinding"},
 | 
			
		||||
			noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
@@ -73,15 +72,15 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			// syncClaim binds claims to the smallest matching volume
 | 
			
		||||
			"1-4 - smallest volume",
 | 
			
		||||
			[]*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume1-4_1", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
				newVolume("volume1-4_2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
				newVolume("volume1-4_1", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
				newVolume("volume1-4_2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			},
 | 
			
		||||
			[]*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume1-4_1", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
				newVolume("volume1-4_2", "1Gi", "uid1-4", "claim1-4", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController),
 | 
			
		||||
				newVolume("volume1-4_1", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
				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", "volume1-4_2", v1.ClaimBound, annBoundByController, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim1-4", "uid1-4", "1Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			newClaimArray("claim1-4", "uid1-4", "1Gi", "volume1-4_2", v1.ClaimBound, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
@@ -89,15 +88,15 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			// name), even though a smaller one is available.
 | 
			
		||||
			"1-5 - prebound volume by name - success",
 | 
			
		||||
			[]*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume1-5_1", "10Gi", "", "claim1-5", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
				newVolume("volume1-5_2", "1Gi", "", "", 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, classEmpty),
 | 
			
		||||
			},
 | 
			
		||||
			[]*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume1-5_1", "10Gi", "uid1-5", "claim1-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
				newVolume("volume1-5_2", "1Gi", "", "", v1.VolumePending, 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, classEmpty),
 | 
			
		||||
			},
 | 
			
		||||
			newClaimArray("claim1-5", "uid1-5", "1Gi", "", v1.ClaimPending),
 | 
			
		||||
			withExpectedCapacity("10Gi", newClaimArray("claim1-5", "uid1-5", "1Gi", "volume1-5_1", v1.ClaimBound, annBoundByController, annBindCompleted)),
 | 
			
		||||
			newClaimArray("claim1-5", "uid1-5", "1Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			withExpectedCapacity("10Gi", newClaimArray("claim1-5", "uid1-5", "1Gi", "volume1-5_1", v1.ClaimBound, nil, annBoundByController, annBindCompleted)),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
@@ -105,25 +104,25 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			// UID), even though a smaller one is available.
 | 
			
		||||
			"1-6 - prebound volume by UID - success",
 | 
			
		||||
			[]*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume1-6_1", "10Gi", "uid1-6", "claim1-6", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
				newVolume("volume1-6_2", "1Gi", "", "", 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, classEmpty),
 | 
			
		||||
			},
 | 
			
		||||
			[]*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume1-6_1", "10Gi", "uid1-6", "claim1-6", v1.VolumeBound, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
				newVolume("volume1-6_2", "1Gi", "", "", v1.VolumePending, 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, classEmpty),
 | 
			
		||||
			},
 | 
			
		||||
			newClaimArray("claim1-6", "uid1-6", "1Gi", "", v1.ClaimPending),
 | 
			
		||||
			withExpectedCapacity("10Gi", newClaimArray("claim1-6", "uid1-6", "1Gi", "volume1-6_1", v1.ClaimBound, annBoundByController, annBindCompleted)),
 | 
			
		||||
			newClaimArray("claim1-6", "uid1-6", "1Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			withExpectedCapacity("10Gi", newClaimArray("claim1-6", "uid1-6", "1Gi", "volume1-6_1", v1.ClaimBound, nil, annBoundByController, annBindCompleted)),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncClaim does not bind claim to a volume prebound to a claim with
 | 
			
		||||
			// same name and different UID
 | 
			
		||||
			"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),
 | 
			
		||||
			newClaimArray("claim1-7", "uid1-7", "1Gi", "", v1.ClaimPending),
 | 
			
		||||
			newClaimArray("claim1-7", "uid1-7", "1Gi", "", v1.ClaimPending),
 | 
			
		||||
			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, classEmpty),
 | 
			
		||||
			newClaimArray("claim1-7", "uid1-7", "1Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			newClaimArray("claim1-7", "uid1-7", "1Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			[]string{"Normal FailedBinding"},
 | 
			
		||||
			noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
@@ -131,48 +130,48 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			// syncClaim completes binding - simulates controller crash after
 | 
			
		||||
			// PV.ClaimRef is saved
 | 
			
		||||
			"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.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController),
 | 
			
		||||
			newClaimArray("claim1-8", "uid1-8", "1Gi", "", v1.ClaimPending),
 | 
			
		||||
			newClaimArray("claim1-8", "uid1-8", "1Gi", "volume1-8", v1.ClaimBound, annBoundByController, annBindCompleted),
 | 
			
		||||
			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, classEmpty, annBoundByController),
 | 
			
		||||
			newClaimArray("claim1-8", "uid1-8", "1Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			newClaimArray("claim1-8", "uid1-8", "1Gi", "volume1-8", v1.ClaimBound, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncClaim completes binding - simulates controller crash after
 | 
			
		||||
			// PV.Status is 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, annBoundByController),
 | 
			
		||||
			newClaimArray("claim1-9", "uid1-9", "1Gi", "", v1.ClaimPending),
 | 
			
		||||
			newClaimArray("claim1-9", "uid1-9", "1Gi", "volume1-9", v1.ClaimBound, annBoundByController, annBindCompleted),
 | 
			
		||||
			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, classEmpty, annBoundByController),
 | 
			
		||||
			newClaimArray("claim1-9", "uid1-9", "1Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			newClaimArray("claim1-9", "uid1-9", "1Gi", "volume1-9", v1.ClaimBound, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncClaim completes binding - simulates controller crash after
 | 
			
		||||
			// PVC.VolumeName is saved
 | 
			
		||||
			"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, annBoundByController),
 | 
			
		||||
			newClaimArray("claim1-10", "uid1-10", "1Gi", "volume1-10", v1.ClaimPending, annBoundByController, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim1-10", "uid1-10", "1Gi", "volume1-10", v1.ClaimBound, annBoundByController, annBindCompleted),
 | 
			
		||||
			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, classEmpty, annBoundByController),
 | 
			
		||||
			newClaimArray("claim1-10", "uid1-10", "1Gi", "volume1-10", v1.ClaimPending, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim1-10", "uid1-10", "1Gi", "volume1-10", v1.ClaimBound, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncClaim binds a claim only when the label selector matches the volume
 | 
			
		||||
			"1-11 - bind when selector matches",
 | 
			
		||||
			withLabels(labels, newVolumeArray("volume1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain)),
 | 
			
		||||
			withLabels(labels, newVolumeArray("volume1-1", "1Gi", "uid1-1", "claim1-1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController)),
 | 
			
		||||
			withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", v1.ClaimPending)),
 | 
			
		||||
			withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "volume1-1", v1.ClaimBound, annBoundByController, annBindCompleted)),
 | 
			
		||||
			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, classEmpty, annBoundByController)),
 | 
			
		||||
			withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", v1.ClaimPending, nil)),
 | 
			
		||||
			withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "volume1-1", v1.ClaimBound, nil, annBoundByController, annBindCompleted)),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncClaim does not bind a claim when the label selector doesn't 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),
 | 
			
		||||
			withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", v1.ClaimPending)),
 | 
			
		||||
			withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", v1.ClaimPending)),
 | 
			
		||||
			newVolumeArray("volume1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newVolumeArray("volume1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", v1.ClaimPending, nil)),
 | 
			
		||||
			withLabelSelector(labels, newClaimArray("claim1-1", "uid1-1", "1Gi", "", v1.ClaimPending, nil)),
 | 
			
		||||
			[]string{"Normal FailedBinding"},
 | 
			
		||||
			noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
@@ -185,8 +184,8 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			"2-1 - claim prebound to non-existing volume - noop",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newClaimArray("claim2-1", "uid2-1", "10Gi", "volume2-1", v1.ClaimPending),
 | 
			
		||||
			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, nil),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
@@ -195,28 +194,28 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			"2-2 - claim prebound to non-existing volume - reset status",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newClaimArray("claim2-2", "uid2-2", "10Gi", "volume2-2", v1.ClaimBound),
 | 
			
		||||
			newClaimArray("claim2-2", "uid2-2", "10Gi", "volume2-2", v1.ClaimPending),
 | 
			
		||||
			newClaimArray("claim2-2", "uid2-2", "10Gi", "volume2-2", v1.ClaimBound, nil),
 | 
			
		||||
			newClaimArray("claim2-2", "uid2-2", "10Gi", "volume2-2", v1.ClaimPending, nil),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncClaim with claim pre-bound to a PV that exists and is
 | 
			
		||||
			// unbound. Check it gets bound and no annBoundByController is set.
 | 
			
		||||
			"2-3 - claim prebound to unbound volume",
 | 
			
		||||
			newVolumeArray("volume2-3", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newVolumeArray("volume2-3", "1Gi", "uid2-3", "claim2-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController),
 | 
			
		||||
			newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", v1.ClaimPending),
 | 
			
		||||
			newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", v1.ClaimBound, annBindCompleted),
 | 
			
		||||
			newVolumeArray("volume2-3", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newVolumeArray("volume2-3", "1Gi", "uid2-3", "claim2-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController),
 | 
			
		||||
			newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", v1.ClaimPending, nil),
 | 
			
		||||
			newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", v1.ClaimBound, nil, annBindCompleted),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// 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.
 | 
			
		||||
			"2-4 - claim prebound to prebound volume by name",
 | 
			
		||||
			newVolumeArray("volume2-4", "1Gi", "", "claim2-4", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newVolumeArray("volume2-4", "1Gi", "uid2-4", "claim2-4", v1.VolumeBound, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newClaimArray("claim2-4", "uid2-4", "1Gi", "volume2-4", v1.ClaimPending),
 | 
			
		||||
			newClaimArray("claim2-4", "uid2-4", "1Gi", "volume2-4", v1.ClaimBound, annBindCompleted),
 | 
			
		||||
			newVolumeArray("volume2-4", "1Gi", "", "claim2-4", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newVolumeArray("volume2-4", "1Gi", "uid2-4", "claim2-4", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newClaimArray("claim2-4", "uid2-4", "1Gi", "volume2-4", v1.ClaimPending, nil),
 | 
			
		||||
			newClaimArray("claim2-4", "uid2-4", "1Gi", "volume2-4", v1.ClaimBound, nil, annBindCompleted),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
@@ -224,30 +223,30 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			// claim by UID. Check it gets bound and no annBoundByController is
 | 
			
		||||
			// set.
 | 
			
		||||
			"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.VolumeBound, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newClaimArray("claim2-5", "uid2-5", "1Gi", "volume2-5", v1.ClaimPending),
 | 
			
		||||
			newClaimArray("claim2-5", "uid2-5", "1Gi", "volume2-5", v1.ClaimBound, annBindCompleted),
 | 
			
		||||
			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, classEmpty),
 | 
			
		||||
			newClaimArray("claim2-5", "uid2-5", "1Gi", "volume2-5", v1.ClaimPending, nil),
 | 
			
		||||
			newClaimArray("claim2-5", "uid2-5", "1Gi", "volume2-5", v1.ClaimBound, nil, annBindCompleted),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncClaim with claim pre-bound to a PV that is bound to different
 | 
			
		||||
			// claim. Check it's reset to Pending.
 | 
			
		||||
			"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),
 | 
			
		||||
			newClaimArray("claim2-6", "uid2-6", "1Gi", "volume2-6", v1.ClaimBound),
 | 
			
		||||
			newClaimArray("claim2-6", "uid2-6", "1Gi", "volume2-6", v1.ClaimPending),
 | 
			
		||||
			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, classEmpty),
 | 
			
		||||
			newClaimArray("claim2-6", "uid2-6", "1Gi", "volume2-6", v1.ClaimBound, nil),
 | 
			
		||||
			newClaimArray("claim2-6", "uid2-6", "1Gi", "volume2-6", v1.ClaimPending, nil),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncClaim with claim bound by controller to a PV that is bound to
 | 
			
		||||
			// different claim. Check it throws an error.
 | 
			
		||||
			"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),
 | 
			
		||||
			newClaimArray("claim2-7", "uid2-7", "1Gi", "volume2-7", v1.ClaimBound, annBoundByController),
 | 
			
		||||
			newClaimArray("claim2-7", "uid2-7", "1Gi", "volume2-7", v1.ClaimBound, annBoundByController),
 | 
			
		||||
			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, classEmpty),
 | 
			
		||||
			newClaimArray("claim2-7", "uid2-7", "1Gi", "volume2-7", v1.ClaimBound, nil, annBoundByController),
 | 
			
		||||
			newClaimArray("claim2-7", "uid2-7", "1Gi", "volume2-7", v1.ClaimBound, nil, annBoundByController),
 | 
			
		||||
			noevents, noerrors, testSyncClaimError,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
@@ -255,10 +254,10 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			// unbound, but does not match the selector. Check it gets bound
 | 
			
		||||
			// and no annBoundByController is set.
 | 
			
		||||
			"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", "uid2-3", "claim2-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController),
 | 
			
		||||
			withLabelSelector(labels, newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", v1.ClaimPending)),
 | 
			
		||||
			withLabelSelector(labels, newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", v1.ClaimBound, annBindCompleted)),
 | 
			
		||||
			newVolumeArray("volume2-3", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			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, nil)),
 | 
			
		||||
			withLabelSelector(labels, newClaimArray("claim2-3", "uid2-3", "1Gi", "volume2-3", v1.ClaimBound, nil, annBindCompleted)),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
@@ -269,8 +268,8 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			"3-1 - bound claim with missing VolumeName",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newClaimArray("claim3-1", "uid3-1", "10Gi", "", v1.ClaimBound, annBoundByController, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim3-1", "uid3-1", "10Gi", "", v1.ClaimLost, annBoundByController, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim3-1", "uid3-1", "10Gi", "", v1.ClaimBound, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim3-1", "uid3-1", "10Gi", "", v1.ClaimLost, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			[]string{"Warning ClaimLost"}, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
@@ -279,28 +278,28 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			"3-2 - bound claim with missing volume",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newClaimArray("claim3-2", "uid3-2", "10Gi", "volume3-2", v1.ClaimBound, annBoundByController, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim3-2", "uid3-2", "10Gi", "volume3-2", v1.ClaimLost, 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, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			[]string{"Warning ClaimLost"}, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncClaim with claim bound to unbound volume. Check it's bound.
 | 
			
		||||
			// Also check that Pending phase is set to Bound
 | 
			
		||||
			"3-3 - bound claim with unbound volume",
 | 
			
		||||
			newVolumeArray("volume3-3", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newVolumeArray("volume3-3", "10Gi", "uid3-3", "claim3-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController),
 | 
			
		||||
			newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", v1.ClaimPending, annBoundByController, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", v1.ClaimBound, annBoundByController, annBindCompleted),
 | 
			
		||||
			newVolumeArray("volume3-3", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newVolumeArray("volume3-3", "10Gi", "uid3-3", "claim3-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController),
 | 
			
		||||
			newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", v1.ClaimPending, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", v1.ClaimBound, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncClaim with claim bound to volume with missing (or different)
 | 
			
		||||
			// volume.Spec.ClaimRef.UID. Check that the claim is marked as lost.
 | 
			
		||||
			"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),
 | 
			
		||||
			newClaimArray("claim3-4", "uid3-4", "10Gi", "volume3-4", v1.ClaimPending, annBoundByController, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim3-4", "uid3-4", "10Gi", "volume3-4", v1.ClaimLost, annBoundByController, annBindCompleted),
 | 
			
		||||
			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, classEmpty),
 | 
			
		||||
			newClaimArray("claim3-4", "uid3-4", "10Gi", "volume3-4", v1.ClaimPending, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim3-4", "uid3-4", "10Gi", "volume3-4", v1.ClaimLost, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			[]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
 | 
			
		||||
			// set to Bound
 | 
			
		||||
			"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.VolumeBound, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newClaimArray("claim3-5", "uid3-5", "10Gi", "volume3-5", v1.ClaimPending, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim3-5", "uid3-5", "10Gi", "volume3-5", v1.ClaimBound, annBindCompleted),
 | 
			
		||||
			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, classEmpty),
 | 
			
		||||
			newClaimArray("claim3-5", "uid3-5", "10Gi", "volume3-5", v1.ClaimPending, nil, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim3-5", "uid3-5", "10Gi", "volume3-5", v1.ClaimBound, nil, annBindCompleted),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
@@ -319,10 +318,10 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			// claim. Check that the claim is marked as lost.
 | 
			
		||||
			// TODO: test that an event is emitted
 | 
			
		||||
			"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),
 | 
			
		||||
			newClaimArray("claim3-6", "uid3-6", "10Gi", "volume3-6", v1.ClaimPending, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim3-6", "uid3-6", "10Gi", "volume3-6", v1.ClaimLost, annBindCompleted),
 | 
			
		||||
			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, classEmpty),
 | 
			
		||||
			newClaimArray("claim3-6", "uid3-6", "10Gi", "volume3-6", v1.ClaimPending, nil, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim3-6", "uid3-6", "10Gi", "volume3-6", v1.ClaimLost, nil, annBindCompleted),
 | 
			
		||||
			[]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
 | 
			
		||||
			// check that Pending phase is set to Bound
 | 
			
		||||
			"3-7 - bound claim with unbound volume where selector doesn't match",
 | 
			
		||||
			newVolumeArray("volume3-3", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newVolumeArray("volume3-3", "10Gi", "uid3-3", "claim3-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, 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.ClaimBound, annBoundByController, annBindCompleted)),
 | 
			
		||||
			newVolumeArray("volume3-3", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			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, nil, annBoundByController, annBindCompleted)),
 | 
			
		||||
			withLabelSelector(labels, newClaimArray("claim3-3", "uid3-3", "10Gi", "volume3-3", v1.ClaimBound, nil, annBoundByController, annBindCompleted)),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		// [Unit test set 4] All syncVolume tests.
 | 
			
		||||
		{
 | 
			
		||||
			// syncVolume with pending volume. Check it's marked as Available.
 | 
			
		||||
			"4-1 - pending volume",
 | 
			
		||||
			newVolumeArray("volume4-1", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newVolumeArray("volume4-1", "10Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newVolumeArray("volume4-1", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newVolumeArray("volume4-1", "10Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noevents, noerrors, testSyncVolume,
 | 
			
		||||
@@ -350,8 +349,8 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			// syncVolume with prebound pending volume. Check it's marked as
 | 
			
		||||
			// Available.
 | 
			
		||||
			"4-2 - pending prebound volume",
 | 
			
		||||
			newVolumeArray("volume4-2", "10Gi", "", "claim4-2", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newVolumeArray("volume4-2", "10Gi", "", "claim4-2", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newVolumeArray("volume4-2", "10Gi", "", "claim4-2", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newVolumeArray("volume4-2", "10Gi", "", "claim4-2", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noevents, noerrors, testSyncVolume,
 | 
			
		||||
@@ -360,8 +359,8 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			// syncVolume with volume bound to missing claim.
 | 
			
		||||
			// Check the volume gets Released
 | 
			
		||||
			"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.VolumeReleased, 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, classEmpty),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noevents, noerrors, testSyncVolume,
 | 
			
		||||
@@ -370,50 +369,50 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			// syncVolume with volume bound to claim with different UID.
 | 
			
		||||
			// Check the volume gets Released.
 | 
			
		||||
			"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.VolumeReleased, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newClaimArray("claim4-4", "uid4-4-x", "10Gi", "volume4-4", v1.ClaimBound, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim4-4", "uid4-4-x", "10Gi", "volume4-4", v1.ClaimBound, annBindCompleted),
 | 
			
		||||
			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, classEmpty),
 | 
			
		||||
			newClaimArray("claim4-4", "uid4-4-x", "10Gi", "volume4-4", v1.ClaimBound, nil, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim4-4", "uid4-4-x", "10Gi", "volume4-4", v1.ClaimBound, nil, annBindCompleted),
 | 
			
		||||
			noevents, noerrors, testSyncVolume,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncVolume with volume bound by controller to unbound claim.
 | 
			
		||||
			// Check syncVolume does not do anything.
 | 
			
		||||
			"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, annBoundByController),
 | 
			
		||||
			newClaimArray("claim4-5", "uid4-5", "10Gi", "", v1.ClaimPending),
 | 
			
		||||
			newClaimArray("claim4-5", "uid4-5", "10Gi", "", v1.ClaimPending),
 | 
			
		||||
			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, classEmpty, annBoundByController),
 | 
			
		||||
			newClaimArray("claim4-5", "uid4-5", "10Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			newClaimArray("claim4-5", "uid4-5", "10Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			noevents, noerrors, testSyncVolume,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncVolume with volume bound by user to unbound claim.
 | 
			
		||||
			// Check syncVolume does not do anything.
 | 
			
		||||
			"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),
 | 
			
		||||
			newClaimArray("claim4-5", "uid4-5", "10Gi", "", v1.ClaimPending),
 | 
			
		||||
			newClaimArray("claim4-5", "uid4-5", "10Gi", "", v1.ClaimPending),
 | 
			
		||||
			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, classEmpty),
 | 
			
		||||
			newClaimArray("claim4-5", "uid4-5", "10Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			newClaimArray("claim4-5", "uid4-5", "10Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			noevents, noerrors, testSyncVolume,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncVolume with volume bound to bound claim.
 | 
			
		||||
			// Check that the volume is marked as Bound.
 | 
			
		||||
			"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.VolumeBound, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newClaimArray("claim4-6", "uid4-6", "10Gi", "volume4-6", v1.ClaimBound),
 | 
			
		||||
			newClaimArray("claim4-6", "uid4-6", "10Gi", "volume4-6", v1.ClaimBound),
 | 
			
		||||
			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, classEmpty),
 | 
			
		||||
			newClaimArray("claim4-6", "uid4-6", "10Gi", "volume4-6", v1.ClaimBound, nil),
 | 
			
		||||
			newClaimArray("claim4-6", "uid4-6", "10Gi", "volume4-6", v1.ClaimBound, nil),
 | 
			
		||||
			noevents, noerrors, testSyncVolume,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncVolume with volume bound by controller to claim bound to
 | 
			
		||||
			// another volume. Check that the volume is rolled back.
 | 
			
		||||
			"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", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newClaimArray("claim4-7", "uid4-7", "10Gi", "volume4-7-x", v1.ClaimBound),
 | 
			
		||||
			newClaimArray("claim4-7", "uid4-7", "10Gi", "volume4-7-x", v1.ClaimBound),
 | 
			
		||||
			newVolumeArray("volume4-7", "10Gi", "uid4-7", "claim4-7", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController),
 | 
			
		||||
			newVolumeArray("volume4-7", "10Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newClaimArray("claim4-7", "uid4-7", "10Gi", "volume4-7-x", v1.ClaimBound, nil),
 | 
			
		||||
			newClaimArray("claim4-7", "uid4-7", "10Gi", "volume4-7-x", v1.ClaimBound, nil),
 | 
			
		||||
			noevents, noerrors, testSyncVolume,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
@@ -421,10 +420,10 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			// another volume. Check that the volume is marked as Available
 | 
			
		||||
			// and its UID is reset.
 | 
			
		||||
			"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", "", "claim4-8", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newClaimArray("claim4-8", "uid4-8", "10Gi", "volume4-8-x", v1.ClaimBound),
 | 
			
		||||
			newClaimArray("claim4-8", "uid4-8", "10Gi", "volume4-8-x", v1.ClaimBound),
 | 
			
		||||
			newVolumeArray("volume4-8", "10Gi", "uid4-8", "claim4-8", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newVolumeArray("volume4-8", "10Gi", "", "claim4-8", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newClaimArray("claim4-8", "uid4-8", "10Gi", "volume4-8-x", v1.ClaimBound, nil),
 | 
			
		||||
			newClaimArray("claim4-8", "uid4-8", "10Gi", "volume4-8-x", v1.ClaimBound, nil),
 | 
			
		||||
			noevents, noerrors, testSyncVolume,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
@@ -434,15 +433,15 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			// smaller PV available
 | 
			
		||||
			"13-1 - binding to class",
 | 
			
		||||
			[]*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume13-1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
				newVolume("volume13-1-2", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, storageutil.StorageClassAnnotation),
 | 
			
		||||
				newVolume("volume13-1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
				newVolume("volume13-1-2", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classGold),
 | 
			
		||||
			},
 | 
			
		||||
			[]*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume13-1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
				newVolume("volume13-1-2", "10Gi", "uid13-1", "claim13-1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController, storageutil.StorageClassAnnotation),
 | 
			
		||||
				newVolume("volume13-1-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
				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),
 | 
			
		||||
			withExpectedCapacity("10Gi", newClaimArray("claim13-1", "uid13-1", "1Gi", "volume13-1-2", v1.ClaimBound, annBoundByController, storageutil.StorageClassAnnotation, annBindCompleted)),
 | 
			
		||||
			newClaimArray("claim13-1", "uid13-1", "1Gi", "", v1.ClaimPending, &classGold),
 | 
			
		||||
			withExpectedCapacity("10Gi", newClaimArray("claim13-1", "uid13-1", "1Gi", "volume13-1-2", v1.ClaimBound, &classGold, annBoundByController, annBindCompleted)),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
@@ -450,61 +449,51 @@ func TestSync(t *testing.T) {
 | 
			
		||||
			// smaller PV with a class available
 | 
			
		||||
			"13-2 - binding without a class",
 | 
			
		||||
			[]*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume13-2-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, storageutil.StorageClassAnnotation),
 | 
			
		||||
				newVolume("volume13-2-2", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
				newVolume("volume13-2-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classGold),
 | 
			
		||||
				newVolume("volume13-2-2", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			},
 | 
			
		||||
			[]*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume13-2-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, storageutil.StorageClassAnnotation),
 | 
			
		||||
				newVolume("volume13-2-2", "10Gi", "uid13-2", "claim13-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController),
 | 
			
		||||
				newVolume("volume13-2-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classGold),
 | 
			
		||||
				newVolume("volume13-2-2", "10Gi", "uid13-2", "claim13-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController),
 | 
			
		||||
			},
 | 
			
		||||
			newClaimArray("claim13-2", "uid13-2", "1Gi", "", v1.ClaimPending),
 | 
			
		||||
			withExpectedCapacity("10Gi", newClaimArray("claim13-2", "uid13-2", "1Gi", "volume13-2-2", v1.ClaimBound, annBoundByController, annBindCompleted)),
 | 
			
		||||
			newClaimArray("claim13-2", "uid13-2", "1Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			withExpectedCapacity("10Gi", newClaimArray("claim13-2", "uid13-2", "1Gi", "volume13-2-2", v1.ClaimBound, nil, annBoundByController, annBindCompleted)),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncVolume binds a claim with given class even if there is a
 | 
			
		||||
			// smaller PV with different class available
 | 
			
		||||
			"13-3 - binding to specific a class",
 | 
			
		||||
			volumeWithClass("silver", []*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume13-3-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
				newVolume("volume13-3-2", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, storageutil.StorageClassAnnotation),
 | 
			
		||||
			}),
 | 
			
		||||
			volumeWithClass("silver", []*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume13-3-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
				newVolume("volume13-3-2", "10Gi", "uid13-3", "claim13-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController, storageutil.StorageClassAnnotation),
 | 
			
		||||
			}),
 | 
			
		||||
			newClaimArray("claim13-3", "uid13-3", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation),
 | 
			
		||||
			withExpectedCapacity("10Gi", newClaimArray("claim13-3", "uid13-3", "1Gi", "volume13-3-2", v1.ClaimBound, annBoundByController, annBindCompleted, storageutil.StorageClassAnnotation)),
 | 
			
		||||
			[]*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume13-3-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classSilver),
 | 
			
		||||
				newVolume("volume13-3-2", "10Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classGold),
 | 
			
		||||
			},
 | 
			
		||||
			[]*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume13-3-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classSilver),
 | 
			
		||||
				newVolume("volume13-3-2", "10Gi", "uid13-3", "claim13-3", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classGold, annBoundByController),
 | 
			
		||||
			},
 | 
			
		||||
			newClaimArray("claim13-3", "uid13-3", "1Gi", "", v1.ClaimPending, &classGold),
 | 
			
		||||
			withExpectedCapacity("10Gi", newClaimArray("claim13-3", "uid13-3", "1Gi", "volume13-3-2", v1.ClaimBound, &classGold, annBoundByController, annBindCompleted)),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncVolume binds claim requesting class "" to claim to PV with
 | 
			
		||||
			// class=""
 | 
			
		||||
			"13-4 - empty class",
 | 
			
		||||
			volumeWithClass("", newVolumeArray("volume13-4", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain)),
 | 
			
		||||
			volumeWithClass("", newVolumeArray("volume13-4", "1Gi", "uid13-4", "claim13-4", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController)),
 | 
			
		||||
			claimWithClass("", newClaimArray("claim13-4", "uid13-4", "1Gi", "", v1.ClaimPending)),
 | 
			
		||||
			claimWithClass("", newClaimArray("claim13-4", "uid13-4", "1Gi", "volume13-4", v1.ClaimBound, annBoundByController, annBindCompleted)),
 | 
			
		||||
			newVolumeArray("volume13-4", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newVolumeArray("volume13-4", "1Gi", "uid13-4", "claim13-4", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController),
 | 
			
		||||
			newClaimArray("claim13-4", "uid13-4", "1Gi", "", v1.ClaimPending, &classEmpty),
 | 
			
		||||
			newClaimArray("claim13-4", "uid13-4", "1Gi", "volume13-4", v1.ClaimBound, &classEmpty, annBoundByController, annBindCompleted),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// syncVolume binds claim requesting class nil to claim to PV with
 | 
			
		||||
			// class = ""
 | 
			
		||||
			"13-5 - nil class",
 | 
			
		||||
			volumeWithClass("", newVolumeArray("volume13-5", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain)),
 | 
			
		||||
			volumeWithClass("", newVolumeArray("volume13-5", "1Gi", "uid13-5", "claim13-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController)),
 | 
			
		||||
			newClaimArray("claim13-5", "uid13-5", "1Gi", "", v1.ClaimPending),
 | 
			
		||||
			newClaimArray("claim13-5", "uid13-5", "1Gi", "volume13-5", v1.ClaimBound, 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)),
 | 
			
		||||
			newVolumeArray("volume13-5", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newVolumeArray("volume13-5", "1Gi", "uid13-5", "claim13-5", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController),
 | 
			
		||||
			newClaimArray("claim13-5", "uid13-5", "1Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			newClaimArray("claim13-5", "uid13-5", "1Gi", "volume13-5", v1.ClaimBound, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
@@ -531,10 +520,10 @@ func TestMultiSync(t *testing.T) {
 | 
			
		||||
		{
 | 
			
		||||
			// syncClaim binds to a matching unbound volume.
 | 
			
		||||
			"10-1 - successful bind",
 | 
			
		||||
			newVolumeArray("volume10-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newVolumeArray("volume10-1", "1Gi", "uid10-1", "claim10-1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController),
 | 
			
		||||
			newClaimArray("claim10-1", "uid10-1", "1Gi", "", v1.ClaimPending),
 | 
			
		||||
			newClaimArray("claim10-1", "uid10-1", "1Gi", "volume10-1", v1.ClaimBound, annBoundByController, annBindCompleted),
 | 
			
		||||
			newVolumeArray("volume10-1", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newVolumeArray("volume10-1", "1Gi", "uid10-1", "claim10-1", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController),
 | 
			
		||||
			newClaimArray("claim10-1", "uid10-1", "1Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			newClaimArray("claim10-1", "uid10-1", "1Gi", "volume10-1", v1.ClaimBound, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
@@ -542,15 +531,15 @@ func TestMultiSync(t *testing.T) {
 | 
			
		||||
			// wins and the second rolls back.
 | 
			
		||||
			"10-2 - bind PV race",
 | 
			
		||||
			[]*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume10-2-1", "1Gi", "uid10-2", "claim10-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController),
 | 
			
		||||
				newVolume("volume10-2-2", "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, classEmpty, annBoundByController),
 | 
			
		||||
			},
 | 
			
		||||
			[]*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume10-2-1", "1Gi", "uid10-2", "claim10-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController),
 | 
			
		||||
				newVolume("volume10-2-2", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
				newVolume("volume10-2-1", "1Gi", "uid10-2", "claim10-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController),
 | 
			
		||||
				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, 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, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			noevents, noerrors, testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -33,7 +33,7 @@ func TestDeleteSync(t *testing.T) {
 | 
			
		||||
		{
 | 
			
		||||
			// delete volume bound by controller
 | 
			
		||||
			"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,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
@@ -45,7 +45,7 @@ func TestDeleteSync(t *testing.T) {
 | 
			
		||||
		{
 | 
			
		||||
			// delete volume bound by user
 | 
			
		||||
			"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,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
@@ -57,8 +57,8 @@ func TestDeleteSync(t *testing.T) {
 | 
			
		||||
		{
 | 
			
		||||
			// delete failure - plugin not found
 | 
			
		||||
			"8-3 - plugin not found",
 | 
			
		||||
			newVolumeArray("volume8-3", "1Gi", "uid8-3", "claim8-3", v1.VolumeBound, 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)),
 | 
			
		||||
			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, classEmpty)),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			[]string{"Warning VolumeFailedDelete"}, noerrors, testSyncVolume,
 | 
			
		||||
@@ -66,8 +66,8 @@ func TestDeleteSync(t *testing.T) {
 | 
			
		||||
		{
 | 
			
		||||
			// delete failure - newDeleter returns error
 | 
			
		||||
			"8-4 - newDeleter returns error",
 | 
			
		||||
			newVolumeArray("volume8-4", "1Gi", "uid8-4", "claim8-4", v1.VolumeBound, 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)),
 | 
			
		||||
			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, classEmpty)),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			[]string{"Warning VolumeFailedDelete"}, noerrors,
 | 
			
		||||
@@ -76,8 +76,8 @@ func TestDeleteSync(t *testing.T) {
 | 
			
		||||
		{
 | 
			
		||||
			// delete failure - delete() returns error
 | 
			
		||||
			"8-5 - delete returns error",
 | 
			
		||||
			newVolumeArray("volume8-5", "1Gi", "uid8-5", "claim8-5", v1.VolumeBound, v1.PersistentVolumeReclaimDelete),
 | 
			
		||||
			withMessage("Mock delete error", newVolumeArray("volume8-5", "1Gi", "uid8-5", "claim8-5", v1.VolumeFailed, 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, classEmpty)),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			[]string{"Warning VolumeFailedDelete"}, noerrors,
 | 
			
		||||
@@ -86,7 +86,7 @@ func TestDeleteSync(t *testing.T) {
 | 
			
		||||
		{
 | 
			
		||||
			// delete success(?) - volume is deleted before doDelete() starts
 | 
			
		||||
			"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,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
@@ -103,17 +103,17 @@ func TestDeleteSync(t *testing.T) {
 | 
			
		||||
			// starts. This simulates "volume no longer needs recycling,
 | 
			
		||||
			// skipping".
 | 
			
		||||
			"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, 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, classEmpty, annBoundByController),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			newClaimArray("claim8-7", "uid8-7", "10Gi", "volume8-7", v1.ClaimBound),
 | 
			
		||||
			newClaimArray("claim8-7", "uid8-7", "10Gi", "volume8-7", v1.ClaimBound, nil),
 | 
			
		||||
			noevents, noerrors,
 | 
			
		||||
			wrapTestWithInjectedOperation(wrapTestWithReclaimCalls(operationDelete, []error{}, testSyncVolume), func(ctrl *PersistentVolumeController, reactor *volumeReactor) {
 | 
			
		||||
				reactor.lock.Lock()
 | 
			
		||||
				defer reactor.lock.Unlock()
 | 
			
		||||
				// Bind the volume to resurrected claim (this should never
 | 
			
		||||
				// 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
 | 
			
		||||
				ctrl.claims.Add(claim)
 | 
			
		||||
				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
 | 
			
		||||
			// claim is created with another UID.
 | 
			
		||||
			"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,
 | 
			
		||||
			newClaimArray("claim8-9", "uid8-9-x", "10Gi", "", v1.ClaimPending),
 | 
			
		||||
			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, nil),
 | 
			
		||||
			noevents, noerrors,
 | 
			
		||||
			// Inject deleter into the controller and call syncVolume. The
 | 
			
		||||
			// deleter simulates one delete() call that succeeds.
 | 
			
		||||
@@ -136,8 +136,8 @@ func TestDeleteSync(t *testing.T) {
 | 
			
		||||
		{
 | 
			
		||||
			// PV requires 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.VolumeReleased, 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, classEmpty, annBoundByController),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noevents, noerrors,
 | 
			
		||||
@@ -153,15 +153,15 @@ func TestDeleteSync(t *testing.T) {
 | 
			
		||||
			// One of the PVs is deleted.
 | 
			
		||||
			"8-11 - two PVs provisioned for a single claim",
 | 
			
		||||
			[]*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume8-11-1", "1Gi", "uid8-11", "claim8-11", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annDynamicallyProvisioned),
 | 
			
		||||
				newVolume("volume8-11-2", "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, classEmpty, annDynamicallyProvisioned),
 | 
			
		||||
			},
 | 
			
		||||
			[]*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
 | 
			
		||||
			newClaimArray("claim8-11", "uid8-11", "10Gi", "volume8-11-2", v1.ClaimBound),
 | 
			
		||||
			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, nil),
 | 
			
		||||
			noevents, noerrors,
 | 
			
		||||
			// Inject deleter into the controller and call syncVolume. The
 | 
			
		||||
			// deleter simulates one delete() call that succeeds.
 | 
			
		||||
@@ -173,16 +173,16 @@ func TestDeleteSync(t *testing.T) {
 | 
			
		||||
			// external provisioner.
 | 
			
		||||
			"8-12 - two PVs externally provisioned for a single claim",
 | 
			
		||||
			[]*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume8-12-1", "1Gi", "uid8-12", "claim8-12", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annDynamicallyProvisioned),
 | 
			
		||||
				newVolume("volume8-12-2", "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, classEmpty, annDynamicallyProvisioned),
 | 
			
		||||
			},
 | 
			
		||||
			[]*v1.PersistentVolume{
 | 
			
		||||
				newVolume("volume8-12-1", "1Gi", "uid8-12", "claim8-12", v1.VolumeReleased, v1.PersistentVolumeReclaimDelete, annDynamicallyProvisioned),
 | 
			
		||||
				newVolume("volume8-12-2", "1Gi", "uid8-12", "claim8-12", v1.VolumeBound, 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, classEmpty, annDynamicallyProvisioned),
 | 
			
		||||
			},
 | 
			
		||||
			// 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),
 | 
			
		||||
			newClaimArray("claim8-12", "uid8-12", "10Gi", "volume8-12-2", v1.ClaimBound, nil),
 | 
			
		||||
			newClaimArray("claim8-12", "uid8-12", "10Gi", "volume8-12-2", v1.ClaimBound, nil),
 | 
			
		||||
			noevents, noerrors,
 | 
			
		||||
			func(ctrl *PersistentVolumeController, reactor *volumeReactor, test controllerTest) error {
 | 
			
		||||
				// Inject external deleter annotation
 | 
			
		||||
@@ -215,7 +215,7 @@ func TestDeleteMultiSync(t *testing.T) {
 | 
			
		||||
			// delete failure - delete returns error. The controller should
 | 
			
		||||
			// try again.
 | 
			
		||||
			"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,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,6 @@ import (
 | 
			
		||||
	"k8s.io/kubernetes/pkg/api/testapi"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/api/v1"
 | 
			
		||||
	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/fake"
 | 
			
		||||
	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
 | 
			
		||||
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{
 | 
			
		||||
		ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
			Name:            name,
 | 
			
		||||
@@ -636,6 +635,7 @@ func newVolume(name, capacity, boundToClaimUID, boundToClaimName string, phase v
 | 
			
		||||
			},
 | 
			
		||||
			AccessModes:                   []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce, v1.ReadOnlyMany},
 | 
			
		||||
			PersistentVolumeReclaimPolicy: reclaimPolicy,
 | 
			
		||||
			StorageClassName:              class,
 | 
			
		||||
		},
 | 
			
		||||
		Status: v1.PersistentVolumeStatus{
 | 
			
		||||
			Phase: phase,
 | 
			
		||||
@@ -658,8 +658,6 @@ func newVolume(name, capacity, boundToClaimUID, boundToClaimName string, phase v
 | 
			
		||||
			switch a {
 | 
			
		||||
			case annDynamicallyProvisioned:
 | 
			
		||||
				volume.Annotations[a] = mockPluginName
 | 
			
		||||
			case storageutil.StorageClassAnnotation:
 | 
			
		||||
				volume.Annotations[a] = "gold"
 | 
			
		||||
			default:
 | 
			
		||||
				volume.Annotations[a] = "yes"
 | 
			
		||||
			}
 | 
			
		||||
@@ -707,27 +705,16 @@ func withMessage(message string, volumes []*v1.PersistentVolume) []*v1.Persisten
 | 
			
		||||
	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
 | 
			
		||||
// 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{
 | 
			
		||||
		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
 | 
			
		||||
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{
 | 
			
		||||
		ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
			Name:            name,
 | 
			
		||||
@@ -743,6 +730,7 @@ func newClaim(name, claimUID, capacity, boundToVolume string, phase v1.Persisten
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			VolumeName:       boundToVolume,
 | 
			
		||||
			StorageClassName: class,
 | 
			
		||||
		},
 | 
			
		||||
		Status: v1.PersistentVolumeClaimStatus{
 | 
			
		||||
			Phase: phase,
 | 
			
		||||
@@ -755,8 +743,6 @@ func newClaim(name, claimUID, capacity, boundToVolume string, phase v1.Persisten
 | 
			
		||||
		claim.Annotations = make(map[string]string)
 | 
			
		||||
		for _, a := range annotations {
 | 
			
		||||
			switch a {
 | 
			
		||||
			case storageutil.StorageClassAnnotation:
 | 
			
		||||
				claim.Annotations[a] = "gold"
 | 
			
		||||
			case annStorageProvisioner:
 | 
			
		||||
				claim.Annotations[a] = mockPluginName
 | 
			
		||||
			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
 | 
			
		||||
// 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{
 | 
			
		||||
		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.
 | 
			
		||||
// Meant to be used to compose claims specified inline in a test.
 | 
			
		||||
func claimWithAnnotation(name, value string, claims []*v1.PersistentVolumeClaim) []*v1.PersistentVolumeClaim {
 | 
			
		||||
@@ -828,6 +803,15 @@ type operationType string
 | 
			
		||||
const operationDelete = "Delete"
 | 
			
		||||
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:
 | 
			
		||||
// - configures controller with a volume plugin that implements recycler,
 | 
			
		||||
//   deleter and provisioner. The plugin retunrs provided errors when a volume
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,6 @@ import (
 | 
			
		||||
	"k8s.io/apimachinery/pkg/labels"
 | 
			
		||||
	"k8s.io/client-go/tools/cache"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/api/v1"
 | 
			
		||||
	storageutil "k8s.io/kubernetes/pkg/apis/storage/v1beta1/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// persistentVolumeOrderedIndex is a cache.Store that keeps persistent volumes
 | 
			
		||||
@@ -93,7 +92,7 @@ func (pvIndex *persistentVolumeOrderedIndex) findByClaim(claim *v1.PersistentVol
 | 
			
		||||
	var smallestVolumeSize int64
 | 
			
		||||
	requestedQty := claim.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)]
 | 
			
		||||
	requestedSize := requestedQty.Value()
 | 
			
		||||
	requestedClass := storageutil.GetClaimStorageClass(claim)
 | 
			
		||||
	requestedClass := v1.GetPersistentVolumeClaimClass(claim)
 | 
			
		||||
 | 
			
		||||
	var selector labels.Selector
 | 
			
		||||
	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
 | 
			
		||||
			// pre-bound to the claim (by dynamic provisioning). TODO: remove in
 | 
			
		||||
			// 1.5
 | 
			
		||||
			if metav1.HasAnnotation(claim.ObjectMeta, storageutil.AlphaStorageClassAnnotation) {
 | 
			
		||||
			if metav1.HasAnnotation(claim.ObjectMeta, v1.AlphaStorageClassAnnotation) {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
@@ -147,7 +146,7 @@ func (pvIndex *persistentVolumeOrderedIndex) findByClaim(claim *v1.PersistentVol
 | 
			
		||||
			} else if selector != nil && !selector.Matches(labels.Set(volume.Labels)) {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			if storageutil.GetVolumeStorageClass(volume) != requestedClass {
 | 
			
		||||
			if v1.GetPersistentVolumeClass(volume) != requestedClass {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,6 @@ import (
 | 
			
		||||
	"k8s.io/kubernetes/pkg/api"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/api/testapi"
 | 
			
		||||
	"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 {
 | 
			
		||||
@@ -112,24 +111,20 @@ func TestMatchVolume(t *testing.T) {
 | 
			
		||||
		"successful-match-with-class": {
 | 
			
		||||
			expectedMatch: "gce-pd-silver1",
 | 
			
		||||
			claim: makePVC("1G", func(pvc *v1.PersistentVolumeClaim) {
 | 
			
		||||
				pvc.ObjectMeta.Annotations = map[string]string{
 | 
			
		||||
					storageutil.StorageClassAnnotation: "silver",
 | 
			
		||||
				}
 | 
			
		||||
				pvc.Spec.Selector = &metav1.LabelSelector{
 | 
			
		||||
					MatchLabels: map[string]string{
 | 
			
		||||
						"should-exist": "true",
 | 
			
		||||
					},
 | 
			
		||||
				}
 | 
			
		||||
				pvc.Spec.AccessModes = []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}
 | 
			
		||||
				pvc.Spec.StorageClassName = &classSilver
 | 
			
		||||
			}),
 | 
			
		||||
		},
 | 
			
		||||
		"successful-match-with-class-and-labels": {
 | 
			
		||||
			expectedMatch: "gce-pd-silver2",
 | 
			
		||||
			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.StorageClassName = &classSilver
 | 
			
		||||
			}),
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
@@ -542,9 +537,6 @@ func createTestVolumes() []*v1.PersistentVolume {
 | 
			
		||||
				Labels: map[string]string{
 | 
			
		||||
					"should-exist": "true",
 | 
			
		||||
				},
 | 
			
		||||
				Annotations: map[string]string{
 | 
			
		||||
					storageutil.StorageClassAnnotation: "silver",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			Spec: v1.PersistentVolumeSpec{
 | 
			
		||||
				Capacity: v1.ResourceList{
 | 
			
		||||
@@ -556,15 +548,13 @@ func createTestVolumes() []*v1.PersistentVolume {
 | 
			
		||||
				AccessModes: []v1.PersistentVolumeAccessMode{
 | 
			
		||||
					v1.ReadWriteOnce,
 | 
			
		||||
				},
 | 
			
		||||
				StorageClassName: classSilver,
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
				UID:  "gce-pd-silver2",
 | 
			
		||||
				Name: "gce0024",
 | 
			
		||||
				Annotations: map[string]string{
 | 
			
		||||
					storageutil.StorageClassAnnotation: "silver",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			Spec: v1.PersistentVolumeSpec{
 | 
			
		||||
				Capacity: v1.ResourceList{
 | 
			
		||||
@@ -576,15 +566,13 @@ func createTestVolumes() []*v1.PersistentVolume {
 | 
			
		||||
				AccessModes: []v1.PersistentVolumeAccessMode{
 | 
			
		||||
					v1.ReadWriteOnce,
 | 
			
		||||
				},
 | 
			
		||||
				StorageClassName: classSilver,
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
				UID:  "gce-pd-gold",
 | 
			
		||||
				Name: "gce0025",
 | 
			
		||||
				Annotations: map[string]string{
 | 
			
		||||
					storageutil.StorageClassAnnotation: "gold",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			Spec: v1.PersistentVolumeSpec{
 | 
			
		||||
				Capacity: v1.ResourceList{
 | 
			
		||||
@@ -596,6 +584,7 @@ func createTestVolumes() []*v1.PersistentVolume {
 | 
			
		||||
				AccessModes: []v1.PersistentVolumeAccessMode{
 | 
			
		||||
					v1.ReadWriteOnce,
 | 
			
		||||
				},
 | 
			
		||||
				StorageClassName: classGold,
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,6 @@ import (
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/api/v1"
 | 
			
		||||
	storage "k8s.io/kubernetes/pkg/apis/storage/v1beta1"
 | 
			
		||||
	storageutil "k8s.io/kubernetes/pkg/apis/storage/v1beta1/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var class1Parameters = map[string]string{
 | 
			
		||||
@@ -109,10 +108,10 @@ func TestProvisionSync(t *testing.T) {
 | 
			
		||||
			// Provision a volume (with a default class)
 | 
			
		||||
			"11-1 - successful provision with storage class 1",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newVolumeArray("pvc-uid11-1", "1Gi", "uid11-1", "claim11-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController, annDynamicallyProvisioned, storageutil.StorageClassAnnotation),
 | 
			
		||||
			newClaimArray("claim11-1", "uid11-1", "1Gi", "", v1.ClaimPending, 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, &classGold),
 | 
			
		||||
			// 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),
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
@@ -120,8 +119,8 @@ func TestProvisionSync(t *testing.T) {
 | 
			
		||||
			"11-2 - plugin not found",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newClaimArray("claim11-2", "uid11-2", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation),
 | 
			
		||||
			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, &classGold),
 | 
			
		||||
			[]string{"Warning ProvisioningFailed"}, noerrors,
 | 
			
		||||
			testSyncClaim,
 | 
			
		||||
		},
 | 
			
		||||
@@ -130,8 +129,8 @@ func TestProvisionSync(t *testing.T) {
 | 
			
		||||
			"11-3 - newProvisioner failure",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newClaimArray("claim11-3", "uid11-3", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation),
 | 
			
		||||
			newClaimArray("claim11-3", "uid11-3", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation, annStorageProvisioner),
 | 
			
		||||
			newClaimArray("claim11-3", "uid11-3", "1Gi", "", v1.ClaimPending, &classGold),
 | 
			
		||||
			newClaimArray("claim11-3", "uid11-3", "1Gi", "", v1.ClaimPending, &classGold, annStorageProvisioner),
 | 
			
		||||
			[]string{"Warning ProvisioningFailed"}, noerrors,
 | 
			
		||||
			wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim),
 | 
			
		||||
		},
 | 
			
		||||
@@ -140,18 +139,18 @@ func TestProvisionSync(t *testing.T) {
 | 
			
		||||
			"11-4 - provision failure",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newClaimArray("claim11-4", "uid11-4", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation),
 | 
			
		||||
			newClaimArray("claim11-4", "uid11-4", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation, annStorageProvisioner),
 | 
			
		||||
			newClaimArray("claim11-4", "uid11-4", "1Gi", "", v1.ClaimPending, &classGold),
 | 
			
		||||
			newClaimArray("claim11-4", "uid11-4", "1Gi", "", v1.ClaimPending, &classGold, annStorageProvisioner),
 | 
			
		||||
			[]string{"Warning ProvisioningFailed"}, noerrors,
 | 
			
		||||
			wrapTestWithProvisionCalls([]provisionCall{provision1Error}, testSyncClaim),
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// No provisioning if there is a matching 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", "uid11-6", "claim11-6", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController, storageutil.StorageClassAnnotation),
 | 
			
		||||
			newClaimArray("claim11-6", "uid11-6", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation),
 | 
			
		||||
			newClaimArray("claim11-6", "uid11-6", "1Gi", "volume11-6", v1.ClaimBound, storageutil.StorageClassAnnotation, annBoundByController, annBindCompleted),
 | 
			
		||||
			newVolumeArray("volume11-6", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classGold),
 | 
			
		||||
			newVolumeArray("volume11-6", "1Gi", "uid11-6", "claim11-6", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classGold, annBoundByController),
 | 
			
		||||
			newClaimArray("claim11-6", "uid11-6", "1Gi", "", v1.ClaimPending, &classGold),
 | 
			
		||||
			newClaimArray("claim11-6", "uid11-6", "1Gi", "volume11-6", v1.ClaimBound, &classGold, annBoundByController, annBindCompleted),
 | 
			
		||||
			noevents, noerrors,
 | 
			
		||||
			// No provisioning plugin confingure - makes the test fail when
 | 
			
		||||
			// the controller errorneously tries to provision something
 | 
			
		||||
@@ -162,16 +161,16 @@ func TestProvisionSync(t *testing.T) {
 | 
			
		||||
			// a volume.
 | 
			
		||||
			"11-7 - claim is bound before provisioning",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newVolumeArray("pvc-uid11-7", "1Gi", "uid11-7", "claim11-7", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController, annDynamicallyProvisioned, storageutil.StorageClassAnnotation),
 | 
			
		||||
			newClaimArray("claim11-7", "uid11-7", "1Gi", "", v1.ClaimPending, 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, &classGold),
 | 
			
		||||
			// 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,
 | 
			
		||||
			wrapTestWithInjectedOperation(wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), func(ctrl *PersistentVolumeController, reactor *volumeReactor) {
 | 
			
		||||
				// Create a volume before provisionClaimOperation starts.
 | 
			
		||||
				// This similates a parallel controller provisioning the volume.
 | 
			
		||||
				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.lock.Unlock()
 | 
			
		||||
			}),
 | 
			
		||||
@@ -181,10 +180,10 @@ func TestProvisionSync(t *testing.T) {
 | 
			
		||||
			// second retry succeeds
 | 
			
		||||
			"11-8 - cannot save provisioned volume",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newVolumeArray("pvc-uid11-8", "1Gi", "uid11-8", "claim11-8", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController, annDynamicallyProvisioned, storageutil.StorageClassAnnotation),
 | 
			
		||||
			newClaimArray("claim11-8", "uid11-8", "1Gi", "", v1.ClaimPending, 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, &classGold),
 | 
			
		||||
			// 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"},
 | 
			
		||||
			[]reactorError{
 | 
			
		||||
				// Inject error to the first
 | 
			
		||||
@@ -200,8 +199,8 @@ func TestProvisionSync(t *testing.T) {
 | 
			
		||||
			"11-9 - cannot save provisioned volume, delete succeeds",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newClaimArray("claim11-9", "uid11-9", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation),
 | 
			
		||||
			newClaimArray("claim11-9", "uid11-9", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation, annStorageProvisioner),
 | 
			
		||||
			newClaimArray("claim11-9", "uid11-9", "1Gi", "", v1.ClaimPending, &classGold),
 | 
			
		||||
			newClaimArray("claim11-9", "uid11-9", "1Gi", "", v1.ClaimPending, &classGold, annStorageProvisioner),
 | 
			
		||||
			[]string{"Warning ProvisioningFailed"},
 | 
			
		||||
			[]reactorError{
 | 
			
		||||
				// 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",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newClaimArray("claim11-10", "uid11-10", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation),
 | 
			
		||||
			newClaimArray("claim11-10", "uid11-10", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation, annStorageProvisioner),
 | 
			
		||||
			newClaimArray("claim11-10", "uid11-10", "1Gi", "", v1.ClaimPending, &classGold),
 | 
			
		||||
			newClaimArray("claim11-10", "uid11-10", "1Gi", "", v1.ClaimPending, &classGold, annStorageProvisioner),
 | 
			
		||||
			[]string{"Warning ProvisioningFailed", "Warning ProvisioningCleanupFailed"},
 | 
			
		||||
			[]reactorError{
 | 
			
		||||
				// Inject error to five kubeclient.PersistentVolumes.Create()
 | 
			
		||||
@@ -246,8 +245,8 @@ func TestProvisionSync(t *testing.T) {
 | 
			
		||||
			"11-11 - cannot save provisioned volume, deleter fails",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newClaimArray("claim11-11", "uid11-11", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation),
 | 
			
		||||
			newClaimArray("claim11-11", "uid11-11", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation, annStorageProvisioner),
 | 
			
		||||
			newClaimArray("claim11-11", "uid11-11", "1Gi", "", v1.ClaimPending, &classGold),
 | 
			
		||||
			newClaimArray("claim11-11", "uid11-11", "1Gi", "", v1.ClaimPending, &classGold, annStorageProvisioner),
 | 
			
		||||
			[]string{"Warning ProvisioningFailed", "Warning ProvisioningCleanupFailed"},
 | 
			
		||||
			[]reactorError{
 | 
			
		||||
				// 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",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newClaimArray("claim11-12", "uid11-12", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation),
 | 
			
		||||
			newClaimArray("claim11-12", "uid11-12", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation, annStorageProvisioner),
 | 
			
		||||
			newClaimArray("claim11-12", "uid11-12", "1Gi", "", v1.ClaimPending, &classGold),
 | 
			
		||||
			newClaimArray("claim11-12", "uid11-12", "1Gi", "", v1.ClaimPending, &classGold, annStorageProvisioner),
 | 
			
		||||
			[]string{"Warning ProvisioningFailed"},
 | 
			
		||||
			[]reactorError{
 | 
			
		||||
				// Inject error to five kubeclient.PersistentVolumes.Create()
 | 
			
		||||
@@ -302,10 +301,10 @@ func TestProvisionSync(t *testing.T) {
 | 
			
		||||
			// Provision a volume (with non-default class)
 | 
			
		||||
			"11-13 - successful provision with storage class 2",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			volumeWithClass("silver", newVolumeArray("pvc-uid11-13", "1Gi", "uid11-13", "claim11-13", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController, annDynamicallyProvisioned)),
 | 
			
		||||
			claimWithClass("silver", newClaimArray("claim11-13", "uid11-13", "1Gi", "", v1.ClaimPending)),
 | 
			
		||||
			newVolumeArray("pvc-uid11-13", "1Gi", "uid11-13", "claim11-13", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classSilver, annBoundByController, annDynamicallyProvisioned),
 | 
			
		||||
			newClaimArray("claim11-13", "uid11-13", "1Gi", "", v1.ClaimPending, &classSilver),
 | 
			
		||||
			// 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),
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
@@ -313,8 +312,8 @@ func TestProvisionSync(t *testing.T) {
 | 
			
		||||
			"11-14 - fail due to non-existing class",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			novolumes,
 | 
			
		||||
			claimWithClass("non-existing", newClaimArray("claim11-14", "uid11-14", "1Gi", "", v1.ClaimPending)),
 | 
			
		||||
			claimWithClass("non-existing", newClaimArray("claim11-14", "uid11-14", "1Gi", "", v1.ClaimPending)),
 | 
			
		||||
			newClaimArray("claim11-14", "uid11-14", "1Gi", "", v1.ClaimPending, &classNonExisting),
 | 
			
		||||
			newClaimArray("claim11-14", "uid11-14", "1Gi", "", v1.ClaimPending, &classNonExisting),
 | 
			
		||||
			noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim),
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
@@ -322,8 +321,8 @@ func TestProvisionSync(t *testing.T) {
 | 
			
		||||
			"11-15 - no provisioning with class=''",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			novolumes,
 | 
			
		||||
			claimWithClass("", newClaimArray("claim11-15", "uid11-15", "1Gi", "", v1.ClaimPending)),
 | 
			
		||||
			claimWithClass("", newClaimArray("claim11-15", "uid11-15", "1Gi", "", v1.ClaimPending)),
 | 
			
		||||
			newClaimArray("claim11-15", "uid11-15", "1Gi", "", v1.ClaimPending, &classEmpty),
 | 
			
		||||
			newClaimArray("claim11-15", "uid11-15", "1Gi", "", v1.ClaimPending, &classEmpty),
 | 
			
		||||
			noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim),
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
@@ -331,8 +330,8 @@ func TestProvisionSync(t *testing.T) {
 | 
			
		||||
			"11-16 - no provisioning with class=nil",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newClaimArray("claim11-15", "uid11-15", "1Gi", "", v1.ClaimPending),
 | 
			
		||||
			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, nil),
 | 
			
		||||
			noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim),
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
@@ -340,9 +339,9 @@ func TestProvisionSync(t *testing.T) {
 | 
			
		||||
			"11-17 - external provisioner",
 | 
			
		||||
			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",
 | 
			
		||||
				claimWithClass("external", newClaimArray("claim11-17", "uid11-17", "1Gi", "", v1.ClaimPending))),
 | 
			
		||||
				newClaimArray("claim11-17", "uid11-17", "1Gi", "", v1.ClaimPending, &classExternal)),
 | 
			
		||||
			[]string{"Normal ExternalProvisioning"},
 | 
			
		||||
			noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim),
 | 
			
		||||
		},
 | 
			
		||||
@@ -351,8 +350,8 @@ func TestProvisionSync(t *testing.T) {
 | 
			
		||||
			"11-18 - unknown internal provisioner",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			novolumes,
 | 
			
		||||
			claimWithClass("unknown-internal", newClaimArray("claim11-18", "uid11-18", "1Gi", "", v1.ClaimPending)),
 | 
			
		||||
			claimWithClass("unknown-internal", newClaimArray("claim11-18", "uid11-18", "1Gi", "", v1.ClaimPending)),
 | 
			
		||||
			newClaimArray("claim11-18", "uid11-18", "1Gi", "", v1.ClaimPending, &classUnknownInternal),
 | 
			
		||||
			newClaimArray("claim11-18", "uid11-18", "1Gi", "", v1.ClaimPending, &classUnknownInternal),
 | 
			
		||||
			[]string{"Warning ProvisioningFailed"},
 | 
			
		||||
			noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim),
 | 
			
		||||
		},
 | 
			
		||||
@@ -366,24 +365,24 @@ func TestAlphaProvisionSync(t *testing.T) {
 | 
			
		||||
			// Provision a volume with alpha annotation
 | 
			
		||||
			"14-1 - successful alpha provisioning",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newVolumeArray("pvc-uid14-1", "1Gi", "uid14-1", "claim14-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController, annDynamicallyProvisioned),
 | 
			
		||||
			newClaimArray("claim14-1", "uid14-1", "1Gi", "", v1.ClaimPending, storageutil.AlphaStorageClassAnnotation),
 | 
			
		||||
			newVolumeArray("pvc-uid14-1", "1Gi", "uid14-1", "claim14-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classEmpty, annBoundByController, annDynamicallyProvisioned),
 | 
			
		||||
			newClaimArray("claim14-1", "uid14-1", "1Gi", "", v1.ClaimPending, nil, v1.AlphaStorageClassAnnotation),
 | 
			
		||||
			// 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),
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			// Provision success - there is already a volume available, still
 | 
			
		||||
			// we provision a new one when requested.
 | 
			
		||||
			"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{
 | 
			
		||||
				newVolume("volume14-2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
				newVolume("pvc-uid14-2", "1Gi", "uid14-2", "claim14-2", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController, annDynamicallyProvisioned),
 | 
			
		||||
				newVolume("volume14-2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
				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
 | 
			
		||||
			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),
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
@@ -410,9 +409,9 @@ func TestProvisionMultiSync(t *testing.T) {
 | 
			
		||||
			// Provision a volume with binding
 | 
			
		||||
			"12-1 - successful provision",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newVolumeArray("pvc-uid12-1", "1Gi", "uid12-1", "claim12-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController, annDynamicallyProvisioned, storageutil.StorageClassAnnotation),
 | 
			
		||||
			newClaimArray("claim12-1", "uid12-1", "1Gi", "", v1.ClaimPending, storageutil.StorageClassAnnotation),
 | 
			
		||||
			newClaimArray("claim12-1", "uid12-1", "1Gi", "pvc-uid12-1", v1.ClaimBound, storageutil.StorageClassAnnotation, annBoundByController, annBindCompleted, annStorageProvisioner),
 | 
			
		||||
			newVolumeArray("pvc-uid12-1", "1Gi", "uid12-1", "claim12-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classGold, annBoundByController, annDynamicallyProvisioned),
 | 
			
		||||
			newClaimArray("claim12-1", "uid12-1", "1Gi", "", v1.ClaimPending, &classGold),
 | 
			
		||||
			newClaimArray("claim12-1", "uid12-1", "1Gi", "pvc-uid12-1", v1.ClaimBound, &classGold, annBoundByController, annBindCompleted, annStorageProvisioner),
 | 
			
		||||
			noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{provision1Success}, testSyncClaim),
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,6 @@ import (
 | 
			
		||||
	"k8s.io/kubernetes/pkg/api"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/api/v1"
 | 
			
		||||
	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"
 | 
			
		||||
	corelisters "k8s.io/kubernetes/pkg/client/listers/core/v1"
 | 
			
		||||
	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))
 | 
			
		||||
			// No PV could be found
 | 
			
		||||
			// 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 {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
@@ -1224,7 +1223,7 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claimObj interfa
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	claimClass := storageutil.GetClaimStorageClass(claim)
 | 
			
		||||
	claimClass := v1.GetPersistentVolumeClaimClass(claim)
 | 
			
		||||
	glog.V(4).Infof("provisionClaimOperation [%s] started, class: %q", claimToClaimKey(claim), claimClass)
 | 
			
		||||
 | 
			
		||||
	plugin, storageClass, err := ctrl.findProvisionablePlugin(claim)
 | 
			
		||||
@@ -1332,7 +1331,7 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claimObj interfa
 | 
			
		||||
	// by storage.AlphaStorageClassAnnotation
 | 
			
		||||
	// TODO: remove this check in 1.5, storage.StorageClassAnnotation will be always non-empty there.
 | 
			
		||||
	if claimClass != "" {
 | 
			
		||||
		metav1.SetMetaDataAnnotation(&volume.ObjectMeta, storageutil.StorageClassAnnotation, claimClass)
 | 
			
		||||
		volume.Spec.StorageClassName = claimClass
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Try to create the PV object several times
 | 
			
		||||
@@ -1439,12 +1438,12 @@ func (ctrl *PersistentVolumeController) newRecyclerEventRecorder(volume *v1.Pers
 | 
			
		||||
// provisioner is requested.
 | 
			
		||||
func (ctrl *PersistentVolumeController) findProvisionablePlugin(claim *v1.PersistentVolumeClaim) (vol.ProvisionableVolumePlugin, *storage.StorageClass, error) {
 | 
			
		||||
	// TODO: remove this alpha behavior in 1.5
 | 
			
		||||
	alpha := metav1.HasAnnotation(claim.ObjectMeta, storageutil.AlphaStorageClassAnnotation)
 | 
			
		||||
	beta := metav1.HasAnnotation(claim.ObjectMeta, storageutil.BetaStorageClassAnnotation)
 | 
			
		||||
	if alpha && beta {
 | 
			
		||||
		// Both Alpha and Beta annotations are set. Do beta.
 | 
			
		||||
	alpha := metav1.HasAnnotation(claim.ObjectMeta, v1.AlphaStorageClassAnnotation)
 | 
			
		||||
	if alpha && v1.PersistentVolumeClaimHasClass(claim) {
 | 
			
		||||
		// Both Alpha annotation and storage class name is set. Use the storage
 | 
			
		||||
		// class name.
 | 
			
		||||
		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)
 | 
			
		||||
	}
 | 
			
		||||
	if alpha {
 | 
			
		||||
@@ -1454,7 +1453,7 @@ func (ctrl *PersistentVolumeController) findProvisionablePlugin(claim *v1.Persis
 | 
			
		||||
 | 
			
		||||
	// provisionClaim() which leads here is never called with claimClass=="", we
 | 
			
		||||
	// can save some checks.
 | 
			
		||||
	claimClass := storageutil.GetClaimStorageClass(claim)
 | 
			
		||||
	claimClass := v1.GetPersistentVolumeClaimClass(claim)
 | 
			
		||||
	class, err := ctrl.classLister.Get(claimClass)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		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.
 | 
			
		||||
			"5-2 - complete bind",
 | 
			
		||||
			newVolumeArray("volume5-2", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain),
 | 
			
		||||
			newVolumeArray("volume5-2", "1Gi", "uid5-2", "claim5-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, annBoundByController),
 | 
			
		||||
			newVolumeArray("volume5-2", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRetain, classEmpty),
 | 
			
		||||
			newVolumeArray("volume5-2", "1Gi", "uid5-2", "claim5-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classEmpty, annBoundByController),
 | 
			
		||||
			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,
 | 
			
		||||
			// Custom test function that generates an add event
 | 
			
		||||
			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)
 | 
			
		||||
				return nil
 | 
			
		||||
			},
 | 
			
		||||
@@ -60,9 +60,9 @@ func TestControllerSync(t *testing.T) {
 | 
			
		||||
		{
 | 
			
		||||
			// deleteClaim with a bound claim makes bound volume released.
 | 
			
		||||
			"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.VolumeReleased, v1.PersistentVolumeReclaimRetain, annBoundByController),
 | 
			
		||||
			newClaimArray("claim5-3", "uid5-3", "1Gi", "volume5-3", v1.ClaimBound, annBoundByController, annBindCompleted),
 | 
			
		||||
			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, classEmpty, annBoundByController),
 | 
			
		||||
			newClaimArray("claim5-3", "uid5-3", "1Gi", "volume5-3", v1.ClaimBound, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noevents, noerrors,
 | 
			
		||||
			// 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.
 | 
			
		||||
			"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,
 | 
			
		||||
			newClaimArray("claim5-4", "uid5-4", "1Gi", "volume5-4", v1.ClaimBound, annBoundByController, annBindCompleted),
 | 
			
		||||
			newClaimArray("claim5-4", "uid5-4", "1Gi", "volume5-4", v1.ClaimLost, 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, nil, annBoundByController, annBindCompleted),
 | 
			
		||||
			[]string{"Warning ClaimLost"}, noerrors,
 | 
			
		||||
			// Custom test function that generates a delete event
 | 
			
		||||
			func(ctrl *PersistentVolumeController, reactor *volumeReactor, test controllerTest) error {
 | 
			
		||||
@@ -94,13 +94,13 @@ func TestControllerSync(t *testing.T) {
 | 
			
		||||
			// is expected - it should stay bound.
 | 
			
		||||
			"5-5 - add bound volume from 1.2",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			[]*v1.PersistentVolume{addVolumeAnnotation(newVolume("volume5-5", "1Gi", "uid5-5", "claim5-5", v1.VolumeBound, v1.PersistentVolumeReclaimDelete), pvProvisioningRequiredAnnotationKey, pvProvisioningCompletedAnnotationValue)},
 | 
			
		||||
			newClaimArray("claim5-5", "uid5-5", "1Gi", "", v1.ClaimPending),
 | 
			
		||||
			newClaimArray("claim5-5", "uid5-5", "1Gi", "volume5-5", v1.ClaimBound, annBindCompleted, annBoundByController),
 | 
			
		||||
			[]*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, nil),
 | 
			
		||||
			newClaimArray("claim5-5", "uid5-5", "1Gi", "volume5-5", v1.ClaimBound, nil, annBindCompleted, annBoundByController),
 | 
			
		||||
			noevents, noerrors,
 | 
			
		||||
			// Custom test function that generates a add event
 | 
			
		||||
			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)
 | 
			
		||||
				reactor.addVolumeEvent(volume)
 | 
			
		||||
				return nil
 | 
			
		||||
@@ -110,14 +110,14 @@ func TestControllerSync(t *testing.T) {
 | 
			
		||||
			// updateVolume with provisioned volume from Kubernetes 1.2. No
 | 
			
		||||
			// "action" is expected - it should stay bound.
 | 
			
		||||
			"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), pvProvisioningRequiredAnnotationKey, pvProvisioningCompletedAnnotationValue)},
 | 
			
		||||
			newClaimArray("claim5-6", "uid5-6", "1Gi", "volume5-6", v1.ClaimBound),
 | 
			
		||||
			newClaimArray("claim5-6", "uid5-6", "1Gi", "volume5-6", v1.ClaimBound, annBindCompleted),
 | 
			
		||||
			[]*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, classEmpty), pvProvisioningRequiredAnnotationKey, pvProvisioningCompletedAnnotationValue)},
 | 
			
		||||
			newClaimArray("claim5-6", "uid5-6", "1Gi", "volume5-6", v1.ClaimBound, nil),
 | 
			
		||||
			newClaimArray("claim5-6", "uid5-6", "1Gi", "volume5-6", v1.ClaimBound, nil, annBindCompleted),
 | 
			
		||||
			noevents, noerrors,
 | 
			
		||||
			// Custom test function that generates a add event
 | 
			
		||||
			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)
 | 
			
		||||
				reactor.modifyVolumeEvent(volume)
 | 
			
		||||
				return nil
 | 
			
		||||
@@ -129,12 +129,12 @@ func TestControllerSync(t *testing.T) {
 | 
			
		||||
			"5-7 - add unprovisioned volume from 1.2",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newClaimArray("claim5-7", "uid5-7", "1Gi", "", v1.ClaimPending),
 | 
			
		||||
			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, nil),
 | 
			
		||||
			noevents, noerrors,
 | 
			
		||||
			// Custom test function that generates a add event
 | 
			
		||||
			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")
 | 
			
		||||
				reactor.addVolumeEvent(volume)
 | 
			
		||||
				return nil
 | 
			
		||||
@@ -146,12 +146,12 @@ func TestControllerSync(t *testing.T) {
 | 
			
		||||
			"5-8 - update bound volume from 1.2",
 | 
			
		||||
			novolumes,
 | 
			
		||||
			novolumes,
 | 
			
		||||
			newClaimArray("claim5-8", "uid5-8", "1Gi", "", v1.ClaimPending),
 | 
			
		||||
			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, nil),
 | 
			
		||||
			noevents, noerrors,
 | 
			
		||||
			// Custom test function that generates a add event
 | 
			
		||||
			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")
 | 
			
		||||
				reactor.modifyVolumeEvent(volume)
 | 
			
		||||
				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) {
 | 
			
		||||
	pv := newVolume("pvName", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimDelete)
 | 
			
		||||
	pv := newVolume("pvName", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimDelete, classEmpty)
 | 
			
		||||
	pv.ResourceVersion = version
 | 
			
		||||
	ret, err := storeObjectUpdate(c, pv, "volume")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -283,7 +283,7 @@ func TestControllerCacheParsingError(t *testing.T) {
 | 
			
		||||
	// There must be something in the cache to compare with
 | 
			
		||||
	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"
 | 
			
		||||
	_, err := storeObjectUpdate(c, pv, "volume")
 | 
			
		||||
	if err == nil {
 | 
			
		||||
 
 | 
			
		||||
@@ -33,8 +33,8 @@ func TestRecycleSync(t *testing.T) {
 | 
			
		||||
		{
 | 
			
		||||
			// recycle volume bound by controller
 | 
			
		||||
			"6-1 - successful recycle",
 | 
			
		||||
			newVolumeArray("volume6-1", "1Gi", "uid6-1", "claim6-1", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle, annBoundByController),
 | 
			
		||||
			newVolumeArray("volume6-1", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle),
 | 
			
		||||
			newVolumeArray("volume6-1", "1Gi", "uid6-1", "claim6-1", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle, classEmpty, annBoundByController),
 | 
			
		||||
			newVolumeArray("volume6-1", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle, classEmpty),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noevents, noerrors,
 | 
			
		||||
@@ -45,8 +45,8 @@ func TestRecycleSync(t *testing.T) {
 | 
			
		||||
		{
 | 
			
		||||
			// recycle volume bound by user
 | 
			
		||||
			"6-2 - successful recycle with prebound volume",
 | 
			
		||||
			newVolumeArray("volume6-2", "1Gi", "uid6-2", "claim6-2", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle),
 | 
			
		||||
			newVolumeArray("volume6-2", "1Gi", "", "claim6-2", v1.VolumeAvailable, 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, classEmpty),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noevents, noerrors,
 | 
			
		||||
@@ -57,8 +57,8 @@ func TestRecycleSync(t *testing.T) {
 | 
			
		||||
		{
 | 
			
		||||
			// recycle failure - plugin not found
 | 
			
		||||
			"6-3 - plugin not found",
 | 
			
		||||
			newVolumeArray("volume6-3", "1Gi", "uid6-3", "claim6-3", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle),
 | 
			
		||||
			withMessage("No recycler plugin found for the volume!", newVolumeArray("volume6-3", "1Gi", "uid6-3", "claim6-3", v1.VolumeFailed, 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, classEmpty)),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			[]string{"Warning VolumeFailedRecycle"}, noerrors, testSyncVolume,
 | 
			
		||||
@@ -66,8 +66,8 @@ func TestRecycleSync(t *testing.T) {
 | 
			
		||||
		{
 | 
			
		||||
			// recycle failure - Recycle returns error
 | 
			
		||||
			"6-4 - newRecycler returns error",
 | 
			
		||||
			newVolumeArray("volume6-4", "1Gi", "uid6-4", "claim6-4", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle),
 | 
			
		||||
			withMessage("Recycle failed: Mock plugin error: no recycleCalls configured", newVolumeArray("volume6-4", "1Gi", "uid6-4", "claim6-4", v1.VolumeFailed, 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, classEmpty)),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			[]string{"Warning VolumeFailedRecycle"}, noerrors,
 | 
			
		||||
@@ -76,8 +76,8 @@ func TestRecycleSync(t *testing.T) {
 | 
			
		||||
		{
 | 
			
		||||
			// recycle failure - recycle returns error
 | 
			
		||||
			"6-5 - recycle returns error",
 | 
			
		||||
			newVolumeArray("volume6-5", "1Gi", "uid6-5", "claim6-5", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle),
 | 
			
		||||
			withMessage("Recycle failed: Mock recycle error", newVolumeArray("volume6-5", "1Gi", "uid6-5", "claim6-5", v1.VolumeFailed, 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, classEmpty)),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			[]string{"Warning VolumeFailedRecycle"}, noerrors,
 | 
			
		||||
@@ -86,7 +86,7 @@ func TestRecycleSync(t *testing.T) {
 | 
			
		||||
		{
 | 
			
		||||
			// recycle success(?) - volume is deleted before doRecycle() starts
 | 
			
		||||
			"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,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
@@ -103,8 +103,8 @@ func TestRecycleSync(t *testing.T) {
 | 
			
		||||
			// at the time new doRecycle() starts. This simulates "volume no
 | 
			
		||||
			// longer needs recycling, skipping".
 | 
			
		||||
			"6-7 - volume is deleted before recycling",
 | 
			
		||||
			newVolumeArray("volume6-7", "1Gi", "uid6-7", "claim6-7", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle, annBoundByController),
 | 
			
		||||
			newVolumeArray("volume6-7", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle),
 | 
			
		||||
			newVolumeArray("volume6-7", "1Gi", "uid6-7", "claim6-7", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle, classEmpty, annBoundByController),
 | 
			
		||||
			newVolumeArray("volume6-7", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle, classEmpty),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noevents, noerrors,
 | 
			
		||||
@@ -124,8 +124,8 @@ func TestRecycleSync(t *testing.T) {
 | 
			
		||||
			// "volume no longer needs recycling, skipping" with volume bound by
 | 
			
		||||
			// user.
 | 
			
		||||
			"6-8 - prebound volume is deleted before recycling",
 | 
			
		||||
			newVolumeArray("volume6-8", "1Gi", "uid6-8", "claim6-8", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle),
 | 
			
		||||
			newVolumeArray("volume6-8", "1Gi", "", "claim6-8", v1.VolumeAvailable, 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, classEmpty),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noevents, noerrors,
 | 
			
		||||
@@ -142,10 +142,10 @@ func TestRecycleSync(t *testing.T) {
 | 
			
		||||
			// recycle success - volume bound by user is recycled, while a new
 | 
			
		||||
			// claim is created with another UID.
 | 
			
		||||
			"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", "", "claim6-9", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle),
 | 
			
		||||
			newClaimArray("claim6-9", "uid6-9-x", "10Gi", "", v1.ClaimPending),
 | 
			
		||||
			newClaimArray("claim6-9", "uid6-9-x", "10Gi", "", v1.ClaimPending),
 | 
			
		||||
			newVolumeArray("volume6-9", "1Gi", "uid6-9", "claim6-9", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle, classEmpty),
 | 
			
		||||
			newVolumeArray("volume6-9", "1Gi", "", "claim6-9", v1.VolumeAvailable, v1.PersistentVolumeReclaimRecycle, classEmpty),
 | 
			
		||||
			newClaimArray("claim6-9", "uid6-9-x", "10Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			newClaimArray("claim6-9", "uid6-9-x", "10Gi", "", v1.ClaimPending, nil),
 | 
			
		||||
			noevents, noerrors,
 | 
			
		||||
			// Inject recycler into the controller and call syncVolume. The
 | 
			
		||||
			// recycler simulates one recycle() call that succeeds.
 | 
			
		||||
@@ -154,8 +154,8 @@ func TestRecycleSync(t *testing.T) {
 | 
			
		||||
		{
 | 
			
		||||
			// volume has unknown reclaim policy - failure expected
 | 
			
		||||
			"6-10 - unknown reclaim policy",
 | 
			
		||||
			newVolumeArray("volume6-10", "1Gi", "uid6-10", "claim6-10", v1.VolumeBound, "Unknown"),
 | 
			
		||||
			withMessage("Volume has unrecognized PersistentVolumeReclaimPolicy", newVolumeArray("volume6-10", "1Gi", "uid6-10", "claim6-10", v1.VolumeFailed, "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", classEmpty)),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			[]string{"Warning VolumeUnknownReclaimPolicy"}, noerrors, testSyncVolume,
 | 
			
		||||
@@ -184,8 +184,8 @@ func TestRecycleMultiSync(t *testing.T) {
 | 
			
		||||
			// recycle failure - recycle returns error. The controller should
 | 
			
		||||
			// try again.
 | 
			
		||||
			"7-1 - recycle returns error",
 | 
			
		||||
			newVolumeArray("volume7-1", "1Gi", "uid7-1", "claim7-1", v1.VolumeBound, v1.PersistentVolumeReclaimRecycle),
 | 
			
		||||
			newVolumeArray("volume7-1", "1Gi", "", "claim7-1", v1.VolumeAvailable, 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, classEmpty),
 | 
			
		||||
			noclaims,
 | 
			
		||||
			noclaims,
 | 
			
		||||
			[]string{"Warning VolumeFailedRecycle"}, noerrors,
 | 
			
		||||
 
 | 
			
		||||
@@ -17840,6 +17840,104 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope
 | 
			
		||||
			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/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": {
 | 
			
		||||
			Schema: spec.Schema{
 | 
			
		||||
				SchemaProps: spec.SchemaProps{
 | 
			
		||||
 
 | 
			
		||||
@@ -51,6 +51,7 @@ go_library(
 | 
			
		||||
        "//pkg/apis/settings/install:go_default_library",
 | 
			
		||||
        "//pkg/apis/settings/v1alpha1: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/client/clientset_generated/clientset/typed/core/v1: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"
 | 
			
		||||
	rbacv1beta1 "k8s.io/kubernetes/pkg/apis/rbac/v1beta1"
 | 
			
		||||
	settingsapi "k8s.io/kubernetes/pkg/apis/settings/v1alpha1"
 | 
			
		||||
	storageapiv1 "k8s.io/kubernetes/pkg/apis/storage/v1"
 | 
			
		||||
	storageapiv1beta1 "k8s.io/kubernetes/pkg/apis/storage/v1beta1"
 | 
			
		||||
	corev1client "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/core/v1"
 | 
			
		||||
	coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
 | 
			
		||||
@@ -375,6 +376,7 @@ func DefaultAPIResourceConfigSource() *serverstorage.ResourceConfig {
 | 
			
		||||
		rbacv1beta1.SchemeGroupVersion,
 | 
			
		||||
		rbacapi.SchemeGroupVersion,
 | 
			
		||||
		settingsapi.SchemeGroupVersion,
 | 
			
		||||
		storageapiv1.SchemeGroupVersion,
 | 
			
		||||
		storageapiv1beta1.SchemeGroupVersion,
 | 
			
		||||
		certificatesapiv1beta1.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)
 | 
			
		||||
		printLabelsMultiline(w, "Labels", pv.Labels)
 | 
			
		||||
		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)
 | 
			
		||||
		if pv.Spec.ClaimRef != nil {
 | 
			
		||||
			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.Write(LEVEL_0, "Name:\t%s\n", pvc.Name)
 | 
			
		||||
		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, "Volume:\t%s\n", pvc.Spec.VolumeName)
 | 
			
		||||
		printLabelsMultiline(w, "Labels", pvc.Labels)
 | 
			
		||||
 
 | 
			
		||||
@@ -1179,7 +1179,7 @@ func printPersistentVolume(pv *api.PersistentVolume, w io.Writer, options printe
 | 
			
		||||
		aSize, modesStr, reclaimPolicyStr,
 | 
			
		||||
		pv.Status.Phase,
 | 
			
		||||
		claimRefUID,
 | 
			
		||||
		storageutil.GetStorageClassAnnotation(pv.ObjectMeta),
 | 
			
		||||
		api.GetPersistentVolumeClass(pv),
 | 
			
		||||
		pv.Status.Reason,
 | 
			
		||||
		translateTimestamp(pv.CreationTimestamp),
 | 
			
		||||
	); err != nil {
 | 
			
		||||
@@ -1222,7 +1222,7 @@ func printPersistentVolumeClaim(pvc *api.PersistentVolumeClaim, w io.Writer, opt
 | 
			
		||||
		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
 | 
			
		||||
	}
 | 
			
		||||
	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/v1: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/informers/informers_generated/externalversions:go_default_library",
 | 
			
		||||
        "//pkg/kubelet/qos:go_default_library",
 | 
			
		||||
@@ -53,7 +52,6 @@ go_test(
 | 
			
		||||
    tags = ["automanaged"],
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//pkg/api:go_default_library",
 | 
			
		||||
        "//pkg/apis/storage/util:go_default_library",
 | 
			
		||||
        "//pkg/client/clientset_generated/clientset/fake:go_default_library",
 | 
			
		||||
        "//pkg/quota:go_default_library",
 | 
			
		||||
        "//vendor:k8s.io/apimachinery/pkg/api/resource",
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,6 @@ import (
 | 
			
		||||
	"k8s.io/apiserver/pkg/admission"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/api"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/api/v1"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/apis/storage/util"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
 | 
			
		||||
	informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions"
 | 
			
		||||
	"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
 | 
			
		||||
	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.ResourceRequestsStorage))
 | 
			
		||||
	}
 | 
			
		||||
@@ -176,7 +175,7 @@ func (p *pvcEvaluator) Usage(item runtime.Object) (api.ResourceList, error) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return result, err
 | 
			
		||||
	}
 | 
			
		||||
	storageClassRef := util.GetClaimStorageClass(pvc)
 | 
			
		||||
	storageClassRef := api.GetPersistentVolumeClaimClass(pvc)
 | 
			
		||||
 | 
			
		||||
	// charge for claim
 | 
			
		||||
	result[api.ResourcePersistentVolumeClaims] = resource.MustParse("1")
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,6 @@ import (
 | 
			
		||||
	"k8s.io/apimachinery/pkg/api/resource"
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"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/quota"
 | 
			
		||||
)
 | 
			
		||||
@@ -35,6 +34,9 @@ func testVolumeClaim(name string, namespace string, spec api.PersistentVolumeCla
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestPersistentVolumeClaimsConstraintsFunc(t *testing.T) {
 | 
			
		||||
	classGold := "gold"
 | 
			
		||||
	classBronze := "bronze"
 | 
			
		||||
 | 
			
		||||
	validClaim := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{
 | 
			
		||||
		Selector: &metav1.LabelSelector{
 | 
			
		||||
			MatchExpressions: []metav1.LabelSelectorRequirement{
 | 
			
		||||
@@ -72,10 +74,8 @@ func TestPersistentVolumeClaimsConstraintsFunc(t *testing.T) {
 | 
			
		||||
				api.ResourceName(api.ResourceStorage): resource.MustParse("10Gi"),
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		StorageClassName: &classGold,
 | 
			
		||||
	})
 | 
			
		||||
	validClaimGoldStorageClass.Annotations = map[string]string{
 | 
			
		||||
		util.StorageClassAnnotation: "gold",
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	validClaimBronzeStorageClass := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{
 | 
			
		||||
		Selector: &metav1.LabelSelector{
 | 
			
		||||
@@ -95,10 +95,8 @@ func TestPersistentVolumeClaimsConstraintsFunc(t *testing.T) {
 | 
			
		||||
				api.ResourceName(api.ResourceStorage): resource.MustParse("10Gi"),
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		StorageClassName: &classBronze,
 | 
			
		||||
	})
 | 
			
		||||
	validClaimBronzeStorageClass.Annotations = map[string]string{
 | 
			
		||||
		util.StorageClassAnnotation: "bronze",
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	missingStorage := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{
 | 
			
		||||
		Selector: &metav1.LabelSelector{
 | 
			
		||||
@@ -134,10 +132,8 @@ func TestPersistentVolumeClaimsConstraintsFunc(t *testing.T) {
 | 
			
		||||
		Resources: api.ResourceRequirements{
 | 
			
		||||
			Requests: api.ResourceList{},
 | 
			
		||||
		},
 | 
			
		||||
		StorageClassName: &classGold,
 | 
			
		||||
	})
 | 
			
		||||
	missingGoldStorage.Annotations = map[string]string{
 | 
			
		||||
		util.StorageClassAnnotation: "gold",
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	testCases := map[string]struct {
 | 
			
		||||
		pvc      *api.PersistentVolumeClaim
 | 
			
		||||
@@ -151,7 +147,7 @@ func TestPersistentVolumeClaimsConstraintsFunc(t *testing.T) {
 | 
			
		||||
		},
 | 
			
		||||
		"missing gold storage": {
 | 
			
		||||
			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`,
 | 
			
		||||
		},
 | 
			
		||||
		"valid-claim-quota-storage": {
 | 
			
		||||
@@ -171,8 +167,8 @@ func TestPersistentVolumeClaimsConstraintsFunc(t *testing.T) {
 | 
			
		||||
			required: []api.ResourceName{
 | 
			
		||||
				api.ResourceRequestsStorage,
 | 
			
		||||
				api.ResourcePersistentVolumeClaims,
 | 
			
		||||
				ResourceByStorageClass("gold", api.ResourceRequestsStorage),
 | 
			
		||||
				ResourceByStorageClass("gold", api.ResourcePersistentVolumeClaims),
 | 
			
		||||
				ResourceByStorageClass(classGold, api.ResourceRequestsStorage),
 | 
			
		||||
				ResourceByStorageClass(classGold, api.ResourcePersistentVolumeClaims),
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		"valid-claim-bronze-with-quota-gold": {
 | 
			
		||||
@@ -180,8 +176,8 @@ func TestPersistentVolumeClaimsConstraintsFunc(t *testing.T) {
 | 
			
		||||
			required: []api.ResourceName{
 | 
			
		||||
				api.ResourceRequestsStorage,
 | 
			
		||||
				api.ResourcePersistentVolumeClaims,
 | 
			
		||||
				ResourceByStorageClass("gold", api.ResourceRequestsStorage),
 | 
			
		||||
				ResourceByStorageClass("gold", api.ResourcePersistentVolumeClaims),
 | 
			
		||||
				ResourceByStorageClass(classGold, api.ResourceRequestsStorage),
 | 
			
		||||
				ResourceByStorageClass(classGold, api.ResourcePersistentVolumeClaims),
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
@@ -200,6 +196,7 @@ func TestPersistentVolumeClaimsConstraintsFunc(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestPersistentVolumeClaimEvaluatorUsage(t *testing.T) {
 | 
			
		||||
	classGold := "gold"
 | 
			
		||||
	validClaim := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{
 | 
			
		||||
		Selector: &metav1.LabelSelector{
 | 
			
		||||
			MatchExpressions: []metav1.LabelSelectorRequirement{
 | 
			
		||||
@@ -237,11 +234,8 @@ func TestPersistentVolumeClaimEvaluatorUsage(t *testing.T) {
 | 
			
		||||
				api.ResourceName(api.ResourceStorage): resource.MustParse("10Gi"),
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		StorageClassName: &classGold,
 | 
			
		||||
	})
 | 
			
		||||
	storageClassName := "gold"
 | 
			
		||||
	validClaimByStorageClass.Annotations = map[string]string{
 | 
			
		||||
		util.StorageClassAnnotation: storageClassName,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	kubeClient := fake.NewSimpleClientset()
 | 
			
		||||
	evaluator := NewPersistentVolumeClaimEvaluator(kubeClient, nil)
 | 
			
		||||
@@ -261,8 +255,8 @@ func TestPersistentVolumeClaimEvaluatorUsage(t *testing.T) {
 | 
			
		||||
			usage: api.ResourceList{
 | 
			
		||||
				api.ResourceRequestsStorage:                                           resource.MustParse("10Gi"),
 | 
			
		||||
				api.ResourcePersistentVolumeClaims:                                    resource.MustParse("1"),
 | 
			
		||||
				ResourceByStorageClass(storageClassName, api.ResourceRequestsStorage):        resource.MustParse("10Gi"),
 | 
			
		||||
				ResourceByStorageClass(storageClassName, api.ResourcePersistentVolumeClaims): resource.MustParse("1"),
 | 
			
		||||
				ResourceByStorageClass(classGold, api.ResourceRequestsStorage):        resource.MustParse("10Gi"),
 | 
			
		||||
				ResourceByStorageClass(classGold, api.ResourcePersistentVolumeClaims): resource.MustParse("1"),
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@ go_library(
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//pkg/api:go_default_library",
 | 
			
		||||
        "//pkg/apis/storage:go_default_library",
 | 
			
		||||
        "//pkg/apis/storage/v1:go_default_library",
 | 
			
		||||
        "//pkg/apis/storage/v1beta1:go_default_library",
 | 
			
		||||
        "//pkg/registry/storage/storageclass/storage:go_default_library",
 | 
			
		||||
        "//vendor:k8s.io/apiserver/pkg/registry/generic",
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,7 @@ import (
 | 
			
		||||
	serverstorage "k8s.io/apiserver/pkg/server/storage"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/api"
 | 
			
		||||
	storageapi "k8s.io/kubernetes/pkg/apis/storage"
 | 
			
		||||
	storageapiv1 "k8s.io/kubernetes/pkg/apis/storage/v1"
 | 
			
		||||
	storageapiv1beta1 "k8s.io/kubernetes/pkg/apis/storage/v1beta1"
 | 
			
		||||
	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.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
 | 
			
		||||
}
 | 
			
		||||
@@ -54,6 +59,19 @@ func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorag
 | 
			
		||||
	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 {
 | 
			
		||||
	return storageapi.GroupName
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,6 @@ go_library(
 | 
			
		||||
    tags = ["automanaged"],
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//pkg/api/v1:go_default_library",
 | 
			
		||||
        "//pkg/apis/storage/v1beta1/util:go_default_library",
 | 
			
		||||
        "//pkg/client/clientset_generated/clientset:go_default_library",
 | 
			
		||||
        "//pkg/util/exec:go_default_library",
 | 
			
		||||
        "//pkg/util/mount:go_default_library",
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,6 @@ import (
 | 
			
		||||
	"k8s.io/apimachinery/pkg/labels"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/types"
 | 
			
		||||
	"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/util/exec"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/util/mount"
 | 
			
		||||
@@ -471,7 +470,7 @@ func (p *glusterfsPlugin) collectGids(className string, gidTable *MinMaxAllocato
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, pv := range pvList.Items {
 | 
			
		||||
		if storageutil.GetVolumeStorageClass(&pv) != className {
 | 
			
		||||
		if v1.GetPersistentVolumeClass(&pv) != className {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -650,7 +649,7 @@ func (r *glusterfsVolumeProvisioner) Provision() (*v1.PersistentVolume, error) {
 | 
			
		||||
		return nil, fmt.Errorf("glusterfs: not able to parse your claim Selector")
 | 
			
		||||
	}
 | 
			
		||||
	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())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
 
 | 
			
		||||
@@ -158,7 +158,7 @@ func GetClassForVolume(kubeClient clientset.Interface, pv *v1.PersistentVolume)
 | 
			
		||||
		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 {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -96,7 +96,7 @@ func (c *claimDefaulterPlugin) Admit(a admission.Attributes) error {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if storageutil.HasStorageClassAnnotation(pvc.ObjectMeta) {
 | 
			
		||||
	if api.PersistentVolumeClaimHasClass(pvc) {
 | 
			
		||||
		// The user asked for a class.
 | 
			
		||||
		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)
 | 
			
		||||
	if pvc.ObjectMeta.Annotations == nil {
 | 
			
		||||
		pvc.ObjectMeta.Annotations = map[string]string{}
 | 
			
		||||
	}
 | 
			
		||||
	pvc.Annotations[storageutil.StorageClassAnnotation] = def.Name
 | 
			
		||||
	pvc.Spec.StorageClassName = &def.Name
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,9 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestAdmission(t *testing.T) {
 | 
			
		||||
	empty := ""
 | 
			
		||||
	foo := "foo"
 | 
			
		||||
 | 
			
		||||
	defaultClass1 := &storage.StorageClass{
 | 
			
		||||
		TypeMeta: metav1.TypeMeta{
 | 
			
		||||
			Kind: "StorageClass",
 | 
			
		||||
@@ -99,9 +102,9 @@ func TestAdmission(t *testing.T) {
 | 
			
		||||
		ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
			Name:      "claimWithClass",
 | 
			
		||||
			Namespace: "ns",
 | 
			
		||||
			Annotations: map[string]string{
 | 
			
		||||
				storageutil.StorageClassAnnotation: "foo",
 | 
			
		||||
		},
 | 
			
		||||
		Spec: api.PersistentVolumeClaimSpec{
 | 
			
		||||
			StorageClassName: &foo,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	claimWithEmptyClass := &api.PersistentVolumeClaim{
 | 
			
		||||
@@ -111,9 +114,9 @@ func TestAdmission(t *testing.T) {
 | 
			
		||||
		ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
			Name:      "claimWithEmptyClass",
 | 
			
		||||
			Namespace: "ns",
 | 
			
		||||
			Annotations: map[string]string{
 | 
			
		||||
				storageutil.StorageClassAnnotation: "",
 | 
			
		||||
		},
 | 
			
		||||
		Spec: api.PersistentVolumeClaimSpec{
 | 
			
		||||
			StorageClassName: &empty,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	claimWithNoClass := &api.PersistentVolumeClaim{
 | 
			
		||||
@@ -221,10 +224,8 @@ func TestAdmission(t *testing.T) {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		class := ""
 | 
			
		||||
		if claim.Annotations != nil {
 | 
			
		||||
			if value, ok := claim.Annotations[storageutil.StorageClassAnnotation]; ok {
 | 
			
		||||
				class = value
 | 
			
		||||
			}
 | 
			
		||||
		if claim.Spec.StorageClassName != nil {
 | 
			
		||||
			class = *claim.Spec.StorageClassName
 | 
			
		||||
		}
 | 
			
		||||
		if test.expectedClassName != "" && 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"
 | 
			
		||||
	rbac_v1beta1 "k8s.io/client-go/pkg/apis/rbac/v1beta1"
 | 
			
		||||
	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"
 | 
			
		||||
	cache "k8s.io/client-go/tools/cache"
 | 
			
		||||
)
 | 
			
		||||
@@ -167,6 +168,10 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource
 | 
			
		||||
	case settings_v1alpha1.SchemeGroupVersion.WithResource("podpresets"):
 | 
			
		||||
		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
 | 
			
		||||
	case storage_v1beta1.SchemeGroupVersion.WithResource("storageclasses"):
 | 
			
		||||
		return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1beta1().StorageClasses().Informer()}, nil
 | 
			
		||||
 
 | 
			
		||||
@@ -20,11 +20,14 @@ package storage
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	internalinterfaces "k8s.io/client-go/informers/internalinterfaces"
 | 
			
		||||
	v1 "k8s.io/client-go/informers/storage/v1"
 | 
			
		||||
	v1beta1 "k8s.io/client-go/informers/storage/v1beta1"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Interface provides access to each of this group's versions.
 | 
			
		||||
type Interface interface {
 | 
			
		||||
	// V1 provides access to shared informers for resources in V1.
 | 
			
		||||
	V1() v1.Interface
 | 
			
		||||
	// V1beta1 provides access to shared informers for resources in V1beta1.
 | 
			
		||||
	V1beta1() v1beta1.Interface
 | 
			
		||||
}
 | 
			
		||||
@@ -38,6 +41,11 @@ func New(f internalinterfaces.SharedInformerFactory) Interface {
 | 
			
		||||
	return &group{f}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// V1 returns a new v1.Interface.
 | 
			
		||||
func (g *group) V1() v1.Interface {
 | 
			
		||||
	return v1.New(g.SharedInformerFactory)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// V1beta1 returns a new v1beta1.Interface.
 | 
			
		||||
func (g *group) V1beta1() v1beta1.Interface {
 | 
			
		||||
	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"
 | 
			
		||||
	rbacv1beta1 "k8s.io/client-go/kubernetes/typed/rbac/v1beta1"
 | 
			
		||||
	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"
 | 
			
		||||
	rest "k8s.io/client-go/rest"
 | 
			
		||||
	flowcontrol "k8s.io/client-go/util/flowcontrol"
 | 
			
		||||
@@ -81,8 +82,9 @@ type Interface interface {
 | 
			
		||||
	// Deprecated: please explicitly pick a version if possible.
 | 
			
		||||
	Settings() settingsv1alpha1.SettingsV1alpha1Interface
 | 
			
		||||
	StorageV1beta1() storagev1beta1.StorageV1beta1Interface
 | 
			
		||||
	StorageV1() storagev1.StorageV1Interface
 | 
			
		||||
	// 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
 | 
			
		||||
@@ -106,6 +108,7 @@ type Clientset struct {
 | 
			
		||||
	*rbacv1alpha1.RbacV1alpha1Client
 | 
			
		||||
	*settingsv1alpha1.SettingsV1alpha1Client
 | 
			
		||||
	*storagev1beta1.StorageV1beta1Client
 | 
			
		||||
	*storagev1.StorageV1Client
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CoreV1 retrieves the CoreV1Client
 | 
			
		||||
@@ -343,13 +346,21 @@ func (c *Clientset) StorageV1beta1() storagev1beta1.StorageV1beta1Interface {
 | 
			
		||||
	return c.StorageV1beta1Client
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Deprecated: Storage retrieves the default version of StorageClient.
 | 
			
		||||
// Please explicitly pick a version.
 | 
			
		||||
func (c *Clientset) Storage() storagev1beta1.StorageV1beta1Interface {
 | 
			
		||||
// StorageV1 retrieves the StorageV1Client
 | 
			
		||||
func (c *Clientset) StorageV1() storagev1.StorageV1Interface {
 | 
			
		||||
	if c == 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
 | 
			
		||||
@@ -436,6 +447,10 @@ func NewForConfig(c *rest.Config) (*Clientset, error) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	cs.StorageV1Client, err = storagev1.NewForConfig(&configShallowCopy)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -466,6 +481,7 @@ func NewForConfigOrDie(c *rest.Config) *Clientset {
 | 
			
		||||
	cs.RbacV1alpha1Client = rbacv1alpha1.NewForConfigOrDie(c)
 | 
			
		||||
	cs.SettingsV1alpha1Client = settingsv1alpha1.NewForConfigOrDie(c)
 | 
			
		||||
	cs.StorageV1beta1Client = storagev1beta1.NewForConfigOrDie(c)
 | 
			
		||||
	cs.StorageV1Client = storagev1.NewForConfigOrDie(c)
 | 
			
		||||
 | 
			
		||||
	cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c)
 | 
			
		||||
	return &cs
 | 
			
		||||
@@ -491,6 +507,7 @@ func New(c rest.Interface) *Clientset {
 | 
			
		||||
	cs.RbacV1alpha1Client = rbacv1alpha1.New(c)
 | 
			
		||||
	cs.SettingsV1alpha1Client = settingsv1alpha1.New(c)
 | 
			
		||||
	cs.StorageV1beta1Client = storagev1beta1.New(c)
 | 
			
		||||
	cs.StorageV1Client = storagev1.New(c)
 | 
			
		||||
 | 
			
		||||
	cs.DiscoveryClient = discovery.NewDiscoveryClient(c)
 | 
			
		||||
	return &cs
 | 
			
		||||
 
 | 
			
		||||
@@ -54,6 +54,8 @@ import (
 | 
			
		||||
	fakerbacv1beta1 "k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake"
 | 
			
		||||
	settingsv1alpha1 "k8s.io/client-go/kubernetes/typed/settings/v1alpha1"
 | 
			
		||||
	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"
 | 
			
		||||
	fakestoragev1beta1 "k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake"
 | 
			
		||||
	"k8s.io/client-go/testing"
 | 
			
		||||
@@ -232,7 +234,12 @@ func (c *Clientset) StorageV1beta1() storagev1beta1.StorageV1beta1Interface {
 | 
			
		||||
	return &fakestoragev1beta1.FakeStorageV1beta1{Fake: &c.Fake}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Storage retrieves the StorageV1beta1Client
 | 
			
		||||
func (c *Clientset) Storage() storagev1beta1.StorageV1beta1Interface {
 | 
			
		||||
	return &fakestoragev1beta1.FakeStorageV1beta1{Fake: &c.Fake}
 | 
			
		||||
// StorageV1 retrieves the StorageV1Client
 | 
			
		||||
func (c *Clientset) StorageV1() storagev1.StorageV1Interface {
 | 
			
		||||
	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"
 | 
			
		||||
	rbacv1beta1 "k8s.io/client-go/pkg/apis/rbac/v1beta1"
 | 
			
		||||
	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"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -81,5 +82,6 @@ func AddToScheme(scheme *runtime.Scheme) {
 | 
			
		||||
	rbacv1alpha1.AddToScheme(scheme)
 | 
			
		||||
	settingsv1alpha1.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