From 2286e5a1cb0fd5df2dc8ef52667b693dc55325b3 Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Fri, 13 Sep 2024 12:16:01 +0200 Subject: [PATCH] rbd: expose the GroupControllerService When the GroupSnapGetInfo go-ceph function is supported by librbd, the Group Controller Servive and VolumeGroupSnapshot capabilities can be exposed to the Container Orchestrator. Signed-off-by: Niels de Vos --- internal/rbd/driver/driver.go | 15 ++++++++++ internal/rbd/identityserver.go | 50 ++++++++++++++++++++++------------ 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/internal/rbd/driver/driver.go b/internal/rbd/driver/driver.go index 0ad8109f81a9..83a5a8ff574d 100644 --- a/internal/rbd/driver/driver.go +++ b/internal/rbd/driver/driver.go @@ -25,6 +25,7 @@ import ( csiaddons "github.com/ceph/ceph-csi/internal/csi-addons/server" csicommon "github.com/ceph/ceph-csi/internal/csi-common" "github.com/ceph/ceph-csi/internal/rbd" + "github.com/ceph/ceph-csi/internal/rbd/features" "github.com/ceph/ceph-csi/internal/util" "github.com/ceph/ceph-csi/internal/util/k8s" "github.com/ceph/ceph-csi/internal/util/log" @@ -123,6 +124,19 @@ func (r *Driver) Run(conf *util.Config) { csi.VolumeCapability_AccessMode_SINGLE_NODE_SINGLE_WRITER, csi.VolumeCapability_AccessMode_SINGLE_NODE_MULTI_WRITER, }) + + // GroupSnapGetInfo is used within the VolumeGroupSnapshot implementation + vgsSupported, vgsErr := features.SupportsGroupSnapGetInfo() + if vgsSupported { + r.cd.AddGroupControllerServiceCapabilities([]csi.GroupControllerServiceCapability_RPC_Type{ + csi.GroupControllerServiceCapability_RPC_CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT, + }) + } else { + log.DefaultLog("not enabling VolumeGroupSnapshot service capability") + } + if vgsErr != nil { + log.ErrorLogMsg("failed detecting VolumeGroupSnapshot support: %v", vgsErr) + } } if k8s.RunsOnKubernetes() && conf.IsNodeServer { @@ -178,6 +192,7 @@ func (r *Driver) Run(conf *util.Config) { IS: r.ids, CS: r.cs, NS: r.ns, + GS: r.cs, } s.Start(conf.Endpoint, srv, csicommon.MiddlewareServerOptionConfig{ LogSlowOpInterval: conf.LogSlowOpInterval, diff --git a/internal/rbd/identityserver.go b/internal/rbd/identityserver.go index 34691c201b4f..184cb2aa324a 100644 --- a/internal/rbd/identityserver.go +++ b/internal/rbd/identityserver.go @@ -20,6 +20,7 @@ import ( "context" csicommon "github.com/ceph/ceph-csi/internal/csi-common" + "github.com/ceph/ceph-csi/internal/rbd/features" "github.com/container-storage-interface/spec/lib/go/csi" ) @@ -35,29 +36,44 @@ func (is *IdentityServer) GetPluginCapabilities( ctx context.Context, req *csi.GetPluginCapabilitiesRequest, ) (*csi.GetPluginCapabilitiesResponse, error) { - return &csi.GetPluginCapabilitiesResponse{ - Capabilities: []*csi.PluginCapability{ - { - Type: &csi.PluginCapability_Service_{ - Service: &csi.PluginCapability_Service{ - Type: csi.PluginCapability_Service_CONTROLLER_SERVICE, - }, + caps := []*csi.PluginCapability{ + { + Type: &csi.PluginCapability_Service_{ + Service: &csi.PluginCapability_Service{ + Type: csi.PluginCapability_Service_CONTROLLER_SERVICE, }, }, - { - Type: &csi.PluginCapability_VolumeExpansion_{ - VolumeExpansion: &csi.PluginCapability_VolumeExpansion{ - Type: csi.PluginCapability_VolumeExpansion_ONLINE, - }, + }, + { + Type: &csi.PluginCapability_VolumeExpansion_{ + VolumeExpansion: &csi.PluginCapability_VolumeExpansion{ + Type: csi.PluginCapability_VolumeExpansion_ONLINE, }, }, - { - Type: &csi.PluginCapability_Service_{ - Service: &csi.PluginCapability_Service{ - Type: csi.PluginCapability_Service_VOLUME_ACCESSIBILITY_CONSTRAINTS, - }, + }, + { + Type: &csi.PluginCapability_Service_{ + Service: &csi.PluginCapability_Service{ + Type: csi.PluginCapability_Service_VOLUME_ACCESSIBILITY_CONSTRAINTS, }, }, }, + } + + // GroupSnapGetInfo is used within the VolumeGroupSnapshot implementation + vgsSupported, err := features.SupportsGroupSnapGetInfo() + if err != nil || !vgsSupported { + gcs := csi.PluginCapability{ + Type: &csi.PluginCapability_Service_{ + Service: &csi.PluginCapability_Service{ + Type: csi.PluginCapability_Service_GROUP_CONTROLLER_SERVICE, + }, + }, + } + caps = append(caps, &gcs) + } + + return &csi.GetPluginCapabilitiesResponse{ + Capabilities: caps, }, nil }