
    g)                         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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   fd	Z	 	 ddedee	   dee
eej                  f      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                 >    dt         j                  vrt        d      y )NAWS_REGION_NAMEz7Missing required environment variable - AWS_REGION_NAME)osenviron
ValueError)clss    b/var/www/openai/venv/lib/python3.12/site-packages/litellm/secret_managers/aws_secret_manager_v2.pyvalidate_environmentz(AWSSecretsManagerV2.validate_environment$   s    BJJ.VWW /    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returnc                   K   | j                  d||      \  }}}t        t        j                  d|i      }	 |j	                  |||j                  d             d{   }|j                          |j                         d   S 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
        GetSecretValueactionr"   r#   r$   llm_providerparamsutf-8urlheadersdataNSecretStringTimeout error occurred1Error reading secret from AWS Secrets Manager: %s)_prepare_requestr	   r   SecretManagerpostdecoderaise_for_statusjsonhttpxTimeoutExceptionr   r   r   	exceptionstr)
selfr"   r#   r$   endpoint_urlr0   bodyasync_clientresponser    s
             r   async_read_secretz%AWSSecretsManagerV2.async_read_secret9   s      '+&;&;##+ '< '
#gt .-;;w'

	).. 'G8L /  H %%'==?>22	
 %% 	7566 	$$CSV  		s@   6C&B	 B &B	 CB	 	&C/CCCCc                 .   |dv rt        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                               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,   r-   r.   r2   r3   r4   N)r   getenvr5   r   r7   r8   r:   r;   r<   r   HTTPStatusErrorr   r=   r>   rC   textr   )
r?   r"   r#   r$   r@   r0   rA   sync_clientrC   r    s
             r   sync_read_secretz$AWSSecretsManagerV2.sync_read_secret`   s     
 
 99[))&*&;&;##+ '< '
#gt (w'
	"'' 'G8L ( H ==?>22%% 	7566$$ 	$$CAJJOO$  	  	$$CSV  		s$   5A7 70D'3CD+DD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)Namer2   DescriptionClientRequestTokenCreateSecret)r)   r"   rO   r#   request_datar$   r*   r-   r.   HTTP error occurred: r3   )uuidr>   uuid4r5   r	   r   r6   r7   r8   r9   r:   r;   rK   r   rC   rL   r<   )r?   r"   rO   rP   r#   r$   rX   r1   r@   r0   rA   rB   rC   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#   rV   r$   r*   r-   r.   NrW   r3   )r5   r	   r   r6   r7   r8   r9   r:   r;   rK   r   rC   rL   r<   )r?   r"   r\   r#   r$   r1   r@   r0   rA   rB   rC   rZ   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)   rV   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secretsmanagerr^   PutSecretValuer2   r-   zapplication/x-amz-json-1.1zsecretsmanager.)zContent-TypezX-Amz-TargetPOST)methodr/   r1   r0   )botocore.authrc   botocore.awsrequestrd   ImportError*_get_boto_credentials_from_optional_paramsget_runtime_endpointrf   rg   replacer:   dumpsencodecredentialsadd_authpreparer0   )r?   r)   r"   rO   r#   rV   rc   rd   boto3_credentials_info_r@   r1   rA   r0   requestpreppeds                   r   r5   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)NN)NNN)   NN)__name__
__module____qualname__classmethodr   r   boolr!   r>   dictr   floatr;   TimeoutrD   rN   r[   intra   tupler   bytesr5    r   r   r   r   #   s   X X Xd^  $ +/9=	%% "$% %u}} 456	%
 
#%T +/9=	00 "$0 %u}} 456	0
 
#0l &**.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__r:   r   typingr   r   r   r;   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F3*&7 F3r   