
    h>1                         d Z ddlZddlZddlmZmZmZ ddlZddlZddl	m
Z
 ddlmZ ddlmZmZ ddlmZ ddlmZ d	d
lmZ  G d dee      Zy)a  
This is a file for the AWS Secret Manager Integration

Handles Async Operations for:
- Read Secret
- Write Secret
- Delete Secret

Relevant issue: https://github.com/BerriAI/litellm/issues/1883

Requires:
* `os.environ["AWS_REGION_NAME"], 
* `pip install boto3>=1.28.57`
    N)AnyOptionalUnion)verbose_logger)
BaseAWSLLM)_get_httpx_clientget_async_httpx_client)KeyManagementSystem)httpxSpecialProvider   )BaseSecretManagerc                   .   e Zd Zd Zed        Zedee   fd       Z	 	 	 dde	dee
   deeeej                  f      d	ee	   d
ee	   f
dZ	 	 	 dde	dee
   deeeej                  f      d	ee	   d
ee	   f
dZdee	   d
e
fdZde	d	e	d
ee	   fdZde	d	e	d
ee	   fdZ	 	 	 dde	de	dee	   dee
   deeeej                  f      d
e
fdZ	 	 	 dde	dee   dee
   deeeej                  f      d
e
f
dZ	 	 	 dde	de	dee	   dee
   dee
   d
ee	eef   fdZy)AWSSecretsManagerV2c                 \    t        j                  | fi | t        j                  | fi | y )N)r   __init__r   )selfkwargss     i/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/secret_managers/aws_secret_manager_v2.pyr   zAWSSecretsManagerV2.__init__$   s(    ""4262D+F+    c                 >    dt         j                  vrt        d      y )NAWS_REGION_NAMEz7Missing required environment variable - AWS_REGION_NAME)osenviron
ValueError)clss    r   validate_environmentz(AWSSecretsManagerV2.validate_environment(   s    BJJ.VWW /r   use_aws_secret_managerc                     ||du ry	 | j                           |        t        _        t        j                  t        _        y# t        $ r}|d}~ww xY w)z
        Initialize AWSSecretsManagerV2 and sets litellm.secret_manager_client = AWSSecretsManagerV2() and litellm._key_management_system = KeyManagementSystem.AWS_SECRET_MANAGER
        NF)r   litellmsecret_manager_clientr
   AWS_SECRET_MANAGER_key_management_system	Exception)r   r   es      r   load_aws_secret_managerz+AWSSecretsManagerV2.load_aws_secret_manager-   sS    
 ")-Cu-L	$$&,/EG)-@-S-SG* 	G	s   9A 	AAANsecret_nameoptional_paramstimeoutprimary_secret_namereturnc                   K   |r| j                  ||       d{   S | j                  d||      \  }}}t        t        j                  d|i      }	 |j                  |||j                  d             d{   }	|	j                          |	j                         d	   S 7 7 )# t        j                  $ r t        d
      t        $ r*}
t        j                  d|t        |
             Y d}
~
yd}
~
ww xY ww)z
        Async function to read a secret from AWS Secrets Manager

        Returns:
            str: Secret value
        Raises:
            ValueError: If the secret is not found or an HTTP error occurs
        r&   r)   NGetSecretValueactionr&   r'   r(   llm_providerparamsutf-8urlheadersdataSecretStringTimeout error occurred6Error reading secret='%s' from AWS Secrets Manager: %s)%async_read_secret_from_primary_secret_prepare_requestr	   r   SecretManagerpostdecoderaise_for_statusjsonhttpxTimeoutExceptionr   r#   r   	exceptionstr)r   r&   r'   r(   r)   endpoint_urlr6   bodyasync_clientresponser$   s              r   async_read_secretz%AWSSecretsManagerV2.async_read_secret<   s     CC'=P D    '+&;&;##+ '< '
#gt .-;;w'

	).. 'G8L /  H %%'==?>22) 
 %% 	7566 	$$HA 
 	sK   C;B$9C;&B( <B&=&B( #C;&B( (&C8 C3.C;3C88C;c           	         |dv rt        j                  |      S |r| j                  ||      S | j                  d||      \  }}}t	        d|i      }	 |j                  |||j                  d            }	|	j                         d	   S # t        j                  $ r t        d
      t        j                  $ r\}
t        j                  d|t        |
j                  j                         t        |
j                  j"                               Y d}
~
yd}
~
wt$        $ r*}
t        j                  d|t        |
             Y d}
~
yd}
~
ww xY w)z
        Sync function to read a secret from AWS Secrets Manager

        Done for backwards compatibility with existing codebase, since get_secret is a sync function
        )AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYr   
AWS_REGIONAWS_BEDROCK_RUNTIME_ENDPOINTr,   r-   r.   r(   )r2   r3   r4   r8   r9   z:Error reading secret='%s' from AWS Secrets Manager: %s, %sNr:   )r   getenv$sync_read_secret_from_primary_secretr<   r   r>   r?   rA   rB   rC   r   HTTPStatusErrorr   rD   rE   rI   textstatus_coder#   )r   r&   r'   r(   r)   rF   r6   rG   sync_clientrI   r$   s              r   sync_read_secretz$AWSSecretsManagerV2.sync_read_secretk   s[     
 
 99[))<<'=P =   '+&;&;##+ '< '
#gt (w'
	"'' 'G8L ( H ==?>22%% 	7566$$ 	$$LAJJOO$AJJ**+	    	$$HA 
 	s%   5B 0E	<ADE	 EE	primary_secret_json_strc                 4    t        j                  |xs d      S )z
        Parse the primary secret JSON string into a dictionary

        Args:
            primary_secret_json_str: JSON string containing key-value pairs

        Returns:
            Dictionary of key-value pairs from the primary secret
        z{})rA   loads)r   rW   s     r   _parse_primary_secretz)AWSSecretsManagerV2._parse_primary_secret   s     zz19T::r   c                 j    | j                  |      }| j                  |      }|j                  |      S )7
        Read a secret from the primary secret
        r&   )rV   rZ   getr   r&   r)   rW   primary_secret_kv_pairss        r   rQ   z8AWSSecretsManagerV2.sync_read_secret_from_primary_secret   s<     #'"7"7DW"7"X"&"<"<=T"U&**;77r   c                    K   | j                  |       d{   }| j                  |      }|j                  |      S 7 &w)r\   r]   N)rJ   rZ   r^   r_   s        r   r;   z9AWSSecretsManagerV2.async_read_secret_from_primary_secret   sP      )-(>(>+ )? )
 #
 #'"<"<=T"U&**;77	#
s   A?'Asecret_valuedescriptionc                    K   ddl }||d}|r||d<   t        |j                               |d<   | j                  d||||      \  }}	}
t	        t
        j                  d|i	      }	 |j                  ||	|
j                  d
             d{   }|j                          |j                         S 7 $# t        j                  $ r'}t        d|j                  j                         d}~wt        j                   $ r t        d      w xY ww)a]  
        Async function to write a secret to AWS Secrets Manager

        Args:
            secret_name: Name of the secret
            secret_value: Value to store (can be a JSON string)
            description: Optional description for the secret
            optional_params: Additional AWS parameters
            timeout: Request timeout
        r   N)Namer8   DescriptionClientRequestTokenCreateSecret)r/   r&   rb   r'   request_datar(   r0   r3   r4   HTTP error occurred: r9   )uuidrE   uuid4r<   r	   r   r=   r>   r?   r@   rA   rB   rR   r   rI   rS   rC   )r   r&   rb   rc   r'   r(   rk   r7   rF   r6   rG   rH   rI   errs                 r   async_write_secretz&AWSSecretsManagerV2.async_write_secret   s     $ 	 $\B"-D%(%6!"&*&;&;!#%+ '< '
#gt .-;;w'

		7).. 'G8L /  H %%'==?"	
 $$ 	J4S\\5F5F4GHII%% 	7566	7s<   A$D'&B4 B2#B4 1D2B4 4D"C))"DDrecovery_window_in_daysc                   K   ||d}| j                  d|||      \  }}}t        t        j                  d|i      }		 |	j	                  |||j                  d             d{   }
|
j                          |
j                         S 7 $# t        j                  $ r'}t        d	|j                  j                         d}~wt        j                  $ r t        d
      w xY ww)a  
        Async function to delete a secret from AWS Secrets Manager

        Args:
            secret_name: Name of the secret to delete
            recovery_window_in_days: Number of days before permanent deletion (default: 7)
            optional_params: Additional AWS parameters
            timeout: Request timeout

        Returns:
            dict: Response from AWS Secrets Manager containing deletion details
        )SecretIdRecoveryWindowInDaysDeleteSecret)r/   r&   r'   ri   r(   r0   r3   r4   Nrj   r9   )r<   r	   r   r=   r>   r?   r@   rA   rB   rR   r   rI   rS   rC   )r   r&   ro   r'   r(   r7   rF   r6   rG   rH   rI   rm   s               r   async_delete_secretz'AWSSecretsManagerV2.async_delete_secret   s     * $$;

 '+&;&;!#+	 '< '
#gt .-;;w'

		7).. 'G8L /  H %%'==?"	
 $$ 	J4S\\5F5F4GHII%% 	7566	7s:   <C&&B %B
&#B 	C&
B C#"C"C##C&r/   ri   c                 &   	 ddl m} ddlm} |xs i }| j                  |      }| j                  d|j                  |j                        \  }	}
|
j                  dd      }
|r|}nd	|i}|r
|d
k(  r||d<   t        j                  |      j                  d      }dd| d} |d|
||      } ||j                  d|j                        j                  |       |j                         }|
|j                   |fS # t        $ r t	        d      w xY w)z'Prepare the AWS Secrets Manager requestr   )	SigV4Auth)
AWSRequestz7Missing boto3 to call bedrock. Run 'pip install boto3'.N)api_baseaws_bedrock_runtime_endpointaws_region_namezbedrock-runtimesecretsmanagerrq   PutSecretValuer8   r3   zapplication/x-amz-json-1.1zsecretsmanager.)zContent-TypezX-Amz-TargetPOST)methodr5   r7   r6   )botocore.authrv   botocore.awsrequestrw   ImportError*_get_boto_credentials_from_optional_paramsget_runtime_endpointry   rz   replacerA   dumpsencodecredentialsadd_authpreparer6   )r   r/   r&   rb   r'   ri   rv   rw   boto3_credentials_info_rF   r7   rG   r6   requestpreppeds                   r   r<   z$AWSSecretsManagerV2._prepare_request+  sG   	Y/6 */R!%!P!P"

 33)?)\)\2BB 4 
<
 $++,=?OP D,D*: :'3^$zz$&&w/8-fX6
 |$
 	".."22	
 (7
//#W__d22Q  	YWXX	Ys   C; ;D)NNN)   NN)__name__
__module____qualname__r   classmethodr   r   boolr%   rE   dictr   floatrB   TimeoutrJ   rV   rZ   rQ   r;   rn   intrt   tupler   bytesr<    r   r   r   r   #   sx   , X X Xd^  " +/9=-1-- "$- %u}} 456	-
 &c]- 
#-d +/9=-199 "$9 %u}} 456	9
 &c]9 
#9v
;Xc] 
;t 
;88588	#8
8
858
8	#
8  &**.9=1717 17 c]	17
 "$17 %u}} 45617 
17l 23*.9=.7.7 "*#.7 "$	.7
 %u}} 456.7 
.7h '+*.'+4343 43 sm	43
 "$43 tn43 
sC	43r   r   )__doc__rA   r   typingr   r   r   rB   r   litellm._loggingr   !litellm.llms.bedrock.base_aws_llmr   &litellm.llms.custom_httpx.http_handlerr   r	   litellm.proxy._typesr
   litellm.types.llms.custom_httpr   base_secret_managerr   r   r   r   r   <module>r      sE     	 ' '   + 8 5 ? 2|3*&7 |3r   