1616from ..services .ceph_service import CephService
1717from ..services .rgw_client import _SYNC_GROUP_ID , NoRgwDaemonsException , \
1818 RgwClient , RgwMultisite , RgwMultisiteAutomation
19+ from ..services .rgw_iam import RgwAccounts
1920from ..services .service import RgwServiceManager , wait_for_daemon_to_start
2021from ..tools import json_str_to_object , str_to_bool
2122from . import APIDoc , APIRouter , BaseController , CreatePermission , \
@@ -399,6 +400,15 @@ def _append_bid(self, bucket):
399400 if bucket ['tenant' ] else bucket ['bucket' ]
400401 return bucket
401402
403+ def _get_owner (self , owner ):
404+ accounts = RgwAccounts ().get_accounts ()
405+
406+ # if the owner is present in the accounts list,
407+ # then the bucket is owned by an account.
408+ # hence we will use dashboard user to fetch the
409+ # bucket info
410+ return owner if owner not in accounts else RgwServiceManager .user
411+
402412 def _get_versioning (self , owner , daemon_name , bucket_name ):
403413 rgw_client = RgwClient .instance (owner , daemon_name )
404414 return rgw_client .get_bucket_versioning (bucket_name )
@@ -542,19 +552,20 @@ def get(self, bucket, daemon_name=None):
542552 bucket_name = RgwBucket .get_s3_bucket_name (result ['bucket' ],
543553 result ['tenant' ])
544554
555+ owner = self ._get_owner (result ['owner' ])
545556 # Append the versioning configuration.
546- versioning = self ._get_versioning (result [ ' owner' ] , daemon_name , bucket_name )
547- encryption = self ._get_encryption (bucket_name , daemon_name , result [ ' owner' ] )
557+ versioning = self ._get_versioning (owner , daemon_name , bucket_name )
558+ encryption = self ._get_encryption (bucket_name , daemon_name , owner )
548559 result ['encryption' ] = encryption ['Status' ]
549560 result ['versioning' ] = versioning ['Status' ]
550561 result ['mfa_delete' ] = versioning ['MfaDelete' ]
551- result ['bucket_policy' ] = self ._get_policy (bucket_name , daemon_name , result [ ' owner' ] )
552- result ['acl' ] = self ._get_acl (bucket_name , daemon_name , result [ ' owner' ] )
553- result ['replication' ] = self ._get_replication (bucket_name , result [ ' owner' ] , daemon_name )
554- result ['lifecycle' ] = self ._get_lifecycle (bucket_name , daemon_name , result [ ' owner' ] )
562+ result ['bucket_policy' ] = self ._get_policy (bucket_name , daemon_name , owner )
563+ result ['acl' ] = self ._get_acl (bucket_name , daemon_name , owner )
564+ result ['replication' ] = self ._get_replication (bucket_name , owner , daemon_name )
565+ result ['lifecycle' ] = self ._get_lifecycle (bucket_name , daemon_name , owner )
555566
556567 # Append the locking configuration.
557- locking = self ._get_locking (result [ ' owner' ] , daemon_name , bucket_name )
568+ locking = self ._get_locking (owner , daemon_name , bucket_name )
558569 result .update (locking )
559570
560571 return self ._append_bid (result )
@@ -599,7 +610,7 @@ def create(self, bucket, uid, zonegroup=None, placement_target=None,
599610 raise DashboardException (e , http_status_code = 500 , component = 'rgw' )
600611
601612 @allow_empty_body
602- def set (self , bucket , bucket_id , uid , versioning_state = None ,
613+ def set (self , bucket , bucket_id , uid = None , versioning_state = None ,
603614 encryption_state = 'false' , encryption_type = None , key_id = None ,
604615 mfa_delete = None , mfa_token_serial = None , mfa_token_pin = None ,
605616 lock_mode = None , lock_retention_period_days = None ,
@@ -609,23 +620,27 @@ def set(self, bucket, bucket_id, uid, versioning_state=None,
609620 encryption_state = str_to_bool (encryption_state )
610621 if replication is not None :
611622 replication = str_to_bool (replication )
612- # When linking a non-tenant-user owned bucket to a tenanted user, we
613- # need to prefix bucket name with '/'. e.g. photos -> /photos
614- if '$' in uid and '/' not in bucket :
615- bucket = '/{}' .format (bucket )
616-
617- # Link bucket to new user:
618- result = self .proxy (daemon_name ,
619- 'PUT' ,
620- 'bucket' , {
621- 'bucket' : bucket ,
622- 'bucket-id' : bucket_id ,
623- 'uid' : uid
624- },
625- json_response = False )
623+
624+ result = None
625+ if uid :
626+ # When linking a non-tenant-user owned bucket to a tenanted user, we
627+ # need to prefix bucket name with '/'. e.g. photos -> /photos
628+ if '$' in uid and '/' not in bucket :
629+ bucket = '/{}' .format (bucket )
630+
631+ # Link bucket to new user:
632+ result = self .proxy (daemon_name ,
633+ 'PUT' ,
634+ 'bucket' , {
635+ 'bucket' : bucket ,
636+ 'bucket-id' : bucket_id ,
637+ 'uid' : uid
638+ },
639+ json_response = False )
626640
627641 uid_tenant = uid [:uid .find ('$' )] if uid .find ('$' ) >= 0 else None
628642 bucket_name = RgwBucket .get_s3_bucket_name (bucket , uid_tenant )
643+ uid = self ._get_owner (uid )
629644
630645 locking = self ._get_locking (uid , daemon_name , bucket_name )
631646 if versioning_state :
@@ -659,7 +674,7 @@ def set(self, bucket, bucket_id, uid, versioning_state=None,
659674 self ._set_lifecycle (bucket_name , lifecycle , daemon_name , uid )
660675 else :
661676 self ._delete_lifecycle (bucket_name , daemon_name , uid )
662- return self ._append_bid (result )
677+ return self ._append_bid (result ) if result else None
663678
664679 def delete (self , bucket , purge_objects = 'true' , daemon_name = None ):
665680 return self .proxy (daemon_name , 'DELETE' , 'bucket' , {
0 commit comments