Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions CHANGELOG-1.5.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

## Breaking Changes

- Updates VolumeSnapshot CRD to v1beta1. v1alpha1 is no longer upported. ([#335](https://github.com/kubernetes-csi/external-provisioner/pull/335), [@xing-yang](https://github.com/xing-yang))
- Updates VolumeSnapshot CRD to v1beta1. v1alpha1 is no longer supported. ([#335](https://github.com/kubernetes-csi/external-provisioner/pull/335), [@xing-yang](https://github.com/xing-yang))

## New Features

- Add prometheus metrics to CSI external-provisioner under the /metrics endpoint. This can be enabled via the "--metrics-address" and "--metrics-path" options. ([#388](https://github.com/kubernetes-csi/external-provisioner/pull/388), [@saad-ali](https://github.com/saad-ali))
- Updates VolumeSnapshot CRD to v1beta1. v1alpha1 is no longer upported. ([#335](https://github.com/kubernetes-csi/external-provisioner/pull/335), [@xing-yang](https://github.com/xing-yang))
- Updates VolumeSnapshot CRD to v1beta1. v1alpha1 is no longer supported. ([#335](https://github.com/kubernetes-csi/external-provisioner/pull/335), [@xing-yang](https://github.com/xing-yang))

## Other Notable Changes

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ Note that the external-provisioner does not scale with more replicas. Only one e

* `--worker-threads <num>`: Number of simultaneously running `ControllerCreateVolume` and `ControllerDeleteVolume` operations. Default value is `100`.

* `--metrics-address`: The TCP network address address where the prometheus metrics endpoint will run (example: `:8080` which corresponds to port 8080 on local host). The default is empty string, which means metrics endpoint is disabled.
* `--metrics-address`: The TCP network address where the prometheus metrics endpoint will run (example: `:8080` which corresponds to port 8080 on local host). The default is empty string, which means metrics endpoint is disabled.

* `--metrics-path`: The HTTP path where prometheus metrics will be exposed. Default is `/metrics`.

Expand Down
10 changes: 7 additions & 3 deletions cmd/csi-provisioner/csi-provisioner.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ import (
utilfeature "k8s.io/apiserver/pkg/util/feature"
"k8s.io/client-go/informers"
v1 "k8s.io/client-go/listers/core/v1"
storagelisters "k8s.io/client-go/listers/storage/v1beta1"
storagelistersv1 "k8s.io/client-go/listers/storage/v1"
storagelistersv1beta1 "k8s.io/client-go/listers/storage/v1beta1"
utilflag "k8s.io/component-base/cli/flag"
csitrans "k8s.io/csi-translation-lib"
)
Expand All @@ -69,7 +70,7 @@ var (
leaderElectionNamespace = flag.String("leader-election-namespace", "", "Namespace where the leader election resource lives. Defaults to the pod namespace if not set.")
strictTopology = flag.Bool("strict-topology", false, "Passes only selected node topology to CreateVolume Request, unlike default behavior of passing aggregated cluster topologies that match with topology keys of the selected node.")

metricsAddress = flag.String("metrics-address", "", "The TCP network address address where the prometheus metrics endpoint will listen (example: `:8080`). The default is empty string, which means metrics endpoint is disabled.")
metricsAddress = flag.String("metrics-address", "", "The TCP network address where the prometheus metrics endpoint will listen (example: `:8080`). The default is empty string, which means metrics endpoint is disabled.")
metricsPath = flag.String("metrics-path", "/metrics", "The HTTP path where prometheus metrics will be exposed. Default is `/metrics`.")

featureGates map[string]bool
Expand Down Expand Up @@ -192,12 +193,14 @@ func main() {
provisionerOptions = append(provisionerOptions, controller.AdditionalProvisionerNames([]string{supportsMigrationFromInTreePluginName}))
}

var csiNodeLister storagelisters.CSINodeLister
var scLister storagelistersv1.StorageClassLister
var csiNodeLister storagelistersv1beta1.CSINodeLister
var nodeLister v1.NodeLister
var factory informers.SharedInformerFactory
if ctrl.SupportsTopology(pluginCapabilities) {
// Create informer to prevent hit the API server for all resource request
factory = informers.NewSharedInformerFactory(clientset, ctrl.ResyncPeriodOfCsiNodeInformer)
scLister = factory.Storage().V1().StorageClasses().Lister()
csiNodeLister = factory.Storage().V1beta1().CSINodes().Lister()
nodeLister = factory.Core().V1().Nodes().Lister()
}
Expand All @@ -218,6 +221,7 @@ func main() {
supportsMigrationFromInTreePluginName,
*strictTopology,
translator,
scLister,
csiNodeLister,
nodeLister)

Expand Down
15 changes: 10 additions & 5 deletions pkg/controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ import (

"google.golang.org/grpc"
corelisters "k8s.io/client-go/listers/core/v1"
storagelisters "k8s.io/client-go/listers/storage/v1beta1"
storagelistersv1 "k8s.io/client-go/listers/storage/v1"
storagelistersv1beta1 "k8s.io/client-go/listers/storage/v1beta1"
)

//secretParamsMap provides a mapping of current as well as deprecated secret keys
Expand Down Expand Up @@ -201,7 +202,8 @@ type csiProvisioner struct {
supportsMigrationFromInTreePluginName string
strictTopology bool
translator ProvisionerCSITranslator
csiNodeLister storagelisters.CSINodeLister
scLister storagelistersv1.StorageClassLister
csiNodeLister storagelistersv1beta1.CSINodeLister
nodeLister corelisters.NodeLister
}

Expand Down Expand Up @@ -263,7 +265,8 @@ func NewCSIProvisioner(client kubernetes.Interface,
supportsMigrationFromInTreePluginName string,
strictTopology bool,
translator ProvisionerCSITranslator,
csiNodeLister storagelisters.CSINodeLister,
scLister storagelistersv1.StorageClassLister,
csiNodeLister storagelistersv1beta1.CSINodeLister,
nodeLister corelisters.NodeLister) controller.Provisioner {

csiClient := csi.NewControllerClient(grpcClient)
Expand All @@ -282,6 +285,7 @@ func NewCSIProvisioner(client kubernetes.Interface,
supportsMigrationFromInTreePluginName: supportsMigrationFromInTreePluginName,
strictTopology: strictTopology,
translator: translator,
scLister: scLister,
csiNodeLister: csiNodeLister,
nodeLister: nodeLister,
}
Expand Down Expand Up @@ -907,10 +911,11 @@ func (p *csiProvisioner) Delete(volume *v1.PersistentVolume) error {
req := csi.DeleteVolumeRequest{
VolumeId: volumeId,
}

// get secrets if StorageClass specifies it
storageClassName := volume.Spec.StorageClassName
storageClassName := util.GetPersistentVolumeClass(volume)
if len(storageClassName) != 0 {
if storageClass, err := p.client.StorageV1().StorageClasses().Get(storageClassName, metav1.GetOptions{}); err == nil {
if storageClass, err := p.scLister.Get(storageClassName); err == nil {
// Resolve provision secret credentials.
provisionerSecretRef, err := getSecretReference(provisionerSecretParams, storageClass.Parameters, volume.Name, &v1.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{
Expand Down
21 changes: 11 additions & 10 deletions pkg/controller/controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,7 @@ func TestCreateDriverReturnsInvalidCapacityDuringProvision(t *testing.T) {

pluginCaps, controllerCaps := provisionCapabilities()
csiProvisioner := NewCSIProvisioner(nil, 5*time.Second, "test-provisioner", "test",
5, csiConn.conn, nil, driverName, pluginCaps, controllerCaps, "", false, csitrans.New(), nil, nil)
5, csiConn.conn, nil, driverName, pluginCaps, controllerCaps, "", false, csitrans.New(), nil, nil, nil)

// Requested PVC with requestedBytes storage
deletePolicy := v1.PersistentVolumeReclaimDelete
Expand Down Expand Up @@ -1465,7 +1465,7 @@ func runProvisionTest(t *testing.T, k string, tc provisioningTestcase, requested

pluginCaps, controllerCaps := provisionCapabilities()
csiProvisioner := NewCSIProvisioner(clientSet, 5*time.Second, "test-provisioner", "test", 5, csiConn.conn,
nil, provisionDriverName, pluginCaps, controllerCaps, supportsMigrationFromInTreePluginName, false, csitrans.New(), nil, nil)
nil, provisionDriverName, pluginCaps, controllerCaps, supportsMigrationFromInTreePluginName, false, csitrans.New(), nil, nil, nil)

out := &csi.CreateVolumeResponse{
Volume: &csi.Volume{
Expand Down Expand Up @@ -2212,7 +2212,7 @@ func TestProvisionFromSnapshot(t *testing.T) {

pluginCaps, controllerCaps := provisionFromSnapshotCapabilities()
csiProvisioner := NewCSIProvisioner(clientSet, 5*time.Second, "test-provisioner", "test", 5, csiConn.conn,
client, driverName, pluginCaps, controllerCaps, "", false, csitrans.New(), nil, nil)
client, driverName, pluginCaps, controllerCaps, "", false, csitrans.New(), nil, nil, nil)

out := &csi.CreateVolumeResponse{
Volume: &csi.Volume{
Expand Down Expand Up @@ -2382,11 +2382,11 @@ func TestProvisionWithTopologyEnabled(t *testing.T) {

clientSet := fakeclientset.NewSimpleClientset(nodes, csiNodes)

csiNodeLister, nodeLister, stopChan := listers(clientSet)
scLister, csiNodeLister, nodeLister, stopChan := listers(clientSet)
defer close(stopChan)

csiProvisioner := NewCSIProvisioner(clientSet, 5*time.Second, "test-provisioner", "test", 5,
csiConn.conn, nil, driverName, pluginCaps, controllerCaps, "", false, csitrans.New(), csiNodeLister, nodeLister)
csiConn.conn, nil, driverName, pluginCaps, controllerCaps, "", false, csitrans.New(), scLister, csiNodeLister, nodeLister)

pv, err := csiProvisioner.Provision(controller.ProvisionOptions{
StorageClass: &storagev1.StorageClass{},
Expand Down Expand Up @@ -2441,7 +2441,7 @@ func TestProvisionWithTopologyDisabled(t *testing.T) {
clientSet := fakeclientset.NewSimpleClientset()
pluginCaps, controllerCaps := provisionWithTopologyCapabilities()
csiProvisioner := NewCSIProvisioner(clientSet, 5*time.Second, "test-provisioner", "test", 5,
csiConn.conn, nil, driverName, pluginCaps, controllerCaps, "", false, csitrans.New(), nil, nil)
csiConn.conn, nil, driverName, pluginCaps, controllerCaps, "", false, csitrans.New(), nil, nil, nil)

out := &csi.CreateVolumeResponse{
Volume: &csi.Volume{
Expand Down Expand Up @@ -2611,8 +2611,9 @@ func runDeleteTest(t *testing.T, k string, tc deleteTestcase) {
}

pluginCaps, controllerCaps := provisionCapabilities()
scLister, _, _, _ := listers(clientSet)
csiProvisioner := NewCSIProvisioner(clientSet, 5*time.Second, "test-provisioner", "test", 5,
csiConn.conn, nil, driverName, pluginCaps, controllerCaps, "", false, csitrans.New(), nil, nil)
csiConn.conn, nil, driverName, pluginCaps, controllerCaps, "", false, csitrans.New(), scLister, nil, nil)

err = csiProvisioner.Delete(tc.persistentVolume)
if tc.expectErr && err == nil {
Expand Down Expand Up @@ -3314,7 +3315,7 @@ func TestProvisionFromPVC(t *testing.T) {
}

csiProvisioner := NewCSIProvisioner(clientSet, 5*time.Second, "test-provisioner", "test", 5, csiConn.conn,
nil, driverName, pluginCaps, controllerCaps, "", false, csitrans.New(), nil, nil)
nil, driverName, pluginCaps, controllerCaps, "", false, csitrans.New(), nil, nil, nil)

pv, err := csiProvisioner.Provision(tc.volOpts)
if tc.expectErr && err == nil {
Expand Down Expand Up @@ -3393,7 +3394,7 @@ func TestProvisionWithMigration(t *testing.T) {
pluginCaps, controllerCaps := provisionCapabilities()
csiProvisioner := NewCSIProvisioner(clientSet, 5*time.Second, "test-provisioner",
"test", 5, csiConn.conn, nil, driverName, pluginCaps, controllerCaps,
inTreePluginName, false, mockTranslator, nil, nil)
inTreePluginName, false, mockTranslator, nil, nil, nil)

// Set up return values (AnyTimes to avoid overfitting on implementation)

Expand Down Expand Up @@ -3553,7 +3554,7 @@ func TestDeleteMigration(t *testing.T) {
pluginCaps, controllerCaps := provisionCapabilities()
csiProvisioner := NewCSIProvisioner(clientSet, 5*time.Second, "test-provisioner",
"test", 5, csiConn.conn, nil, driverName, pluginCaps, controllerCaps, "",
false, mockTranslator, nil, nil)
false, mockTranslator, nil, nil, nil)

// Set mock return values (AnyTimes to avoid overfitting on implementation details)
mockTranslator.EXPECT().IsPVMigratable(gomock.Any()).Return(tc.expectTranslation).AnyTimes()
Expand Down
31 changes: 17 additions & 14 deletions pkg/controller/topology_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,16 @@ import (
"testing"

"github.com/container-storage-interface/spec/lib/go/csi"
"k8s.io/api/core/v1"
storage "k8s.io/api/storage/v1beta1"
v1 "k8s.io/api/core/v1"
storagev1beta1 "k8s.io/api/storage/v1beta1"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/client-go/informers"
fakeclientset "k8s.io/client-go/kubernetes/fake"
corelisters "k8s.io/client-go/listers/core/v1"
"k8s.io/client-go/listers/storage/v1beta1"
storagelistersv1 "k8s.io/client-go/listers/storage/v1"
storagelistersv1beta1 "k8s.io/client-go/listers/storage/v1beta1"
"k8s.io/kubernetes/pkg/apis/core/helper"
)

Expand Down Expand Up @@ -393,7 +395,7 @@ func TestStatefulSetSpreading(t *testing.T) {

kubeClient := fakeclientset.NewSimpleClientset(nodes, csiNodes)

csiNodeLister, nodeLister, stopChan := listers(kubeClient)
_, csiNodeLister, nodeLister, stopChan := listers(kubeClient)
defer close(stopChan)

for name, tc := range testcases {
Expand Down Expand Up @@ -1083,7 +1085,7 @@ func TestTopologyAggregation(t *testing.T) {

kubeClient := fakeclientset.NewSimpleClientset(nodes, csiNodes)

csiNodeLister, nodeLister, stopChan := listers(kubeClient)
_, csiNodeLister, nodeLister, stopChan := listers(kubeClient)
defer close(stopChan)

var selectedNode *v1.Node
Expand Down Expand Up @@ -1336,7 +1338,7 @@ func TestPreferredTopologies(t *testing.T) {
kubeClient := fakeclientset.NewSimpleClientset(nodes, csiNodes)
selectedNode := &nodes.Items[0]

csiNodeLister, nodeLister, stopChan := listers(kubeClient)
_, csiNodeLister, nodeLister, stopChan := listers(kubeClient)
defer close(stopChan)

requirements, err := GenerateAccessibilityRequirements(
Expand Down Expand Up @@ -1404,19 +1406,19 @@ func buildNodes(nodeLabels []map[string]string, nodeVersion string) *v1.NodeList
return list
}

func buildCSINodes(csiNodes []map[string][]string) *storage.CSINodeList {
list := &storage.CSINodeList{}
func buildCSINodes(csiNodes []map[string][]string) *storagev1beta1.CSINodeList {
list := &storagev1beta1.CSINodeList{}
i := 0
for _, csiNode := range csiNodes {
nodeName := fmt.Sprintf("node-%d", i)
n := storage.CSINode{
n := storagev1beta1.CSINode{
ObjectMeta: metav1.ObjectMeta{
Name: nodeName,
},
}
var csiDrivers []storage.CSINodeDriver
var csiDrivers []storagev1beta1.CSINodeDriver
for driver, topologyKeys := range csiNode {
driverInfos := []storage.CSINodeDriver{
driverInfos := []storagev1beta1.CSINodeDriver{
{
Name: driver,
NodeID: nodeName,
Expand All @@ -1430,7 +1432,7 @@ func buildCSINodes(csiNodes []map[string][]string) *storage.CSINodeList {
}
csiDrivers = append(csiDrivers, driverInfos...)
}
n.Spec = storage.CSINodeSpec{Drivers: csiDrivers}
n.Spec = storagev1beta1.CSINodeSpec{Drivers: csiDrivers}
list.Items = append(list.Items, n)
i++
}
Expand Down Expand Up @@ -1550,12 +1552,13 @@ func requisiteEqual(t1, t2 []*csi.Topology) bool {
return unchecked.Len() == 0
}

func listers(kubeClient *fakeclientset.Clientset) (v1beta1.CSINodeLister, corelisters.NodeLister, chan struct{}) {
func listers(kubeClient *fakeclientset.Clientset) (storagelistersv1.StorageClassLister, storagelistersv1beta1.CSINodeLister, corelisters.NodeLister, chan struct{}) {
factory := informers.NewSharedInformerFactory(kubeClient, ResyncPeriodOfCsiNodeInformer)
stopChan := make(chan struct{})
scLister := factory.Storage().V1().StorageClasses().Lister()
csiNodeLister := factory.Storage().V1beta1().CSINodes().Lister()
nodeLister := factory.Core().V1().Nodes().Lister()
factory.Start(stopChan)
factory.WaitForCacheSync(stopChan)
return csiNodeLister, nodeLister, stopChan
return scLister, csiNodeLister, nodeLister, stopChan
}