diff --git a/spec.md b/spec.md index f16e8a47..65a7b58d 100644 --- a/spec.md +++ b/spec.md @@ -80,85 +80,97 @@ A CO SHOULD be equipped to handle both centralized and headless plugins, as well Several of these possibilities are illustrated in the following figures. ``` - CO "Master" Host -+-------------------------------------------+ -| | -| +------------+ +------------+ | -| | CO | gRPC | Controller | | -| | +-----------> Plugin | | -| +------------+ +------------+ | -| | -+-------------------------------------------+ - - CO "Node" Host(s) -+-------------------------------------------+ -| | -| +------------+ +------------+ | -| | CO | gRPC | Node | | -| | +-----------> Plugin | | -| +------------+ +------------+ | -| | -+-------------------------------------------+ + CO "Master" Host ++-------------------------------------------------+ +| | +| +------------+ +------------------+ | +| | CO | gRPC | Controller | | +| | +--+--------> Plugin | | +| +------------+ | +------------------+ | +| | | +| | +------------------+ | +| | | Group Controller | | +| +--------> Plugin | | +| +------------------+ | +| | ++-------------------------------------------------+ + + CO "Node" Host(s) ++-------------------------------------------------+ +| | +| +------------+ +------------------+ | +| | CO | gRPC | Node | | +| | +-----------> Plugin | | +| +------------+ +------------------+ | +| | ++-------------------------------------------------+ Figure 1: The Plugin runs on all nodes in the cluster: a centralized -Controller Plugin is available on the CO master host and the Node -Plugin is available on all of the CO Nodes. +Controller Plugin and Group Controller Plugin (Optional) are available +on the CO master host and the Node Plugin is available on all of the +CO Nodes. ``` ``` - CO "Node" Host(s) -+-------------------------------------------+ -| | -| +------------+ +------------+ | -| | CO | gRPC | Controller | | -| | +--+--------> Plugin | | -| +------------+ | +------------+ | -| | | -| | | -| | +------------+ | -| | | Node | | -| +--------> Plugin | | -| +------------+ | -| | -+-------------------------------------------+ + CO "Node" Host(s) ++-------------------------------------------------+ +| | +| +------------------+ | +| | Node | | +| +--------> Plugin | | +| | +------------------+ | +| | | +| +------------+ | +------------------+ | +| | CO | |gRPC | Controller | | +| | +-----------> Plugin | | +| +------------+ | +------------------+ | +| | | +| | +------------------+ | +| | | Group Controller | | +| +--------> Plugin | | +| +------------------+ | +| | ++-------------------------------------------------+ Figure 2: Headless Plugin deployment, only the CO Node hosts run -Plugins. Separate, split-component Plugins supply the Controller -Service and the Node Service respectively. +Plugins. Separate, split-component Plugins supply the Node Service, +the Controller Service and the Group Controller Service (Optional) +respectively. ``` ``` - CO "Node" Host(s) -+-------------------------------------------+ -| | -| +------------+ +------------+ | -| | CO | gRPC | Controller | | -| | +-----------> Node | | -| +------------+ | Plugin | | -| +------------+ | -| | -+-------------------------------------------+ + CO "Node" Host(s) ++-------------------------------------------------+ +| | +| +------------------+ | +| +------------+ | Node | | +| | CO | gRPC | Controller | | +| | +-----------> Group Controller | | +| +------------+ | Plugin | | +| +------------------+ | +| | ++-------------------------------------------------+ Figure 3: Headless Plugin deployment, only the CO Node hosts run -Plugins. A unified Plugin component supplies both the Controller -Service and Node Service. +Plugins. A unified Plugin component supplies both the Node Service, +the Controller Service and the Group Controller Service (Optional). ``` ``` - CO "Node" Host(s) -+-------------------------------------------+ -| | -| +------------+ +------------+ | -| | CO | gRPC | Node | | -| | +-----------> Plugin | | -| +------------+ +------------+ | -| | -+-------------------------------------------+ + CO "Node" Host(s) ++-------------------------------------------------+ +| | +| +------------+ +------------------+ | +| | CO | gRPC | Node | | +| | +-----------> Plugin | | +| +------------+ +------------------+ | +| | ++-------------------------------------------------+ Figure 4: Headless Plugin deployment, only the CO Node hosts run Plugins. A Node-only Plugin component supplies only the Node Service. -Its GetPluginCapabilities RPC does not report the CONTROLLER_SERVICE -capability. +Its GetPluginCapabilities RPC does not report both the CONTROLLER_SERVICE +capability and the GROUP_CONTROLLER_SERVICE capability. ``` ### Volume Lifecycle @@ -268,7 +280,13 @@ Each SP MUST provide: * **Node Plugin**: A gRPC endpoint serving CSI RPCs that MUST be run on the Node whereupon an SP-provisioned volume will be published. * **Controller Plugin**: A gRPC endpoint serving CSI RPCs that MAY be run anywhere. -* In some circumstances a single gRPC endpoint MAY serve all CSI RPCs (see Figure 3 in [Architecture](#architecture)). + +Each SP MAY provide: + +- **Group Controller Plugin**: A gRPC endpoint serving CSI RPCs that MAY be run anywhere. + + +In some circumstances a single gRPC endpoint MAY serve all CSI RPCs (see Figure 3 in [Architecture](#architecture)). ```protobuf syntax = "proto3"; @@ -322,10 +340,11 @@ extend google.protobuf.ServiceOptions { } ``` -There are three sets of RPCs: +There are four sets of RPCs: -* **Identity Service**: Both the Node Plugin and the Controller Plugin MUST implement this sets of RPCs. +* **Identity Service**: Both the Node Plugin, the Controller Plugin and the Group Controller Plugin MUST implement this sets of RPCs. * **Controller Service**: The Controller Plugin MUST implement this sets of RPCs. +* **Group Controller Service**: The GroupController Plugin MUST implement this sets of RPCs. * **Node Service**: The Node Plugin MUST implement this sets of RPCs. ```protobuf