Skip to content

Commit f2ffed4

Browse files
authored
Merge pull request #152 from verult/flag-gates-0.4
Cherry pick of #148
2 parents d890ddf + 24282a0 commit f2ffed4

File tree

3,548 files changed

+511162
-23490
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

3,548 files changed

+511162
-23490
lines changed

Gopkg.lock

Lines changed: 80 additions & 27 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Gopkg.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,7 @@
5959
[[constraint]]
6060
name = "k8s.io/csi-api"
6161
version = "kubernetes-1.12.0"
62+
63+
[[constraint]]
64+
name = "k8s.io/apiserver"
65+
version = "kubernetes-1.12.0"

cmd/csi-provisioner/csi-provisioner.go

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ limitations under the License.
1717
package main
1818

1919
import (
20-
"flag"
20+
goflag "flag"
2121
"fmt"
22+
flag "github.com/spf13/pflag"
2223
"math/rand"
2324
"os"
2425
"strconv"
@@ -37,17 +38,23 @@ import (
3738
"k8s.io/client-go/kubernetes"
3839
"k8s.io/client-go/rest"
3940
"k8s.io/client-go/tools/clientcmd"
41+
"strings"
42+
43+
utilfeature "k8s.io/apiserver/pkg/util/feature"
44+
utilflag "k8s.io/apiserver/pkg/util/flag"
4045
)
4146

4247
var (
4348
provisioner = flag.String("provisioner", "", "Name of the provisioner. The provisioner will only provision volumes for claims that request a StorageClass with a provisioner field set equal to this name.")
4449
master = flag.String("master", "", "Master URL to build a client config from. Either this or kubeconfig needs to be set if the provisioner is being run out of cluster.")
4550
kubeconfig = flag.String("kubeconfig", "", "Absolute path to the kubeconfig file. Either this or master needs to be set if the provisioner is being run out of cluster.")
46-
csiEndpoint = flag.String("csi-address", "/run/csi/socket", "The gRPC endpoint for Target CSI Volume")
51+
csiEndpoint = flag.String("csi-address", "/run/csi/socket", "The gRPC endpoint for Target CSI Volume.")
4752
connectionTimeout = flag.Duration("connection-timeout", 10*time.Second, "Timeout for waiting for CSI driver socket.")
48-
volumeNamePrefix = flag.String("volume-name-prefix", "pvc", "Prefix to apply to the name of a created volume")
53+
volumeNamePrefix = flag.String("volume-name-prefix", "pvc", "Prefix to apply to the name of a created volume.")
4954
volumeNameUUIDLength = flag.Int("volume-name-uuid-length", -1, "Truncates generated UUID of a created volume to this length. Defaults behavior is to NOT truncate.")
5055
showVersion = flag.Bool("version", false, "Show version.")
56+
enableLeaderElection = flag.Bool("enable-leader-election", false, "Enables leader election. If leader election is enabled, additional RBAC rules are required. Please refer to the Kubernetes CSI documentation for instructions on setting up these RBAC rules.")
57+
featureGates map[string]bool
5158

5259
provisionController *controller.ProvisionController
5360
version = "unknown"
@@ -57,9 +64,17 @@ func init() {
5764
var config *rest.Config
5865
var err error
5966

67+
flag.Var(utilflag.NewMapStringBool(&featureGates), "feature-gates", "A set of key=value pairs that describe feature gates for alpha/experimental features. "+
68+
"Options are:\n"+strings.Join(utilfeature.DefaultFeatureGate.KnownFeatures(), "\n"))
69+
70+
flag.CommandLine.AddGoFlagSet(goflag.CommandLine)
6071
flag.Parse()
6172
flag.Set("logtostderr", "true")
6273

74+
if err := utilfeature.DefaultFeatureGate.SetFromMap(featureGates); err != nil {
75+
glog.Fatal(err)
76+
}
77+
6378
if *showVersion {
6479
fmt.Println(os.Args[0], version)
6580
os.Exit(0)
@@ -129,6 +144,7 @@ func init() {
129144
*provisioner,
130145
csiProvisioner,
131146
serverVersion.GitVersion,
147+
controller.LeaderElection(*enableLeaderElection),
132148
)
133149
}
134150

pkg/controller/controller.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ import (
5050

5151
"github.com/container-storage-interface/spec/lib/go/csi/v0"
5252
csiclientset "k8s.io/csi-api/pkg/client/clientset/versioned"
53+
54+
"github.com/kubernetes-csi/external-provisioner/pkg/features"
55+
utilfeature "k8s.io/apiserver/pkg/util/feature"
5356
)
5457

5558
const (
@@ -412,7 +415,8 @@ func (p *csiProvisioner) Provision(options controller.VolumeOptions) (*v1.Persis
412415
req.VolumeContentSource = volumeContentSource
413416
}
414417

415-
if driverState.capabilities.Has(PluginCapability_ACCESSIBILITY_CONSTRAINTS) {
418+
if driverState.capabilities.Has(PluginCapability_ACCESSIBILITY_CONSTRAINTS) &&
419+
utilfeature.DefaultFeatureGate.Enabled(features.Topology) {
416420
requirements, err := GenerateAccessibilityRequirements(
417421
p.client,
418422
p.csiAPIClient,
@@ -539,7 +543,8 @@ func (p *csiProvisioner) Provision(options controller.VolumeOptions) (*v1.Persis
539543
},
540544
}
541545

542-
if driverState.capabilities.Has(PluginCapability_ACCESSIBILITY_CONSTRAINTS) {
546+
if driverState.capabilities.Has(PluginCapability_ACCESSIBILITY_CONSTRAINTS) &&
547+
utilfeature.DefaultFeatureGate.Enabled(features.Topology) {
543548
pv.Spec.NodeAffinity = GenerateVolumeNodeAffinity(rep.Volume.AccessibleTopology)
544549
}
545550

pkg/controller/controller_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"github.com/container-storage-interface/spec/lib/go/csi/v0"
2929
"github.com/golang/mock/gomock"
3030
"github.com/kubernetes-csi/csi-test/driver"
31+
"github.com/kubernetes-csi/external-provisioner/pkg/features"
3132
crdv1 "github.com/kubernetes-csi/external-snapshotter/pkg/apis/volumesnapshot/v1alpha1"
3233
"github.com/kubernetes-csi/external-snapshotter/pkg/client/clientset/versioned/fake"
3334
"github.com/kubernetes-incubator/external-storage/lib/controller"
@@ -38,6 +39,8 @@ import (
3839
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3940
"k8s.io/apimachinery/pkg/runtime"
4041
"k8s.io/apimachinery/pkg/types"
42+
utilfeature "k8s.io/apiserver/pkg/util/feature"
43+
utilfeaturetesting "k8s.io/apiserver/pkg/util/feature/testing"
4144
"k8s.io/client-go/kubernetes"
4245
fakeclientset "k8s.io/client-go/kubernetes/fake"
4346
k8stesting "k8s.io/client-go/testing"
@@ -1502,6 +1505,8 @@ func TestProvisionFromSnapshot(t *testing.T) {
15021505

15031506
// TestProvisionWithTopology is a basic test of provisioner integration with topology functions.
15041507
func TestProvisionWithTopology(t *testing.T) {
1508+
defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.Topology, true)()
1509+
15051510
accessibleTopology := []*csi.Topology{
15061511
{
15071512
Segments: map[string]string{

0 commit comments

Comments
 (0)