pkg/server/server.go (82 lines of code) (raw):

package server import ( "encoding/json" "fmt" "os" "github.com/Azure/go-autorest/autorest/azure" "github.com/Azure/secrets-store-csi-driver-provider-azure/pkg/provider" "github.com/Azure/secrets-store-csi-driver-provider-azure/pkg/version" "golang.org/x/net/context" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/health/grpc_health_v1" "google.golang.org/grpc/status" "k8s.io/klog/v2" "sigs.k8s.io/secrets-store-csi-driver/provider/v1alpha1" ) // CSIDriverProviderServer providers a Secrets Store CSI Driver provider implementation type CSIDriverProviderServer struct { *grpc.Server provider provider.Interface } // New returns an instance of CSIDriverProviderServer func New(constructPEMChain, writeCertAndKeyInSeparateFiles bool, defaultCloudEnvironment azure.Environment) *CSIDriverProviderServer { return &CSIDriverProviderServer{ provider: provider.NewProvider(constructPEMChain, writeCertAndKeyInSeparateFiles, defaultCloudEnvironment), } } // Mount executes the mount operation in the provider. The provider fetches the objects from Key Vault // writes the contents to the pod mount and returns the object versions as part of MountResponse func (s *CSIDriverProviderServer) Mount(ctx context.Context, req *v1alpha1.MountRequest) (*v1alpha1.MountResponse, error) { var attrib, secret map[string]string var defaultFilePermission os.FileMode var err error err = json.Unmarshal([]byte(req.GetAttributes()), &attrib) if err != nil { klog.ErrorS(err, "failed to unmarshal attributes") return &v1alpha1.MountResponse{}, fmt.Errorf("failed to unmarshal attributes, error: %w", err) } err = json.Unmarshal([]byte(req.GetSecrets()), &secret) if err != nil { klog.ErrorS(err, "failed to unmarshal node publish secrets ref") return &v1alpha1.MountResponse{}, fmt.Errorf("failed to unmarshal secrets, error: %w", err) } err = json.Unmarshal([]byte(req.GetPermission()), &defaultFilePermission) if err != nil { klog.ErrorS(err, "failed to unmarshal file permission") return &v1alpha1.MountResponse{}, fmt.Errorf("failed to unmarshal file permission, error: %w", err) } files, err := s.provider.GetSecretsStoreObjectContent(ctx, attrib, secret, defaultFilePermission) if err != nil { klog.ErrorS(err, "failed to process mount request") return &v1alpha1.MountResponse{}, fmt.Errorf("failed to mount objects, error: %w", err) } ov := []*v1alpha1.ObjectVersion{} f := []*v1alpha1.File{} // CSI driver v0.0.21+ will write to the filesystem if the files are in the response. // No files in the response translates to "not implemented" in the CSI driver. for _, file := range files { f = append(f, &v1alpha1.File{ Path: file.Path, Contents: file.Content, Mode: file.FileMode, }) ov = append(ov, &v1alpha1.ObjectVersion{ Id: file.UID, Version: file.Version, }) } return &v1alpha1.MountResponse{ ObjectVersion: ov, Files: f, }, nil } func (s *CSIDriverProviderServer) Version(_ context.Context, _ *v1alpha1.VersionRequest) (*v1alpha1.VersionResponse, error) { return &v1alpha1.VersionResponse{ Version: "v1alpha1", RuntimeVersion: version.BuildVersion, RuntimeName: "secrets-store-csi-driver-provider-azure", }, nil } func (s *CSIDriverProviderServer) Check(_ context.Context, _ *grpc_health_v1.HealthCheckRequest) (*grpc_health_v1.HealthCheckResponse, error) { return &grpc_health_v1.HealthCheckResponse{ Status: grpc_health_v1.HealthCheckResponse_SERVING, }, nil } // Watch for the serving status of the requested service. func (s *CSIDriverProviderServer) Watch(_ *grpc_health_v1.HealthCheckRequest, _ grpc_health_v1.Health_WatchServer) error { return status.Error(codes.Unimplemented, "Watch is not supported") }