@@ -21,190 +21,209 @@ func New() APIImplementor {
2121}
2222
2323func (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+ }
2829
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+ }
3334
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+ }
3839
39- return nil
40+ return nil
41+ })
4042}
4143
4244func (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-
4845 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 )
5148 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
5350 }
5451
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+ }
5757
58- return iqns , nil
58+ iqns = append (iqns , iqn )
59+ }
60+
61+ return nil
62+ })
63+ return iqns , err
5964}
6065
6166func (APIImplementor ) ListTargetPortals () ([]TargetPortal , error ) {
62- instances , err := cim .ListISCSITargetPortals (cim .ISCSITargetPortalDefaultSelectorList )
63- if err != nil {
64- return nil , err
65- }
66-
6767 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 )
7070 if err != nil {
71- return nil , fmt . Errorf ( "failed parsing target portal %v. err: %w" , instance , err )
71+ return err
7272 }
7373
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+ }
7979
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
8189}
8290
8391func (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+ }
8897
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+ }
93102
94- return nil
103+ return nil
104+ })
95105}
96106
97107func (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+ }
112113
113- targetAuthType := strings .ToUpper (strings .ReplaceAll (authType , "_" , "" ))
114+ connected , err := cim .IsISCSITargetConnected (target )
115+ if err != nil {
116+ return err
117+ }
114118
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 , "_" , "" ))
119125
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+ })
121133}
122134
123135func (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+ }
138141
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+ }
144146
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+ }
149151
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+ }
154157
155- if persistent {
156- result , err := cim .UnregisterISCSISession (session )
158+ sessionIdentifier , err := cim .GetISCSISessionIdentifier (session )
157159 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 )
159161 }
160- }
161162
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+ }
166174
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+ })
168182}
169183
170184func (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-
191185 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 )
194193 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 )
196195 }
197196
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
201218}
202219
203220func (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+ }
208226
209- return nil
227+ return nil
228+ })
210229}
0 commit comments