@@ -21,190 +21,209 @@ func New() APIImplementor {
21
21
}
22
22
23
23
func (APIImplementor ) AddTargetPortal (portal * TargetPortal ) error {
24
- existing , err := cim .QueryISCSITargetPortal (portal .Address , portal .Port , nil )
25
- if cim .IgnoreNotFound (err ) != nil {
26
- return err
27
- }
24
+ return cim .WithCOMThread (func () error {
25
+ existing , err := cim .QueryISCSITargetPortal (portal .Address , portal .Port , nil )
26
+ if cim .IgnoreNotFound (err ) != nil {
27
+ return err
28
+ }
28
29
29
- if existing != nil {
30
- klog .V (2 ).Infof ("target portal at (%s:%d) already exists" , portal .Address , portal .Port )
31
- return nil
32
- }
30
+ if existing != nil {
31
+ klog .V (2 ).Infof ("target portal at (%s:%d) already exists" , portal .Address , portal .Port )
32
+ return nil
33
+ }
33
34
34
- _ , err = cim .NewISCSITargetPortal (portal .Address , portal .Port , nil , nil , nil , nil )
35
- if err != nil {
36
- return fmt .Errorf ("error adding target portal at (%s:%d). err: %v" , portal .Address , portal .Port , err )
37
- }
35
+ _ , err = cim .NewISCSITargetPortal (portal .Address , portal .Port , nil , nil , nil , nil )
36
+ if err != nil {
37
+ return fmt .Errorf ("error adding target portal at (%s:%d). err: %v" , portal .Address , portal .Port , err )
38
+ }
38
39
39
- return nil
40
+ return nil
41
+ })
40
42
}
41
43
42
44
func (APIImplementor ) DiscoverTargetPortal (portal * TargetPortal ) ([]string , error ) {
43
- targets , err := cim .ListISCSITargetsByTargetPortalAddressAndPort (portal .Address , portal .Port , nil )
44
- if err != nil {
45
- return nil , err
46
- }
47
-
48
45
var iqns []string
49
- for _ , target := range targets {
50
- iqn , err := cim .GetISCSITargetNodeAddress ( target )
46
+ err := cim . WithCOMThread ( func () error {
47
+ targets , err := cim .ListISCSITargetsByTargetPortalAddressAndPort ( portal . Address , portal . Port , nil )
51
48
if err != nil {
52
- return nil , fmt . Errorf ( "failed parsing node address of target %v to target portal at (%s:%d). err: %w" , target , portal . Address , portal . Port , err )
49
+ return err
53
50
}
54
51
55
- iqns = append (iqns , iqn )
56
- }
52
+ for _ , target := range targets {
53
+ iqn , err := cim .GetISCSITargetNodeAddress (target )
54
+ if err != nil {
55
+ return fmt .Errorf ("failed parsing node address of target %v to target portal at (%s:%d). err: %w" , target , portal .Address , portal .Port , err )
56
+ }
57
57
58
- return iqns , nil
58
+ iqns = append (iqns , iqn )
59
+ }
60
+
61
+ return nil
62
+ })
63
+ return iqns , err
59
64
}
60
65
61
66
func (APIImplementor ) ListTargetPortals () ([]TargetPortal , error ) {
62
- instances , err := cim .ListISCSITargetPortals (cim .ISCSITargetPortalDefaultSelectorList )
63
- if err != nil {
64
- return nil , err
65
- }
66
-
67
67
var portals []TargetPortal
68
- for _ , instance := range instances {
69
- address , port , err := cim .ParseISCSITargetPortal ( instance )
68
+ err := cim . WithCOMThread ( func () error {
69
+ instances , err := cim .ListISCSITargetPortals ( cim . ISCSITargetPortalDefaultSelectorList )
70
70
if err != nil {
71
- return nil , fmt . Errorf ( "failed parsing target portal %v. err: %w" , instance , err )
71
+ return err
72
72
}
73
73
74
- portals = append ( portals , TargetPortal {
75
- Address : address ,
76
- Port : port ,
77
- } )
78
- }
74
+ for _ , instance := range instances {
75
+ address , port , err := cim . ParseISCSITargetPortal ( instance )
76
+ if err != nil {
77
+ return fmt . Errorf ( "failed parsing target portal %v. err: %w" , instance , err )
78
+ }
79
79
80
- return portals , nil
80
+ portals = append (portals , TargetPortal {
81
+ Address : address ,
82
+ Port : port ,
83
+ })
84
+ }
85
+
86
+ return nil
87
+ })
88
+ return portals , err
81
89
}
82
90
83
91
func (APIImplementor ) RemoveTargetPortal (portal * TargetPortal ) error {
84
- instance , err := cim .QueryISCSITargetPortal (portal .Address , portal .Port , nil )
85
- if err != nil {
86
- return err
87
- }
92
+ return cim .WithCOMThread (func () error {
93
+ instance , err := cim .QueryISCSITargetPortal (portal .Address , portal .Port , nil )
94
+ if err != nil {
95
+ return err
96
+ }
88
97
89
- result , err := cim .RemoveISCSITargetPortal (instance )
90
- if result != 0 || err != nil {
91
- return fmt .Errorf ("error removing target portal at (%s:%d). result: %d, err: %w" , portal .Address , portal .Port , result , err )
92
- }
98
+ result , err := cim .RemoveISCSITargetPortal (instance )
99
+ if result != 0 || err != nil {
100
+ return fmt .Errorf ("error removing target portal at (%s:%d). result: %d, err: %w" , portal .Address , portal .Port , result , err )
101
+ }
93
102
94
- return nil
103
+ return nil
104
+ })
95
105
}
96
106
97
107
func (APIImplementor ) ConnectTarget (portal * TargetPortal , iqn string , authType string , chapUser string , chapSecret string ) error {
98
- target , err := cim .QueryISCSITarget (portal .Address , portal .Port , iqn )
99
- if err != nil {
100
- return err
101
- }
102
-
103
- connected , err := cim .IsISCSITargetConnected (target )
104
- if err != nil {
105
- return err
106
- }
107
-
108
- if connected {
109
- klog .V (2 ).Infof ("target %s from target portal at (%s:%d) is connected." , iqn , portal .Address , portal .Port )
110
- return nil
111
- }
108
+ return cim .WithCOMThread (func () error {
109
+ target , err := cim .QueryISCSITarget (portal .Address , portal .Port , iqn )
110
+ if err != nil {
111
+ return err
112
+ }
112
113
113
- targetAuthType := strings .ToUpper (strings .ReplaceAll (authType , "_" , "" ))
114
+ connected , err := cim .IsISCSITargetConnected (target )
115
+ if err != nil {
116
+ return err
117
+ }
114
118
115
- result , err := cim .ConnectISCSITarget (portal .Address , portal .Port , iqn , targetAuthType , & chapUser , & chapSecret )
116
- if err != nil {
117
- return fmt .Errorf ("error connecting to target portal. result: %d, err: %w" , result , err )
118
- }
119
+ if connected {
120
+ klog .V (2 ).Infof ("target %s from target portal at (%s:%d) is connected." , iqn , portal .Address , portal .Port )
121
+ return nil
122
+ }
123
+
124
+ targetAuthType := strings .ToUpper (strings .ReplaceAll (authType , "_" , "" ))
119
125
120
- return nil
126
+ result , err := cim .ConnectISCSITarget (portal .Address , portal .Port , iqn , targetAuthType , & chapUser , & chapSecret )
127
+ if err != nil {
128
+ return fmt .Errorf ("error connecting to target portal. result: %d, err: %w" , result , err )
129
+ }
130
+
131
+ return nil
132
+ })
121
133
}
122
134
123
135
func (APIImplementor ) DisconnectTarget (portal * TargetPortal , iqn string ) error {
124
- target , err := cim .QueryISCSITarget (portal .Address , portal .Port , iqn )
125
- if err != nil {
126
- return err
127
- }
128
-
129
- connected , err := cim .IsISCSITargetConnected (target )
130
- if err != nil {
131
- return fmt .Errorf ("error query connected of target %s from target portal at (%s:%d). err: %w" , iqn , portal .Address , portal .Port , err )
132
- }
133
-
134
- if ! connected {
135
- klog .V (2 ).Infof ("target %s from target portal at (%s:%d) is not connected." , iqn , portal .Address , portal .Port )
136
- return nil
137
- }
136
+ return cim .WithCOMThread (func () error {
137
+ target , err := cim .QueryISCSITarget (portal .Address , portal .Port , iqn )
138
+ if err != nil {
139
+ return err
140
+ }
138
141
139
- // get session
140
- session , err := cim .QueryISCSISessionByTarget (target )
141
- if err != nil {
142
- return fmt .Errorf ("error query session of target %s from target portal at (%s:%d). err: %w" , iqn , portal .Address , portal .Port , err )
143
- }
142
+ connected , err := cim .IsISCSITargetConnected (target )
143
+ if err != nil {
144
+ return fmt .Errorf ("error query connected of target %s from target portal at (%s:%d). err: %w" , iqn , portal .Address , portal .Port , err )
145
+ }
144
146
145
- sessionIdentifier , err := cim . GetISCSISessionIdentifier ( session )
146
- if err != nil {
147
- return fmt . Errorf ( "error query session identifier of target %s from target portal at (%s:%d). err: %w" , iqn , portal . Address , portal . Port , err )
148
- }
147
+ if ! connected {
148
+ klog . V ( 2 ). Infof ( "target %s from target portal at (%s:%d) is not connected." , iqn , portal . Address , portal . Port )
149
+ return nil
150
+ }
149
151
150
- persistent , err := cim .IsISCSISessionPersistent (session )
151
- if err != nil {
152
- return fmt .Errorf ("error query session persistency of target %s from target portal at (%s:%d). err: %w" , iqn , portal .Address , portal .Port , err )
153
- }
152
+ // get session
153
+ session , err := cim .QueryISCSISessionByTarget (target )
154
+ if err != nil {
155
+ return fmt .Errorf ("error query session of target %s from target portal at (%s:%d). err: %w" , iqn , portal .Address , portal .Port , err )
156
+ }
154
157
155
- if persistent {
156
- result , err := cim .UnregisterISCSISession (session )
158
+ sessionIdentifier , err := cim .GetISCSISessionIdentifier (session )
157
159
if err != nil {
158
- return fmt .Errorf ("error unregister session on target %s from target portal at (%s:%d). result: %d, err: %w" , iqn , portal .Address , portal .Port , result , err )
160
+ return fmt .Errorf ("error query session identifier of target %s from target portal at (%s:%d). err: %w" , iqn , portal .Address , portal .Port , err )
159
161
}
160
- }
161
162
162
- result , err := cim .DisconnectISCSITarget (target , sessionIdentifier )
163
- if err != nil {
164
- return fmt .Errorf ("error disconnecting target %s from target portal at (%s:%d). result: %d, err: %w" , iqn , portal .Address , portal .Port , result , err )
165
- }
163
+ persistent , err := cim .IsISCSISessionPersistent (session )
164
+ if err != nil {
165
+ return fmt .Errorf ("error query session persistency of target %s from target portal at (%s:%d). err: %w" , iqn , portal .Address , portal .Port , err )
166
+ }
167
+
168
+ if persistent {
169
+ result , err := cim .UnregisterISCSISession (session )
170
+ if err != nil {
171
+ return fmt .Errorf ("error unregister session on target %s from target portal at (%s:%d). result: %d, err: %w" , iqn , portal .Address , portal .Port , result , err )
172
+ }
173
+ }
166
174
167
- return nil
175
+ result , err := cim .DisconnectISCSITarget (target , sessionIdentifier )
176
+ if err != nil {
177
+ return fmt .Errorf ("error disconnecting target %s from target portal at (%s:%d). result: %d, err: %w" , iqn , portal .Address , portal .Port , result , err )
178
+ }
179
+
180
+ return nil
181
+ })
168
182
}
169
183
170
184
func (APIImplementor ) GetTargetDisks (portal * TargetPortal , iqn string ) ([]string , error ) {
171
- target , err := cim .QueryISCSITarget (portal .Address , portal .Port , iqn )
172
- if err != nil {
173
- return nil , err
174
- }
175
-
176
- connected , err := cim .IsISCSITargetConnected (target )
177
- if err != nil {
178
- return nil , fmt .Errorf ("error query connected of target %s from target portal at (%s:%d). err: %w" , iqn , portal .Address , portal .Port , err )
179
- }
180
-
181
- if ! connected {
182
- klog .V (2 ).Infof ("target %s from target portal at (%s:%d) is not connected." , iqn , portal .Address , portal .Port )
183
- return nil , nil
184
- }
185
-
186
- disks , err := cim .ListDisksByTarget (target )
187
- if err != nil {
188
- return nil , fmt .Errorf ("error getting target disks on target %s from target portal at (%s:%d). err: %w" , iqn , portal .Address , portal .Port , err )
189
- }
190
-
191
185
var ids []string
192
- for _ , disk := range disks {
193
- number , err := cim .GetDiskNumber (disk )
186
+ err := cim .WithCOMThread (func () error {
187
+ target , err := cim .QueryISCSITarget (portal .Address , portal .Port , iqn )
188
+ if err != nil {
189
+ return err
190
+ }
191
+
192
+ connected , err := cim .IsISCSITargetConnected (target )
194
193
if err != nil {
195
- return nil , fmt .Errorf ("error getting number of disk %v on target %s from target portal at (%s:%d). err: %w" , disk , iqn , portal .Address , portal .Port , err )
194
+ return fmt .Errorf ("error query connected of target %s from target portal at (%s:%d). err: %w" , iqn , portal .Address , portal .Port , err )
196
195
}
197
196
198
- ids = append (ids , strconv .Itoa (int (number )))
199
- }
200
- return ids , nil
197
+ if ! connected {
198
+ klog .V (2 ).Infof ("target %s from target portal at (%s:%d) is not connected." , iqn , portal .Address , portal .Port )
199
+ return nil
200
+ }
201
+
202
+ disks , err := cim .ListDisksByTarget (target )
203
+ if err != nil {
204
+ return fmt .Errorf ("error getting target disks on target %s from target portal at (%s:%d). err: %w" , iqn , portal .Address , portal .Port , err )
205
+ }
206
+
207
+ for _ , disk := range disks {
208
+ number , err := cim .GetDiskNumber (disk )
209
+ if err != nil {
210
+ return fmt .Errorf ("error getting number of disk %v on target %s from target portal at (%s:%d). err: %w" , disk , iqn , portal .Address , portal .Port , err )
211
+ }
212
+
213
+ ids = append (ids , strconv .Itoa (int (number )))
214
+ }
215
+ return nil
216
+ })
217
+ return ids , err
201
218
}
202
219
203
220
func (APIImplementor ) SetMutualChapSecret (mutualChapSecret string ) error {
204
- result , err := cim .SetISCSISessionChapSecret (mutualChapSecret )
205
- if err != nil {
206
- return fmt .Errorf ("error setting mutual chap secret. result: %d, err: %v" , result , err )
207
- }
221
+ return cim .WithCOMThread (func () error {
222
+ result , err := cim .SetISCSISessionChapSecret (mutualChapSecret )
223
+ if err != nil {
224
+ return fmt .Errorf ("error setting mutual chap secret. result: %d, err: %v" , result , err )
225
+ }
208
226
209
- return nil
227
+ return nil
228
+ })
210
229
}
0 commit comments