@@ -452,16 +452,25 @@ def group_list(self) -> str:
452452 response = self ._url_open ("GET" , _COMMAND .LIST_GROUPS )
453453 return response .data .decode ()
454454
455- def policy_add (self , policy_name : str , policy_file : str ) -> str :
455+ def policy_add (self ,
456+ policy_name : str ,
457+ policy_file : str | os .PathLike | None = None ,
458+ policy : dict | None = None ) -> str :
456459 """Add new policy."""
457- with open (policy_file , encoding = 'utf-8' ) as file :
458- response = self ._url_open (
459- "PUT" ,
460- _COMMAND .ADD_CANNED_POLICY ,
461- query_params = {"name" : policy_name },
462- body = file .read ().encode (),
463- )
464- return response .data .decode ()
460+ if not (policy_file is not None ) ^ (policy is not None ):
461+ raise ValueError ("either policy_file or policy must be provided" )
462+ if policy_file :
463+ with open (policy_file , encoding = 'utf-8' ) as file :
464+ body = file .read ().encode ()
465+ else :
466+ body = json .dumps (policy ).encode ()
467+ response = self ._url_open (
468+ "PUT" ,
469+ _COMMAND .ADD_CANNED_POLICY ,
470+ query_params = {"name" : policy_name },
471+ body = body ,
472+ )
473+ return response .data .decode ()
465474
466475 def policy_remove (self , policy_name : str ) -> str :
467476 """Remove policy."""
@@ -753,7 +762,8 @@ def add_service_account(self,
753762 secret_key : str | None = None ,
754763 name : str | None = None ,
755764 description : str | None = None ,
756- policy_file : str | None = None ,
765+ policy : dict | None = None ,
766+ policy_file : str | os .PathLike | None = None ,
757767 expiration : str | None = None ,
758768 status : str | None = None ) -> str :
759769 """
@@ -763,7 +773,9 @@ def add_service_account(self,
763773 raise ValueError ("both access key and secret key must be provided" )
764774 if access_key == "" or secret_key == "" :
765775 raise ValueError ("access key or secret key must not be empty" )
766- data = {
776+ if policy_file is not None and policy is not None :
777+ raise ValueError ("either policy_file or policy must be provided" )
778+ data : dict [str , Any ] = {
767779 "status" : "enabled" ,
768780 "accessKey" : access_key ,
769781 "secretKey" : secret_key ,
@@ -775,6 +787,8 @@ def add_service_account(self,
775787 if policy_file :
776788 with open (policy_file , encoding = "utf-8" ) as file :
777789 data ["policy" ] = json .load (file )
790+ if policy :
791+ data ["policy" ] = policy
778792 if expiration :
779793 data ["expiration" ] = expiration
780794 if status :
@@ -797,16 +811,20 @@ def update_service_account(self,
797811 secret_key : str | None = None ,
798812 name : str | None = None ,
799813 description : str | None = None ,
800- policy_file : str | None = None ,
814+ policy_file : str | os .PathLike | None = None ,
815+ policy : dict | None = None ,
801816 expiration : str | None = None ,
802817 status : str | None = None ) -> str :
803818 """Update an existing service account"""
804- args = [secret_key , name , description , policy_file , expiration , status ]
819+ args = [secret_key , name , description ,
820+ policy_file , policy , expiration , status ]
805821 if not any (arg for arg in args ):
806822 raise ValueError ("at least one of secret_key, name, description, "
807- "policy_file, expiration or status must be "
808- "specified" )
809- data = {}
823+ "policy_file, policy, expiration or status must "
824+ "be specified" )
825+ if policy_file is not None and policy is not None :
826+ raise ValueError ("either policy_file or policy must be provided" )
827+ data : dict [str , Any ] = {}
810828 if secret_key :
811829 data ["newSecretKey" ] = secret_key
812830 if name :
@@ -816,6 +834,8 @@ def update_service_account(self,
816834 if policy_file :
817835 with open (policy_file , encoding = "utf-8" ) as file :
818836 data ["newPolicy" ] = json .load (file )
837+ if policy :
838+ data ["newPolicy" ] = policy
819839 if expiration :
820840 data ["newExpiration" ] = expiration
821841 if status :
0 commit comments