diff --git a/pkg/spdk/controllerserver.go b/pkg/spdk/controllerserver.go index 298a7d8..d821b43 100644 --- a/pkg/spdk/controllerserver.go +++ b/pkg/spdk/controllerserver.go @@ -265,6 +265,11 @@ func prepareCreateVolumeReq(ctx context.Context, req *csi.CreateVolumeRequest, s return nil, err } + lvolID, err := getLvolIDAnnotation(ctx, pvcName, pvcNamespace) + if err != nil { + return nil, err + } + createVolReq := util.CreateLVolData{ LvolName: req.GetName(), Size: fmt.Sprintf("%dM", sizeMiB), @@ -282,6 +287,7 @@ func prepareCreateVolumeReq(ctx context.Context, req *csi.CreateVolumeRequest, s CryptoKey1: cryptoKey1, CryptoKey2: cryptoKey2, HostID: hostID, + LvolID: lvolID, PvcName: pvcName, PvcNamespace: pvcNamespace, } @@ -731,3 +737,30 @@ func getHostIDAnnotation(ctx context.Context, pvcName, pvcNamespace string) (str return hostID, nil } + +func getLvolIDAnnotation(ctx context.Context, pvcName, pvcNamespace string) (string, error) { + config, err := rest.InClusterConfig() + if err != nil { + klog.Errorf("failed to get in-cluster config: %v", err) + return "", fmt.Errorf("could not get in-cluster config: %w", err) + } + + clientset, err := kubernetes.NewForConfig(config) + if err != nil { + klog.Errorf("failed to create clientset: %v", err) + return "", fmt.Errorf("could not create clientset: %w", err) + } + + pvc, err := clientset.CoreV1().PersistentVolumeClaims(pvcNamespace).Get(ctx, pvcName, metav1.GetOptions{}) + if err != nil { + klog.Errorf("failed to get PVC %s in namespace %s: %v", pvcName, pvcNamespace, err) + return "", fmt.Errorf("could not get PVC %s in namespace %s: %w", pvcName, pvcNamespace, err) + } + + lvolID, ok := pvc.ObjectMeta.Annotations["simplybk/lvol-id"] + if !ok { + return "", nil + } + + return lvolID, nil +} diff --git a/pkg/util/nvmf.go b/pkg/util/nvmf.go index 3ca8b54..b7368fb 100644 --- a/pkg/util/nvmf.go +++ b/pkg/util/nvmf.go @@ -87,6 +87,7 @@ type CreateLVolData struct { CryptoKey1 string `json:"crypto_key1"` CryptoKey2 string `json:"crypto_key2"` HostID string `json:"host_id"` + LvolID string `json:"uid"` PvcName string `json:"pvc_name"` PvcNamespace string `json:"namespace"` }