@@ -18,6 +18,7 @@ package shareadapters
18
18
19
19
import (
20
20
"fmt"
21
+ "strings"
21
22
"time"
22
23
23
24
"github.com/gophercloud/gophercloud/v2"
@@ -31,82 +32,88 @@ type Cephfs struct{}
31
32
32
33
var _ ShareAdapter = & Cephfs {}
33
34
34
- func (Cephfs ) GetOrGrantAccess (args * GrantAccessArgs ) (accessRight * shares.AccessRight , err error ) {
35
+ func (Cephfs ) GetOrGrantAccesses (args * GrantAccessArgs ) ([] shares.AccessRight , error ) {
35
36
// First, check if the access right exists or needs to be created
36
37
37
- var rights []shares.AccessRight
38
-
39
- accessTo := args .Options .CephfsClientID
40
- if accessTo == "" {
41
- accessTo = args .Share .Name
42
- }
43
-
44
- rights , err = args .ManilaClient .GetAccessRights (args .Share .ID )
38
+ rights , err := args .ManilaClient .GetAccessRights (args .Share .ID )
45
39
if err != nil {
46
40
if _ , ok := err .(gophercloud.ErrResourceNotFound ); ! ok {
47
41
return nil , fmt .Errorf ("failed to list access rights: %v" , err )
48
42
}
43
+ }
44
+
45
+ var accessToList []string
46
+ if args .Options .CephfsClientID == "" {
47
+ accessToList = []string {args .Share .Name }
49
48
} else {
50
- // Try to find the access right
49
+ accessToList = strings .Split (args .Options .CephfsClientID , "," )
50
+ }
51
51
52
+ modified := false
53
+ for _ , at := range accessToList {
54
+ // Try to find the access right
55
+ found := false
52
56
for _ , r := range rights {
53
- if r .AccessTo == accessTo && r .AccessType == "cephx" && r .AccessLevel == "rw" {
57
+ if r .AccessTo == at && r .AccessType == "cephx" && r .AccessLevel == "rw" {
54
58
klog .V (4 ).Infof ("cephx access right for share %s already exists" , args .Share .Name )
55
-
56
- accessRight = & r
59
+ found = true
57
60
break
58
61
}
59
62
}
60
- }
61
63
62
- if accessRight == nil {
63
64
// Not found, create it
64
-
65
- accessRight , err = args .ManilaClient .GrantAccess (args .Share .ID , shares.GrantAccessOpts {
66
- AccessType : "cephx" ,
67
- AccessLevel : "rw" ,
68
- AccessTo : accessTo ,
69
- })
70
-
71
- if err != nil {
72
- return
65
+ if ! found {
66
+ result , err := args .ManilaClient .GrantAccess (args .Share .ID , shares.GrantAccessOpts {
67
+ AccessType : "cephx" ,
68
+ AccessLevel : "rw" ,
69
+ AccessTo : at ,
70
+ })
71
+ if err != nil {
72
+ return nil , fmt .Errorf ("failed to grant access right: %v" , err )
73
+ }
74
+ if result .AccessKey == "" {
75
+ // Wait till a ceph key is assigned to the access right
76
+ backoff := wait.Backoff {
77
+ Duration : time .Second * 5 ,
78
+ Factor : 1.2 ,
79
+ Steps : 10 ,
80
+ }
81
+ wait .ExponentialBackoff (backoff , func () (bool , error ) {
82
+ rights , err := args .ManilaClient .GetAccessRights (args .Share .ID )
83
+ if err != nil {
84
+ return false , err
85
+ }
86
+
87
+ var accessRight * shares.AccessRight
88
+
89
+ for i := range rights {
90
+ if rights [i ].AccessTo == at {
91
+ accessRight = & rights [i ]
92
+ break
93
+ }
94
+ }
95
+
96
+ if accessRight == nil {
97
+ return false , fmt .Errorf ("cannot find the access right we've just created" )
98
+ }
99
+
100
+ return accessRight .AccessKey != "" , nil
101
+ })
102
+ }
103
+ modified = true
73
104
}
74
105
}
75
106
76
- if accessRight .AccessKey != "" {
77
- // The access right is ready
78
- return
79
- }
80
-
81
- // Wait till a ceph key is assigned to the access right
82
-
83
- backoff := wait.Backoff {
84
- Duration : time .Second * 5 ,
85
- Factor : 1.2 ,
86
- Steps : 10 ,
87
- }
88
-
89
- return accessRight , wait .ExponentialBackoff (backoff , func () (bool , error ) {
90
- rights , err := args .ManilaClient .GetAccessRights (args .Share .ID )
107
+ // Search again because access rights have changed
108
+ if modified {
109
+ rights , err = args .ManilaClient .GetAccessRights (args .Share .ID )
91
110
if err != nil {
92
- return false , err
93
- }
94
-
95
- var accessRight * shares.AccessRight
96
-
97
- for i := range rights {
98
- if rights [i ].AccessTo == accessTo {
99
- accessRight = & rights [i ]
100
- break
111
+ if _ , ok := err .(gophercloud.ErrResourceNotFound ); ! ok {
112
+ return nil , fmt .Errorf ("failed to list access rights: %v" , err )
101
113
}
102
114
}
103
-
104
- if accessRight == nil {
105
- return false , fmt .Errorf ("cannot find the access right we've just created" )
106
- }
107
-
108
- return accessRight .AccessKey != "" , nil
109
- })
115
+ }
116
+ return rights , nil
110
117
}
111
118
112
119
func (Cephfs ) BuildVolumeContext (args * VolumeContextArgs ) (volumeContext map [string ]string , err error ) {
0 commit comments