From d432421a88238a878a470d54cbf2c50f2e61cdda Mon Sep 17 00:00:00 2001 From: riya-singhal31 Date: Tue, 11 Jul 2023 20:48:51 +0530 Subject: [PATCH] cephfs: add CSI-Addons support to the cephfs this commit adds CSI-Addons support to the cephfs provisioner Signed-off-by: riya-singhal31 --- internal/cephfs/driver.go | 36 +++++++++ internal/cephfs/driver_test.go | 51 +++++++++++++ internal/csi-addons/cephfs/identity.go | 102 +++++++++++++++++++++++++ 3 files changed, 189 insertions(+) create mode 100644 internal/cephfs/driver_test.go create mode 100644 internal/csi-addons/cephfs/identity.go diff --git a/internal/cephfs/driver.go b/internal/cephfs/driver.go index 5261d12aa..7c6f1b187 100644 --- a/internal/cephfs/driver.go +++ b/internal/cephfs/driver.go @@ -17,9 +17,13 @@ limitations under the License. package cephfs import ( + "fmt" + "github.com/ceph/ceph-csi/internal/cephfs/mounter" "github.com/ceph/ceph-csi/internal/cephfs/store" fsutil "github.com/ceph/ceph-csi/internal/cephfs/util" + casceph "github.com/ceph/ceph-csi/internal/csi-addons/cephfs" + 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/journal" "github.com/ceph/ceph-csi/internal/util" @@ -35,6 +39,8 @@ type Driver struct { is *IdentityServer ns *NodeServer cs *ControllerServer + // cas is the CSIAddonsServer where CSI-Addons services are handled + cas *csiaddons.CSIAddonsServer } // CSIInstanceID is the instance ID that is unique to an instance of CSI, used when sharing @@ -147,6 +153,12 @@ func (fs *Driver) Run(conf *util.Config) { fs.cs = NewControllerServer(fs.cd) } + // configre CSI-Addons server and components + err = fs.setupCSIAddonsServer(conf) + if err != nil { + log.FatalLogMsg(err.Error()) + } + server := csicommon.NewNonBlockingGRPCServer() srv := csicommon.Servers{ IS: fs.is, @@ -169,3 +181,27 @@ func (fs *Driver) Run(conf *util.Config) { } server.Wait() } + +// setupCSIAddonsServer creates a new CSI-Addons Server on the given (URL) +// endpoint. The supported CSI-Addons operations get registered as their own +// services. +func (fs *Driver) setupCSIAddonsServer(conf *util.Config) error { + var err error + + fs.cas, err = csiaddons.NewCSIAddonsServer(conf.CSIAddonsEndpoint) + if err != nil { + return fmt.Errorf("failed to create CSI-Addons server: %w", err) + } + + // register services + is := casceph.NewIdentityServer(conf) + fs.cas.RegisterService(is) + + // start the server, this does not block, it runs a new go-routine + err = fs.cas.Start() + if err != nil { + return fmt.Errorf("failed to start CSI-Addons server: %w", err) + } + + return nil +} diff --git a/internal/cephfs/driver_test.go b/internal/cephfs/driver_test.go new file mode 100644 index 000000000..28dc628b6 --- /dev/null +++ b/internal/cephfs/driver_test.go @@ -0,0 +1,51 @@ +/* +Copyright 2023 The Ceph-CSI Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cephfs + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/ceph/ceph-csi/internal/util" +) + +func TestSetupCSIAddonsServer(t *testing.T) { + t.Parallel() + + // endpoint in a temporary directory + tmpDir := t.TempDir() + endpoint := "unix://" + tmpDir + "/csi-addons.sock" + + config := &util.Config{ + CSIAddonsEndpoint: endpoint, + } + + drv := &Driver{} + err := drv.setupCSIAddonsServer(config) + require.NoError(t, err) + require.NotNil(t, drv.cas) + + // verify the socket file has been created + _, err = os.Stat(tmpDir + "/csi-addons.sock") + assert.NoError(t, err) + + // stop the gRPC server + drv.cas.Stop() +} diff --git a/internal/csi-addons/cephfs/identity.go b/internal/csi-addons/cephfs/identity.go new file mode 100644 index 000000000..c869a94f8 --- /dev/null +++ b/internal/csi-addons/cephfs/identity.go @@ -0,0 +1,102 @@ +/* +Copyright 2023 The Ceph-CSI Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cephfs + +import ( + "context" + + "github.com/csi-addons/spec/lib/go/identity" + "google.golang.org/grpc" + "google.golang.org/protobuf/types/known/wrapperspb" + + "github.com/ceph/ceph-csi/internal/util" +) + +// IdentityServer struct of ceph CSI driver with supported methods of CSI +// identity server spec. +type IdentityServer struct { + *identity.UnimplementedIdentityServer + + config *util.Config +} + +// NewIdentityServer creates a new IdentityServer which handles the Identity +// Service requests from the CSI-Addons specification. +func NewIdentityServer(config *util.Config) *IdentityServer { + return &IdentityServer{ + config: config, + } +} + +func (is *IdentityServer) RegisterService(server grpc.ServiceRegistrar) { + identity.RegisterIdentityServer(server, is) +} + +// GetIdentity returns available capabilities of the ceph driver. +func (is *IdentityServer) GetIdentity( + ctx context.Context, + req *identity.GetIdentityRequest, +) (*identity.GetIdentityResponse, error) { + // only include Name and VendorVersion, Manifest is optional + res := &identity.GetIdentityResponse{ + Name: is.config.DriverName, + VendorVersion: util.DriverVersion, + } + + return res, nil +} + +// GetCapabilities returns available capabilities of the ceph driver. +func (is *IdentityServer) GetCapabilities( + ctx context.Context, + req *identity.GetCapabilitiesRequest, +) (*identity.GetCapabilitiesResponse, error) { + // build the list of capabilities, depending on the config + caps := make([]*identity.Capability, 0) + + if is.config.IsControllerServer { + // we're running as a CSI Controller service + caps = append(caps, + &identity.Capability{ + Type: &identity.Capability_Service_{ + Service: &identity.Capability_Service{ + Type: identity.Capability_Service_CONTROLLER_SERVICE, + }, + }, + }) + } + + res := &identity.GetCapabilitiesResponse{ + Capabilities: caps, + } + + return res, nil +} + +// Probe is called by the CO plugin to validate that the CSI-Addons Node is +// still healthy. +func (is *IdentityServer) Probe( + ctx context.Context, + req *identity.ProbeRequest, +) (*identity.ProbeResponse, error) { + // there is nothing that would cause a delay in getting ready + res := &identity.ProbeResponse{ + Ready: &wrapperspb.BoolValue{Value: true}, + } + + return res, nil +}