Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding CSI driver registration with plugin watcher #64560

Merged
merged 2 commits into from Jun 5, 2018

Conversation

@sbezverk
Copy link
Contributor

sbezverk commented May 31, 2018

Adding CSI driver registration bits. The registration process will leverage driver-registrar side which will open the registration socket and will listen for pluginwatcher's GetInfo calls.

Adding CSI driver registration code.

/sig sig-storage

@sbezverk

This comment has been minimized.

Copy link
Contributor Author

sbezverk commented May 31, 2018

@saad-ali @vladimirvivien it is WIP and I cannot finish it until @vladimirvivien in-tree CSI PR gets merged, but I would appreciate if you could check the idea of using sync.Map as a secure store of all registered CSI drivers.


// Storing endpoint of newly registered CSI driver into the map, where CSI driver name will be the key
// all other CSI components will be able to get the actual socket of CSI drivers by its name.
csiDrivers.Store(pluginName, csiDriver{driverEndpoint: endpoint})

This comment has been minimized.

@vladimirvivien

vladimirvivien May 31, 2018

Member

If all type csiDriver is storing is a string value, consider just using a string directly instead of the extra type.

This comment has been minimized.

@sbezverk

sbezverk May 31, 2018

Author Contributor

@vladimirvivien yeah, I was thinking more about future extensibility. Adding something to a struct would require less refactoring than converting endpoint string into struct. I do not have strong opinion though.

This comment has been minimized.

@saad-ali

saad-ali May 31, 2018

Member

I'm ok with the new type as is. It can can be expanded in the future if needed, and unlike opaque strings can be type checked.

@sbezverk

This comment has been minimized.

Copy link
Contributor Author

sbezverk commented May 31, 2018

/test pull-kubernetes-bazel-test

driverEndpoint string
}

var csiDrivers sync.Map

This comment has been minimized.

@saad-ali

saad-ali May 31, 2018

Member

Won't this be null? Doesn't it need to be initialized somewhere?

@@ -1271,6 +1272,9 @@ func (kl *Kubelet) initializeModules() error {
}
}

// Adding Registration Callback function for CSI Driver
kl.pluginWatcher.AddHandler("CSIPlugin", csi.RegistrationCallback)

This comment has been minimized.

@saad-ali

saad-ali May 31, 2018

Member

Move this to inside NewVolumeManager(...). And modify NewVolumeManager(...) to take pluginWatcher pluginwatcher.Watcher as a new parameter. That way all volume plugin code is inside VolumeManager

@k8s-ci-robot k8s-ci-robot added size/L and removed size/S labels May 31, 2018

@sbezverk sbezverk force-pushed the sbezverk:csi_registration branch from bc99533 to c182445 Jun 1, 2018

@sbezverk

This comment has been minimized.

Copy link
Contributor Author

sbezverk commented Jun 1, 2018

/test pull-kubernetes-integration

@sbezverk sbezverk force-pushed the sbezverk:csi_registration branch from 636c1c3 to c991333 Jun 1, 2018

return newAnnotations
}

func getVerifyAndAddNodeId(

This comment has been minimized.

@vladimirvivien

vladimirvivien Jun 1, 2018

Member

Rename this to just verifyAndAddNodeId, the get makes it sound like it returns a value.

This comment has been minimized.

@sbezverk

sbezverk Jun 1, 2018

Author Contributor

done


// Fetches Kubernetes node API object corresponding to k8sNodeName.
// If the csiDriverName is present in the node annotation, it is removed.
func getVerifyAndDeleteNodeId(

This comment has been minimized.

@vladimirvivien

vladimirvivien Jun 1, 2018

Member

Rename to just verifyAndDeleteNodeId

This comment has been minimized.

@sbezverk

sbezverk Jun 1, 2018

Author Contributor

done

@sbezverk sbezverk force-pushed the sbezverk:csi_registration branch from c991333 to 08aed61 Jun 1, 2018

@sbezverk

This comment has been minimized.

Copy link
Contributor Author

sbezverk commented Jun 1, 2018

/test pull-kubernetes-bazel-test

@vladimirvivien
Copy link
Member

vladimirvivien left a comment

Recommendations: 1) make all registration-related functions into methods on type labelManager, instead of package-level vars 2) Be careful with the use of channels, ensure deadlock situations not being created.


// labelManagement is struct of channels used for communication between the driver registration
// code and the go routine responsible for managing the node's labels
type labelManagement struct {

This comment has been minimized.

@vladimirvivien

vladimirvivien Jun 1, 2018

Member

labelManager maybe an better name based on its description

out chan bool
}

var lm labelManagement

This comment has been minimized.

@vladimirvivien

vladimirvivien Jun 1, 2018

Member

Create a construction function for this type, newLabelManager

This comment has been minimized.

@sbezverk

sbezverk Jun 1, 2018

Author Contributor

Where would I call it from to make sure that it is the very first thing that happens for in-tree csi bits?

This comment has been minimized.

@vladimirvivien

// labelManagement is struct of channels used for communication between the driver registration
// code and the go routine responsible for managing the node's labels
type labelManagement struct {

This comment has been minimized.

@vladimirvivien

vladimirvivien Jun 1, 2018

Member

This should be called labelManger based on its description

This comment has been minimized.

@sbezverk

sbezverk Jun 1, 2018

Author Contributor

done

var lm labelManagement

// Initalizing csiDrivers map and label management channels
func init() {

This comment has been minimized.

@vladimirvivien

vladimirvivien Jun 1, 2018

Member

Avoid using package init. Use a constructor function (see previous)

This comment has been minimized.

@sbezverk

sbezverk Jun 1, 2018

Author Contributor

The reason I am using init func is because I need to make sure that initialization of sync.Map and communication channels will happen before anything. I do not see any other way to ensure it.

This comment has been minimized.

This comment has been minimized.

@sbezverk

sbezverk Jun 1, 2018

Author Contributor

I was under impression that csi_plugin's Init func will be called by multiple components: kubelet, controller_manager etc.. So then I would need to make sure the constructor for labelManager is not called multiple times. I am not sure how reliable it would be?

// TODO (sbezverk) Check for pluginwatcher behavior on kubelet restart, CSI would require
// replaying registrations for all existing socket. (Possible issue is when kubelet is up and tryig
// to replay registrations but corresponding driver-registrars are not up yet, would it keep retrying?)
func nodeLabelManager(nodeName types.NodeName, k8s kubernetes.Interface) {

This comment has been minimized.

@vladimirvivien

vladimirvivien Jun 1, 2018

Member

Convert this function to method for type labelManager i.e.

func (m *labelManager) Run(...){

}

This comment has been minimized.

@saad-ali

saad-ali Jun 1, 2018

Member

+1 create a interface for labelManager. Create a newLabelManager method that initializes the labelManager struct. And turn this function in to Run as suggested by Vlad. All reads and writes to the labelManager struct should go through this methods in this new class instead of directly on the struct.

A good example to follow: https://github.com/kubernetes/kubernetes/blob/master/pkg/volume/util/nestedpendingoperations/nestedpendingoperations.go

This comment has been minimized.

@saad-ali

saad-ali Jun 1, 2018

Member

newLabelManager can accept NodeName and KubeClient as parameters and store them in its internal struct.

// to replay registrations but corresponding driver-registrars are not up yet, would it keep retrying?)
func nodeLabelManager(nodeName types.NodeName, k8s kubernetes.Interface) {
var driver csiDriver
for {

This comment has been minimized.

@vladimirvivien

vladimirvivien Jun 1, 2018

Member

Please use for-range construct to receive values from channel

for driver := range lm.in{
...
}

This comment has been minimized.

@sbezverk

sbezverk Jun 1, 2018

Author Contributor

done

csiDrivers.Store(pluginName, csiDriver{driverName: pluginName, driverEndpoint: endpoint})

// Sending request to the node labek manager to update label for newly registered CSI driver
lm.in <- csiDriver{driverName: pluginName, driverEndpoint: endpoint}

This comment has been minimized.

@vladimirvivien

vladimirvivien Jun 1, 2018

Member

This should happen in a goroutine or risk deadlock

This comment has been minimized.

@sbezverk

sbezverk Jun 1, 2018

Author Contributor

this send and then following receive should be blocking and synchronous, as I need to get the result of labeling to report back to kubelet whether registration was successful or not. Could you help me to understand under which condition deadlock could happen? thanks a lot.

This comment has been minimized.

@vladimirvivien

vladimirvivien Jun 1, 2018

Member

Since lm.in is a non-buffered chan, a send operations blocks immediately until that value is received. Since the <-lm.in is happening on the same goroutine, the code will block.

This comment has been minimized.

@sbezverk

sbezverk Jun 1, 2018

Author Contributor

it will be executed in its own go routine since the callback was called by the kubelet's plugin watcher. So inside of this go routine we will have only callback, and labelManager funcs and they are not in the critical path even if it gets block for a little bit. I am curious if I do not block here, how I can return to kubelet the result on the registration?


// Storing endpoint of newly registered CSI driver into the map, where CSI driver name will be the key
// all other CSI components will be able to get the actual socket of CSI drivers by its name.
csiDrivers.Store(pluginName, csiDriver{driverName: pluginName, driverEndpoint: endpoint})

This comment has been minimized.

@saad-ali

saad-ali Jun 1, 2018

Member

Check if endpoint is empty, if so use socketPath for driverEndpoint instead.

This comment has been minimized.

@saad-ali

saad-ali Jun 1, 2018

Member

Also csiDrivers is not used anywhere. Next step is to modify all the existing CSI in-tree code to use csiDrivers to find the socket instead of generating it if enablePluginsWatcher is true.

// TODO (sbezverk) Check for pluginwatcher behavior on kubelet restart, CSI would require
// replaying registrations for all existing socket. (Possible issue is when kubelet is up and tryig
// to replay registrations but corresponding driver-registrars are not up yet, would it keep retrying?)
func nodeLabelManager(nodeName types.NodeName, k8s kubernetes.Interface) {

This comment has been minimized.

@saad-ali

saad-ali Jun 1, 2018

Member

+1 create a interface for labelManager. Create a newLabelManager method that initializes the labelManager struct. And turn this function in to Run as suggested by Vlad. All reads and writes to the labelManager struct should go through this methods in this new class instead of directly on the struct.

A good example to follow: https://github.com/kubernetes/kubernetes/blob/master/pkg/volume/util/nestedpendingoperations/nestedpendingoperations.go

// Sending request to the node labek manager to update label for newly registered CSI driver
lm.in <- csiDriver{driverName: pluginName, driverEndpoint: endpoint}

// Waiting for results from the label management

This comment has been minimized.

@saad-ali

saad-ali Jun 1, 2018

Member

If we end up waiting anyway, what is the purpose of having a separate goroutine?

This comment has been minimized.

@saad-ali

saad-ali Jun 1, 2018

Member

As discussed offline, the labelManager does not need to run in a separate goroutine as long as the callback runs on a separate goroutine.

plugin.Init will just initializes a labelManager and store it in a global variable, lm.
Then the callback will execute lm.Label(...) which will block.

This comment has been minimized.

@sbezverk

sbezverk Jun 1, 2018

Author Contributor

done

@@ -60,6 +64,16 @@ var _ volume.VolumePlugin = &csiPlugin{}
func (p *csiPlugin) Init(host volume.VolumeHost) error {
glog.Info(log("plugin initializing..."))
p.host = host

// Initalizing csiDrivers map and label management channels
csiDrivers = sync.Map{}

This comment has been minimized.

@saad-ali

saad-ali Jun 1, 2018

Member

Ideally this should also be a class instead of a raw map, but we can do that refactor in the future.

This comment has been minimized.

@sbezverk

sbezverk Jun 1, 2018

Author Contributor

will do it in a followup PR

@@ -40,6 +41,9 @@ const (
csiTimeout = 15 * time.Second
volNameSep = "^"
volDataFileName = "vol_data.json"

// Verify (and update, if needed) the node ID at this freqeuency.
sleepDuration = 2 * time.Minute

This comment has been minimized.

@saad-ali

saad-ali Jun 1, 2018

Member

Remove since this is not used.

// process.
// TODO (sbezverk) Right now the driver registration only registers drivers, not clear
// how to de-register the driver when CSI driver is terminated.
// TODO (sbezverk) Check for pluginwatcher behavior on kubelet restart, CSI would require

This comment has been minimized.

@saad-ali

saad-ali Jun 1, 2018

Member

Open issues to track these and put issue numbers here.

This comment has been minimized.

@sbezverk

sbezverk Jun 1, 2018

Author Contributor

@sbezverk sbezverk changed the title WIP Adding CSI driver registration with plugin watcher Adding CSI driver registration with plugin watcher Jun 1, 2018

k8s kubernetes.Interface
}

var lm labelManager

This comment has been minimized.

@saad-ali

saad-ali Jun 1, 2018

Member

Here is what I was thinking. Optionally, put labelManager in to a new file, then do something like this:

package labelManager

import (
	"encoding/json"
	"fmt"
	"strings"
	"sync"

	"github.com/golang/glog"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/types"
	"k8s.io/client-go/kubernetes"
	corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
	"k8s.io/client-go/util/retry"
)

type LabelManagerInterface interface {
	AddLabels(driverName string, ...)
}

type labelManagerStruct struct {
	nodeName types.NodeName
	k8s      kubernetes.Interface
}

func NewLabelManager(nodeName, kubeClient) LabelManagerInterface {
	return labelManagerStruct{
		nodeName: nodename,
		k8s: kubeClient,
	}
}

func (lm *labelManagerStruct)AddLabels(driverName string, ...) {
}

And in func (p *csiPlugin) Init(host volume.VolumeHost) error do this

    lm = labelManager.NewLabelManager(...)

And then in RegistrationCallback(...) do this:

lm.AddLabel(...)
@sbezverk

This comment has been minimized.

Copy link
Contributor Author

sbezverk commented Jun 4, 2018

@saad-ali I thought it is already done here: 9380601#diff-3849dfdf2ef9c31e2f367967e0bf7369R262

Please clarify if I am missing something.

@saad-ali

This comment has been minimized.

Copy link
Member

saad-ali commented Jun 4, 2018

@saad-ali I thought it is already done here: 9380601#diff-3849dfdf2ef9c31e2f367967e0bf7369R262

Please clarify if I am missing something.

Oh, you're absolutely right, I missed that. LGTM

@cblecker

This comment has been minimized.

Copy link
Member

cblecker commented Jun 4, 2018

Is there a reason we aren't correcting the lint failures?
/lint

@k8s-ci-robot
Copy link
Contributor

k8s-ci-robot left a comment

@cblecker: 12 warnings.

In response to this:

Is there a reason we aren't correcting the lint failures?
/lint

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

k8sNodeName string,
k8sNodesClient corev1.NodeInterface,
csiDriverName string,
csiDriverNodeId string) error {

This comment has been minimized.

@k8s-ci-robot

k8s-ci-robot Jun 4, 2018

Contributor

Golint naming: func parameter csiDriverNodeId should be csiDriverNodeID. More info.

This comment has been minimized.

@sbezverk

sbezverk Jun 4, 2018

Author Contributor

Due to the naming convention used in gRPC proto file.


// Fetches Kubernetes node API object corresponding to k8sNodeName.
// If the csiDriverName is present in the node annotation, it is removed.
func verifyAndDeleteNodeId(

This comment has been minimized.

@k8s-ci-robot

k8s-ci-robot Jun 4, 2018

Contributor

Golint naming: func verifyAndDeleteNodeId should be verifyAndDeleteNodeID. More info.

return updateErr // do not wrap error
})
if retryErr != nil {
return fmt.Errorf("Node update failed: %v", retryErr)

This comment has been minimized.

@k8s-ci-robot

k8s-ci-robot Jun 4, 2018

Contributor

Golint errors: error strings should not be capitalized or end with punctuation or a newline. More info.

This comment has been minimized.

@sbezverk

sbezverk Jun 4, 2018

Author Contributor

fixing

return updateErr // do not wrap error
})
if retryErr != nil {
return fmt.Errorf("Node update failed: %v", retryErr)

This comment has been minimized.

@k8s-ci-robot

k8s-ci-robot Jun 4, 2018

Contributor

Golint errors: error strings should not be capitalized or end with punctuation or a newline. More info.

This comment has been minimized.

@sbezverk

sbezverk Jun 4, 2018

Author Contributor

fixing

limitations under the License.
*/

package labelmanager

This comment has been minimized.

@k8s-ci-robot

k8s-ci-robot Jun 4, 2018

Contributor

Golint comments: should have a package comment, unless it's in another file for this package. More info.

This comment has been minimized.

@sbezverk

sbezverk Jun 4, 2018

Author Contributor

Added

jsonObj, err := json.Marshal(existingDriverMap)
if err != nil {
return fmt.Errorf(
"Failed while trying to remove key %q from node %q annotation. Existing data: %v",

This comment has been minimized.

@k8s-ci-robot

k8s-ci-robot Jun 4, 2018

Contributor

Golint errors: error strings should not be capitalized or end with punctuation or a newline. More info.

This comment has been minimized.

@sbezverk

sbezverk Jun 4, 2018

Author Contributor

fixing

func (lm labelManagerStruct) AddLabels(driverName string) error {
err := verifyAndAddNodeId(string(lm.nodeName), lm.k8s.CoreV1().Nodes(), driverName, string(lm.nodeName))
if err != nil {
return fmt.Errorf("Failed to update node %s's annotation with error: %+v", lm.nodeName, err)

This comment has been minimized.

@k8s-ci-robot

k8s-ci-robot Jun 4, 2018

Contributor

Golint errors: error strings should not be capitalized or end with punctuation or a newline. More info.

This comment has been minimized.

@sbezverk

sbezverk Jun 4, 2018

Author Contributor

fixing

return newAnnotations
}

func verifyAndAddNodeId(

This comment has been minimized.

@k8s-ci-robot

k8s-ci-robot Jun 4, 2018

Contributor

Golint naming: func verifyAndAddNodeId should be verifyAndAddNodeID. More info.

This comment has been minimized.

@sbezverk

sbezverk Jun 4, 2018

Author Contributor

Due to the naming convention used in gRPC proto file.

// Parse previousAnnotationValue as JSON
if err := json.Unmarshal([]byte(previousAnnotationValue), &existingDriverMap); err != nil {
return fmt.Errorf(
"Failed to parse node's %q annotation value (%q) err=%v",

This comment has been minimized.

@k8s-ci-robot

k8s-ci-robot Jun 4, 2018

Contributor

Golint errors: error strings should not be capitalized or end with punctuation or a newline. More info.

This comment has been minimized.

@sbezverk

sbezverk Jun 4, 2018

Author Contributor

fixing


// RegistrationCallback is called by kubelet's plugin watcher upon detection
// of a new registration socket opened by CSI Driver registrar side car.
func RegistrationCallback(pluginName string, endpoint string, versions []string, socketPath string) (error, chan bool) {

This comment has been minimized.

@k8s-ci-robot

k8s-ci-robot Jun 4, 2018

Contributor

Golint arg-order: error should be the last type when returning multiple items.

This comment has been minimized.

@sbezverk

sbezverk Jun 4, 2018

Author Contributor

Due to the kubelet's function returning variable in this order.

@sbezverk sbezverk force-pushed the sbezverk:csi_registration branch from e2650b5 to 1c05ca5 Jun 4, 2018

@k8s-ci-robot k8s-ci-robot added size/M and removed lgtm size/L labels Jun 4, 2018

@cblecker

This comment has been minimized.

Copy link
Member

cblecker commented Jun 4, 2018

/approve
Approving for lint failures

@k8s-ci-robot k8s-ci-robot added size/L and removed size/M labels Jun 4, 2018

@vishh

This comment has been minimized.

Copy link
Member

vishh commented Jun 4, 2018

/approve

@vishh

This comment has been minimized.

Copy link
Member

vishh commented Jun 4, 2018

@vikaschoudhary16 FYI

/lgtm

@k8s-ci-robot k8s-ci-robot added the lgtm label Jun 4, 2018

@k8s-ci-robot

This comment has been minimized.

Copy link
Contributor

k8s-ci-robot commented Jun 4, 2018

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: cblecker, saad-ali, sbezverk, vishh

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@@ -1290,6 +1291,9 @@ func (kl *Kubelet) initializeModules() error {
}
}
if kl.enablePluginsWatcher {
// Adding Registration Callback function for CSI Driver
kl.pluginWatcher.AddHandler("CSIPlugin", csi.RegistrationCallback)

This comment has been minimized.

This comment has been minimized.

@sbezverk

sbezverk Jun 5, 2018

Author Contributor

yep, will do in the follow up PR.

// of a new registration socket opened by CSI Driver registrar side car.
func RegistrationCallback(pluginName string, endpoint string, versions []string, socketPath string) (error, chan bool) {

glog.Infof(log("Callback from kubelet with plugin name: %s endpoint: %s versions: %s socket path: %s",

This comment has been minimized.

@vikaschoudhary16

vikaschoudhary16 Jun 5, 2018

Member

may be we should use verbose level like V(4)

This comment has been minimized.

@sbezverk

sbezverk Jun 5, 2018

Author Contributor

Will change it once the feature becomes more mature/beta. For now we need to see this but without trigger 10 million of other messages.

@k8s-github-robot

This comment has been minimized.

Copy link
Contributor

k8s-github-robot commented Jun 5, 2018

Automatic merge from submit-queue (batch tested with PRs 62266, 64351, 64366, 64235, 64560). If you want to cherry-pick this change to another branch, please follow the instructions here.

@k8s-github-robot k8s-github-robot merged commit 84ec43c into kubernetes:master Jun 5, 2018

17 of 18 checks passed

pull-kubernetes-local-e2e-containerized Job triggered.
Details
Submit Queue Queued to run github e2e tests a second time.
Details
cla/linuxfoundation sbezverk authorized
Details
pull-kubernetes-bazel-build Job succeeded.
Details
pull-kubernetes-bazel-test Job succeeded.
Details
pull-kubernetes-cross Skipped
pull-kubernetes-e2e-gce Job succeeded.
Details
pull-kubernetes-e2e-gce-100-performance Job succeeded.
Details
pull-kubernetes-e2e-gce-device-plugin-gpu Job succeeded.
Details
pull-kubernetes-e2e-gke Skipped
pull-kubernetes-e2e-kops-aws Job succeeded.
Details
pull-kubernetes-integration Job succeeded.
Details
pull-kubernetes-kubemark-e2e-gce Job succeeded.
Details
pull-kubernetes-kubemark-e2e-gce-big Job succeeded.
Details
pull-kubernetes-local-e2e Skipped
pull-kubernetes-node-e2e Job succeeded.
Details
pull-kubernetes-typecheck Job succeeded.
Details
pull-kubernetes-verify Job succeeded.
Details
@colemickens

This comment has been minimized.

Copy link
Contributor

colemickens commented Jun 5, 2018

Are there docs added for this feature yet? Can we link them back here when they're added? Thanks.

@sbezverk

This comment has been minimized.

Copy link
Contributor Author

sbezverk commented Jun 5, 2018

@colemickens the documentation for this feature will go into in a different repo. in kubernetes this feature is not exposed to the user.

@sbezverk sbezverk deleted the sbezverk:csi_registration branch Jun 5, 2018

@k8s-ci-robot

This comment has been minimized.

Copy link
Contributor

k8s-ci-robot commented Jun 6, 2018

@sbezverk: The following test failed, say /retest to rerun them all:

Test name Commit Details Rerun command
pull-kubernetes-local-e2e-containerized ea474cd link /test pull-kubernetes-local-e2e-containerized

Full PR test history. Your PR dashboard. Please help us cut down on flakes by linking to an open issue when you hit one in your PR.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@zparnold

This comment has been minimized.

Copy link
Member

zparnold commented Jun 13, 2018

Hello there! @sbezverk I'm Zach Arnold working on Docs for the 1.11 release. This PR was identified as one needing some documentation in the https://github.com/kubernetes/website repo around your contributions (thanks by the way!) When you have some time, could you please modify/add/remove the relevant content that needs changing in our documentation repo? Thanks! Please let me or my colleague Misty know (@zparnold/@Misty on K8s Slack) if you need any assistance with the documentation.

@sbezverk

This comment has been minimized.

Copy link
Contributor Author

sbezverk commented Jun 16, 2018

@zparnold Hello, this feature does not have any configuration exposed in kubernetes. The configuration parameters are exposed in kubernetes-csi/driver-registrar repo and the doc will go into kubernetes-csi/docs repo. Please let me know if you still need ay actions from me.

@RenaudWasTaken RenaudWasTaken referenced this pull request Jul 3, 2018

Closed

[Umbrella issue] Plugin Watcher Work Tracker #65773

15 of 20 tasks complete
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.