Merge pull request #47987 from wongma7/reclaimpolicy

Automatic merge from submit-queue (batch tested with PRs 49869, 47987, 50211, 50804, 50583)

Add ReclaimPolicy field to StorageClass

fix https://github.com/kubernetes/kubernetes/issues/38192, enough people want this imo so going ahead and adding it according to initial suggested design

some considerations:
* No Recycle allowed, Retain (& Delete) only.
* Do we need to gate the field.
* E2E test where a Retain PV is dynamically provisioned is TODO if we agree we want this & this is the way to do it.
* Need a feature repo issue to track docs and stuff for 1.8

**Release note**:

```release-note
StorageClass has a new field to configure reclaim policy of dynamically provisioned PVs.
```
This commit is contained in:
Kubernetes Submit Queue 2017-08-17 01:32:18 -07:00 committed by GitHub
commit 9c8f74e45c
46 changed files with 757 additions and 232 deletions

View File

@ -64235,6 +64235,10 @@
"provisioner": { "provisioner": {
"description": "Provisioner indicates the type of the provisioner.", "description": "Provisioner indicates the type of the provisioner.",
"type": "string" "type": "string"
},
"reclaimPolicy": {
"description": "Dynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.",
"type": "string"
} }
}, },
"x-kubernetes-group-version-kind": [ "x-kubernetes-group-version-kind": [
@ -64307,6 +64311,10 @@
"provisioner": { "provisioner": {
"description": "Provisioner indicates the type of the provisioner.", "description": "Provisioner indicates the type of the provisioner.",
"type": "string" "type": "string"
},
"reclaimPolicy": {
"description": "Dynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.",
"type": "string"
} }
}, },
"x-kubernetes-group-version-kind": [ "x-kubernetes-group-version-kind": [

View File

@ -716,6 +716,10 @@
"parameters": { "parameters": {
"type": "object", "type": "object",
"description": "Parameters holds the parameters for the provisioner that should create volumes of this storage class." "description": "Parameters holds the parameters for the provisioner that should create volumes of this storage class."
},
"reclaimPolicy": {
"$ref": "v1.PersistentVolumeReclaimPolicy",
"description": "Dynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete."
} }
} }
}, },
@ -957,6 +961,10 @@
} }
} }
}, },
"v1.PersistentVolumeReclaimPolicy": {
"id": "v1.PersistentVolumeReclaimPolicy",
"properties": {}
},
"v1.WatchEvent": { "v1.WatchEvent": {
"id": "v1.WatchEvent", "id": "v1.WatchEvent",
"required": [ "required": [

View File

@ -716,6 +716,10 @@
"parameters": { "parameters": {
"type": "object", "type": "object",
"description": "Parameters holds the parameters for the provisioner that should create volumes of this storage class." "description": "Parameters holds the parameters for the provisioner that should create volumes of this storage class."
},
"reclaimPolicy": {
"$ref": "v1.PersistentVolumeReclaimPolicy",
"description": "Dynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete."
} }
} }
}, },
@ -957,6 +961,10 @@
} }
} }
}, },
"v1.PersistentVolumeReclaimPolicy": {
"id": "v1.PersistentVolumeReclaimPolicy",
"properties": {}
},
"v1.WatchEvent": { "v1.WatchEvent": {
"id": "v1.WatchEvent", "id": "v1.WatchEvent",
"required": [ "required": [

View File

@ -968,6 +968,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
<td class="tableblock halign-left valign-top"><p class="tableblock">object</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">object</p></td>
<td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td>
</tr> </tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">reclaimPolicy</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Dynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_persistentvolumereclaimpolicy">v1.PersistentVolumeReclaimPolicy</a></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
</tbody> </tbody>
</table> </table>
@ -1195,6 +1202,10 @@ When an object is created, the system will populate this list with the current s
</tbody> </tbody>
</table> </table>
</div>
<div class="sect2">
<h3 id="_v1_persistentvolumereclaimpolicy">v1.PersistentVolumeReclaimPolicy</h3>
</div> </div>
<div class="sect2"> <div class="sect2">
<h3 id="_v1_apiresource">v1.APIResource</h3> <h3 id="_v1_apiresource">v1.APIResource</h3>

View File

@ -436,6 +436,12 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
</tbody> </tbody>
</table> </table>
</div>
<div class="sect2">
<h3 id="_v1_patch">v1.Patch</h3>
<div class="paragraph">
<p>Patch is provided to give a concrete name and type to the Kubernetes PATCH request body.</p>
</div>
</div> </div>
<div class="sect2"> <div class="sect2">
<h3 id="_v1beta1_storageclasslist">v1beta1.StorageClassList</h3> <h3 id="_v1beta1_storageclasslist">v1beta1.StorageClassList</h3>
@ -491,12 +497,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
</tbody> </tbody>
</table> </table>
</div>
<div class="sect2">
<h3 id="_v1_patch">v1.Patch</h3>
<div class="paragraph">
<p>Patch is provided to give a concrete name and type to the Kubernetes PATCH request body.</p>
</div>
</div> </div>
<div class="sect2"> <div class="sect2">
<h3 id="_v1_deleteoptions">v1.DeleteOptions</h3> <h3 id="_v1_deleteoptions">v1.DeleteOptions</h3>
@ -930,6 +930,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
<td class="tableblock halign-left valign-top"><p class="tableblock">object</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">object</p></td>
<td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td>
</tr> </tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">reclaimPolicy</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Dynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_persistentvolumereclaimpolicy">v1.PersistentVolumeReclaimPolicy</a></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
</tbody> </tbody>
</table> </table>
@ -1195,6 +1202,10 @@ When an object is created, the system will populate this list with the current s
</tbody> </tbody>
</table> </table>
</div>
<div class="sect2">
<h3 id="_v1_persistentvolumereclaimpolicy">v1.PersistentVolumeReclaimPolicy</h3>
</div> </div>
<div class="sect2"> <div class="sect2">
<h3 id="_v1_apiresource">v1.APIResource</h3> <h3 id="_v1_apiresource">v1.APIResource</h3>

View File

@ -129,6 +129,10 @@ func TestDefaulting(t *testing.T) {
{Group: "admissionregistration.k8s.io", Version: "v1alpha1", Kind: "ExternalAdmissionHookConfigurationList"}: {}, {Group: "admissionregistration.k8s.io", Version: "v1alpha1", Kind: "ExternalAdmissionHookConfigurationList"}: {},
{Group: "networking.k8s.io", Version: "v1", Kind: "NetworkPolicy"}: {}, {Group: "networking.k8s.io", Version: "v1", Kind: "NetworkPolicy"}: {},
{Group: "networking.k8s.io", Version: "v1", Kind: "NetworkPolicyList"}: {}, {Group: "networking.k8s.io", Version: "v1", Kind: "NetworkPolicyList"}: {},
{Group: "storage.k8s.io", Version: "v1beta1", Kind: "StorageClass"}: {},
{Group: "storage.k8s.io", Version: "v1beta1", Kind: "StorageClassList"}: {},
{Group: "storage.k8s.io", Version: "v1", Kind: "StorageClass"}: {},
{Group: "storage.k8s.io", Version: "v1", Kind: "StorageClassList"}: {},
} }
f := fuzz.New().NilChance(.5).NumElements(1, 1).RandSource(rand.NewSource(1)) f := fuzz.New().NilChance(.5).NumElements(1, 1).RandSource(rand.NewSource(1))

View File

@ -26,6 +26,7 @@ go_library(
"//pkg/apis/extensions/v1beta1:go_default_library", "//pkg/apis/extensions/v1beta1:go_default_library",
"//pkg/apis/policy/fuzzer:go_default_library", "//pkg/apis/policy/fuzzer:go_default_library",
"//pkg/apis/rbac/fuzzer:go_default_library", "//pkg/apis/rbac/fuzzer:go_default_library",
"//pkg/apis/storage/fuzzer:go_default_library",
"//vendor/github.com/google/gofuzz:go_default_library", "//vendor/github.com/google/gofuzz:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/testing:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/testing:go_default_library",

View File

@ -40,6 +40,7 @@ import (
extensionsv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" extensionsv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
policyfuzzer "k8s.io/kubernetes/pkg/apis/policy/fuzzer" policyfuzzer "k8s.io/kubernetes/pkg/apis/policy/fuzzer"
rbacfuzzer "k8s.io/kubernetes/pkg/apis/rbac/fuzzer" rbacfuzzer "k8s.io/kubernetes/pkg/apis/rbac/fuzzer"
storagefuzzer "k8s.io/kubernetes/pkg/apis/storage/fuzzer"
) )
// overrideGenericFuncs override some generic fuzzer funcs from k8s.io/apiserver in order to have more realistic // overrideGenericFuncs override some generic fuzzer funcs from k8s.io/apiserver in order to have more realistic
@ -100,4 +101,5 @@ var FuzzerFuncs = fuzzer.MergeFuzzerFuncs(
policyfuzzer.Funcs, policyfuzzer.Funcs,
certificatesfuzzer.Funcs, certificatesfuzzer.Funcs,
admissionregistrationfuzzer.Funcs, admissionregistrationfuzzer.Funcs,
storagefuzzer.Funcs,
) )

View File

@ -14,6 +14,7 @@ go_library(
"zz_generated.deepcopy.go", "zz_generated.deepcopy.go",
], ],
deps = [ deps = [
"//pkg/api:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",

View File

@ -8,7 +8,12 @@ load(
go_library( go_library(
name = "go_default_library", name = "go_default_library",
srcs = ["fuzzer.go"], srcs = ["fuzzer.go"],
deps = ["//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library"], deps = [
"//pkg/api:go_default_library",
"//pkg/apis/storage:go_default_library",
"//vendor/github.com/google/gofuzz:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library",
],
) )
filegroup( filegroup(

View File

@ -17,10 +17,20 @@ limitations under the License.
package fuzzer package fuzzer
import ( import (
fuzz "github.com/google/gofuzz"
runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/apis/storage"
) )
// Funcs returns the fuzzer functions for the storage api group. // Funcs returns the fuzzer functions for the storage api group.
var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} {
return []interface{}{} return []interface{}{
func(obj *storage.StorageClass, c fuzz.Continue) {
c.FuzzNoCustom(obj) // fuzz self without calling this function again
reclamationPolicies := []api.PersistentVolumeReclaimPolicy{api.PersistentVolumeReclaimDelete, api.PersistentVolumeReclaimRetain}
obj.ReclaimPolicy = &reclamationPolicies[c.Rand.Intn(len(reclamationPolicies))]
},
}
} }

View File

@ -16,7 +16,10 @@ limitations under the License.
package storage package storage
import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/api"
)
// +genclient // +genclient
// +genclient:nonNamespaced // +genclient:nonNamespaced
@ -46,6 +49,11 @@ type StorageClass struct {
// 512, with a cumulative max size of 256K // 512, with a cumulative max size of 256K
// +optional // +optional
Parameters map[string]string Parameters map[string]string
// reclaimPolicy is the reclaim policy that dynamically provisioned
// PersistentVolumes of this storage class are created with
// +optional
ReclaimPolicy *api.PersistentVolumeReclaimPolicy
} }
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

View File

@ -8,13 +8,16 @@ load(
go_library( go_library(
name = "go_default_library", name = "go_default_library",
srcs = [ srcs = [
"defaults.go",
"doc.go", "doc.go",
"register.go", "register.go",
"zz_generated.conversion.go", "zz_generated.conversion.go",
"zz_generated.defaults.go", "zz_generated.defaults.go",
], ],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/apis/storage:go_default_library", "//pkg/apis/storage:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/api/storage/v1:go_default_library", "//vendor/k8s.io/api/storage/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",

View File

@ -0,0 +1,34 @@
/*
Copyright 2017 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package v1
import (
"k8s.io/api/core/v1"
storagev1 "k8s.io/api/storage/v1"
"k8s.io/apimachinery/pkg/runtime"
)
func addDefaultingFuncs(scheme *runtime.Scheme) error {
return RegisterDefaults(scheme)
}
func SetDefaults_StorageClass(obj *storagev1.StorageClass) {
if obj.ReclaimPolicy == nil {
obj.ReclaimPolicy = new(v1.PersistentVolumeReclaimPolicy)
*obj.ReclaimPolicy = v1.PersistentVolumeReclaimDelete
}
}

View File

@ -41,5 +41,5 @@ func init() {
// We only register manually written functions here. The registration of the // We only register manually written functions here. The registration of the
// generated functions takes place in the generated files. The separation // generated functions takes place in the generated files. The separation
// makes the code compile even when the generated files are missing. // makes the code compile even when the generated files are missing.
localSchemeBuilder.Register(RegisterDefaults) localSchemeBuilder.Register(addDefaultingFuncs)
} }

View File

@ -21,9 +21,11 @@ limitations under the License.
package v1 package v1
import ( import (
core_v1 "k8s.io/api/core/v1"
v1 "k8s.io/api/storage/v1" v1 "k8s.io/api/storage/v1"
conversion "k8s.io/apimachinery/pkg/conversion" conversion "k8s.io/apimachinery/pkg/conversion"
runtime "k8s.io/apimachinery/pkg/runtime" runtime "k8s.io/apimachinery/pkg/runtime"
api "k8s.io/kubernetes/pkg/api"
storage "k8s.io/kubernetes/pkg/apis/storage" storage "k8s.io/kubernetes/pkg/apis/storage"
unsafe "unsafe" unsafe "unsafe"
) )
@ -47,6 +49,7 @@ func autoConvert_v1_StorageClass_To_storage_StorageClass(in *v1.StorageClass, ou
out.ObjectMeta = in.ObjectMeta out.ObjectMeta = in.ObjectMeta
out.Provisioner = in.Provisioner out.Provisioner = in.Provisioner
out.Parameters = *(*map[string]string)(unsafe.Pointer(&in.Parameters)) out.Parameters = *(*map[string]string)(unsafe.Pointer(&in.Parameters))
out.ReclaimPolicy = (*api.PersistentVolumeReclaimPolicy)(unsafe.Pointer(in.ReclaimPolicy))
return nil return nil
} }
@ -59,6 +62,7 @@ func autoConvert_storage_StorageClass_To_v1_StorageClass(in *storage.StorageClas
out.ObjectMeta = in.ObjectMeta out.ObjectMeta = in.ObjectMeta
out.Provisioner = in.Provisioner out.Provisioner = in.Provisioner
out.Parameters = *(*map[string]string)(unsafe.Pointer(&in.Parameters)) out.Parameters = *(*map[string]string)(unsafe.Pointer(&in.Parameters))
out.ReclaimPolicy = (*core_v1.PersistentVolumeReclaimPolicy)(unsafe.Pointer(in.ReclaimPolicy))
return nil return nil
} }

View File

@ -21,6 +21,7 @@ limitations under the License.
package v1 package v1
import ( import (
v1 "k8s.io/api/storage/v1"
runtime "k8s.io/apimachinery/pkg/runtime" runtime "k8s.io/apimachinery/pkg/runtime"
) )
@ -28,5 +29,18 @@ import (
// Public to allow building arbitrary schemes. // Public to allow building arbitrary schemes.
// All generated defaulters are covering - they call all nested defaulters. // All generated defaulters are covering - they call all nested defaulters.
func RegisterDefaults(scheme *runtime.Scheme) error { func RegisterDefaults(scheme *runtime.Scheme) error {
scheme.AddTypeDefaultingFunc(&v1.StorageClass{}, func(obj interface{}) { SetObjectDefaults_StorageClass(obj.(*v1.StorageClass)) })
scheme.AddTypeDefaultingFunc(&v1.StorageClassList{}, func(obj interface{}) { SetObjectDefaults_StorageClassList(obj.(*v1.StorageClassList)) })
return nil return nil
} }
func SetObjectDefaults_StorageClass(in *v1.StorageClass) {
SetDefaults_StorageClass(in)
}
func SetObjectDefaults_StorageClassList(in *v1.StorageClassList) {
for i := range in.Items {
a := &in.Items[i]
SetObjectDefaults_StorageClass(a)
}
}

View File

@ -8,13 +8,16 @@ load(
go_library( go_library(
name = "go_default_library", name = "go_default_library",
srcs = [ srcs = [
"defaults.go",
"doc.go", "doc.go",
"register.go", "register.go",
"zz_generated.conversion.go", "zz_generated.conversion.go",
"zz_generated.defaults.go", "zz_generated.defaults.go",
], ],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/apis/storage:go_default_library", "//pkg/apis/storage:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/api/storage/v1beta1:go_default_library", "//vendor/k8s.io/api/storage/v1beta1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",

View File

@ -0,0 +1,34 @@
/*
Copyright 2017 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package v1beta1
import (
"k8s.io/api/core/v1"
storagev1beta1 "k8s.io/api/storage/v1beta1"
"k8s.io/apimachinery/pkg/runtime"
)
func addDefaultingFuncs(scheme *runtime.Scheme) error {
return RegisterDefaults(scheme)
}
func SetDefaults_StorageClass(obj *storagev1beta1.StorageClass) {
if obj.ReclaimPolicy == nil {
obj.ReclaimPolicy = new(v1.PersistentVolumeReclaimPolicy)
*obj.ReclaimPolicy = v1.PersistentVolumeReclaimDelete
}
}

View File

@ -41,5 +41,5 @@ func init() {
// We only register manually written functions here. The registration of the // We only register manually written functions here. The registration of the
// generated functions takes place in the generated files. The separation // generated functions takes place in the generated files. The separation
// makes the code compile even when the generated files are missing. // makes the code compile even when the generated files are missing.
localSchemeBuilder.Register(RegisterDefaults) localSchemeBuilder.Register(addDefaultingFuncs)
} }

View File

@ -21,9 +21,11 @@ limitations under the License.
package v1beta1 package v1beta1
import ( import (
v1 "k8s.io/api/core/v1"
v1beta1 "k8s.io/api/storage/v1beta1" v1beta1 "k8s.io/api/storage/v1beta1"
conversion "k8s.io/apimachinery/pkg/conversion" conversion "k8s.io/apimachinery/pkg/conversion"
runtime "k8s.io/apimachinery/pkg/runtime" runtime "k8s.io/apimachinery/pkg/runtime"
api "k8s.io/kubernetes/pkg/api"
storage "k8s.io/kubernetes/pkg/apis/storage" storage "k8s.io/kubernetes/pkg/apis/storage"
unsafe "unsafe" unsafe "unsafe"
) )
@ -47,6 +49,7 @@ func autoConvert_v1beta1_StorageClass_To_storage_StorageClass(in *v1beta1.Storag
out.ObjectMeta = in.ObjectMeta out.ObjectMeta = in.ObjectMeta
out.Provisioner = in.Provisioner out.Provisioner = in.Provisioner
out.Parameters = *(*map[string]string)(unsafe.Pointer(&in.Parameters)) out.Parameters = *(*map[string]string)(unsafe.Pointer(&in.Parameters))
out.ReclaimPolicy = (*api.PersistentVolumeReclaimPolicy)(unsafe.Pointer(in.ReclaimPolicy))
return nil return nil
} }
@ -59,6 +62,7 @@ func autoConvert_storage_StorageClass_To_v1beta1_StorageClass(in *storage.Storag
out.ObjectMeta = in.ObjectMeta out.ObjectMeta = in.ObjectMeta
out.Provisioner = in.Provisioner out.Provisioner = in.Provisioner
out.Parameters = *(*map[string]string)(unsafe.Pointer(&in.Parameters)) out.Parameters = *(*map[string]string)(unsafe.Pointer(&in.Parameters))
out.ReclaimPolicy = (*v1.PersistentVolumeReclaimPolicy)(unsafe.Pointer(in.ReclaimPolicy))
return nil return nil
} }

View File

@ -21,6 +21,7 @@ limitations under the License.
package v1beta1 package v1beta1
import ( import (
v1beta1 "k8s.io/api/storage/v1beta1"
runtime "k8s.io/apimachinery/pkg/runtime" runtime "k8s.io/apimachinery/pkg/runtime"
) )
@ -28,5 +29,18 @@ import (
// Public to allow building arbitrary schemes. // Public to allow building arbitrary schemes.
// All generated defaulters are covering - they call all nested defaulters. // All generated defaulters are covering - they call all nested defaulters.
func RegisterDefaults(scheme *runtime.Scheme) error { func RegisterDefaults(scheme *runtime.Scheme) error {
scheme.AddTypeDefaultingFunc(&v1beta1.StorageClass{}, func(obj interface{}) { SetObjectDefaults_StorageClass(obj.(*v1beta1.StorageClass)) })
scheme.AddTypeDefaultingFunc(&v1beta1.StorageClassList{}, func(obj interface{}) { SetObjectDefaults_StorageClassList(obj.(*v1beta1.StorageClassList)) })
return nil return nil
} }
func SetObjectDefaults_StorageClass(in *v1beta1.StorageClass) {
SetDefaults_StorageClass(in)
}
func SetObjectDefaults_StorageClassList(in *v1beta1.StorageClassList) {
for i := range in.Items {
a := &in.Items[i]
SetObjectDefaults_StorageClass(a)
}
}

View File

@ -10,8 +10,10 @@ go_library(
name = "go_default_library", name = "go_default_library",
srcs = ["validation.go"], srcs = ["validation.go"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/api/validation:go_default_library", "//pkg/api/validation:go_default_library",
"//pkg/apis/storage:go_default_library", "//pkg/apis/storage:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
], ],
@ -22,6 +24,7 @@ go_test(
srcs = ["validation_test.go"], srcs = ["validation_test.go"],
library = ":go_default_library", library = ":go_default_library",
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/apis/storage:go_default_library", "//pkg/apis/storage:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
], ],

View File

@ -20,8 +20,10 @@ import (
"reflect" "reflect"
"strings" "strings"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation"
"k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apimachinery/pkg/util/validation/field"
"k8s.io/kubernetes/pkg/api"
apivalidation "k8s.io/kubernetes/pkg/api/validation" apivalidation "k8s.io/kubernetes/pkg/api/validation"
"k8s.io/kubernetes/pkg/apis/storage" "k8s.io/kubernetes/pkg/apis/storage"
) )
@ -31,6 +33,7 @@ func ValidateStorageClass(storageClass *storage.StorageClass) field.ErrorList {
allErrs := apivalidation.ValidateObjectMeta(&storageClass.ObjectMeta, false, apivalidation.ValidateClassName, field.NewPath("metadata")) allErrs := apivalidation.ValidateObjectMeta(&storageClass.ObjectMeta, false, apivalidation.ValidateClassName, field.NewPath("metadata"))
allErrs = append(allErrs, validateProvisioner(storageClass.Provisioner, field.NewPath("provisioner"))...) allErrs = append(allErrs, validateProvisioner(storageClass.Provisioner, field.NewPath("provisioner"))...)
allErrs = append(allErrs, validateParameters(storageClass.Parameters, field.NewPath("parameters"))...) allErrs = append(allErrs, validateParameters(storageClass.Parameters, field.NewPath("parameters"))...)
allErrs = append(allErrs, validateReclaimPolicy(storageClass.ReclaimPolicy, field.NewPath("reclaimPolicy"))...)
return allErrs return allErrs
} }
@ -45,6 +48,10 @@ func ValidateStorageClassUpdate(storageClass, oldStorageClass *storage.StorageCl
if storageClass.Provisioner != oldStorageClass.Provisioner { if storageClass.Provisioner != oldStorageClass.Provisioner {
allErrs = append(allErrs, field.Forbidden(field.NewPath("provisioner"), "updates to provisioner are forbidden.")) allErrs = append(allErrs, field.Forbidden(field.NewPath("provisioner"), "updates to provisioner are forbidden."))
} }
if *storageClass.ReclaimPolicy != *oldStorageClass.ReclaimPolicy {
allErrs = append(allErrs, field.Forbidden(field.NewPath("reclaimPolicy"), "updates to reclaimPolicy are forbidden."))
}
return allErrs return allErrs
} }
@ -87,3 +94,17 @@ func validateParameters(params map[string]string, fldPath *field.Path) field.Err
} }
return allErrs return allErrs
} }
var supportedReclaimPolicy = sets.NewString(string(api.PersistentVolumeReclaimDelete), string(api.PersistentVolumeReclaimRetain))
// validateReclaimPolicy tests that the reclaim policy is one of the supported. It is up to the volume plugin to reject
// provisioning for storage classes with impossible reclaim policies, e.g. EBS is not Recyclable
func validateReclaimPolicy(reclaimPolicy *api.PersistentVolumeReclaimPolicy, fldPath *field.Path) field.ErrorList {
allErrs := field.ErrorList{}
if len(string(*reclaimPolicy)) > 0 {
if !supportedReclaimPolicy.Has(string(*reclaimPolicy)) {
allErrs = append(allErrs, field.NotSupported(fldPath, reclaimPolicy, supportedReclaimPolicy.List()))
}
}
return allErrs
}

View File

@ -21,21 +21,27 @@ import (
"testing" "testing"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/apis/storage" "k8s.io/kubernetes/pkg/apis/storage"
) )
func TestValidateStorageClass(t *testing.T) { func TestValidateStorageClass(t *testing.T) {
deleteReclaimPolicy := api.PersistentVolumeReclaimPolicy("Delete")
retainReclaimPolicy := api.PersistentVolumeReclaimPolicy("Retain")
recycleReclaimPolicy := api.PersistentVolumeReclaimPolicy("Recycle")
successCases := []storage.StorageClass{ successCases := []storage.StorageClass{
{ {
// empty parameters // empty parameters
ObjectMeta: metav1.ObjectMeta{Name: "foo"}, ObjectMeta: metav1.ObjectMeta{Name: "foo"},
Provisioner: "kubernetes.io/foo-provisioner", Provisioner: "kubernetes.io/foo-provisioner",
Parameters: map[string]string{}, Parameters: map[string]string{},
ReclaimPolicy: &deleteReclaimPolicy,
}, },
{ {
// nil parameters // nil parameters
ObjectMeta: metav1.ObjectMeta{Name: "foo"}, ObjectMeta: metav1.ObjectMeta{Name: "foo"},
Provisioner: "kubernetes.io/foo-provisioner", Provisioner: "kubernetes.io/foo-provisioner",
ReclaimPolicy: &deleteReclaimPolicy,
}, },
{ {
// some parameters // some parameters
@ -46,6 +52,13 @@ func TestValidateStorageClass(t *testing.T) {
"foo-parameter": "free-form-string", "foo-parameter": "free-form-string",
"foo-parameter2": "{\"embedded\": \"json\", \"with\": {\"structures\":\"inside\"}}", "foo-parameter2": "{\"embedded\": \"json\", \"with\": {\"structures\":\"inside\"}}",
}, },
ReclaimPolicy: &deleteReclaimPolicy,
},
{
// retain reclaimPolicy
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
Provisioner: "kubernetes.io/foo-provisioner",
ReclaimPolicy: &retainReclaimPolicy,
}, },
} }
@ -68,12 +81,14 @@ func TestValidateStorageClass(t *testing.T) {
errorCases := map[string]storage.StorageClass{ errorCases := map[string]storage.StorageClass{
"namespace is present": { "namespace is present": {
ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "bar"}, ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "bar"},
Provisioner: "kubernetes.io/foo-provisioner", Provisioner: "kubernetes.io/foo-provisioner",
ReclaimPolicy: &deleteReclaimPolicy,
}, },
"invalid provisioner": { "invalid provisioner": {
ObjectMeta: metav1.ObjectMeta{Name: "foo"}, ObjectMeta: metav1.ObjectMeta{Name: "foo"},
Provisioner: "kubernetes.io/invalid/provisioner", Provisioner: "kubernetes.io/invalid/provisioner",
ReclaimPolicy: &deleteReclaimPolicy,
}, },
"invalid empty parameter name": { "invalid empty parameter name": {
ObjectMeta: metav1.ObjectMeta{Name: "foo"}, ObjectMeta: metav1.ObjectMeta{Name: "foo"},
@ -81,15 +96,23 @@ func TestValidateStorageClass(t *testing.T) {
Parameters: map[string]string{ Parameters: map[string]string{
"": "value", "": "value",
}, },
ReclaimPolicy: &deleteReclaimPolicy,
}, },
"provisioner: Required value": { "provisioner: Required value": {
ObjectMeta: metav1.ObjectMeta{Name: "foo"}, ObjectMeta: metav1.ObjectMeta{Name: "foo"},
Provisioner: "", Provisioner: "",
ReclaimPolicy: &deleteReclaimPolicy,
}, },
"too long parameters": { "too long parameters": {
ObjectMeta: metav1.ObjectMeta{Name: "foo"}, ObjectMeta: metav1.ObjectMeta{Name: "foo"},
Provisioner: "kubernetes.io/foo", Provisioner: "kubernetes.io/foo",
Parameters: longParameters, Parameters: longParameters,
ReclaimPolicy: &deleteReclaimPolicy,
},
"invalid reclaimpolicy": {
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
Provisioner: "kubernetes.io/foo",
ReclaimPolicy: &recycleReclaimPolicy,
}, },
} }

View File

@ -23,6 +23,7 @@ package storage
import ( import (
conversion "k8s.io/apimachinery/pkg/conversion" conversion "k8s.io/apimachinery/pkg/conversion"
runtime "k8s.io/apimachinery/pkg/runtime" runtime "k8s.io/apimachinery/pkg/runtime"
api "k8s.io/kubernetes/pkg/api"
reflect "reflect" reflect "reflect"
) )
@ -59,6 +60,15 @@ func (in *StorageClass) DeepCopyInto(out *StorageClass) {
(*out)[key] = val (*out)[key] = val
} }
} }
if in.ReclaimPolicy != nil {
in, out := &in.ReclaimPolicy, &out.ReclaimPolicy
if *in == nil {
*out = nil
} else {
*out = new(api.PersistentVolumeReclaimPolicy)
**out = **in
}
}
return return
} }

View File

@ -31,6 +31,7 @@ var class1Parameters = map[string]string{
var class2Parameters = map[string]string{ var class2Parameters = map[string]string{
"param2": "value2", "param2": "value2",
} }
var deleteReclaimPolicy = v1.PersistentVolumeReclaimDelete
var storageClasses = []*storage.StorageClass{ var storageClasses = []*storage.StorageClass{
{ {
TypeMeta: metav1.TypeMeta{ TypeMeta: metav1.TypeMeta{
@ -41,8 +42,9 @@ var storageClasses = []*storage.StorageClass{
Name: "gold", Name: "gold",
}, },
Provisioner: mockPluginName, Provisioner: mockPluginName,
Parameters: class1Parameters, Parameters: class1Parameters,
ReclaimPolicy: &deleteReclaimPolicy,
}, },
{ {
TypeMeta: metav1.TypeMeta{ TypeMeta: metav1.TypeMeta{
@ -51,8 +53,9 @@ var storageClasses = []*storage.StorageClass{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "silver", Name: "silver",
}, },
Provisioner: mockPluginName, Provisioner: mockPluginName,
Parameters: class2Parameters, Parameters: class2Parameters,
ReclaimPolicy: &deleteReclaimPolicy,
}, },
{ {
TypeMeta: metav1.TypeMeta{ TypeMeta: metav1.TypeMeta{
@ -61,8 +64,9 @@ var storageClasses = []*storage.StorageClass{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "external", Name: "external",
}, },
Provisioner: "vendor.com/my-volume", Provisioner: "vendor.com/my-volume",
Parameters: class1Parameters, Parameters: class1Parameters,
ReclaimPolicy: &deleteReclaimPolicy,
}, },
{ {
TypeMeta: metav1.TypeMeta{ TypeMeta: metav1.TypeMeta{
@ -71,8 +75,9 @@ var storageClasses = []*storage.StorageClass{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "unknown-internal", Name: "unknown-internal",
}, },
Provisioner: "kubernetes.io/unknown", Provisioner: "kubernetes.io/unknown",
Parameters: class1Parameters, Parameters: class1Parameters,
ReclaimPolicy: &deleteReclaimPolicy,
}, },
} }

View File

@ -1309,7 +1309,7 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claimObj interfa
tags[CloudVolumeCreatedForVolumeNameTag] = pvName tags[CloudVolumeCreatedForVolumeNameTag] = pvName
options := vol.VolumeOptions{ options := vol.VolumeOptions{
PersistentVolumeReclaimPolicy: v1.PersistentVolumeReclaimDelete, PersistentVolumeReclaimPolicy: *storageClass.ReclaimPolicy,
CloudTags: &tags, CloudTags: &tags,
ClusterName: ctrl.clusterName, ClusterName: ctrl.clusterName,
PVName: pvName, PVName: pvName,

View File

@ -28,6 +28,7 @@ go_test(
srcs = ["strategy_test.go"], srcs = ["strategy_test.go"],
library = ":go_default_library", library = ":go_default_library",
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/apis/storage:go_default_library", "//pkg/apis/storage:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library",

View File

@ -11,6 +11,7 @@ go_test(
srcs = ["storage_test.go"], srcs = ["storage_test.go"],
library = ":go_default_library", library = ":go_default_library",
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/apis/storage:go_default_library", "//pkg/apis/storage:go_default_library",
"//pkg/registry/registrytest:go_default_library", "//pkg/registry/registrytest:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",

View File

@ -25,6 +25,7 @@ import (
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/generic"
etcdtesting "k8s.io/apiserver/pkg/storage/etcd/testing" etcdtesting "k8s.io/apiserver/pkg/storage/etcd/testing"
"k8s.io/kubernetes/pkg/api"
storageapi "k8s.io/kubernetes/pkg/apis/storage" storageapi "k8s.io/kubernetes/pkg/apis/storage"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
) )
@ -42,6 +43,7 @@ func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
} }
func validNewStorageClass(name string) *storageapi.StorageClass { func validNewStorageClass(name string) *storageapi.StorageClass {
deleteReclaimPolicy := api.PersistentVolumeReclaimDelete
return &storageapi.StorageClass{ return &storageapi.StorageClass{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: name, Name: name,
@ -50,6 +52,7 @@ func validNewStorageClass(name string) *storageapi.StorageClass {
Parameters: map[string]string{ Parameters: map[string]string{
"foo": "bar", "foo": "bar",
}, },
ReclaimPolicy: &deleteReclaimPolicy,
} }
} }
@ -64,12 +67,14 @@ func TestCreate(t *testing.T) {
test := registrytest.New(t, storage.Store).ClusterScope() test := registrytest.New(t, storage.Store).ClusterScope()
storageClass := validNewStorageClass("foo") storageClass := validNewStorageClass("foo")
storageClass.ObjectMeta = metav1.ObjectMeta{GenerateName: "foo"} storageClass.ObjectMeta = metav1.ObjectMeta{GenerateName: "foo"}
deleteReclaimPolicy := api.PersistentVolumeReclaimDelete
test.TestCreate( test.TestCreate(
// valid // valid
storageClass, storageClass,
// invalid // invalid
&storageapi.StorageClass{ &storageapi.StorageClass{
ObjectMeta: metav1.ObjectMeta{Name: "*BadName!"}, ObjectMeta: metav1.ObjectMeta{Name: "*BadName!"},
ReclaimPolicy: &deleteReclaimPolicy,
}, },
) )
} }

View File

@ -21,6 +21,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
genericapirequest "k8s.io/apiserver/pkg/endpoints/request" genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/apis/storage" "k8s.io/kubernetes/pkg/apis/storage"
) )
@ -33,6 +34,7 @@ func TestStorageClassStrategy(t *testing.T) {
t.Errorf("StorageClass should not allow create on update") t.Errorf("StorageClass should not allow create on update")
} }
deleteReclaimPolicy := api.PersistentVolumeReclaimDelete
storageClass := &storage.StorageClass{ storageClass := &storage.StorageClass{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "valid-class", Name: "valid-class",
@ -41,6 +43,7 @@ func TestStorageClassStrategy(t *testing.T) {
Parameters: map[string]string{ Parameters: map[string]string{
"foo": "bar", "foo": "bar",
}, },
ReclaimPolicy: &deleteReclaimPolicy,
} }
Strategy.PrepareForCreate(ctx, storageClass) Strategy.PrepareForCreate(ctx, storageClass)
@ -59,6 +62,7 @@ func TestStorageClassStrategy(t *testing.T) {
Parameters: map[string]string{ Parameters: map[string]string{
"foo": "bar", "foo": "bar",
}, },
ReclaimPolicy: &deleteReclaimPolicy,
} }
Strategy.PrepareForUpdate(ctx, newStorageClass, storageClass) Strategy.PrepareForUpdate(ctx, newStorageClass, storageClass)

View File

@ -20,6 +20,7 @@ go_library(
"//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library",
"//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library",
"//vendor/github.com/ugorji/go/codec:go_default_library", "//vendor/github.com/ugorji/go/codec:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",

View File

@ -34,6 +34,8 @@ import proto "github.com/gogo/protobuf/proto"
import fmt "fmt" import fmt "fmt"
import math "math" import math "math"
import k8s_io_api_core_v1 "k8s.io/api/core/v1"
import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys"
import strings "strings" import strings "strings"
@ -113,6 +115,12 @@ func (m *StorageClass) MarshalTo(dAtA []byte) (int, error) {
i += copy(dAtA[i:], v) i += copy(dAtA[i:], v)
} }
} }
if m.ReclaimPolicy != nil {
dAtA[i] = 0x22
i++
i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ReclaimPolicy)))
i += copy(dAtA[i:], *m.ReclaimPolicy)
}
return i, nil return i, nil
} }
@ -196,6 +204,10 @@ func (m *StorageClass) Size() (n int) {
n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize))
} }
} }
if m.ReclaimPolicy != nil {
l = len(*m.ReclaimPolicy)
n += 1 + l + sovGenerated(uint64(l))
}
return n return n
} }
@ -244,6 +256,7 @@ func (this *StorageClass) String() string {
`ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`, `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) + `,`, `Provisioner:` + fmt.Sprintf("%v", this.Provisioner) + `,`,
`Parameters:` + mapStringForParameters + `,`, `Parameters:` + mapStringForParameters + `,`,
`ReclaimPolicy:` + valueToStringGenerated(this.ReclaimPolicy) + `,`,
`}`, `}`,
}, "") }, "")
return s return s
@ -471,6 +484,36 @@ func (m *StorageClass) Unmarshal(dAtA []byte) error {
m.Parameters[mapkey] = mapvalue m.Parameters[mapkey] = mapvalue
} }
iNdEx = postIndex iNdEx = postIndex
case 4:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field ReclaimPolicy", 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
}
s := k8s_io_api_core_v1.PersistentVolumeReclaimPolicy(dAtA[iNdEx:postIndex])
m.ReclaimPolicy = &s
iNdEx = postIndex
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:]) skippy, err := skipGenerated(dAtA[iNdEx:])
@ -713,35 +756,39 @@ func init() {
} }
var fileDescriptorGenerated = []byte{ var fileDescriptorGenerated = []byte{
// 465 bytes of a gzipped FileDescriptorProto // 529 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0xcf, 0x6e, 0xd3, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0xcd, 0x8a, 0x13, 0x41,
0x10, 0xc6, 0xb3, 0x8e, 0x22, 0xb5, 0x1b, 0x10, 0x91, 0x01, 0x29, 0xca, 0x61, 0x1b, 0x95, 0x4b, 0x10, 0xce, 0x24, 0x2e, 0xec, 0x76, 0x0c, 0x86, 0x51, 0x21, 0xe4, 0x30, 0x09, 0xeb, 0x25, 0x08,
0x2e, 0xec, 0x92, 0x16, 0x50, 0x85, 0x04, 0x87, 0x20, 0x24, 0x90, 0x40, 0x54, 0xe6, 0x86, 0x38, 0x76, 0x6f, 0x76, 0x55, 0x16, 0x41, 0x0f, 0x91, 0x05, 0x05, 0xc5, 0x30, 0x82, 0x07, 0xf1, 0x60,
0xb0, 0x49, 0x06, 0x67, 0x71, 0xec, 0xb5, 0x76, 0xc7, 0x96, 0x72, 0xe3, 0x11, 0x78, 0x1e, 0x9e, 0x67, 0x52, 0x4e, 0xda, 0xf9, 0xe9, 0xa1, 0xbb, 0x66, 0x20, 0x37, 0x1f, 0xc1, 0xe7, 0x11, 0x1f,
0x20, 0x37, 0x7a, 0xec, 0xa9, 0x22, 0xe6, 0x45, 0x90, 0xff, 0x10, 0x5b, 0x4d, 0xab, 0xf6, 0xe6, 0x20, 0xc7, 0x3d, 0xee, 0x29, 0x98, 0xf1, 0x2d, 0x3c, 0xc9, 0xcc, 0xc4, 0xcc, 0xec, 0x26, 0x8b,
0x99, 0xf9, 0x7e, 0xdf, 0xcc, 0x7e, 0xa6, 0xaf, 0x82, 0x13, 0xcb, 0x95, 0x16, 0x41, 0x32, 0x05, 0x7b, 0xeb, 0xaa, 0xfa, 0xbe, 0xaf, 0xab, 0xea, 0x2b, 0xf2, 0xc2, 0x3b, 0xd5, 0x54, 0x48, 0xe6,
0x13, 0x01, 0x82, 0x15, 0x29, 0x44, 0x73, 0x6d, 0x44, 0x35, 0x90, 0xb1, 0x12, 0x16, 0xb5, 0x91, 0xc5, 0x13, 0x50, 0x21, 0x20, 0x68, 0x96, 0x40, 0x38, 0x95, 0x8a, 0xad, 0x0b, 0x3c, 0x12, 0x4c,
0x3e, 0x88, 0x74, 0x2c, 0x7c, 0x88, 0xc0, 0x48, 0x84, 0x39, 0x8f, 0x8d, 0x46, 0xed, 0x3e, 0x2c, 0xa3, 0x54, 0xdc, 0x05, 0x96, 0x0c, 0x99, 0x0b, 0x21, 0x28, 0x8e, 0x30, 0xa5, 0x91, 0x92, 0x28,
0x65, 0x5c, 0xc6, 0x8a, 0x57, 0x32, 0x9e, 0x8e, 0x07, 0x8f, 0x7d, 0x85, 0x8b, 0x64, 0xca, 0x67, 0xcd, 0xfb, 0x05, 0x8c, 0xf2, 0x48, 0xd0, 0x35, 0x8c, 0x26, 0xc3, 0xee, 0x23, 0x57, 0xe0, 0x2c,
0x3a, 0x14, 0xbe, 0xf6, 0xb5, 0x28, 0xd4, 0xd3, 0xe4, 0x5b, 0x51, 0x15, 0x45, 0xf1, 0x55, 0xba, 0x9e, 0x50, 0x47, 0x06, 0xcc, 0x95, 0xae, 0x64, 0x39, 0x7a, 0x12, 0x7f, 0xc9, 0xa3, 0x3c, 0xc8,
0x0c, 0x9e, 0xd6, 0xcb, 0x42, 0x39, 0x5b, 0xa8, 0x08, 0xcc, 0x4a, 0xc4, 0x81, 0x9f, 0x37, 0xac, 0x5f, 0x85, 0x4a, 0xf7, 0xe1, 0xce, 0xcf, 0x26, 0x80, 0x7c, 0xeb, 0xc7, 0xee, 0xe3, 0x12, 0x1b,
0x08, 0x01, 0xe5, 0x15, 0xbb, 0x07, 0xe2, 0x3a, 0xca, 0x24, 0x11, 0xaa, 0x10, 0x76, 0x80, 0xe7, 0x70, 0x67, 0x26, 0x42, 0x50, 0x73, 0x16, 0x79, 0x6e, 0x96, 0xd0, 0x2c, 0x00, 0xe4, 0x3b, 0xfa,
0x37, 0x01, 0x76, 0xb6, 0x80, 0x50, 0xee, 0x70, 0xc7, 0xd7, 0x71, 0x09, 0xaa, 0xa5, 0x50, 0x11, 0xec, 0xb2, 0xeb, 0x58, 0x2a, 0x0e, 0x51, 0x04, 0xb0, 0x45, 0x78, 0xfa, 0x3f, 0x82, 0x76, 0x66,
0x5a, 0x34, 0x97, 0xa1, 0xc3, 0xdf, 0x0e, 0xbd, 0xf3, 0xa9, 0x4c, 0xe4, 0xf5, 0x52, 0x5a, 0xeb, 0x10, 0xf0, 0x2d, 0xde, 0xc9, 0x75, 0xbc, 0x18, 0x85, 0xcf, 0x44, 0x88, 0x1a, 0xd5, 0x55, 0xd2,
0x7e, 0xa5, 0x7b, 0xf9, 0x4b, 0xe6, 0x12, 0x65, 0x9f, 0x0c, 0xc9, 0xa8, 0x7b, 0xf4, 0x84, 0xd7, 0xe1, 0xcf, 0x06, 0xb9, 0xfd, 0xbe, 0x98, 0xfb, 0xa5, 0xcf, 0xb5, 0x36, 0x3f, 0x93, 0xfd, 0x6c,
0xe9, 0x6d, 0x8d, 0x79, 0x1c, 0xf8, 0x79, 0xc3, 0xf2, 0x5c, 0xcd, 0xd3, 0x31, 0xff, 0x38, 0xfd, 0x92, 0x29, 0x47, 0xde, 0x31, 0xfa, 0xc6, 0xa0, 0x79, 0x7c, 0x44, 0xcb, 0x4d, 0x6f, 0x84, 0x69,
0x0e, 0x33, 0xfc, 0x00, 0x28, 0x27, 0xee, 0xfa, 0xe2, 0xa0, 0x95, 0x5d, 0x1c, 0xd0, 0xba, 0xe7, 0xe4, 0xb9, 0x59, 0x42, 0xd3, 0x0c, 0x4d, 0x93, 0x21, 0x7d, 0x37, 0xf9, 0x0a, 0x0e, 0xbe, 0x05,
0x6d, 0x5d, 0xdd, 0x67, 0xb4, 0x1b, 0x1b, 0x9d, 0x2a, 0xab, 0x74, 0x04, 0xa6, 0xef, 0x0c, 0xc9, 0xe4, 0x23, 0x73, 0xb1, 0xec, 0xd5, 0xd2, 0x65, 0x8f, 0x94, 0x39, 0x7b, 0xa3, 0x6a, 0x3e, 0x21,
0x68, 0x7f, 0x72, 0xbf, 0x42, 0xba, 0xa7, 0xf5, 0xc8, 0x6b, 0xea, 0x5c, 0x9f, 0xd2, 0x58, 0x1a, 0xcd, 0x48, 0xc9, 0x44, 0x68, 0x21, 0x43, 0x50, 0x9d, 0x7a, 0xdf, 0x18, 0x1c, 0x8c, 0xee, 0xae,
0x19, 0x02, 0x82, 0xb1, 0xfd, 0xf6, 0xb0, 0x3d, 0xea, 0x1e, 0x1d, 0xf3, 0x2b, 0x7f, 0x2c, 0x6f, 0x29, 0xcd, 0x71, 0x59, 0xb2, 0xab, 0x38, 0xd3, 0x25, 0x24, 0xe2, 0x8a, 0x07, 0x80, 0xa0, 0x74,
0xbe, 0x88, 0x9f, 0x6e, 0xa9, 0x37, 0x11, 0x9a, 0x55, 0x7d, 0x5d, 0x3d, 0xf0, 0x1a, 0xd6, 0x83, 0xa7, 0xd1, 0x6f, 0x0c, 0x9a, 0xc7, 0x27, 0x74, 0xe7, 0x11, 0xd0, 0xea, 0x44, 0x74, 0xbc, 0x61,
0x97, 0xf4, 0xde, 0x25, 0xc4, 0xed, 0xd1, 0x76, 0x00, 0xab, 0x22, 0x8f, 0x7d, 0x2f, 0xff, 0x74, 0x9d, 0x85, 0xa8, 0xe6, 0x65, 0x77, 0x65, 0xc1, 0xae, 0x48, 0x9b, 0x1e, 0x69, 0x29, 0x70, 0x7c,
0x1f, 0xd0, 0x4e, 0x2a, 0x97, 0x09, 0x94, 0xe7, 0x7b, 0x65, 0xf1, 0xc2, 0x39, 0x21, 0x87, 0xbf, 0x2e, 0x82, 0xb1, 0xf4, 0x85, 0x33, 0xef, 0xdc, 0xca, 0x3b, 0x3c, 0x4b, 0x97, 0xbd, 0x96, 0x5d,
0x08, 0xed, 0x35, 0xf7, 0xbf, 0x57, 0x16, 0xdd, 0x2f, 0x3b, 0xa9, 0xf2, 0xdb, 0xa5, 0x9a, 0xd3, 0x2d, 0xfc, 0x59, 0xf6, 0x8e, 0x2a, 0xe7, 0xe3, 0x48, 0x95, 0xdd, 0x0e, 0x1d, 0x83, 0xd2, 0x42,
0x45, 0xa6, 0xbd, 0xea, 0xea, 0xbd, 0xff, 0x9d, 0x46, 0xa2, 0x6f, 0x69, 0x47, 0x21, 0x84, 0xb6, 0x23, 0x84, 0xf8, 0x41, 0xfa, 0x71, 0x00, 0x97, 0x38, 0xf6, 0x65, 0xed, 0xee, 0x73, 0x72, 0xe7,
0xef, 0x14, 0xa9, 0x3c, 0xba, 0x45, 0x2a, 0x93, 0xbb, 0x95, 0x5f, 0xe7, 0x5d, 0x4e, 0x7a, 0xa5, 0x4a, 0x7f, 0x66, 0x9b, 0x34, 0x3c, 0x98, 0xe7, 0xcb, 0x3f, 0xb0, 0xb3, 0xa7, 0x79, 0x8f, 0xec,
0xc1, 0x64, 0xb4, 0xde, 0xb0, 0xd6, 0xd9, 0x86, 0xb5, 0xce, 0x37, 0xac, 0xf5, 0x23, 0x63, 0x64, 0x25, 0xdc, 0x8f, 0xa1, 0xd8, 0x95, 0x5d, 0x04, 0xcf, 0xea, 0xa7, 0xc6, 0xe1, 0x0f, 0x83, 0xb4,
0x9d, 0x31, 0x72, 0x96, 0x31, 0x72, 0x9e, 0x31, 0xf2, 0x27, 0x63, 0xe4, 0xe7, 0x5f, 0xd6, 0xfa, 0xab, 0xc3, 0xbe, 0x11, 0x1a, 0xcd, 0x4f, 0x5b, 0x16, 0xd2, 0x9b, 0x59, 0x98, 0xb1, 0x73, 0x03,
0xec, 0xa4, 0xe3, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xba, 0xfb, 0xcc, 0xa9, 0x93, 0x03, 0x00, 0xdb, 0xeb, 0x15, 0xed, 0xff, 0xcb, 0x54, 0xec, 0x7b, 0x45, 0xf6, 0x04, 0x42, 0xa0, 0x3b, 0xf5,
0xdc, 0x82, 0x07, 0x37, 0xb0, 0x60, 0xd4, 0x5a, 0xeb, 0xed, 0xbd, 0xce, 0x98, 0x76, 0x21, 0x30,
0x1a, 0x2c, 0x56, 0x56, 0xed, 0x7c, 0x65, 0xd5, 0x2e, 0x56, 0x56, 0xed, 0x5b, 0x6a, 0x19, 0x8b,
0xd4, 0x32, 0xce, 0x53, 0xcb, 0xb8, 0x48, 0x2d, 0xe3, 0x57, 0x6a, 0x19, 0xdf, 0x7f, 0x5b, 0xb5,
0x8f, 0xf5, 0x64, 0xf8, 0x37, 0x00, 0x00, 0xff, 0xff, 0xd2, 0x64, 0xc7, 0x7e, 0x2c, 0x04, 0x00,
0x00, 0x00,
} }

View File

@ -21,6 +21,7 @@ syntax = 'proto2';
package k8s.io.api.storage.v1; package k8s.io.api.storage.v1;
import "k8s.io/api/storage/v1beta1/generated.proto";
import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto";
import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto";
import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto";
@ -47,6 +48,11 @@ message StorageClass {
// create volumes of this storage class. // create volumes of this storage class.
// +optional // +optional
map<string, string> parameters = 3; map<string, string> parameters = 3;
// Dynamically provisioned PersistentVolumes of this storage class are
// created with this reclaimPolicy. Defaults to Delete.
// +optional
optional string reclaimPolicy = 4;
} }
// StorageClassList is a collection of storage classes. // StorageClassList is a collection of storage classes.

View File

@ -25,6 +25,7 @@ import (
"errors" "errors"
"fmt" "fmt"
codec1978 "github.com/ugorji/go/codec" codec1978 "github.com/ugorji/go/codec"
pkg3_v1 "k8s.io/api/core/v1"
pkg1_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" pkg1_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
pkg2_types "k8s.io/apimachinery/pkg/types" pkg2_types "k8s.io/apimachinery/pkg/types"
"reflect" "reflect"
@ -62,10 +63,11 @@ func init() {
panic(err) panic(err)
} }
if false { // reference the types, but skip this branch at build/run time if false { // reference the types, but skip this branch at build/run time
var v0 pkg1_v1.TypeMeta var v0 pkg3_v1.PersistentVolumeReclaimPolicy
var v1 pkg2_types.UID var v1 pkg1_v1.TypeMeta
var v2 time.Time var v2 pkg2_types.UID
_, _, _ = v0, v1, v2 var v3 time.Time
_, _, _, _ = v0, v1, v2, v3
} }
} }
@ -83,16 +85,17 @@ func (x *StorageClass) CodecEncodeSelf(e *codec1978.Encoder) {
} else { } else {
yysep2 := !z.EncBinary() yysep2 := !z.EncBinary()
yy2arr2 := z.EncBasicHandle().StructToArray yy2arr2 := z.EncBasicHandle().StructToArray
var yyq2 [5]bool var yyq2 [6]bool
_, _, _ = yysep2, yyq2, yy2arr2 _, _, _ = yysep2, yyq2, yy2arr2
const yyr2 bool = false const yyr2 bool = false
yyq2[0] = x.Kind != "" yyq2[0] = x.Kind != ""
yyq2[1] = x.APIVersion != "" yyq2[1] = x.APIVersion != ""
yyq2[2] = true yyq2[2] = true
yyq2[4] = len(x.Parameters) != 0 yyq2[4] = len(x.Parameters) != 0
yyq2[5] = x.ReclaimPolicy != nil
var yynn2 int var yynn2 int
if yyr2 || yy2arr2 { if yyr2 || yy2arr2 {
r.EncodeArrayStart(5) r.EncodeArrayStart(6)
} else { } else {
yynn2 = 1 yynn2 = 1
for _, b := range yyq2 { for _, b := range yyq2 {
@ -234,6 +237,33 @@ func (x *StorageClass) CodecEncodeSelf(e *codec1978.Encoder) {
} }
} }
} }
if yyr2 || yy2arr2 {
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
if yyq2[5] {
if x.ReclaimPolicy == nil {
r.EncodeNil()
} else {
yy21 := *x.ReclaimPolicy
yysf22 := &yy21
yysf22.CodecEncodeSelf(e)
}
} else {
r.EncodeNil()
}
} else {
if yyq2[5] {
z.EncSendContainerState(codecSelfer_containerMapKey1234)
r.EncodeString(codecSelferC_UTF81234, string("reclaimPolicy"))
z.EncSendContainerState(codecSelfer_containerMapValue1234)
if x.ReclaimPolicy == nil {
r.EncodeNil()
} else {
yy23 := *x.ReclaimPolicy
yysf24 := &yy23
yysf24.CodecEncodeSelf(e)
}
}
}
if yyr2 || yy2arr2 { if yyr2 || yy2arr2 {
z.EncSendContainerState(codecSelfer_containerArrayEnd1234) z.EncSendContainerState(codecSelfer_containerArrayEnd1234)
} else { } else {
@ -356,6 +386,17 @@ func (x *StorageClass) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) {
z.F.DecMapStringStringX(yyv12, false, d) z.F.DecMapStringStringX(yyv12, false, d)
} }
} }
case "reclaimPolicy":
if r.TryDecodeAsNil() {
if x.ReclaimPolicy != nil {
x.ReclaimPolicy = nil
}
} else {
if x.ReclaimPolicy == nil {
x.ReclaimPolicy = new(pkg3_v1.PersistentVolumeReclaimPolicy)
}
x.ReclaimPolicy.CodecDecodeSelf(d)
}
default: default:
z.DecStructFieldNotFound(-1, yys3) z.DecStructFieldNotFound(-1, yys3)
} // end switch yys3 } // end switch yys3
@ -367,16 +408,16 @@ func (x *StorageClass) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
var h codecSelfer1234 var h codecSelfer1234
z, r := codec1978.GenHelperDecoder(d) z, r := codec1978.GenHelperDecoder(d)
_, _, _ = h, z, r _, _, _ = h, z, r
var yyj14 int var yyj15 int
var yyb14 bool var yyb15 bool
var yyhl14 bool = l >= 0 var yyhl15 bool = l >= 0
yyj14++ yyj15++
if yyhl14 { if yyhl15 {
yyb14 = yyj14 > l yyb15 = yyj15 > l
} else { } else {
yyb14 = r.CheckBreak() yyb15 = r.CheckBreak()
} }
if yyb14 { if yyb15 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@ -384,21 +425,21 @@ func (x *StorageClass) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.Kind = "" x.Kind = ""
} else { } else {
yyv15 := &x.Kind yyv16 := &x.Kind
yym16 := z.DecBinary() yym17 := z.DecBinary()
_ = yym16 _ = yym17
if false { if false {
} else { } else {
*((*string)(yyv15)) = r.DecodeString() *((*string)(yyv16)) = r.DecodeString()
} }
} }
yyj14++ yyj15++
if yyhl14 { if yyhl15 {
yyb14 = yyj14 > l yyb15 = yyj15 > l
} else { } else {
yyb14 = r.CheckBreak() yyb15 = r.CheckBreak()
} }
if yyb14 { if yyb15 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@ -406,21 +447,21 @@ func (x *StorageClass) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.APIVersion = "" x.APIVersion = ""
} else { } else {
yyv17 := &x.APIVersion yyv18 := &x.APIVersion
yym18 := z.DecBinary() yym19 := z.DecBinary()
_ = yym18 _ = yym19
if false { if false {
} else { } else {
*((*string)(yyv17)) = r.DecodeString() *((*string)(yyv18)) = r.DecodeString()
} }
} }
yyj14++ yyj15++
if yyhl14 { if yyhl15 {
yyb14 = yyj14 > l yyb15 = yyj15 > l
} else { } else {
yyb14 = r.CheckBreak() yyb15 = r.CheckBreak()
} }
if yyb14 { if yyb15 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@ -428,22 +469,22 @@ func (x *StorageClass) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.ObjectMeta = pkg1_v1.ObjectMeta{} x.ObjectMeta = pkg1_v1.ObjectMeta{}
} else { } else {
yyv19 := &x.ObjectMeta yyv20 := &x.ObjectMeta
yym20 := z.DecBinary() yym21 := z.DecBinary()
_ = yym20 _ = yym21
if false { if false {
} else if z.HasExtensions() && z.DecExt(yyv19) { } else if z.HasExtensions() && z.DecExt(yyv20) {
} else { } else {
z.DecFallback(yyv19, false) z.DecFallback(yyv20, false)
} }
} }
yyj14++ yyj15++
if yyhl14 { if yyhl15 {
yyb14 = yyj14 > l yyb15 = yyj15 > l
} else { } else {
yyb14 = r.CheckBreak() yyb15 = r.CheckBreak()
} }
if yyb14 { if yyb15 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@ -451,21 +492,21 @@ func (x *StorageClass) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.Provisioner = "" x.Provisioner = ""
} else { } else {
yyv21 := &x.Provisioner yyv22 := &x.Provisioner
yym22 := z.DecBinary() yym23 := z.DecBinary()
_ = yym22 _ = yym23
if false { if false {
} else { } else {
*((*string)(yyv21)) = r.DecodeString() *((*string)(yyv22)) = r.DecodeString()
} }
} }
yyj14++ yyj15++
if yyhl14 { if yyhl15 {
yyb14 = yyj14 > l yyb15 = yyj15 > l
} else { } else {
yyb14 = r.CheckBreak() yyb15 = r.CheckBreak()
} }
if yyb14 { if yyb15 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@ -473,26 +514,47 @@ func (x *StorageClass) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.Parameters = nil x.Parameters = nil
} else { } else {
yyv23 := &x.Parameters yyv24 := &x.Parameters
yym24 := z.DecBinary() yym25 := z.DecBinary()
_ = yym24 _ = yym25
if false { if false {
} else { } else {
z.F.DecMapStringStringX(yyv23, false, d) z.F.DecMapStringStringX(yyv24, false, d)
} }
} }
for { yyj15++
yyj14++ if yyhl15 {
if yyhl14 { yyb15 = yyj15 > l
yyb14 = yyj14 > l } else {
} else { yyb15 = r.CheckBreak()
yyb14 = r.CheckBreak() }
if yyb15 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
if x.ReclaimPolicy != nil {
x.ReclaimPolicy = nil
} }
if yyb14 { } else {
if x.ReclaimPolicy == nil {
x.ReclaimPolicy = new(pkg3_v1.PersistentVolumeReclaimPolicy)
}
x.ReclaimPolicy.CodecDecodeSelf(d)
}
for {
yyj15++
if yyhl15 {
yyb15 = yyj15 > l
} else {
yyb15 = r.CheckBreak()
}
if yyb15 {
break break
} }
z.DecSendContainerState(codecSelfer_containerArrayElem1234) z.DecSendContainerState(codecSelfer_containerArrayElem1234)
z.DecStructFieldNotFound(yyj14-1, "") z.DecStructFieldNotFound(yyj15-1, "")
} }
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
} }
@ -904,7 +966,7 @@ func (x codecSelfer1234) decSliceStorageClass(v *[]StorageClass, d *codec1978.De
yyrg1 := len(yyv1) > 0 yyrg1 := len(yyv1) > 0
yyv21 := yyv1 yyv21 := yyv1
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 288) yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 296)
if yyrt1 { if yyrt1 {
if yyrl1 <= cap(yyv1) { if yyrl1 <= cap(yyv1) {
yyv1 = yyv1[:yyrl1] yyv1 = yyv1[:yyrl1]

View File

@ -17,6 +17,7 @@ limitations under the License.
package v1 package v1
import ( import (
"k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
) )
@ -43,6 +44,11 @@ type StorageClass struct {
// create volumes of this storage class. // create volumes of this storage class.
// +optional // +optional
Parameters map[string]string `json:"parameters,omitempty" protobuf:"bytes,3,rep,name=parameters"` Parameters map[string]string `json:"parameters,omitempty" protobuf:"bytes,3,rep,name=parameters"`
// Dynamically provisioned PersistentVolumes of this storage class are
// created with this reclaimPolicy. Defaults to Delete.
// +optional
ReclaimPolicy *v1.PersistentVolumeReclaimPolicy `json:"reclaimPolicy,omitempty" protobuf:"bytes,4,opt,name=reclaimPolicy,casttype=k8s.io/api/core/v1.PersistentVolumeReclaimPolicy"`
} }
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

View File

@ -28,10 +28,11 @@ package v1
// AUTO-GENERATED FUNCTIONS START HERE // AUTO-GENERATED FUNCTIONS START HERE
var map_StorageClass = map[string]string{ 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.", "": "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: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata",
"provisioner": "Provisioner indicates the type of the provisioner.", "provisioner": "Provisioner indicates the type of the provisioner.",
"parameters": "Parameters holds the parameters for the provisioner that should create volumes of this storage class.", "parameters": "Parameters holds the parameters for the provisioner that should create volumes of this storage class.",
"reclaimPolicy": "Dynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.",
} }
func (StorageClass) SwaggerDoc() map[string]string { func (StorageClass) SwaggerDoc() map[string]string {

View File

@ -21,6 +21,7 @@ limitations under the License.
package v1 package v1
import ( import (
core_v1 "k8s.io/api/core/v1"
conversion "k8s.io/apimachinery/pkg/conversion" conversion "k8s.io/apimachinery/pkg/conversion"
runtime "k8s.io/apimachinery/pkg/runtime" runtime "k8s.io/apimachinery/pkg/runtime"
reflect "reflect" reflect "reflect"
@ -59,6 +60,15 @@ func (in *StorageClass) DeepCopyInto(out *StorageClass) {
(*out)[key] = val (*out)[key] = val
} }
} }
if in.ReclaimPolicy != nil {
in, out := &in.ReclaimPolicy, &out.ReclaimPolicy
if *in == nil {
*out = nil
} else {
*out = new(core_v1.PersistentVolumeReclaimPolicy)
**out = **in
}
}
return return
} }

View File

@ -20,6 +20,7 @@ go_library(
"//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library",
"//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library",
"//vendor/github.com/ugorji/go/codec:go_default_library", "//vendor/github.com/ugorji/go/codec:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",

View File

@ -34,6 +34,8 @@ import proto "github.com/gogo/protobuf/proto"
import fmt "fmt" import fmt "fmt"
import math "math" import math "math"
import k8s_io_api_core_v1 "k8s.io/api/core/v1"
import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys"
import strings "strings" import strings "strings"
@ -113,6 +115,12 @@ func (m *StorageClass) MarshalTo(dAtA []byte) (int, error) {
i += copy(dAtA[i:], v) i += copy(dAtA[i:], v)
} }
} }
if m.ReclaimPolicy != nil {
dAtA[i] = 0x22
i++
i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ReclaimPolicy)))
i += copy(dAtA[i:], *m.ReclaimPolicy)
}
return i, nil return i, nil
} }
@ -196,6 +204,10 @@ func (m *StorageClass) Size() (n int) {
n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize))
} }
} }
if m.ReclaimPolicy != nil {
l = len(*m.ReclaimPolicy)
n += 1 + l + sovGenerated(uint64(l))
}
return n return n
} }
@ -244,6 +256,7 @@ func (this *StorageClass) String() string {
`ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`, `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) + `,`, `Provisioner:` + fmt.Sprintf("%v", this.Provisioner) + `,`,
`Parameters:` + mapStringForParameters + `,`, `Parameters:` + mapStringForParameters + `,`,
`ReclaimPolicy:` + valueToStringGenerated(this.ReclaimPolicy) + `,`,
`}`, `}`,
}, "") }, "")
return s return s
@ -471,6 +484,36 @@ func (m *StorageClass) Unmarshal(dAtA []byte) error {
m.Parameters[mapkey] = mapvalue m.Parameters[mapkey] = mapvalue
} }
iNdEx = postIndex iNdEx = postIndex
case 4:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field ReclaimPolicy", 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
}
s := k8s_io_api_core_v1.PersistentVolumeReclaimPolicy(dAtA[iNdEx:postIndex])
m.ReclaimPolicy = &s
iNdEx = postIndex
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:]) skippy, err := skipGenerated(dAtA[iNdEx:])
@ -713,35 +756,38 @@ func init() {
} }
var fileDescriptorGenerated = []byte{ var fileDescriptorGenerated = []byte{
// 468 bytes of a gzipped FileDescriptorProto // 527 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0xbf, 0x8e, 0xd3, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xbb, 0x8e, 0x13, 0x3f,
0x10, 0xc6, 0xbd, 0x89, 0x22, 0xee, 0x36, 0x20, 0x22, 0x43, 0x11, 0xb9, 0xf0, 0x45, 0x57, 0xa5, 0x14, 0xc6, 0xe3, 0xe4, 0x1f, 0xfd, 0x77, 0x1d, 0x22, 0xa2, 0x81, 0x22, 0x4a, 0x31, 0x89, 0x52,
0xb9, 0x5d, 0x72, 0xfc, 0x51, 0x84, 0x44, 0x93, 0x13, 0x05, 0x12, 0x27, 0x4e, 0xa6, 0x43, 0x14, 0xa5, 0x59, 0x7b, 0xb3, 0x5c, 0x14, 0x21, 0xd1, 0x64, 0xb5, 0x05, 0x12, 0x2b, 0xa2, 0x41, 0xa2,
0xac, 0x93, 0xc1, 0x59, 0x1c, 0x7b, 0xad, 0xdd, 0xb1, 0xa5, 0x74, 0x3c, 0x02, 0x6f, 0x44, 0x9b, 0x40, 0x14, 0x38, 0x93, 0xc3, 0xc4, 0xcc, 0xc5, 0x23, 0xdb, 0x33, 0x52, 0x3a, 0x1e, 0x81, 0x37,
0xf2, 0x0a, 0x8a, 0xab, 0x4e, 0xc4, 0xbc, 0x08, 0xf2, 0x1f, 0x62, 0xeb, 0xa2, 0x88, 0xeb, 0x3c, 0x42, 0x74, 0x29, 0xb7, 0xdc, 0x2a, 0x22, 0xc3, 0x5b, 0x50, 0xa1, 0xb9, 0x90, 0x99, 0x4d, 0x88,
0x33, 0xdf, 0xef, 0xdb, 0x99, 0xcf, 0xf4, 0x22, 0x9c, 0x1a, 0x26, 0x15, 0x0f, 0x53, 0x1f, 0x74, 0xd8, 0xce, 0x3e, 0xe7, 0xfb, 0x7d, 0xb6, 0xcf, 0x67, 0x7c, 0xe9, 0x4e, 0x14, 0xe1, 0x82, 0xba,
0x0c, 0x08, 0x86, 0x67, 0x10, 0x2f, 0x94, 0xe6, 0xf5, 0x40, 0x24, 0x92, 0x1b, 0x54, 0x5a, 0x04, 0xd1, 0x1c, 0x64, 0x00, 0x1a, 0x14, 0x8d, 0x21, 0x58, 0x08, 0x49, 0x8b, 0x06, 0x0b, 0x39, 0x55,
0xc0, 0xb3, 0x89, 0x0f, 0x28, 0x26, 0x3c, 0x80, 0x18, 0xb4, 0x40, 0x58, 0xb0, 0x44, 0x2b, 0x54, 0x5a, 0x48, 0xe6, 0x00, 0x8d, 0xc7, 0x73, 0xd0, 0x6c, 0x4c, 0x1d, 0x08, 0x40, 0x32, 0x0d, 0x0b,
0xb6, 0x53, 0x69, 0x99, 0x48, 0x24, 0xab, 0xb5, 0xac, 0xd6, 0x3a, 0x67, 0x81, 0xc4, 0x65, 0xea, 0x12, 0x4a, 0xa1, 0x85, 0xd1, 0xcb, 0xb5, 0x84, 0x85, 0x9c, 0x14, 0x5a, 0x52, 0x68, 0x7b, 0x67,
0xb3, 0xb9, 0x8a, 0x78, 0xa0, 0x02, 0xc5, 0x4b, 0xc4, 0x4f, 0xbf, 0x96, 0x55, 0x59, 0x94, 0x5f, 0x0e, 0xd7, 0xcb, 0x68, 0x4e, 0x6c, 0xe1, 0x53, 0x47, 0x38, 0x82, 0x66, 0xc8, 0x3c, 0xfa, 0x94,
0x95, 0x95, 0xf3, 0xa2, 0x79, 0x36, 0x12, 0xf3, 0xa5, 0x8c, 0x41, 0xaf, 0x79, 0x12, 0x06, 0x45, 0xed, 0xb2, 0x4d, 0xb6, 0xca, 0xad, 0x7a, 0xc3, 0xca, 0xb1, 0xb6, 0x90, 0xe9, 0x99, 0xfb, 0xc7,
0xc3, 0xf0, 0x08, 0x50, 0xf0, 0x6c, 0x6f, 0x01, 0x87, 0x1f, 0xa2, 0x74, 0x1a, 0xa3, 0x8c, 0x60, 0xf5, 0x9e, 0x96, 0x1a, 0x9f, 0xd9, 0x4b, 0x1e, 0x80, 0x5c, 0xd1, 0xd0, 0x75, 0xd2, 0x82, 0xa2,
0x0f, 0x78, 0xf5, 0x3f, 0xc0, 0xcc, 0x97, 0x10, 0x89, 0x3d, 0xee, 0xf9, 0x21, 0x2e, 0x45, 0xb9, 0x3e, 0x68, 0xf6, 0x37, 0x8a, 0x1e, 0xa3, 0x64, 0x14, 0x68, 0xee, 0xc3, 0x01, 0xf0, 0xfc, 0x5f,
0xe2, 0x32, 0x46, 0x83, 0xfa, 0x2e, 0x74, 0xfa, 0xab, 0x43, 0x1f, 0x7e, 0xac, 0x62, 0xb9, 0x58, 0x80, 0xb2, 0x97, 0xe0, 0xb3, 0x03, 0xee, 0xc9, 0x31, 0x2e, 0xd2, 0xdc, 0xa3, 0x3c, 0xd0, 0x4a,
0x09, 0x63, 0xec, 0x2f, 0xf4, 0xa8, 0xb8, 0x64, 0x21, 0x50, 0x0c, 0xc9, 0x88, 0x8c, 0xfb, 0xe7, 0xcb, 0x7d, 0x68, 0xf8, 0xbd, 0x81, 0x1f, 0xbc, 0xcd, 0x47, 0x77, 0xe9, 0x31, 0xa5, 0x8c, 0x8f,
0xcf, 0x58, 0x13, 0xe1, 0xce, 0x98, 0x25, 0x61, 0x50, 0x34, 0x0c, 0x2b, 0xd4, 0x2c, 0x9b, 0xb0, 0xf8, 0x24, 0x7d, 0xc9, 0x82, 0x69, 0xd6, 0x45, 0x03, 0x34, 0x6a, 0x5d, 0x9c, 0x93, 0x72, 0xcc,
0x0f, 0xfe, 0x37, 0x98, 0xe3, 0x25, 0xa0, 0x98, 0xd9, 0x9b, 0xdb, 0x13, 0x2b, 0xbf, 0x3d, 0xa1, 0x3b, 0x63, 0x12, 0xba, 0x4e, 0x5a, 0x50, 0x24, 0x55, 0x93, 0x78, 0x4c, 0xde, 0xcc, 0x3f, 0x83,
0x4d, 0xcf, 0xdb, 0xb9, 0xda, 0x2f, 0x69, 0x3f, 0xd1, 0x2a, 0x93, 0x46, 0xaa, 0x18, 0xf4, 0xb0, 0xad, 0xaf, 0x41, 0xb3, 0xa9, 0xb1, 0xde, 0xf4, 0x6b, 0xc9, 0xa6, 0x8f, 0xcb, 0x9a, 0xb5, 0x73,
0x33, 0x22, 0xe3, 0xe3, 0xd9, 0x93, 0x1a, 0xe9, 0x5f, 0x35, 0x23, 0xaf, 0xad, 0xb3, 0x57, 0x94, 0x35, 0x9e, 0xe1, 0x56, 0x28, 0x45, 0xcc, 0x15, 0x17, 0x01, 0xc8, 0x6e, 0x7d, 0x80, 0x46, 0xa7,
0x26, 0x42, 0x8b, 0x08, 0x10, 0xb4, 0x19, 0x76, 0x47, 0xdd, 0x71, 0xff, 0x7c, 0xca, 0x0e, 0xff, 0xd3, 0x47, 0x05, 0xd2, 0x9a, 0x95, 0x2d, 0xab, 0xaa, 0x33, 0x3c, 0x8c, 0x43, 0x26, 0x99, 0x0f,
0x5d, 0xd6, 0x3e, 0x8b, 0x5d, 0xed, 0xd0, 0xb7, 0x31, 0xea, 0x75, 0xb3, 0x62, 0x33, 0xf0, 0x5a, 0x1a, 0xa4, 0xea, 0x36, 0x06, 0x8d, 0x51, 0xeb, 0x62, 0x42, 0x8e, 0xff, 0x00, 0x52, 0x7d, 0x16,
0xfe, 0xce, 0x1b, 0xfa, 0xf8, 0x0e, 0x62, 0x0f, 0x68, 0x37, 0x84, 0x75, 0x19, 0xca, 0xb1, 0x57, 0x99, 0xed, 0xd0, 0xab, 0x40, 0xcb, 0x55, 0x79, 0xc5, 0xb2, 0x61, 0x55, 0xfc, 0x0d, 0x17, 0xb7,
0x7c, 0xda, 0x4f, 0x69, 0x2f, 0x13, 0xab, 0x14, 0xaa, 0x1b, 0xbc, 0xaa, 0x78, 0xdd, 0x99, 0x92, 0x25, 0xd8, 0x1e, 0xe3, 0xfe, 0x4c, 0x78, 0xdc, 0x5e, 0x75, 0xff, 0xcb, 0xae, 0x79, 0x95, 0x6c,
0xd3, 0x9f, 0x84, 0x0e, 0xda, 0xef, 0xbf, 0x97, 0x06, 0xed, 0xcf, 0x7b, 0xd1, 0xb2, 0xfb, 0x45, 0xfa, 0x6d, 0xab, 0xda, 0xf8, 0xb5, 0xe9, 0x9f, 0x1f, 0xfe, 0x1d, 0x32, 0x03, 0xa9, 0xb8, 0xd2,
0x5b, 0xd0, 0x65, 0xb0, 0x83, 0x7a, 0xeb, 0xa3, 0x7f, 0x9d, 0x56, 0xac, 0x97, 0xb4, 0x27, 0x11, 0x10, 0xe8, 0x77, 0xc2, 0x8b, 0x7c, 0xb8, 0xc3, 0x58, 0x77, 0xbd, 0x7b, 0x2f, 0xf1, 0xc3, 0xbd,
0x22, 0x33, 0xec, 0x94, 0xd1, 0x8c, 0xef, 0x1b, 0xcd, 0xec, 0x51, 0x6d, 0xda, 0x7b, 0x57, 0xe0, 0xfb, 0x19, 0x1d, 0xdc, 0x70, 0x61, 0x95, 0x25, 0x70, 0x6a, 0xa5, 0x4b, 0xe3, 0x31, 0x6e, 0xc6,
0x5e, 0xe5, 0x32, 0x3b, 0xdb, 0x6c, 0x5d, 0xeb, 0x7a, 0xeb, 0x5a, 0x37, 0x5b, 0xd7, 0xfa, 0x9e, 0xcc, 0x8b, 0x20, 0x1f, 0x98, 0x95, 0x6f, 0x5e, 0xd4, 0x27, 0x68, 0xf8, 0x0d, 0xe1, 0x4e, 0xf5,
0xbb, 0x64, 0x93, 0xbb, 0xe4, 0x3a, 0x77, 0xc9, 0x4d, 0xee, 0x92, 0xdf, 0xb9, 0x4b, 0x7e, 0xfc, 0xb1, 0xaf, 0xb9, 0xd2, 0xc6, 0x87, 0x83, 0x1c, 0xc9, 0xfd, 0x72, 0x4c, 0xe9, 0x2c, 0xc5, 0x4e,
0x71, 0xad, 0x4f, 0x0f, 0x6a, 0xc7, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x31, 0xec, 0x16, 0x3f, 0x31, 0xa2, 0x93, 0x3f, 0x95, 0x4a, 0x86, 0xd7, 0xb8, 0xc9, 0x35, 0xf8, 0xaa, 0x5b, 0xcf, 0x72,
0xac, 0x03, 0x00, 0x00, 0x18, 0xdd, 0x37, 0x87, 0x69, 0xbb, 0x30, 0x6d, 0xbe, 0x4a, 0x71, 0x2b, 0x77, 0x99, 0x9e, 0xad,
0xb7, 0x66, 0xed, 0x66, 0x6b, 0xd6, 0x6e, 0xb7, 0x66, 0xed, 0x4b, 0x62, 0xa2, 0x75, 0x62, 0xa2,
0x9b, 0xc4, 0x44, 0xb7, 0x89, 0x89, 0x7e, 0x24, 0x26, 0xfa, 0xfa, 0xd3, 0xac, 0xbd, 0xff, 0xbf,
0x70, 0xfc, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x94, 0xc8, 0xc6, 0xb6, 0x3d, 0x04, 0x00, 0x00,
} }

View File

@ -21,6 +21,7 @@ syntax = 'proto2';
package k8s.io.api.storage.v1beta1; package k8s.io.api.storage.v1beta1;
import "k8s.io/api/core/v1/generated.proto";
import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto";
import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto";
import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto";
@ -47,6 +48,11 @@ message StorageClass {
// create volumes of this storage class. // create volumes of this storage class.
// +optional // +optional
map<string, string> parameters = 3; map<string, string> parameters = 3;
// Dynamically provisioned PersistentVolumes of this storage class are
// created with this reclaimPolicy. Defaults to Delete.
// +optional
optional string reclaimPolicy = 4;
} }
// StorageClassList is a collection of storage classes. // StorageClassList is a collection of storage classes.

View File

@ -25,6 +25,7 @@ import (
"errors" "errors"
"fmt" "fmt"
codec1978 "github.com/ugorji/go/codec" codec1978 "github.com/ugorji/go/codec"
pkg3_v1 "k8s.io/api/core/v1"
pkg1_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" pkg1_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
pkg2_types "k8s.io/apimachinery/pkg/types" pkg2_types "k8s.io/apimachinery/pkg/types"
"reflect" "reflect"
@ -62,10 +63,11 @@ func init() {
panic(err) panic(err)
} }
if false { // reference the types, but skip this branch at build/run time if false { // reference the types, but skip this branch at build/run time
var v0 pkg1_v1.TypeMeta var v0 pkg3_v1.PersistentVolumeReclaimPolicy
var v1 pkg2_types.UID var v1 pkg1_v1.TypeMeta
var v2 time.Time var v2 pkg2_types.UID
_, _, _ = v0, v1, v2 var v3 time.Time
_, _, _, _ = v0, v1, v2, v3
} }
} }
@ -83,16 +85,17 @@ func (x *StorageClass) CodecEncodeSelf(e *codec1978.Encoder) {
} else { } else {
yysep2 := !z.EncBinary() yysep2 := !z.EncBinary()
yy2arr2 := z.EncBasicHandle().StructToArray yy2arr2 := z.EncBasicHandle().StructToArray
var yyq2 [5]bool var yyq2 [6]bool
_, _, _ = yysep2, yyq2, yy2arr2 _, _, _ = yysep2, yyq2, yy2arr2
const yyr2 bool = false const yyr2 bool = false
yyq2[0] = x.Kind != "" yyq2[0] = x.Kind != ""
yyq2[1] = x.APIVersion != "" yyq2[1] = x.APIVersion != ""
yyq2[2] = true yyq2[2] = true
yyq2[4] = len(x.Parameters) != 0 yyq2[4] = len(x.Parameters) != 0
yyq2[5] = x.ReclaimPolicy != nil
var yynn2 int var yynn2 int
if yyr2 || yy2arr2 { if yyr2 || yy2arr2 {
r.EncodeArrayStart(5) r.EncodeArrayStart(6)
} else { } else {
yynn2 = 1 yynn2 = 1
for _, b := range yyq2 { for _, b := range yyq2 {
@ -234,6 +237,33 @@ func (x *StorageClass) CodecEncodeSelf(e *codec1978.Encoder) {
} }
} }
} }
if yyr2 || yy2arr2 {
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
if yyq2[5] {
if x.ReclaimPolicy == nil {
r.EncodeNil()
} else {
yy21 := *x.ReclaimPolicy
yysf22 := &yy21
yysf22.CodecEncodeSelf(e)
}
} else {
r.EncodeNil()
}
} else {
if yyq2[5] {
z.EncSendContainerState(codecSelfer_containerMapKey1234)
r.EncodeString(codecSelferC_UTF81234, string("reclaimPolicy"))
z.EncSendContainerState(codecSelfer_containerMapValue1234)
if x.ReclaimPolicy == nil {
r.EncodeNil()
} else {
yy23 := *x.ReclaimPolicy
yysf24 := &yy23
yysf24.CodecEncodeSelf(e)
}
}
}
if yyr2 || yy2arr2 { if yyr2 || yy2arr2 {
z.EncSendContainerState(codecSelfer_containerArrayEnd1234) z.EncSendContainerState(codecSelfer_containerArrayEnd1234)
} else { } else {
@ -356,6 +386,17 @@ func (x *StorageClass) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) {
z.F.DecMapStringStringX(yyv12, false, d) z.F.DecMapStringStringX(yyv12, false, d)
} }
} }
case "reclaimPolicy":
if r.TryDecodeAsNil() {
if x.ReclaimPolicy != nil {
x.ReclaimPolicy = nil
}
} else {
if x.ReclaimPolicy == nil {
x.ReclaimPolicy = new(pkg3_v1.PersistentVolumeReclaimPolicy)
}
x.ReclaimPolicy.CodecDecodeSelf(d)
}
default: default:
z.DecStructFieldNotFound(-1, yys3) z.DecStructFieldNotFound(-1, yys3)
} // end switch yys3 } // end switch yys3
@ -367,16 +408,16 @@ func (x *StorageClass) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
var h codecSelfer1234 var h codecSelfer1234
z, r := codec1978.GenHelperDecoder(d) z, r := codec1978.GenHelperDecoder(d)
_, _, _ = h, z, r _, _, _ = h, z, r
var yyj14 int var yyj15 int
var yyb14 bool var yyb15 bool
var yyhl14 bool = l >= 0 var yyhl15 bool = l >= 0
yyj14++ yyj15++
if yyhl14 { if yyhl15 {
yyb14 = yyj14 > l yyb15 = yyj15 > l
} else { } else {
yyb14 = r.CheckBreak() yyb15 = r.CheckBreak()
} }
if yyb14 { if yyb15 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@ -384,21 +425,21 @@ func (x *StorageClass) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.Kind = "" x.Kind = ""
} else { } else {
yyv15 := &x.Kind yyv16 := &x.Kind
yym16 := z.DecBinary() yym17 := z.DecBinary()
_ = yym16 _ = yym17
if false { if false {
} else { } else {
*((*string)(yyv15)) = r.DecodeString() *((*string)(yyv16)) = r.DecodeString()
} }
} }
yyj14++ yyj15++
if yyhl14 { if yyhl15 {
yyb14 = yyj14 > l yyb15 = yyj15 > l
} else { } else {
yyb14 = r.CheckBreak() yyb15 = r.CheckBreak()
} }
if yyb14 { if yyb15 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@ -406,21 +447,21 @@ func (x *StorageClass) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.APIVersion = "" x.APIVersion = ""
} else { } else {
yyv17 := &x.APIVersion yyv18 := &x.APIVersion
yym18 := z.DecBinary() yym19 := z.DecBinary()
_ = yym18 _ = yym19
if false { if false {
} else { } else {
*((*string)(yyv17)) = r.DecodeString() *((*string)(yyv18)) = r.DecodeString()
} }
} }
yyj14++ yyj15++
if yyhl14 { if yyhl15 {
yyb14 = yyj14 > l yyb15 = yyj15 > l
} else { } else {
yyb14 = r.CheckBreak() yyb15 = r.CheckBreak()
} }
if yyb14 { if yyb15 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@ -428,22 +469,22 @@ func (x *StorageClass) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.ObjectMeta = pkg1_v1.ObjectMeta{} x.ObjectMeta = pkg1_v1.ObjectMeta{}
} else { } else {
yyv19 := &x.ObjectMeta yyv20 := &x.ObjectMeta
yym20 := z.DecBinary() yym21 := z.DecBinary()
_ = yym20 _ = yym21
if false { if false {
} else if z.HasExtensions() && z.DecExt(yyv19) { } else if z.HasExtensions() && z.DecExt(yyv20) {
} else { } else {
z.DecFallback(yyv19, false) z.DecFallback(yyv20, false)
} }
} }
yyj14++ yyj15++
if yyhl14 { if yyhl15 {
yyb14 = yyj14 > l yyb15 = yyj15 > l
} else { } else {
yyb14 = r.CheckBreak() yyb15 = r.CheckBreak()
} }
if yyb14 { if yyb15 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@ -451,21 +492,21 @@ func (x *StorageClass) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.Provisioner = "" x.Provisioner = ""
} else { } else {
yyv21 := &x.Provisioner yyv22 := &x.Provisioner
yym22 := z.DecBinary() yym23 := z.DecBinary()
_ = yym22 _ = yym23
if false { if false {
} else { } else {
*((*string)(yyv21)) = r.DecodeString() *((*string)(yyv22)) = r.DecodeString()
} }
} }
yyj14++ yyj15++
if yyhl14 { if yyhl15 {
yyb14 = yyj14 > l yyb15 = yyj15 > l
} else { } else {
yyb14 = r.CheckBreak() yyb15 = r.CheckBreak()
} }
if yyb14 { if yyb15 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@ -473,26 +514,47 @@ func (x *StorageClass) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) {
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.Parameters = nil x.Parameters = nil
} else { } else {
yyv23 := &x.Parameters yyv24 := &x.Parameters
yym24 := z.DecBinary() yym25 := z.DecBinary()
_ = yym24 _ = yym25
if false { if false {
} else { } else {
z.F.DecMapStringStringX(yyv23, false, d) z.F.DecMapStringStringX(yyv24, false, d)
} }
} }
for { yyj15++
yyj14++ if yyhl15 {
if yyhl14 { yyb15 = yyj15 > l
yyb14 = yyj14 > l } else {
} else { yyb15 = r.CheckBreak()
yyb14 = r.CheckBreak() }
if yyb15 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
if x.ReclaimPolicy != nil {
x.ReclaimPolicy = nil
} }
if yyb14 { } else {
if x.ReclaimPolicy == nil {
x.ReclaimPolicy = new(pkg3_v1.PersistentVolumeReclaimPolicy)
}
x.ReclaimPolicy.CodecDecodeSelf(d)
}
for {
yyj15++
if yyhl15 {
yyb15 = yyj15 > l
} else {
yyb15 = r.CheckBreak()
}
if yyb15 {
break break
} }
z.DecSendContainerState(codecSelfer_containerArrayElem1234) z.DecSendContainerState(codecSelfer_containerArrayElem1234)
z.DecStructFieldNotFound(yyj14-1, "") z.DecStructFieldNotFound(yyj15-1, "")
} }
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
} }
@ -904,7 +966,7 @@ func (x codecSelfer1234) decSliceStorageClass(v *[]StorageClass, d *codec1978.De
yyrg1 := len(yyv1) > 0 yyrg1 := len(yyv1) > 0
yyv21 := yyv1 yyv21 := yyv1
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 288) yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 296)
if yyrt1 { if yyrt1 {
if yyrl1 <= cap(yyv1) { if yyrl1 <= cap(yyv1) {
yyv1 = yyv1[:yyrl1] yyv1 = yyv1[:yyrl1]

View File

@ -17,6 +17,7 @@ limitations under the License.
package v1beta1 package v1beta1
import ( import (
"k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
) )
@ -43,6 +44,11 @@ type StorageClass struct {
// create volumes of this storage class. // create volumes of this storage class.
// +optional // +optional
Parameters map[string]string `json:"parameters,omitempty" protobuf:"bytes,3,rep,name=parameters"` Parameters map[string]string `json:"parameters,omitempty" protobuf:"bytes,3,rep,name=parameters"`
// Dynamically provisioned PersistentVolumes of this storage class are
// created with this reclaimPolicy. Defaults to Delete.
// +optional
ReclaimPolicy *v1.PersistentVolumeReclaimPolicy `json:"reclaimPolicy,omitempty" protobuf:"bytes,4,opt,name=reclaimPolicy,casttype=k8s.io/api/core/v1.PersistentVolumeReclaimPolicy"`
} }
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

View File

@ -28,10 +28,11 @@ package v1beta1
// AUTO-GENERATED FUNCTIONS START HERE // AUTO-GENERATED FUNCTIONS START HERE
var map_StorageClass = map[string]string{ 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.", "": "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: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata",
"provisioner": "Provisioner indicates the type of the provisioner.", "provisioner": "Provisioner indicates the type of the provisioner.",
"parameters": "Parameters holds the parameters for the provisioner that should create volumes of this storage class.", "parameters": "Parameters holds the parameters for the provisioner that should create volumes of this storage class.",
"reclaimPolicy": "Dynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.",
} }
func (StorageClass) SwaggerDoc() map[string]string { func (StorageClass) SwaggerDoc() map[string]string {

View File

@ -21,6 +21,7 @@ limitations under the License.
package v1beta1 package v1beta1
import ( import (
v1 "k8s.io/api/core/v1"
conversion "k8s.io/apimachinery/pkg/conversion" conversion "k8s.io/apimachinery/pkg/conversion"
runtime "k8s.io/apimachinery/pkg/runtime" runtime "k8s.io/apimachinery/pkg/runtime"
reflect "reflect" reflect "reflect"
@ -59,6 +60,15 @@ func (in *StorageClass) DeepCopyInto(out *StorageClass) {
(*out)[key] = val (*out)[key] = val
} }
} }
if in.ReclaimPolicy != nil {
in, out := &in.ReclaimPolicy, &out.ReclaimPolicy
if *in == nil {
*out = nil
} else {
*out = new(v1.PersistentVolumeReclaimPolicy)
**out = **in
}
}
return return
} }