Skip to content

Commit eb95e05

Browse files
util: improve static PV handling
- Clarify static PV must not specify controllerPublishSecretRef. - Improve handling volumeHandle validation error. This error is harmless for static volume and is a real error for other volumes. The related discussion: #6290 Signed-off-by: Satoru Takeuchi <satoru.takeuchi@gmail.com>
1 parent 214d462 commit eb95e05

7 files changed

Lines changed: 43 additions & 16 deletions

File tree

docs/static-pvc.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ spec:
8383
volumeMode: Filesystem
8484
```
8585
86+
> [!note]
87+
> `controllerPublishSecretRef` must not be specified for static RBD PVs.
88+
8689
### RBD Volume Attributes in PV
8790

8891
Below table explains the list of volume attributes can be set when creating a
@@ -278,6 +281,9 @@ spec:
278281
volumeMode: Filesystem
279282
```
280283
284+
> [!note]
285+
> `controllerPublishSecretRef` must not be specified for static CephFS PVs.
286+
281287
### Node stage secret ref in CephFS PV
282288

283289
For static CephFS PV to work, userID and userKey needs to be specified in the

internal/cephfs/controllerserver.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,11 +1159,14 @@ func (cs *ControllerServer) getServiceAccountRestriction(
11591159

11601160
if secrets == nil {
11611161
secretName, secretNamespace, err := util.GetControllerPublishSecretRef(volumeID, util.CephFsType)
1162-
if err != nil {
1163-
log.WarningLog(ctx, "controller publish secret not found: %v", err)
1162+
if util.IsOlderOrStaticPV(err) {
1163+
log.WarningLog(ctx, "possibly older or static PV: %v", err)
11641164

11651165
return "", nil
11661166
}
1167+
if err != nil {
1168+
return "", status.Errorf(codes.Internal, "failed to get controller publish secret ref: %v", err)
1169+
}
11671170

11681171
secrets, err = k8s.GetSecret(secretName, secretNamespace)
11691172
if err != nil {
@@ -1231,13 +1234,14 @@ func (cs *ControllerServer) ControllerUnpublishVolume(
12311234
secrets := req.GetSecrets()
12321235
if secrets == nil {
12331236
secretName, secretNamespace, err := util.GetControllerPublishSecretRef(volumeId, util.CephFsType)
1234-
if err != nil {
1235-
log.WarningLog(ctx, "controller publish secret not found: %v", err)
1237+
if util.IsOlderOrStaticPV(err) {
1238+
log.WarningLog(ctx, "possibly older or static PV: %v", err)
12361239

1237-
// If the secret is not found, return success to not break for older PVs
1238-
// without controller-publish secrets.
12391240
return &csi.ControllerUnpublishVolumeResponse{}, nil
12401241
}
1242+
if err != nil {
1243+
return nil, status.Errorf(codes.Internal, "failed to get controller publish secret ref: %v", err)
1244+
}
12411245

12421246
secrets, err = k8s.GetSecret(secretName, secretNamespace)
12431247
if err != nil {

internal/nvmeof/controller/controllerserver.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,11 +295,14 @@ func (cs *Server) ControllerUnpublishVolume(
295295
secrets := req.GetSecrets()
296296
if secrets == nil {
297297
secretName, secretNamespace, err := util.GetControllerPublishSecretRef(req.GetVolumeId(), util.RBDType)
298-
if err != nil {
299-
log.WarningLog(ctx, "controller publish secret not found: %v", err)
298+
if util.IsOlderOrStaticPV(err) {
299+
log.WarningLog(ctx, "possibly older or static PV: %v", err)
300300

301301
return &csi.ControllerUnpublishVolumeResponse{}, nil
302302
}
303+
if err != nil {
304+
return nil, status.Errorf(codes.Internal, "failed to get controller publish secret ref: %v", err)
305+
}
303306

304307
secrets, err = k8s.GetSecret(secretName, secretNamespace)
305308
if err != nil {

internal/rbd/controllerserver.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1719,11 +1719,14 @@ func (cs *ControllerServer) getServiceAccountRestriction(
17191719

17201720
if secrets == nil {
17211721
secretName, secretNamespace, err := util.GetControllerPublishSecretRef(volumeID, util.RBDType)
1722-
if err != nil {
1723-
log.WarningLog(ctx, "controller publish secret not found: %v", err)
1722+
if util.IsOlderOrStaticPV(err) {
1723+
log.WarningLog(ctx, "possibly older or static PV: %v", err)
17241724

17251725
return "", nil
17261726
}
1727+
if err != nil {
1728+
return "", status.Errorf(codes.Internal, "failed to get controller publish secret ref: %v", err)
1729+
}
17271730

17281731
secrets, err = k8s.GetSecret(secretName, secretNamespace)
17291732
if err != nil {
@@ -1790,13 +1793,14 @@ func (cs *ControllerServer) ControllerUnpublishVolume(
17901793
secrets := req.GetSecrets()
17911794
if secrets == nil {
17921795
secretName, secretNamespace, err := util.GetControllerPublishSecretRef(volumeId, util.RBDType)
1793-
if err != nil {
1794-
log.WarningLog(ctx, "controller publish secret not found: %v", err)
1796+
if util.IsOlderOrStaticPV(err) {
1797+
log.WarningLog(ctx, "possibly older or static PV: %v", err)
17951798

1796-
// If the secret is not found, return success to not break for older PVs
1797-
// without controller-publish secrets.
17981799
return &csi.ControllerUnpublishVolumeResponse{}, nil
17991800
}
1801+
if err != nil {
1802+
return nil, status.Errorf(codes.Internal, "failed to get controller publish secret ref: %v", err)
1803+
}
18001804

18011805
secrets, err = k8s.GetSecret(secretName, secretNamespace)
18021806
if err != nil {

internal/rbd/nodeserver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1572,7 +1572,7 @@ func (ns *NodeServer) blockNodeGetVolumeStats(
15721572
}
15731573

15741574
secretName, secretNamespace, err := util.GetControllerPublishSecretRef(volumeId, util.RBDType)
1575-
if errors.Is(err, util.ErrConfigNotFound) {
1575+
if util.IsOlderOrStaticPV(err) {
15761576
// diff iterate to measure usage is not possible without secrets.
15771577
isDiffPossible = false
15781578
} else if err != nil {

internal/util/errors.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,6 @@ var (
3636
ErrMissingConfigForMonitor = errors.New("missing configuration of cluster ID for monitor")
3737
// ErrConfigNotFound is returned when no configuration is found for a cluster ID.
3838
ErrConfigNotFound = errors.New("missing configuration for cluster ID")
39+
// ErrInvalidVolID is returned when the volume ID cannot be decomposed into a CSI identifier.
40+
ErrInvalidVolID = errors.New("invalid volume ID")
3941
)

internal/util/util.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,8 @@ func GetControllerPublishSecretRef(volumeId, driverType string) (string, string,
349349
)
350350
err := vi.DecomposeCSIID(volumeId)
351351
if err != nil {
352-
return secretName, secretNamespace, fmt.Errorf("failed to decode volume ID (%s): %w", volumeId, err)
352+
return secretName, secretNamespace, fmt.Errorf("failed to decode volume ID (%s): %w",
353+
volumeId, errors.Join(ErrInvalidVolID, err))
353354
}
354355

355356
secretName, secretNamespace, err = getControllerPublishSecretRef(vi.ClusterID, driverType)
@@ -395,6 +396,13 @@ func GetControllerPublishSecretRef(volumeId, driverType string) (string, string,
395396
return secretName, secretNamespace, nil
396397
}
397398

399+
// IsOlderOrStaticPV returns true when the error from GetControllerPublishSecretRef indicates
400+
// that the volume is either a static PV (non-CSI-formatted volume handle) or an older PV
401+
// provisioned without a controller-publish secret configured.
402+
func IsOlderOrStaticPV(err error) bool {
403+
return errors.Is(err, ErrInvalidVolID) || errors.Is(err, ErrConfigNotFound)
404+
}
405+
398406
func getControllerPublishSecretRef(clusterId, driverType string) (string, string, error) {
399407
var (
400408
err error

0 commit comments

Comments
 (0)