Fix Amazon OpenSearch Serverless integration with LangChain. (#603)
Signed-off-by: dblock <[email protected]>
This commit is contained in:
@@ -8,6 +8,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
|
|||||||
### Removed
|
### Removed
|
||||||
### Fixed
|
### Fixed
|
||||||
- Fix `TypeError` on `parallel_bulk` ([#601](https://github.com/opensearch-project/opensearch-py/pull/601))
|
- Fix `TypeError` on `parallel_bulk` ([#601](https://github.com/opensearch-project/opensearch-py/pull/601))
|
||||||
|
- Fix Amazon OpenSearch Serverless integration with LangChain ([#603](https://github.com/opensearch-project/opensearch-py/pull/603))
|
||||||
### Security
|
### Security
|
||||||
|
|
||||||
## [2.4.1]
|
## [2.4.1]
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ class RequestsAWSV4SignerAuth(requests.auth.AuthBase):
|
|||||||
|
|
||||||
def __init__(self, credentials, region, service: str = "es") -> None: # type: ignore
|
def __init__(self, credentials, region, service: str = "es") -> None: # type: ignore
|
||||||
self.signer = AWSV4Signer(credentials, region, service)
|
self.signer = AWSV4Signer(credentials, region, service)
|
||||||
|
self.service = service # tools like LangChain rely on this, see https://github.com/opensearch-project/opensearch-py/issues/600
|
||||||
|
|
||||||
def __call__(self, request): # type: ignore
|
def __call__(self, request): # type: ignore
|
||||||
return self._sign_request(request) # type: ignore
|
return self._sign_request(request) # type: ignore
|
||||||
@@ -133,6 +134,7 @@ class AWSV4SignerAuth(RequestsAWSV4SignerAuth):
|
|||||||
class Urllib3AWSV4SignerAuth(Callable): # type: ignore
|
class Urllib3AWSV4SignerAuth(Callable): # type: ignore
|
||||||
def __init__(self, credentials, region, service: str = "es") -> None: # type: ignore
|
def __init__(self, credentials, region, service: str = "es") -> None: # type: ignore
|
||||||
self.signer = AWSV4Signer(credentials, region, service)
|
self.signer = AWSV4Signer(credentials, region, service)
|
||||||
|
self.service = service # tools like LangChain rely on this, see https://github.com/opensearch-project/opensearch-py/issues/600
|
||||||
|
|
||||||
def __call__(self, method: str, url: str, body: Any) -> Dict[str, str]:
|
def __call__(self, method: str, url: str, body: Any) -> Dict[str, str]:
|
||||||
return self.signer.sign(method, url, body)
|
return self.signer.sign(method, url, body)
|
||||||
|
|||||||
@@ -460,6 +460,7 @@ class TestRequestsHttpConnection(TestCase):
|
|||||||
from opensearchpy.helpers.signer import RequestsAWSV4SignerAuth
|
from opensearchpy.helpers.signer import RequestsAWSV4SignerAuth
|
||||||
|
|
||||||
auth = RequestsAWSV4SignerAuth(self.mock_session(), region)
|
auth = RequestsAWSV4SignerAuth(self.mock_session(), region)
|
||||||
|
self.assertEqual(auth.service, "es")
|
||||||
con = RequestsHttpConnection(http_auth=auth)
|
con = RequestsHttpConnection(http_auth=auth)
|
||||||
prepared_request = requests.Request("GET", "http://localhost").prepare()
|
prepared_request = requests.Request("GET", "http://localhost").prepare()
|
||||||
auth(prepared_request)
|
auth(prepared_request)
|
||||||
@@ -478,6 +479,7 @@ class TestRequestsHttpConnection(TestCase):
|
|||||||
from opensearchpy.helpers.signer import RequestsAWSV4SignerAuth
|
from opensearchpy.helpers.signer import RequestsAWSV4SignerAuth
|
||||||
|
|
||||||
auth = RequestsAWSV4SignerAuth(self.mock_session(), region, service)
|
auth = RequestsAWSV4SignerAuth(self.mock_session(), region, service)
|
||||||
|
self.assertEqual(auth.service, service)
|
||||||
con = RequestsHttpConnection(http_auth=auth)
|
con = RequestsHttpConnection(http_auth=auth)
|
||||||
prepared_request = requests.Request("GET", "http://localhost").prepare()
|
prepared_request = requests.Request("GET", "http://localhost").prepare()
|
||||||
auth(prepared_request)
|
auth(prepared_request)
|
||||||
|
|||||||
@@ -192,6 +192,7 @@ class TestUrllib3HttpConnection(TestCase):
|
|||||||
from opensearchpy.helpers.signer import Urllib3AWSV4SignerAuth
|
from opensearchpy.helpers.signer import Urllib3AWSV4SignerAuth
|
||||||
|
|
||||||
auth = Urllib3AWSV4SignerAuth(self.mock_session(), "us-west-2")
|
auth = Urllib3AWSV4SignerAuth(self.mock_session(), "us-west-2")
|
||||||
|
self.assertEqual(auth.service, "es")
|
||||||
con = Urllib3HttpConnection(http_auth=auth, headers={"x": "y"})
|
con = Urllib3HttpConnection(http_auth=auth, headers={"x": "y"})
|
||||||
con.perform_request("GET", "/")
|
con.perform_request("GET", "/")
|
||||||
self.assertEqual(mock_open.call_count, 1)
|
self.assertEqual(mock_open.call_count, 1)
|
||||||
@@ -249,6 +250,7 @@ class TestUrllib3HttpConnection(TestCase):
|
|||||||
from opensearchpy.helpers.signer import Urllib3AWSV4SignerAuth
|
from opensearchpy.helpers.signer import Urllib3AWSV4SignerAuth
|
||||||
|
|
||||||
auth = Urllib3AWSV4SignerAuth(self.mock_session(), region, service)
|
auth = Urllib3AWSV4SignerAuth(self.mock_session(), region, service)
|
||||||
|
self.assertEqual(auth.service, service)
|
||||||
headers = auth("GET", "http://localhost", None)
|
headers = auth("GET", "http://localhost", None)
|
||||||
self.assertIn("Authorization", headers)
|
self.assertIn("Authorization", headers)
|
||||||
self.assertIn("X-Amz-Date", headers)
|
self.assertIn("X-Amz-Date", headers)
|
||||||
|
|||||||
Reference in New Issue
Block a user