@@ -392,55 +392,65 @@ func getZoneEndpoints(objContext *Context, serviceEndpoint string) ([]string, bo
392
392
return zoneEndpointsList , isEndpointAlreadyExists , nil
393
393
}
394
394
395
+ func createMultisiteConfigurations (objContext * Context , configType , configTypeArg string , args ... string ) error {
396
+ args = append ([]string {configType }, args ... )
397
+ args = append (args , configTypeArg )
398
+ // get the multisite config before creating
399
+ configTypeArgs := []string {configType , "get" , configTypeArg }
400
+ if configType == "zonegroup" {
401
+ configTypeArgs = append (configTypeArgs , fmt .Sprintf ("--rgw-realm=%s" , objContext .Realm ))
402
+ }
403
+ output , getConfigErr := RunAdminCommandNoMultisite (objContext , true , configTypeArgs ... )
404
+ if getConfigErr == nil {
405
+ return nil
406
+ }
407
+
408
+ if kerrors .IsNotFound (getConfigErr ) {
409
+ // the pod used to exec command (act as a proxy) is not found/ready yet
410
+ // caller can nicely handle error and not overflow logs with misleading error messages
411
+ return getConfigErr
412
+ }
413
+
414
+ code , err := exec .ExtractExitCode (getConfigErr )
415
+ if err != nil {
416
+ return errorOrIsNotFound (getConfigErr , "'radosgw-admin %q get' failed with code %q, for reason %q, error: (%v)" , configType , strconv .Itoa (code ), output , string (kerrors .ReasonForError (err )))
417
+ }
418
+ // ENOENT means "No such file or directory"
419
+ if code != int (syscall .ENOENT ) {
420
+ code := strconv .Itoa (code )
421
+ return errors .Wrapf (getConfigErr , "'radosgw-admin %q get' failed with code %q, for reason %q" , configType , code , output )
422
+ }
423
+
424
+ // create the object if it doesn't exist yet
425
+ output , err = RunAdminCommandNoMultisite (objContext , false , args ... )
426
+ if err != nil {
427
+ return errorOrIsNotFound (err , "failed to create ceph %q %q, for reason %q" , configType , configTypeArg , output )
428
+ }
429
+ logger .Debugf ("created %q %q" , configType , configTypeArg )
430
+
431
+ return nil
432
+ }
433
+
395
434
func createMultisite (objContext * Context , endpointArg string ) error {
396
435
logger .Debugf ("creating realm, zone group, zone for object-store %v" , objContext .Name )
397
436
398
437
realmArg := fmt .Sprintf ("--rgw-realm=%s" , objContext .Realm )
399
438
zoneGroupArg := fmt .Sprintf ("--rgw-zonegroup=%s" , objContext .ZoneGroup )
439
+ zoneArg := fmt .Sprintf ("--rgw-zone=%s" , objContext .Zone )
400
440
401
- // create the realm if it doesn't exist yet
402
- output , err := RunAdminCommandNoMultisite (objContext , true , "realm" , "get" , realmArg )
441
+ err := createMultisiteConfigurations (objContext , "realm" , realmArg , "create" )
403
442
if err != nil {
404
- // ENOENT means "No such file or directory"
405
- if code , err := exec .ExtractExitCode (err ); err == nil && code == int (syscall .ENOENT ) {
406
- output , err = RunAdminCommandNoMultisite (objContext , false , "realm" , "create" , realmArg )
407
- if err != nil {
408
- return errorOrIsNotFound (err , "failed to create ceph realm %q, for reason %q" , objContext .ZoneGroup , output )
409
- }
410
- logger .Debugf ("created realm %q" , objContext .Realm )
411
- } else {
412
- return errorOrIsNotFound (err , "'radosgw-admin realm get' failed with code %d, for reason %q. %v" , strconv .Itoa (code ), output , string (kerrors .ReasonForError (err )))
413
- }
443
+ return err
414
444
}
415
445
416
- // create the zonegroup if it doesn't exist yet
417
- output , err = RunAdminCommandNoMultisite (objContext , true , "zonegroup" , "get" , realmArg , zoneGroupArg )
446
+ err = createMultisiteConfigurations (objContext , "zonegroup" , zoneGroupArg , "create" , "--master" , realmArg , endpointArg )
418
447
if err != nil {
419
- // ENOENT means "No such file or directory"
420
- if code , err := exec .ExtractExitCode (err ); err == nil && code == int (syscall .ENOENT ) {
421
- output , err = RunAdminCommandNoMultisite (objContext , false , "zonegroup" , "create" , "--master" , realmArg , zoneGroupArg , endpointArg )
422
- if err != nil {
423
- return errorOrIsNotFound (err , "failed to create ceph zone group %q, for reason %q" , objContext .ZoneGroup , output )
424
- }
425
- logger .Debugf ("created zone group %q" , objContext .ZoneGroup )
426
- } else {
427
- return errorOrIsNotFound (err , "'radosgw-admin zonegroup get' failed with code %d, for reason %q" , strconv .Itoa (code ), output )
428
- }
448
+ return err
429
449
}
430
450
431
- // create the zone if it doesn't exist yet
432
- output , err = runAdminCommand (objContext , true , "zone" , "get" )
451
+ err = createMultisiteConfigurations (objContext , "zone" , zoneArg , "create" , "--master" , endpointArg , realmArg , zoneGroupArg )
433
452
if err != nil {
434
- // ENOENT means "No such file or directory"
435
- if code , err := exec .ExtractExitCode (err ); err == nil && code == int (syscall .ENOENT ) {
436
- output , err = runAdminCommand (objContext , false , "zone" , "create" , "--master" , endpointArg )
437
- if err != nil {
438
- return errorOrIsNotFound (err , "failed to create ceph zone %q, for reason %q" , objContext .Zone , output )
439
- }
440
- logger .Debugf ("created zone %q" , objContext .Zone )
441
- } else {
442
- return errorOrIsNotFound (err , "'radosgw-admin zone get' failed with code %d, for reason %q" , strconv .Itoa (code ), output )
443
- }
453
+ return err
444
454
}
445
455
446
456
if err := commitConfigChanges (objContext ); err != nil {
0 commit comments