From 3f6caca97a265d58155d90cd2f11f258e565fd52 Mon Sep 17 00:00:00 2001 From: Jan Safranek Date: Fri, 24 Feb 2017 13:34:18 +0100 Subject: [PATCH] Add storage.k8s.io/v1 --- .../app/controllermanager.go | 2 +- .../go2idl/go-to-protobuf/protobuf/cmd.go | 1 + hack/lib/init.sh | 3 +- hack/make-rules/test-cmd-util.sh | 2 +- pkg/apis/storage/install/install.go | 4 +- pkg/apis/storage/v1/doc.go | 22 +++ pkg/apis/storage/v1/register.go | 56 +++++++ pkg/apis/storage/v1/types.go | 57 ++++++++ pkg/apis/storage/v1/util/helpers.go | 137 ++++++++++++++++++ pkg/controller/informers/storage.go | 2 +- .../volume/persistentvolume/framework_test.go | 4 +- .../volume/persistentvolume/pv_controller.go | 6 +- .../persistentvolume/pv_controller_base.go | 4 +- pkg/volume/util/util.go | 2 +- test/e2e/volume_provisioning.go | 3 +- 15 files changed, 291 insertions(+), 14 deletions(-) create mode 100644 pkg/apis/storage/v1/doc.go create mode 100644 pkg/apis/storage/v1/register.go create mode 100644 pkg/apis/storage/v1/types.go create mode 100644 pkg/apis/storage/v1/util/helpers.go diff --git a/cmd/kube-controller-manager/app/controllermanager.go b/cmd/kube-controller-manager/app/controllermanager.go index b32ea0e4605..9b185eb7b0e 100644 --- a/cmd/kube-controller-manager/app/controllermanager.go +++ b/cmd/kube-controller-manager/app/controllermanager.go @@ -493,7 +493,7 @@ func StartControllers(controllers map[string]InitFunc, s *options.CMServer, root ClusterName: s.ClusterName, VolumeInformer: newSharedInformers.Core().V1().PersistentVolumes(), ClaimInformer: newSharedInformers.Core().V1().PersistentVolumeClaims(), - ClassInformer: newSharedInformers.Storage().V1beta1().StorageClasses(), + ClassInformer: newSharedInformers.Storage().V1().StorageClasses(), EnableDynamicProvisioning: s.VolumeConfiguration.EnableDynamicProvisioning, } volumeController := persistentvolumecontroller.NewController(params) diff --git a/cmd/libs/go2idl/go-to-protobuf/protobuf/cmd.go b/cmd/libs/go2idl/go-to-protobuf/protobuf/cmd.go index 39cc2c7c655..29b99471fc0 100644 --- a/cmd/libs/go2idl/go-to-protobuf/protobuf/cmd.go +++ b/cmd/libs/go2idl/go-to-protobuf/protobuf/cmd.go @@ -86,6 +86,7 @@ func New() *Generator { `k8s.io/kubernetes/pkg/apis/certificates/v1beta1`, `k8s.io/kubernetes/pkg/apis/imagepolicy/v1alpha1`, `k8s.io/kubernetes/pkg/apis/storage/v1beta1`, + `k8s.io/kubernetes/pkg/apis/storage/v1`, }, ","), DropEmbeddedFields: "k8s.io/apimachinery/pkg/apis/meta/v1.TypeMeta", } diff --git a/hack/lib/init.sh b/hack/lib/init.sh index 68af35d2c39..e6afe565efd 100644 --- a/hack/lib/init.sh +++ b/hack/lib/init.sh @@ -68,7 +68,8 @@ imagepolicy.k8s.io/v1alpha1 \ policy/v1beta1 \ rbac.authorization.k8s.io/v1beta1 \ rbac.authorization.k8s.io/v1alpha1 \ -storage.k8s.io/v1beta1\ +storage.k8s.io/v1beta1 \ +storage.k8s.io/v1\ }" # not all group versions are exposed by the server. This list contains those diff --git a/hack/make-rules/test-cmd-util.sh b/hack/make-rules/test-cmd-util.sh index 76a1d63f0d9..47de6988355 100644 --- a/hack/make-rules/test-cmd-util.sh +++ b/hack/make-rules/test-cmd-util.sh @@ -3230,7 +3230,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" }, diff --git a/pkg/apis/storage/install/install.go b/pkg/apis/storage/install/install.go index 955c7e79dbf..7b09a34d233 100644 --- a/pkg/apis/storage/install/install.go +++ b/pkg/apis/storage/install/install.go @@ -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,13 @@ func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *r if err := announced.NewGroupMetaFactory( &announced.GroupMetaFactoryArgs{ GroupName: storage.GroupName, - VersionPreferenceOrder: []string{v1beta1.SchemeGroupVersion.Version}, + VersionPreferenceOrder: []string{v1.SchemeGroupVersion.Version, v1beta1.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 { diff --git a/pkg/apis/storage/v1/doc.go b/pkg/apis/storage/v1/doc.go new file mode 100644 index 00000000000..32f99daea9a --- /dev/null +++ b/pkg/apis/storage/v1/doc.go @@ -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 diff --git a/pkg/apis/storage/v1/register.go b/pkg/apis/storage/v1/register.go new file mode 100644 index 00000000000..d04e8e808f8 --- /dev/null +++ b/pkg/apis/storage/v1/register.go @@ -0,0 +1,56 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/kubernetes/pkg/api/v1" +) + +// 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, + &v1.ListOptions{}, + &v1.DeleteOptions{}, + &metav1.ExportOptions{}, + &metav1.GetOptions{}, + + &StorageClass{}, + &StorageClassList{}, + ) + + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) + return nil +} diff --git a/pkg/apis/storage/v1/types.go b/pkg/apis/storage/v1/types.go new file mode 100644 index 00000000000..25b283b81fc --- /dev/null +++ b/pkg/apis/storage/v1/types.go @@ -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"` +} diff --git a/pkg/apis/storage/v1/util/helpers.go b/pkg/apis/storage/v1/util/helpers.go new file mode 100644 index 00000000000..39c4f6f3ed5 --- /dev/null +++ b/pkg/apis/storage/v1/util/helpers.go @@ -0,0 +1,137 @@ +/* +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" + "k8s.io/kubernetes/pkg/api/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" + +// 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 +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 +} diff --git a/pkg/controller/informers/storage.go b/pkg/controller/informers/storage.go index db3898c05df..1730fdbbad9 100644 --- a/pkg/controller/informers/storage.go +++ b/pkg/controller/informers/storage.go @@ -23,7 +23,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/tools/cache" - storage "k8s.io/kubernetes/pkg/apis/storage/v1beta1" + storage "k8s.io/kubernetes/pkg/apis/storage/v1" "k8s.io/kubernetes/pkg/client/legacylisters" ) diff --git a/pkg/controller/volume/persistentvolume/framework_test.go b/pkg/controller/volume/persistentvolume/framework_test.go index d23fba4d611..909b85f4c00 100644 --- a/pkg/controller/volume/persistentvolume/framework_test.go +++ b/pkg/controller/volume/persistentvolume/framework_test.go @@ -47,7 +47,7 @@ import ( "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" - storagelisters "k8s.io/kubernetes/pkg/client/listers/storage/v1beta1" + storagelisters "k8s.io/kubernetes/pkg/client/listers/storage/v1" "k8s.io/kubernetes/pkg/controller" vol "k8s.io/kubernetes/pkg/volume" ) @@ -607,7 +607,7 @@ func newTestController(kubeClient clientset.Interface, informerFactory informers VolumePlugins: []vol.VolumePlugin{}, VolumeInformer: informerFactory.Core().V1().PersistentVolumes(), ClaimInformer: informerFactory.Core().V1().PersistentVolumeClaims(), - ClassInformer: informerFactory.Storage().V1beta1().StorageClasses(), + ClassInformer: informerFactory.Storage().V1().StorageClasses(), EventRecorder: record.NewFakeRecorder(1000), EnableDynamicProvisioning: enableDynamicProvisioning, } diff --git a/pkg/controller/volume/persistentvolume/pv_controller.go b/pkg/controller/volume/persistentvolume/pv_controller.go index 212a85bff52..abbe3ec373f 100644 --- a/pkg/controller/volume/persistentvolume/pv_controller.go +++ b/pkg/controller/volume/persistentvolume/pv_controller.go @@ -28,11 +28,11 @@ import ( "k8s.io/client-go/util/workqueue" "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" + storage "k8s.io/kubernetes/pkg/apis/storage/v1" + storageutil "k8s.io/kubernetes/pkg/apis/storage/v1/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" + storagelisters "k8s.io/kubernetes/pkg/client/listers/storage/v1" "k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/util/goroutinemap" vol "k8s.io/kubernetes/pkg/volume" diff --git a/pkg/controller/volume/persistentvolume/pv_controller_base.go b/pkg/controller/volume/persistentvolume/pv_controller_base.go index ee83a7e304a..333c618a491 100644 --- a/pkg/controller/volume/persistentvolume/pv_controller_base.go +++ b/pkg/controller/volume/persistentvolume/pv_controller_base.go @@ -34,10 +34,10 @@ import ( "k8s.io/client-go/util/workqueue" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/v1" - storage "k8s.io/kubernetes/pkg/apis/storage/v1beta1" + storage "k8s.io/kubernetes/pkg/apis/storage/v1" "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" coreinformers "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions/core/v1" - storageinformers "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions/storage/v1beta1" + storageinformers "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions/storage/v1" corelisters "k8s.io/kubernetes/pkg/client/listers/core/v1" "k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/controller" diff --git a/pkg/volume/util/util.go b/pkg/volume/util/util.go index 0112d394a7a..90e8cdad0c4 100644 --- a/pkg/volume/util/util.go +++ b/pkg/volume/util/util.go @@ -24,7 +24,7 @@ import ( "github.com/golang/glog" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/kubernetes/pkg/api/v1" - storage "k8s.io/kubernetes/pkg/apis/storage/v1beta1" + storage "k8s.io/kubernetes/pkg/apis/storage/v1" "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" "k8s.io/kubernetes/pkg/util/mount" ) diff --git a/test/e2e/volume_provisioning.go b/test/e2e/volume_provisioning.go index cc0524c6f50..1ad84dfe7c6 100644 --- a/test/e2e/volume_provisioning.go +++ b/test/e2e/volume_provisioning.go @@ -24,9 +24,10 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apiserver/pkg/authentication/serviceaccount" + "k8s.io/kubernetes/pkg/api/v1" rbacv1beta1 "k8s.io/kubernetes/pkg/apis/rbac/v1beta1" - storage "k8s.io/kubernetes/pkg/apis/storage/v1beta1" + storage "k8s.io/kubernetes/pkg/apis/storage/v1" storageutil "k8s.io/kubernetes/pkg/apis/storage/v1beta1/util" "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" "k8s.io/kubernetes/test/e2e/framework"