From 8be7963797f46a44aa914318e7cd4f462941944c Mon Sep 17 00:00:00 2001 From: Andrew Kim Date: Thu, 31 Jan 2019 12:54:18 -0500 Subject: [PATCH] move GCERegionalPersistentDisk feature to k8s.io/cloud-provider --- pkg/cloudprovider/providers/gce/BUILD | 2 +- pkg/cloudprovider/providers/gce/gce_disks.go | 28 ++++++++-------- pkg/features/BUILD | 1 + pkg/features/kube_features.go | 9 ++--- pkg/volume/gcepd/BUILD | 1 + pkg/volume/gcepd/gce_util.go | 6 ++-- staging/publishing/import-restrictions.yaml | 1 + staging/src/k8s.io/cloud-provider/BUILD | 1 + .../k8s.io/cloud-provider/Godeps/Godeps.json | 8 +++++ .../src/k8s.io/cloud-provider/features/BUILD | 24 ++++++++++++++ .../src/k8s.io/cloud-provider/features/gce.go | 33 +++++++++++++++++++ 11 files changed, 89 insertions(+), 25 deletions(-) create mode 100644 staging/src/k8s.io/cloud-provider/features/BUILD create mode 100644 staging/src/k8s.io/cloud-provider/features/gce.go diff --git a/pkg/cloudprovider/providers/gce/BUILD b/pkg/cloudprovider/providers/gce/BUILD index adab6ef078..d78dc72d31 100644 --- a/pkg/cloudprovider/providers/gce/BUILD +++ b/pkg/cloudprovider/providers/gce/BUILD @@ -47,7 +47,6 @@ go_library( importpath = "k8s.io/kubernetes/pkg/cloudprovider/providers/gce", deps = [ "//pkg/api/v1/service:go_default_library", - "//pkg/features:go_default_library", "//pkg/kubelet/apis:go_default_library", "//pkg/master/ports:go_default_library", "//pkg/util/net/sets:go_default_library", @@ -74,6 +73,7 @@ go_library( "//staging/src/k8s.io/client-go/tools/record:go_default_library", "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", "//staging/src/k8s.io/cloud-provider:go_default_library", + "//staging/src/k8s.io/cloud-provider/features:go_default_library", "//vendor/cloud.google.com/go/compute/metadata:go_default_library", "//vendor/github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud:go_default_library", "//vendor/github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/filter:go_default_library", diff --git a/pkg/cloudprovider/providers/gce/gce_disks.go b/pkg/cloudprovider/providers/gce/gce_disks.go index 1c3bda8dd8..268d83b5c4 100644 --- a/pkg/cloudprovider/providers/gce/gce_disks.go +++ b/pkg/cloudprovider/providers/gce/gce_disks.go @@ -38,8 +38,8 @@ import ( compute "google.golang.org/api/compute/v1" "google.golang.org/api/googleapi" utilfeature "k8s.io/apiserver/pkg/util/feature" + cloudfeatures "k8s.io/cloud-provider/features" "k8s.io/klog" - "k8s.io/kubernetes/pkg/features" ) // DiskType defines a specific type for holding disk types (eg. pd-ssd) @@ -146,8 +146,8 @@ func (manager *gceServiceManager) CreateRegionalDiskOnCloudProvider( diskType string, replicaZones sets.String) error { - if !utilfeature.DefaultFeatureGate.Enabled(features.GCERegionalPersistentDisk) { - return fmt.Errorf("the regional PD feature is only available with the %s Kubernetes feature gate enabled", features.GCERegionalPersistentDisk) + if !utilfeature.DefaultFeatureGate.Enabled(cloudfeatures.GCERegionalPersistentDisk) { + return fmt.Errorf("the regional PD feature is only available with the %s Kubernetes feature gate enabled", cloudfeatures.GCERegionalPersistentDisk) } diskTypeURI, err := manager.getDiskTypeURI( @@ -247,8 +247,8 @@ func (manager *gceServiceManager) GetDiskFromCloudProvider( func (manager *gceServiceManager) GetRegionalDiskFromCloudProvider( diskName string) (*Disk, error) { - if !utilfeature.DefaultFeatureGate.Enabled(features.GCERegionalPersistentDisk) { - return nil, fmt.Errorf("the regional PD feature is only available with the %s Kubernetes feature gate enabled", features.GCERegionalPersistentDisk) + if !utilfeature.DefaultFeatureGate.Enabled(cloudfeatures.GCERegionalPersistentDisk) { + return nil, fmt.Errorf("the regional PD feature is only available with the %s Kubernetes feature gate enabled", cloudfeatures.GCERegionalPersistentDisk) } ctx, cancel := cloud.ContextWithCallTimeout() @@ -284,8 +284,8 @@ func (manager *gceServiceManager) DeleteDiskOnCloudProvider( func (manager *gceServiceManager) DeleteRegionalDiskOnCloudProvider( diskName string) error { - if !utilfeature.DefaultFeatureGate.Enabled(features.GCERegionalPersistentDisk) { - return fmt.Errorf("the regional PD feature is only available with the %s Kubernetes feature gate enabled", features.GCERegionalPersistentDisk) + if !utilfeature.DefaultFeatureGate.Enabled(cloudfeatures.GCERegionalPersistentDisk) { + return fmt.Errorf("the regional PD feature is only available with the %s Kubernetes feature gate enabled", cloudfeatures.GCERegionalPersistentDisk) } ctx, cancel := cloud.ContextWithCallTimeout() @@ -411,8 +411,8 @@ func (manager *gceServiceManager) ResizeDiskOnCloudProvider(disk *Disk, sizeGb i } func (manager *gceServiceManager) RegionalResizeDiskOnCloudProvider(disk *Disk, sizeGb int64) error { - if !utilfeature.DefaultFeatureGate.Enabled(features.GCERegionalPersistentDisk) { - return fmt.Errorf("the regional PD feature is only available with the %s Kubernetes feature gate enabled", features.GCERegionalPersistentDisk) + if !utilfeature.DefaultFeatureGate.Enabled(cloudfeatures.GCERegionalPersistentDisk) { + return fmt.Errorf("the regional PD feature is only available with the %s Kubernetes feature gate enabled", cloudfeatures.GCERegionalPersistentDisk) } resizeServiceRequest := &compute.RegionDisksResizeRequest{ @@ -532,7 +532,7 @@ func (g *Cloud) AttachDisk(diskName string, nodeName types.NodeName, readOnly bo // Try fetching as regional PD var disk *Disk var mc *metricContext - if regional && utilfeature.DefaultFeatureGate.Enabled(features.GCERegionalPersistentDisk) { + if regional && utilfeature.DefaultFeatureGate.Enabled(cloudfeatures.GCERegionalPersistentDisk) { disk, err = g.getRegionalDiskByName(diskName) if err != nil { return err @@ -768,7 +768,7 @@ func (g *Cloud) ResizeDisk(diskToResize string, oldSize resource.Quantity, newSi } return newSizeQuant, mc.Observe(err) case multiZone: - if !utilfeature.DefaultFeatureGate.Enabled(features.GCERegionalPersistentDisk) { + if !utilfeature.DefaultFeatureGate.Enabled(cloudfeatures.GCERegionalPersistentDisk) { return oldSize, fmt.Errorf("disk.ZoneInfo has unexpected type %T", zoneInfo) } @@ -811,7 +811,7 @@ func (g *Cloud) GetAutoLabelsForPD(name string, zone string) (map[string]string, // We could assume the disks exists; we have all the information we need // However it is more consistent to ensure the disk exists, // and in future we may gather addition information (e.g. disk type, IOPS etc) - if utilfeature.DefaultFeatureGate.Enabled(features.GCERegionalPersistentDisk) { + if utilfeature.DefaultFeatureGate.Enabled(cloudfeatures.GCERegionalPersistentDisk) { zoneSet, err := volumeutil.LabelZonesToSet(zone) if err != nil { klog.Warningf("Failed to parse zone field: %q. Will use raw field.", zone) @@ -916,7 +916,7 @@ func (g *Cloud) getRegionalDiskByName(diskName string) (*Disk, error) { // Prefer getDiskByName, if the zone can be established // Return cloudprovider.DiskNotFound if the given disk cannot be found in any zone func (g *Cloud) GetDiskByNameUnknownZone(diskName string) (*Disk, error) { - if utilfeature.DefaultFeatureGate.Enabled(features.GCERegionalPersistentDisk) { + if utilfeature.DefaultFeatureGate.Enabled(cloudfeatures.GCERegionalPersistentDisk) { regionalDisk, err := g.getRegionalDiskByName(diskName) if err == nil { return regionalDisk, err @@ -996,7 +996,7 @@ func (g *Cloud) doDeleteDisk(diskToDelete string) error { mc = newDiskMetricContextZonal("delete", disk.Region, zoneInfo.zone) return mc.Observe(g.manager.DeleteDiskOnCloudProvider(zoneInfo.zone, disk.Name)) case multiZone: - if !utilfeature.DefaultFeatureGate.Enabled(features.GCERegionalPersistentDisk) { + if !utilfeature.DefaultFeatureGate.Enabled(cloudfeatures.GCERegionalPersistentDisk) { return fmt.Errorf("disk.ZoneInfo has unexpected type %T", zoneInfo) } diff --git a/pkg/features/BUILD b/pkg/features/BUILD index b0c1c85443..f652b7d3ce 100644 --- a/pkg/features/BUILD +++ b/pkg/features/BUILD @@ -13,6 +13,7 @@ go_library( "//staging/src/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/cloud-provider/features:go_default_library", ], ) diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 86acccdf42..ee2bcda099 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -20,6 +20,7 @@ import ( apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features" genericfeatures "k8s.io/apiserver/pkg/features" utilfeature "k8s.io/apiserver/pkg/util/feature" + cloudfeatures "k8s.io/cloud-provider/features" ) const ( @@ -282,12 +283,6 @@ const ( // Enable container log rotation for cri container runtime CRIContainerLogRotation utilfeature.Feature = "CRIContainerLogRotation" - // owner: @verult - // GA: v1.13 - // - // Enables the regional PD feature on GCE. - GCERegionalPersistentDisk utilfeature.Feature = "GCERegionalPersistentDisk" - // owner: @krmayankk // alpha: v1.10 // @@ -460,7 +455,7 @@ var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureS TokenRequestProjection: {Default: true, PreRelease: utilfeature.Beta}, BoundServiceAccountTokenVolume: {Default: false, PreRelease: utilfeature.Alpha}, CRIContainerLogRotation: {Default: true, PreRelease: utilfeature.Beta}, - GCERegionalPersistentDisk: {Default: true, PreRelease: utilfeature.GA}, + cloudfeatures.GCERegionalPersistentDisk: {Default: true, PreRelease: utilfeature.GA}, CSIMigration: {Default: false, PreRelease: utilfeature.Alpha}, CSIMigrationGCE: {Default: false, PreRelease: utilfeature.Alpha}, CSIMigrationAWS: {Default: false, PreRelease: utilfeature.Alpha}, diff --git a/pkg/volume/gcepd/BUILD b/pkg/volume/gcepd/BUILD index 42ec285363..2278e7bd2f 100644 --- a/pkg/volume/gcepd/BUILD +++ b/pkg/volume/gcepd/BUILD @@ -32,6 +32,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/cloud-provider:go_default_library", + "//staging/src/k8s.io/cloud-provider/features:go_default_library", "//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/path:go_default_library", diff --git a/pkg/volume/gcepd/gce_util.go b/pkg/volume/gcepd/gce_util.go index 0d7e2126e2..bb5ff8c844 100644 --- a/pkg/volume/gcepd/gce_util.go +++ b/pkg/volume/gcepd/gce_util.go @@ -28,9 +28,9 @@ import ( "k8s.io/apimachinery/pkg/util/sets" utilfeature "k8s.io/apiserver/pkg/util/feature" cloudprovider "k8s.io/cloud-provider" + cloudfeatures "k8s.io/cloud-provider/features" "k8s.io/klog" gcecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/gce" - "k8s.io/kubernetes/pkg/features" kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis" "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" @@ -127,10 +127,10 @@ func (util *GCEDiskUtil) CreateVolume(c *gcePersistentDiskProvisioner, node *v1. return "", 0, nil, "", err } case "replication-type": - if !utilfeature.DefaultFeatureGate.Enabled(features.GCERegionalPersistentDisk) { + if !utilfeature.DefaultFeatureGate.Enabled(cloudfeatures.GCERegionalPersistentDisk) { return "", 0, nil, "", fmt.Errorf("the %q option for volume plugin %v is only supported with the %q Kubernetes feature gate enabled", - k, c.plugin.GetPluginName(), features.GCERegionalPersistentDisk) + k, c.plugin.GetPluginName(), cloudfeatures.GCERegionalPersistentDisk) } replicationType = strings.ToLower(v) case volume.VolumeParameterFSType: diff --git a/staging/publishing/import-restrictions.yaml b/staging/publishing/import-restrictions.yaml index bfcd70fefa..dc08fff7ea 100644 --- a/staging/publishing/import-restrictions.yaml +++ b/staging/publishing/import-restrictions.yaml @@ -188,6 +188,7 @@ allowedImports: - k8s.io/api - k8s.io/apimachinery + - k8s.io/apiserver - k8s.io/client-go - k8s.io/klog diff --git a/staging/src/k8s.io/cloud-provider/BUILD b/staging/src/k8s.io/cloud-provider/BUILD index 21126c5df8..5f62f39057 100644 --- a/staging/src/k8s.io/cloud-provider/BUILD +++ b/staging/src/k8s.io/cloud-provider/BUILD @@ -35,6 +35,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//staging/src/k8s.io/cloud-provider/features:all-srcs", "//staging/src/k8s.io/cloud-provider/node:all-srcs", ], tags = ["automanaged"], diff --git a/staging/src/k8s.io/cloud-provider/Godeps/Godeps.json b/staging/src/k8s.io/cloud-provider/Godeps/Godeps.json index 5393449dba..2959210ba9 100644 --- a/staging/src/k8s.io/cloud-provider/Godeps/Godeps.json +++ b/staging/src/k8s.io/cloud-provider/Godeps/Godeps.json @@ -90,6 +90,10 @@ "ImportPath": "github.com/peterbourgon/diskv", "Rev": "5f041e8faa004a95c88a202771f4cc3e991971e6" }, + { + "ImportPath": "github.com/spf13/pflag", + "Rev": "583c0c0531f06d5278b7d917446061adc344b5cd" + }, { "ImportPath": "golang.org/x/crypto/ssh/terminal", "Rev": "de0752318171da717af4ce24d0a2e8626afaeb11" @@ -458,6 +462,10 @@ "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", "Rev": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }, + { + "ImportPath": "k8s.io/apiserver/pkg/util/feature", + "Rev": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + }, { "ImportPath": "k8s.io/client-go/discovery", "Rev": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" diff --git a/staging/src/k8s.io/cloud-provider/features/BUILD b/staging/src/k8s.io/cloud-provider/features/BUILD new file mode 100644 index 0000000000..6280c20721 --- /dev/null +++ b/staging/src/k8s.io/cloud-provider/features/BUILD @@ -0,0 +1,24 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["gce.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/cloud-provider/features", + importpath = "k8s.io/cloud-provider/features", + visibility = ["//visibility:public"], + deps = ["//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/cloud-provider/features/gce.go b/staging/src/k8s.io/cloud-provider/features/gce.go new file mode 100644 index 0000000000..7fcea2a3c0 --- /dev/null +++ b/staging/src/k8s.io/cloud-provider/features/gce.go @@ -0,0 +1,33 @@ +/* +Copyright 2019 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 features + +import ( + utilfeature "k8s.io/apiserver/pkg/util/feature" +) + +// TODO: this file should ideally live in k8s.io/cloud-provider-gcp, but it is +// temporarily placed here to remove dependencies to k8s.io/kubernetes in the +// in-tree GCE cloud provider. Move this to k8s.io/cloud-provider-gcp as soon +// as it's ready to be used +const ( + // owner: @verult + // GA: v1.13 + // + // Enables the regional PD feature on GCE. + GCERegionalPersistentDisk utilfeature.Feature = "GCERegionalPersistentDisk" +)