@@ -4,9 +4,11 @@ import (
4
4
"context"
5
5
"errors"
6
6
"fmt"
7
- "sort"
7
+ "regexp"
8
+ "strconv"
8
9
"strings"
9
10
"sync"
11
+ "time"
10
12
11
13
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2021-03-01/compute"
12
14
"github.com/Azure/go-autorest/autorest/to"
@@ -127,6 +129,23 @@ func (imageHandler *AzureImageHandler) CreateImage(imageReqInfo irs.ImageReqInfo
127
129
return imageInfo , nil
128
130
}
129
131
132
+ func checkRequest (errMessage string ) (repeat bool ) {
133
+ pattern := `Please try again after '(\d+)' seconds`
134
+ re := regexp .MustCompile (pattern )
135
+
136
+ matches := re .FindStringSubmatch (errMessage )
137
+
138
+ if len (matches ) > 1 {
139
+ number := matches [1 ]
140
+ sec , _ := strconv .Atoi (number )
141
+ time .Sleep (time .Second * time .Duration (sec ))
142
+
143
+ return true
144
+ }
145
+
146
+ return false
147
+ }
148
+
130
149
func (imageHandler * AzureImageHandler ) ListImage () ([]* irs.ImageInfo , error ) {
131
150
// log HisCall
132
151
hiscallInfo := GetCallLogScheme (imageHandler .Region , call .VMIMAGE , Image , "ListImage()" )
@@ -143,21 +162,28 @@ func (imageHandler *AzureImageHandler) ListImage() ([]*irs.ImageInfo, error) {
143
162
144
163
var publisherNames []string
145
164
for _ , p := range * publishers .Value {
146
- if p .Name == nil ||
147
- strings .Contains (strings .ToLower (* p .Name ), "test" ) {
165
+ if p .Name == nil {
148
166
continue
149
167
}
150
168
publisherNames = append (publisherNames , * p .Name )
151
169
}
152
- sort .Strings (publisherNames )
153
170
154
- var routineMax = 200
171
+ var routineMax = 300
155
172
var wait sync.WaitGroup
156
173
var mutex = & sync.Mutex {}
157
174
var lenPublisherNames = len (publisherNames )
158
175
var errList []string
159
176
var errMutex = & sync.Mutex {}
160
177
178
+ type imageSearchInfo struct {
179
+ PublisherName string
180
+ OfferName string
181
+ Sku string
182
+ Version string
183
+ }
184
+ var imageSearchInfos []imageSearchInfo
185
+ var imageSearchInfosMutex = & sync.Mutex {}
186
+
161
187
for i := 0 ; i < lenPublisherNames ; {
162
188
if lenPublisherNames - i < routineMax {
163
189
routineMax = lenPublisherNames - i
@@ -166,15 +192,28 @@ func (imageHandler *AzureImageHandler) ListImage() ([]*irs.ImageInfo, error) {
166
192
wait .Add (routineMax )
167
193
168
194
for j := 0 ; j < routineMax ; j ++ {
169
- go func (ctx context.Context , wait * sync.WaitGroup , mutex * sync.Mutex , errList []string , errMutex * sync.Mutex , pName string ) {
195
+ pName := publisherNames [i ]
196
+ go func (imageHandler * AzureImageHandler , wait * sync.WaitGroup , mutex * sync.Mutex , errList []string , errMutex * sync.Mutex , pName string ) {
170
197
defer wait .Done ()
171
- offers , err := imageHandler .VMImageClient .ListOffers (ctx , imageHandler .Region .Region , pName )
172
- if err != nil {
173
- errMutex .Lock ()
174
- errList = append (errList , err .Error ())
175
- errMutex .Unlock ()
176
198
177
- return
199
+ var err error
200
+ var offers compute.ListVirtualMachineImageResource
201
+
202
+ for {
203
+ offers , err = imageHandler .VMImageClient .ListOffers (imageHandler .Ctx , imageHandler .Region .Region , pName )
204
+ if err != nil {
205
+ if checkRequest (err .Error ()) {
206
+ continue
207
+ }
208
+
209
+ cblogger .Error (err )
210
+ errMutex .Lock ()
211
+ errList = append (errList , err .Error ())
212
+ errMutex .Unlock ()
213
+
214
+ return
215
+ }
216
+ break
178
217
}
179
218
180
219
if offers .Value == nil {
@@ -183,38 +222,44 @@ func (imageHandler *AzureImageHandler) ListImage() ([]*irs.ImageInfo, error) {
183
222
184
223
var offerNames []string
185
224
for _ , o := range * offers .Value {
186
- if o .Name == nil ||
187
- strings .Contains (strings .ToLower (* o .Name ), "test" ) ||
188
- strings .Contains (strings .ToLower (* o .Name ), "preview" ) ||
189
- strings .Contains (strings .ToLower (* o .Name ), "daily" ) {
225
+ if o .Name == nil {
190
226
continue
191
227
}
192
228
offerNames = append (offerNames , * o .Name )
193
229
}
194
- sort .Strings (offerNames )
195
230
196
231
var lenOfferNames = len (offerNames )
197
232
var wait2 sync.WaitGroup
198
- var routineMax2 = 150
199
233
200
234
for i := 0 ; i < lenOfferNames ; {
201
- if lenOfferNames - i < routineMax2 {
202
- routineMax2 = lenOfferNames - i
235
+ if lenOfferNames - i < routineMax {
236
+ routineMax = lenOfferNames - i
203
237
}
204
238
205
- wait2 .Add (routineMax2 )
239
+ wait2 .Add (routineMax )
206
240
207
- for j := 0 ; j < routineMax2 ; j ++ {
241
+ for j := 0 ; j < routineMax ; j ++ {
208
242
go func (wait2 * sync.WaitGroup , oName string ) {
209
243
defer wait2 .Done ()
210
244
211
- skus , err := imageHandler .VMImageClient .ListSkus (ctx , imageHandler .Region .Region , pName , oName )
212
- if err != nil {
213
- errMutex .Lock ()
214
- errList = append (errList , err .Error ())
215
- errMutex .Unlock ()
245
+ var err error
246
+ var skus compute.ListVirtualMachineImageResource
216
247
217
- return
248
+ for {
249
+ skus , err = imageHandler .VMImageClient .ListSkus (imageHandler .Ctx , imageHandler .Region .Region , pName , oName )
250
+ if err != nil {
251
+ if checkRequest (err .Error ()) {
252
+ continue
253
+ }
254
+
255
+ cblogger .Error (err )
256
+ errMutex .Lock ()
257
+ errList = append (errList , err .Error ())
258
+ errMutex .Unlock ()
259
+
260
+ return
261
+ }
262
+ break
218
263
}
219
264
220
265
if skus .Value == nil {
@@ -228,66 +273,66 @@ func (imageHandler *AzureImageHandler) ListImage() ([]*irs.ImageInfo, error) {
228
273
}
229
274
skuNames = append (skuNames , * s .Name )
230
275
}
231
- sort .Strings (skuNames )
232
276
233
277
var lenSkuNames = len (skuNames )
234
278
var wait3 sync.WaitGroup
235
- var routineMax3 = 100
236
279
237
280
for i := 0 ; i < lenSkuNames ; {
238
- if lenSkuNames - i < routineMax3 {
239
- routineMax3 = lenSkuNames - i
281
+ if lenSkuNames - i < routineMax {
282
+ routineMax = lenSkuNames - i
240
283
}
241
284
242
- wait3 .Add (routineMax3 )
285
+ wait3 .Add (routineMax )
243
286
244
- for j := 0 ; j < routineMax3 ; j ++ {
287
+ for j := 0 ; j < routineMax ; j ++ {
245
288
go func (wait3 * sync.WaitGroup , sName string ) {
246
289
defer wait3 .Done ()
247
290
248
- imageVersionList , err := imageHandler .VMImageClient .List (ctx , imageHandler .Region .Region , pName , oName , sName , "" , nil , "" )
249
- if err != nil {
250
- errMutex .Lock ()
251
- errList = append (errList , err .Error ())
252
- errMutex .Unlock ()
291
+ var err error
292
+ var imageVersionList compute.ListVirtualMachineImageResource
253
293
254
- return
294
+ for {
295
+ imageVersionList , err = imageHandler .VMImageClient .List (imageHandler .Ctx , imageHandler .Region .Region , pName , oName , sName , "" , nil , "" )
296
+ if err != nil {
297
+ if checkRequest (err .Error ()) {
298
+ continue
299
+ }
300
+
301
+ errMutex .Lock ()
302
+ cblogger .Error (err )
303
+ errList = append (errList , err .Error ())
304
+ errMutex .Unlock ()
305
+
306
+ return
307
+ }
308
+ break
255
309
}
256
310
257
311
if imageVersionList .Value == nil {
258
312
return
259
313
}
260
314
261
- var imageVersions []string
262
315
for _ , iv := range * imageVersionList .Value {
263
316
if iv .ID == nil {
264
317
continue
265
318
}
266
- imageVersions = append (imageVersions , * iv .ID )
267
- }
268
- sort .Strings (skuNames )
269
319
270
- for _ , vID := range imageVersions {
271
- imageIdArr := strings .Split (vID , "/" )
320
+ imageIdArr := strings .Split (* iv .ID , "/" )
272
321
imageVersion := imageIdArr [len (imageIdArr )- 1 ]
273
322
274
- vmImage , err := imageHandler .VMImageClient .Get (ctx , imageHandler .Region .Region , pName , oName , sName , imageVersion )
275
- if err != nil {
276
- errMutex .Lock ()
277
- errList = append (errList , err .Error ())
278
- errMutex .Unlock ()
279
-
280
- continue
281
- }
282
- vmImageInfo := imageHandler .setterVMImage (vmImage )
283
- mutex .Lock ()
284
- imageList = append (imageList , vmImageInfo )
285
- mutex .Unlock ()
323
+ imageSearchInfosMutex .Lock ()
324
+ imageSearchInfos = append (imageSearchInfos , imageSearchInfo {
325
+ PublisherName : pName ,
326
+ OfferName : oName ,
327
+ Sku : sName ,
328
+ Version : imageVersion ,
329
+ })
330
+ imageSearchInfosMutex .Unlock ()
286
331
}
287
332
}(& wait3 , skuNames [i ])
288
333
289
334
i ++
290
- if i == lenPublisherNames {
335
+ if i == lenSkuNames {
291
336
break
292
337
}
293
338
}
@@ -305,7 +350,7 @@ func (imageHandler *AzureImageHandler) ListImage() ([]*irs.ImageInfo, error) {
305
350
306
351
wait2 .Wait ()
307
352
}
308
- }(imageHandler . Ctx , & wait , mutex , errList , errMutex , publisherNames [ i ] )
353
+ }(imageHandler , & wait , mutex , errList , errMutex , pName )
309
354
310
355
i ++
311
356
if i == lenPublisherNames {
@@ -315,6 +360,58 @@ func (imageHandler *AzureImageHandler) ListImage() ([]*irs.ImageInfo, error) {
315
360
316
361
wait .Wait ()
317
362
}
363
+
364
+ if len (errList ) == 0 {
365
+ var lenImageSearchInfos = len (imageSearchInfos )
366
+ var wait4 sync.WaitGroup
367
+
368
+ for i := 0 ; i < lenImageSearchInfos ; {
369
+ if lenImageSearchInfos - i < routineMax {
370
+ routineMax = lenImageSearchInfos - i
371
+ }
372
+
373
+ wait4 .Add (routineMax )
374
+
375
+ for j := 0 ; j < routineMax ; j ++ {
376
+ go func (imageHandler * AzureImageHandler , wait4 * sync.WaitGroup , isInfo imageSearchInfo ) {
377
+ defer wait4 .Done ()
378
+
379
+ var err error
380
+ var vmImage compute.VirtualMachineImage
381
+
382
+ for {
383
+ vmImage , err = imageHandler .VMImageClient .Get (imageHandler .Ctx , imageHandler .Region .Region , isInfo .PublisherName , isInfo .OfferName , isInfo .Sku , isInfo .Version )
384
+ if err != nil {
385
+ if checkRequest (err .Error ()) {
386
+ continue
387
+ }
388
+
389
+ cblogger .Error (err )
390
+ errMutex .Lock ()
391
+ errList = append (errList , err .Error ())
392
+ errMutex .Unlock ()
393
+
394
+ return
395
+ }
396
+ break
397
+ }
398
+
399
+ vmImageInfo := imageHandler .setterVMImage (vmImage )
400
+ mutex .Lock ()
401
+ imageList = append (imageList , vmImageInfo )
402
+ mutex .Unlock ()
403
+ }(imageHandler , & wait4 , imageSearchInfos [i ])
404
+
405
+ i ++
406
+ if i == lenImageSearchInfos {
407
+ break
408
+ }
409
+ }
410
+
411
+ wait4 .Wait ()
412
+ }
413
+ }
414
+
318
415
if len (errList ) > 0 {
319
416
cblogger .Error (strings .Join (errList , "\n " ))
320
417
return nil , errors .New (strings .Join (errList , "\n " ))
0 commit comments