From 4b78ee707ee3fea3e2cda4a5b89985c84b01afa9 Mon Sep 17 00:00:00 2001 From: zhuxiaolong37 Date: Fri, 5 Sep 2025 16:15:56 +0800 Subject: [PATCH 1/9] Fix vector endpoint issues and supplement test cases --- alibabacloud_oss_v2/vectors/endpoints.py | 2 +- tests/unit/vectors/test_endpoints.py | 64 ++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 tests/unit/vectors/test_endpoints.py diff --git a/alibabacloud_oss_v2/vectors/endpoints.py b/alibabacloud_oss_v2/vectors/endpoints.py index 0e26436..71ffbd8 100644 --- a/alibabacloud_oss_v2/vectors/endpoints.py +++ b/alibabacloud_oss_v2/vectors/endpoints.py @@ -27,7 +27,7 @@ def build_url(self, op_input: OperationInput) -> str: if op_input.bucket is None: host = self._endpoint.netloc else: - host = f'{self._account_id}-{op_input.bucket}.{self._endpoint.netloc}' + host = f'{op_input.bucket}-{self._account_id}.{self._endpoint.netloc}' if op_input.key is not None: paths.append(quote(op_input.key)) diff --git a/tests/unit/vectors/test_endpoints.py b/tests/unit/vectors/test_endpoints.py new file mode 100644 index 0000000..580a37a --- /dev/null +++ b/tests/unit/vectors/test_endpoints.py @@ -0,0 +1,64 @@ +import unittest +from urllib.parse import urlparse +from alibabacloud_oss_v2.vectors.endpoints import VectorsEndpointProvider, from_region +from alibabacloud_oss_v2.types import OperationInput + +class TestVectorsEndpoints(unittest.TestCase): + + def test_from_region(self): + result = from_region("cn-hangzhou", "") + self.assertEqual("oss-cn-hangzhou.oss-vectors.aliyuncs.com", result) + + result = from_region("cn-hangzhou", "internal") + self.assertEqual("oss-cn-hangzhou-internal.oss-vectors.aliyuncs.com", result) + + def test_vectors_endpoint_provider_init(self): + endpoint = urlparse("https://oss-cn-hangzhou.oss-vectors.aliyuncs.com") + provider = VectorsEndpointProvider(endpoint, "123456") + + self.assertEqual(endpoint, provider._endpoint) + self.assertEqual("123456", provider._account_id) + + provider = VectorsEndpointProvider(endpoint, None) + self.assertEqual("", provider._account_id) + + def test_vectors_endpoint_provider_build_url(self): + endpoint = urlparse("https://oss-cn-hangzhou.oss-vectors.aliyuncs.com") + provider = VectorsEndpointProvider(endpoint, "123456") + + op_input = OperationInput( + op_name="TestOperation", + method="GET" + ) + url = provider.build_url(op_input) + self.assertEqual("https://oss-cn-hangzhou.oss-vectors.aliyuncs.com/", url) + + op_input = OperationInput( + op_name="TestOperation", + method="GET", + bucket="test-bucket" + ) + url = provider.build_url(op_input) + self.assertEqual("https://test-bucket-123456.oss-cn-hangzhou.oss-vectors.aliyuncs.com/", url) + + op_input = OperationInput( + op_name="TestOperation", + method="GET", + bucket="test-bucket", + key="test-key" + ) + url = provider.build_url(op_input) + self.assertEqual("https://test-bucket-123456.oss-cn-hangzhou.oss-vectors.aliyuncs.com/test-key", url) + + op_input = OperationInput( + op_name="TestOperation", + method="GET", + bucket="test-bucket", + key="test key+value" + ) + url = provider.build_url(op_input) + self.assertEqual("https://test-bucket-123456.oss-cn-hangzhou.oss-vectors.aliyuncs.com/test%20key%2Bvalue", url) + + +if __name__ == '__main__': + unittest.main() From 82bcc393c75768df9de03161654eefb5ddcdd88e Mon Sep 17 00:00:00 2001 From: zhuxiaolong37 Date: Mon, 8 Sep 2025 17:40:32 +0800 Subject: [PATCH 2/9] Change user ID to account ID --- alibabacloud_oss_v2/config.py | 6 ++--- alibabacloud_oss_v2/signer/vectors_v4.py | 10 ++++---- alibabacloud_oss_v2/vectors/client.py | 4 ++-- sample/vector/vector_delete_bucket.py | 4 ++-- sample/vector/vector_delete_bucket_logging.py | 4 ++-- sample/vector/vector_delete_bucket_policy.py | 4 ++-- sample/vector/vector_delete_bucket_tags.py | 4 ++-- sample/vector/vector_delete_vector_index.py | 4 ++-- sample/vector/vector_delete_vectors.py | 4 ++-- sample/vector/vector_get_bucket.py | 4 ++-- sample/vector/vector_get_bucket_logging.py | 4 ++-- sample/vector/vector_get_bucket_policy.py | 4 ++-- .../vector_get_bucket_resource_group.py | 4 ++-- sample/vector/vector_get_bucket_tags.py | 4 ++-- sample/vector/vector_get_vector_index.py | 4 ++-- sample/vector/vector_get_vectors.py | 4 ++-- sample/vector/vector_list_buckets.py | 4 ++-- sample/vector/vector_list_vector_index.py | 4 ++-- sample/vector/vector_list_vectors.py | 4 ++-- sample/vector/vector_put_bucket.py | 4 ++-- sample/vector/vector_put_bucket_logging.py | 4 ++-- sample/vector/vector_put_bucket_policy.py | 4 ++-- .../vector_put_bucket_resource_group.py | 4 ++-- sample/vector/vector_put_bucket_tags.py | 4 ++-- sample/vector/vector_put_vector_index.py | 4 ++-- sample/vector/vector_put_vectors.py | 4 ++-- sample/vector/vector_query_vectors.py | 4 ++-- tests/integration/__init__.py | 2 +- tests/unit/signer/test_v4.py | 24 +++++++++---------- 29 files changed, 71 insertions(+), 71 deletions(-) diff --git a/alibabacloud_oss_v2/config.py b/alibabacloud_oss_v2/config.py index 6a963fa..874690a 100644 --- a/alibabacloud_oss_v2/config.py +++ b/alibabacloud_oss_v2/config.py @@ -30,7 +30,7 @@ def __init__( user_agent: Optional[str] = None, cloud_box_id: Optional[str] = None, enable_auto_detect_cloud_box_id: Optional[bool] = None, - user_id: Optional[str] = None + account_id: Optional[str] = None ) -> None: """ Args: @@ -74,7 +74,7 @@ def __init__( user_agent: (str, optional): The optional user specific identifier appended to the User-Agent header. cloud_box_id: (str, optional): The cloud box id. enable_auto_detect_cloud_box_id: (bool, optional): The cloud box id is automatically extracted from endpoint. - user_id: (str, optional): The user id, must be required in vectors options. + account_id: (str, optional): The account id, must be required in vectors options. """ self.region = region self.endpoint = endpoint @@ -100,7 +100,7 @@ def __init__( self.user_agent = user_agent self.cloud_box_id = cloud_box_id self.enable_auto_detect_cloud_box_id = enable_auto_detect_cloud_box_id - self.user_id = user_id + self.account_id = account_id def load_default() -> Config: """Using the SDK's default configuration""" diff --git a/alibabacloud_oss_v2/signer/vectors_v4.py b/alibabacloud_oss_v2/signer/vectors_v4.py index 18b8b9c..cd8c2a7 100644 --- a/alibabacloud_oss_v2/signer/vectors_v4.py +++ b/alibabacloud_oss_v2/signer/vectors_v4.py @@ -15,8 +15,8 @@ class VectorsSignerV4(Signer): """Signer Vectors V4 """ - def __init__(self, user_id: str) -> None: - self._user_id = user_id + def __init__(self, account_id: str) -> None: + self._account_id = account_id def sign(self, signing_ctx: SigningContext) -> None: if signing_ctx is None: @@ -30,9 +30,9 @@ def sign(self, signing_ctx: SigningContext) -> None: raise exceptions.ParamNullOrEmptyError( field="SigningContext.request") - if self._user_id is None or self._user_id == '': + if self._account_id is None or self._account_id == '': raise exceptions.ParamNullOrEmptyError( - field="SignerVectorsV4.user_id") + field="SignerVectorsV4.account_id") if signing_ctx.auth_method_query: return self._auth_query(signing_ctx) @@ -238,7 +238,7 @@ def _calc_canonical_request(self, request = signing_ctx.request # canonical uri - uri = f'/acs:ossvector:{signing_ctx.region}:{self._user_id}:' + uri = f'/acs:ossvector:{signing_ctx.region}:{self._account_id}:' if signing_ctx.bucket is not None: uri = uri + signing_ctx.bucket + '/' if signing_ctx.key is not None: diff --git a/alibabacloud_oss_v2/vectors/client.py b/alibabacloud_oss_v2/vectors/client.py index fc18144..395e458 100644 --- a/alibabacloud_oss_v2/vectors/client.py +++ b/alibabacloud_oss_v2/vectors/client.py @@ -33,9 +33,9 @@ def __init__(self, config: Config, **kwargs) -> None: self._resolve_vectors_endpoint(_config) self._build_vectors_user_agent(_config) self._client = _SyncClientImpl(_config, **kwargs) - self._client._options.signer = VectorsSignerV4(user_id=config.user_id) + self._client._options.signer = VectorsSignerV4(account_id=config.account_id) self._client._options.endpoint_provider = endpoints.VectorsEndpointProvider( - account_id=config.user_id, + account_id=config.account_id, endpoint=self._client._options.endpoint ) diff --git a/sample/vector/vector_delete_bucket.py b/sample/vector/vector_delete_bucket.py index a32d722..721327a 100644 --- a/sample/vector/vector_delete_bucket.py +++ b/sample/vector/vector_delete_bucket.py @@ -6,7 +6,7 @@ parser.add_argument('--region', help='The region in which the bucket is located.', required=True) parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -18,7 +18,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_delete_bucket_logging.py b/sample/vector/vector_delete_bucket_logging.py index 6fc299e..230ad9c 100644 --- a/sample/vector/vector_delete_bucket_logging.py +++ b/sample/vector/vector_delete_bucket_logging.py @@ -6,7 +6,7 @@ parser.add_argument('--region', help='The region in which the bucket is located.', required=True) parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -18,7 +18,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_delete_bucket_policy.py b/sample/vector/vector_delete_bucket_policy.py index 03ab7fd..b1e3c18 100644 --- a/sample/vector/vector_delete_bucket_policy.py +++ b/sample/vector/vector_delete_bucket_policy.py @@ -6,7 +6,7 @@ parser.add_argument('--region', help='The region in which the bucket is located.', required=True) parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -18,7 +18,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_delete_bucket_tags.py b/sample/vector/vector_delete_bucket_tags.py index cd4b936..0bba50f 100644 --- a/sample/vector/vector_delete_bucket_tags.py +++ b/sample/vector/vector_delete_bucket_tags.py @@ -6,7 +6,7 @@ parser.add_argument('--region', help='The region in which the bucket is located.', required=True) parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -18,7 +18,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_delete_vector_index.py b/sample/vector/vector_delete_vector_index.py index 5fd785f..b153fc3 100644 --- a/sample/vector/vector_delete_vector_index.py +++ b/sample/vector/vector_delete_vector_index.py @@ -7,7 +7,7 @@ parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') parser.add_argument('--index_name', help='The name of the vector index.', required=True) -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -19,7 +19,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_delete_vectors.py b/sample/vector/vector_delete_vectors.py index 6a746fa..057ba1c 100644 --- a/sample/vector/vector_delete_vectors.py +++ b/sample/vector/vector_delete_vectors.py @@ -7,7 +7,7 @@ parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') parser.add_argument('--index_name', help='The name of the vector index.', required=True) -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -19,7 +19,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_get_bucket.py b/sample/vector/vector_get_bucket.py index 2a6215f..f6826e0 100644 --- a/sample/vector/vector_get_bucket.py +++ b/sample/vector/vector_get_bucket.py @@ -6,7 +6,7 @@ parser.add_argument('--region', help='The region in which the bucket is located.', required=True) parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -18,7 +18,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_get_bucket_logging.py b/sample/vector/vector_get_bucket_logging.py index 3a23eb1..249caed 100644 --- a/sample/vector/vector_get_bucket_logging.py +++ b/sample/vector/vector_get_bucket_logging.py @@ -6,7 +6,7 @@ parser.add_argument('--region', help='The region in which the bucket is located.', required=True) parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -18,7 +18,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_get_bucket_policy.py b/sample/vector/vector_get_bucket_policy.py index 1a76f88..526e367 100644 --- a/sample/vector/vector_get_bucket_policy.py +++ b/sample/vector/vector_get_bucket_policy.py @@ -6,7 +6,7 @@ parser.add_argument('--region', help='The region in which the bucket is located.', required=True) parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -18,7 +18,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_get_bucket_resource_group.py b/sample/vector/vector_get_bucket_resource_group.py index 33c8d9d..6cdcd92 100644 --- a/sample/vector/vector_get_bucket_resource_group.py +++ b/sample/vector/vector_get_bucket_resource_group.py @@ -6,7 +6,7 @@ parser.add_argument('--region', help='The region in which the bucket is located.', required=True) parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -18,7 +18,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_get_bucket_tags.py b/sample/vector/vector_get_bucket_tags.py index eb3b426..eda3b69 100644 --- a/sample/vector/vector_get_bucket_tags.py +++ b/sample/vector/vector_get_bucket_tags.py @@ -6,7 +6,7 @@ parser.add_argument('--region', help='The region in which the bucket is located.', required=True) parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -18,7 +18,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_get_vector_index.py b/sample/vector/vector_get_vector_index.py index cb4e244..aaf732f 100644 --- a/sample/vector/vector_get_vector_index.py +++ b/sample/vector/vector_get_vector_index.py @@ -7,7 +7,7 @@ parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') parser.add_argument('--index_name', help='The name of the vector index.', required=True) -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -19,7 +19,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_get_vectors.py b/sample/vector/vector_get_vectors.py index 151ec3f..5773122 100644 --- a/sample/vector/vector_get_vectors.py +++ b/sample/vector/vector_get_vectors.py @@ -7,7 +7,7 @@ parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') parser.add_argument('--index_name', help='The name of the vector index.', required=True) -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -19,7 +19,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_list_buckets.py b/sample/vector/vector_list_buckets.py index 883d708..2ca2bb9 100644 --- a/sample/vector/vector_list_buckets.py +++ b/sample/vector/vector_list_buckets.py @@ -6,7 +6,7 @@ parser.add_argument('--region', help='The region in which the bucket is located.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): @@ -19,7 +19,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_list_vector_index.py b/sample/vector/vector_list_vector_index.py index 83dac29..b15be62 100644 --- a/sample/vector/vector_list_vector_index.py +++ b/sample/vector/vector_list_vector_index.py @@ -6,7 +6,7 @@ parser.add_argument('--region', help='The region in which the bucket is located.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) parser.add_argument('--bucket', help='The name of the bucket.', required=True) def main(): @@ -20,7 +20,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_list_vectors.py b/sample/vector/vector_list_vectors.py index e7c1a04..a3c8067 100644 --- a/sample/vector/vector_list_vectors.py +++ b/sample/vector/vector_list_vectors.py @@ -6,7 +6,7 @@ parser.add_argument('--region', help='The region in which the bucket is located.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--iindex_name', help='The name of the vector index.', required=True) @@ -21,7 +21,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_put_bucket.py b/sample/vector/vector_put_bucket.py index 3b9412f..58f46fa 100644 --- a/sample/vector/vector_put_bucket.py +++ b/sample/vector/vector_put_bucket.py @@ -6,7 +6,7 @@ parser.add_argument('--region', help='The region in which the bucket is located.', required=True) parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -18,7 +18,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_put_bucket_logging.py b/sample/vector/vector_put_bucket_logging.py index 6d6b216..ae1cfdc 100644 --- a/sample/vector/vector_put_bucket_logging.py +++ b/sample/vector/vector_put_bucket_logging.py @@ -6,7 +6,7 @@ parser.add_argument('--region', help='The region in which the bucket is located.', required=True) parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -18,7 +18,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_put_bucket_policy.py b/sample/vector/vector_put_bucket_policy.py index 26fc72f..8f2f10b 100644 --- a/sample/vector/vector_put_bucket_policy.py +++ b/sample/vector/vector_put_bucket_policy.py @@ -6,7 +6,7 @@ parser.add_argument('--region', help='The region in which the bucket is located.', required=True) parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -18,7 +18,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_put_bucket_resource_group.py b/sample/vector/vector_put_bucket_resource_group.py index f20ba4e..7268aa7 100644 --- a/sample/vector/vector_put_bucket_resource_group.py +++ b/sample/vector/vector_put_bucket_resource_group.py @@ -7,7 +7,7 @@ parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') parser.add_argument('--resource_group_id', help='The ID of the resource group.', required=True) -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -19,7 +19,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_put_bucket_tags.py b/sample/vector/vector_put_bucket_tags.py index 33b235c..dd96632 100644 --- a/sample/vector/vector_put_bucket_tags.py +++ b/sample/vector/vector_put_bucket_tags.py @@ -6,7 +6,7 @@ parser.add_argument('--region', help='The region in which the bucket is located.', required=True) parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): @@ -19,7 +19,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_put_vector_index.py b/sample/vector/vector_put_vector_index.py index 1365c13..68a0b2a 100644 --- a/sample/vector/vector_put_vector_index.py +++ b/sample/vector/vector_put_vector_index.py @@ -7,7 +7,7 @@ parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') parser.add_argument('--index_name', help='The name of the vector index.', required=True) -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -19,7 +19,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_put_vectors.py b/sample/vector/vector_put_vectors.py index 985b4ae..312911e 100644 --- a/sample/vector/vector_put_vectors.py +++ b/sample/vector/vector_put_vectors.py @@ -7,7 +7,7 @@ parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') parser.add_argument('--index_name', help='The name of the vector index.', required=True) -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -19,7 +19,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/sample/vector/vector_query_vectors.py b/sample/vector/vector_query_vectors.py index 4473ba9..a09aa5d 100644 --- a/sample/vector/vector_query_vectors.py +++ b/sample/vector/vector_query_vectors.py @@ -7,7 +7,7 @@ parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') parser.add_argument('--index_name', help='The name of the vector index.', required=True) -parser.add_argument('--uid', help='The user id.', required=True) +parser.add_argument('--account_id', help='The account id.', required=True) def main(): args = parser.parse_args() @@ -19,7 +19,7 @@ def main(): cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider cfg.region = args.region - cfg.user_id = args.uid + cfg.account_id = args.account_id if args.endpoint is not None: cfg.endpoint = args.endpoint diff --git a/tests/integration/__init__.py b/tests/integration/__init__.py index 0e97314..2306d03 100644 --- a/tests/integration/__init__.py +++ b/tests/integration/__init__.py @@ -102,7 +102,7 @@ def get_vectors_client() -> oss_vectors.Client: cfg.credentials_provider = oss.credentials.StaticCredentialsProvider(ACCESS_ID, ACCESS_KEY) cfg.region = REGION cfg.endpoint = ENDPOINT - cfg.user_id = USER_ID + cfg.account_id = USER_ID return oss_vectors.Client(cfg) def get_client_use_ststoken(region:str, endpoint:str) -> oss.Client: diff --git a/tests/unit/signer/test_v4.py b/tests/unit/signer/test_v4.py index 637eb21..632a337 100644 --- a/tests/unit/signer/test_v4.py +++ b/tests/unit/signer/test_v4.py @@ -634,8 +634,8 @@ def test_signer_vector_v4_build_bucket_arn(self) -> None: Since the URI construction is internal, we test it by examining the string_to_sign which contains the canonical request. """ - user_id = "123" - signer = VectorsSignerV4(user_id) + account_id = "123" + signer = VectorsSignerV4(account_id) # Test 1: Only region sign_ctx = SigningContext( @@ -645,7 +645,7 @@ def test_signer_vector_v4_build_bucket_arn(self) -> None: signing_time=datetime.datetime.fromtimestamp(1702743657, tz=datetime.timezone.utc) ) signer.sign(sign_ctx) - expected_uri_1 = f'/acs:ossvector:cn-hangzhou:{user_id}:' + expected_uri_1 = f'/acs:ossvector:cn-hangzhou:{account_id}:' self.assertIn(expected_uri_1, sign_ctx.string_to_sign) @@ -658,7 +658,7 @@ def test_signer_vector_v4_build_bucket_arn(self) -> None: signing_time=datetime.datetime.fromtimestamp(1702743657, tz=datetime.timezone.utc) ) signer.sign(sign_ctx) - expected_uri_2 = f'/acs:ossvector:cn-hangzhou:{user_id}:bucket/' + expected_uri_2 = f'/acs:ossvector:cn-hangzhou:{account_id}:bucket/' self.assertIn(expected_uri_2, sign_ctx.string_to_sign) # Test 3: Region, bucket, and simple key @@ -671,7 +671,7 @@ def test_signer_vector_v4_build_bucket_arn(self) -> None: signing_time=datetime.datetime.fromtimestamp(1702743657, tz=datetime.timezone.utc) ) signer.sign(sign_ctx) - expected_uri_3 = f'/acs:ossvector:cn-hangzhou:{user_id}:bucket/key' + expected_uri_3 = f'/acs:ossvector:cn-hangzhou:{account_id}:bucket/key' self.assertIn(expected_uri_3, sign_ctx.string_to_sign) # Test 4: Region, bucket, and complex key that needs escaping @@ -687,7 +687,7 @@ def test_signer_vector_v4_build_bucket_arn(self) -> None: ) signer.sign(sign_ctx) # The key should be URL-encoded in the final URI - expected_uri_4 = f'/acs:ossvector:cn-hangzhou:{user_id}:bucket/{escaped_key}' + expected_uri_4 = f'/acs:ossvector:cn-hangzhou:{account_id}:bucket/{escaped_key}' self.assertIn(expected_uri_4, sign_ctx.string_to_sign) def test_signer_vector_v4_build_bucket_arn(self) -> None: @@ -696,8 +696,8 @@ def test_signer_vector_v4_build_bucket_arn(self) -> None: _calc_canonical_request. Corresponds to TestSignerVectorV4BuildBucketArn in Go. """ - user_id = "123" - signer = VectorsSignerV4(user_id) + account_id = "123" + signer = VectorsSignerV4(account_id) # Create a minimal, valid SigningContext for _calc_canonical_request # It doesn't need credentials or a full request for this specific test @@ -718,7 +718,7 @@ def mock_common_additional_headers(*args, **kwargs): sign_ctx.__dict__.update(base_sign_ctx.__dict__) # Merge base context sign_ctx.region = 'cn-hangzhou' canonical_request_output = signer._calc_canonical_request(sign_ctx, set()) - expected_uri_1 = f'/acs:ossvector:cn-hangzhou:{user_id}:' + expected_uri_1 = f'/acs:ossvector:cn-hangzhou:{account_id}:' # The canonical request format is METHOD\nURI\nQUERY\nHEADERS\nADDITIONAL_HEADERS\nPAYLOAD # So the URI should be the second line. lines = canonical_request_output.split('\n') @@ -730,7 +730,7 @@ def mock_common_additional_headers(*args, **kwargs): sign_ctx.region = 'cn-hangzhou' sign_ctx.bucket = 'bucket' canonical_request_output = signer._calc_canonical_request(sign_ctx, set()) - expected_uri_2 = f'/acs:ossvector:cn-hangzhou:{user_id}:bucket/' + expected_uri_2 = f'/acs:ossvector:cn-hangzhou:{account_id}:bucket/' lines = canonical_request_output.split('\n') self.assertEqual(lines[1], quote(expected_uri_2), "URI mismatch for region-bucket case") @@ -741,7 +741,7 @@ def mock_common_additional_headers(*args, **kwargs): sign_ctx.bucket = 'bucket' sign_ctx.key = 'key' canonical_request_output = signer._calc_canonical_request(sign_ctx, set()) - expected_uri_3 = f'/acs:ossvector:cn-hangzhou:{user_id}:bucket/key' + expected_uri_3 = f'/acs:ossvector:cn-hangzhou:{account_id}:bucket/key' lines = canonical_request_output.split('\n') self.assertEqual(lines[1], quote(expected_uri_3), "URI mismatch for region-bucket-key case") @@ -755,7 +755,7 @@ def mock_common_additional_headers(*args, **kwargs): sign_ctx.key = escaped_key canonical_request_output = signer._calc_canonical_request(sign_ctx, set()) # The key should be URL-encoded in the final URI by the quote() function inside _calc_canonical_request - expected_uri_4 = f'/acs:ossvector:cn-hangzhou:{user_id}:bucket/{escaped_key}' + expected_uri_4 = f'/acs:ossvector:cn-hangzhou:{account_id}:bucket/{escaped_key}' lines = canonical_request_output.split('\n') self.assertEqual(lines[1], quote(expected_uri_4), "URI mismatch for region-bucket-complex-key case") From 298336341466a5af48f3a6f0f6e00a274a29fec8 Mon Sep 17 00:00:00 2001 From: zhuxiaolong37 Date: Tue, 9 Sep 2025 16:45:45 +0800 Subject: [PATCH 3/9] Change the account ID signature rule and remove interfaces that are currently not supported --- alibabacloud_oss_v2/signer/vectors_v4.py | 8 +- alibabacloud_oss_v2/vectors/client.py | 69 ----- .../vectors/models/__init__.py | 3 - .../vectors/models/bucket_resource_group.py | 8 - .../vectors/models/bucket_tags.py | 11 - .../vectors/operations/__init__.py | 2 - .../operations/bucket_resource_group.py | 90 ------- .../vectors/operations/bucket_tags.py | 129 --------- sample/vector/vector_delete_bucket_tags.py | 36 --- .../vector_get_bucket_resource_group.py | 40 --- sample/vector/vector_get_bucket_tags.py | 41 --- .../vector_put_bucket_resource_group.py | 38 --- sample/vector/vector_put_bucket_tags.py | 49 ---- ...est_vector_bucket_resource_group_client.py | 50 ---- .../vector/test_vector_bucket_tags_client.py | 107 -------- tests/unit/signer/test_v4.py | 2 +- .../models/test_bucket_resource_group.py | 145 ---------- tests/unit/vectors/models/test_bucket_tags.py | 253 ------------------ 18 files changed, 6 insertions(+), 1075 deletions(-) delete mode 100644 alibabacloud_oss_v2/vectors/models/bucket_resource_group.py delete mode 100644 alibabacloud_oss_v2/vectors/models/bucket_tags.py delete mode 100644 alibabacloud_oss_v2/vectors/operations/bucket_resource_group.py delete mode 100644 alibabacloud_oss_v2/vectors/operations/bucket_tags.py delete mode 100644 sample/vector/vector_delete_bucket_tags.py delete mode 100644 sample/vector/vector_get_bucket_resource_group.py delete mode 100644 sample/vector/vector_get_bucket_tags.py delete mode 100644 sample/vector/vector_put_bucket_resource_group.py delete mode 100644 sample/vector/vector_put_bucket_tags.py delete mode 100644 tests/integration/vector/test_vector_bucket_resource_group_client.py delete mode 100644 tests/integration/vector/test_vector_bucket_tags_client.py delete mode 100644 tests/unit/vectors/models/test_bucket_resource_group.py delete mode 100644 tests/unit/vectors/models/test_bucket_tags.py diff --git a/alibabacloud_oss_v2/signer/vectors_v4.py b/alibabacloud_oss_v2/signer/vectors_v4.py index cd8c2a7..36d3121 100644 --- a/alibabacloud_oss_v2/signer/vectors_v4.py +++ b/alibabacloud_oss_v2/signer/vectors_v4.py @@ -238,11 +238,13 @@ def _calc_canonical_request(self, request = signing_ctx.request # canonical uri - uri = f'/acs:ossvector:{signing_ctx.region}:{self._account_id}:' + uri = f'/acs:ossvector:{signing_ctx.region}:' if signing_ctx.bucket is not None: - uri = uri + signing_ctx.bucket + '/' + uri += f'{self._account_id}:{signing_ctx.bucket}/' + else: + uri += ':' if signing_ctx.key is not None: - uri = uri + signing_ctx.key + uri += f'{signing_ctx.key}' canonical_uri = quote(uri, safe='/') # canonical query diff --git a/alibabacloud_oss_v2/vectors/client.py b/alibabacloud_oss_v2/vectors/client.py index 395e458..f999503 100644 --- a/alibabacloud_oss_v2/vectors/client.py +++ b/alibabacloud_oss_v2/vectors/client.py @@ -173,76 +173,7 @@ def delete_bucket_policy(self, request: models.DeleteBucketPolicyRequest, **kwar """ return operations.delete_bucket_policy(self._client, request, **kwargs) - # bucket tags - def put_bucket_tags(self, request: models.PutBucketTagsRequest, **kwargs - ) -> models.PutBucketTagsResult: - """ - Adds tags to or modifies the existing tags of a bucket. - - Args: - request (PutBucketTagsRequest): Request parameters for PutBucketTags operation. - - Returns: - PutBucketTagsResult: Response result for PutBucketTags operation. - """ - return operations.put_bucket_tags(self._client, request, **kwargs) - - - def get_bucket_tags(self, request: models.GetBucketTagsRequest, **kwargs - ) -> models.GetBucketTagsResult: - """ - Queries the tags of a bucket. - - Args: - request (GetBucketTagsRequest): Request parameters for GetBucketTags operation. - - Returns: - GetBucketTagsResult: Response result for GetBucketTags operation. - """ - return operations.get_bucket_tags(self._client, request, **kwargs) - - - def delete_bucket_tags(self, request: models.DeleteBucketTagsRequest, **kwargs - ) -> models.DeleteBucketTagsResult: - """ - Deletes tags configured for a bucket. - - Args: - request (DeleteBucketTagsRequest): Request parameters for DeleteBucketTags operation. - - Returns: - DeleteBucketTagsResult: Response result for DeleteBucketTags operation. - """ - return operations.delete_bucket_tags(self._client, request, **kwargs) - - - # bucket resource group - def put_bucket_resource_group(self, request: models.PutBucketResourceGroupRequest, **kwargs - ) -> models.PutBucketResourceGroupResult: - """ - Modifies the ID of the resource group to which a bucket belongs. - - Args: - request (PutBucketResourceGroupRequest): Request parameters for PutBucketResourceGroup operation. - Returns: - PutBucketResourceGroupResult: Response result for PutBucketResourceGroup operation. - """ - return operations.put_bucket_resource_group(self._client, request, **kwargs) - - def get_bucket_resource_group(self, request: models.GetBucketResourceGroupRequest, **kwargs - ) -> models.GetBucketResourceGroupResult: - """ - Queries the ID of the resource group to which a bucket belongs. - - Args: - request (GetBucketResourceGroupRequest): Request parameters for GetBucketResourceGroup operation. - - Returns: - GetBucketResourceGroupResult: Response result for GetBucketResourceGroup operation. - """ - return operations.get_bucket_resource_group(self._client, request, **kwargs) - # index def put_vector_index(self, request: models.PutVectorIndexRequest, **kwargs) -> models.PutVectorIndexResult: """ diff --git a/alibabacloud_oss_v2/vectors/models/__init__.py b/alibabacloud_oss_v2/vectors/models/__init__.py index 5a0f2ac..cb34a1e 100644 --- a/alibabacloud_oss_v2/vectors/models/__init__.py +++ b/alibabacloud_oss_v2/vectors/models/__init__.py @@ -2,9 +2,6 @@ from .bucket_basic import * from .bucket_policy import * -from .bucket_resource_group import * -#from .bucket_public_access_block import * -from .bucket_tags import * from .index_basic import * from .vector_basic import * from .bucket_logging import * diff --git a/alibabacloud_oss_v2/vectors/models/bucket_resource_group.py b/alibabacloud_oss_v2/vectors/models/bucket_resource_group.py deleted file mode 100644 index b28b621..0000000 --- a/alibabacloud_oss_v2/vectors/models/bucket_resource_group.py +++ /dev/null @@ -1,8 +0,0 @@ -import datetime -from typing import Optional, List, Any, Union - -# reference to oss.models -from ...models import BucketResourceGroupConfiguration -from ...models import PutBucketResourceGroupRequest, PutBucketResourceGroupResult -from ...models import GetBucketResourceGroupRequest, GetBucketResourceGroupResult - diff --git a/alibabacloud_oss_v2/vectors/models/bucket_tags.py b/alibabacloud_oss_v2/vectors/models/bucket_tags.py deleted file mode 100644 index d03f1a6..0000000 --- a/alibabacloud_oss_v2/vectors/models/bucket_tags.py +++ /dev/null @@ -1,11 +0,0 @@ -from typing import Optional, List, Any, Union -from ... import serde, BodyType - -# reference to oss.models -from ...models import Tagging -from ...models import TagSet -from ...models import Tag -from ...models import PutBucketTagsRequest, PutBucketTagsResult -from ...models import GetBucketTagsRequest, GetBucketTagsResult -from ...models import DeleteBucketTagsRequest, DeleteBucketTagsResult - diff --git a/alibabacloud_oss_v2/vectors/operations/__init__.py b/alibabacloud_oss_v2/vectors/operations/__init__.py index 0f9da20..367e7a5 100644 --- a/alibabacloud_oss_v2/vectors/operations/__init__.py +++ b/alibabacloud_oss_v2/vectors/operations/__init__.py @@ -1,7 +1,5 @@ from .bucket_basic import * from .bucket_policy import * -from .bucket_tags import * -from .bucket_resource_group import * from .index_basic import * from .vector_basic import * from .bucket_logging import * diff --git a/alibabacloud_oss_v2/vectors/operations/bucket_resource_group.py b/alibabacloud_oss_v2/vectors/operations/bucket_resource_group.py deleted file mode 100644 index 9f8a66e..0000000 --- a/alibabacloud_oss_v2/vectors/operations/bucket_resource_group.py +++ /dev/null @@ -1,90 +0,0 @@ -# pylint: disable=line-too-long -from ..._client import _SyncClientImpl -from ...types import OperationInput, CaseInsensitiveDict -from ... import serde -from ... import serde_utils -from .. import models - - -def put_bucket_resource_group(client: _SyncClientImpl, request: models.PutBucketResourceGroupRequest, **kwargs) -> models.PutBucketResourceGroupResult: - """ - put_bucket_resource_group synchronously - - Args: - client (_SyncClientImpl): A agent that sends the request. - request (PutBucketResourceGroupRequest): The request for the PutBucketResourceGroup operation. - - Returns: - PutBucketResourceGroupResult: The result for the PutBucketResourceGroup operation. - """ - - op_input = serde.serialize_input_json( - request=request, - op_input=OperationInput( - op_name='PutBucketResourceGroup', - method='PUT', - headers=CaseInsensitiveDict({ - 'Content-Type': 'application/json', - }), - parameters={ - 'resourceGroup': '', - }, - bucket=request.bucket, - op_metadata={'sub-resource': ['resourceGroup']}, - ), - custom_serializer=[ - serde_utils.add_content_md5 - ] - ) - - op_output = client.invoke_operation(op_input, **kwargs) - - return serde.deserialize_output( - result=models.PutBucketResourceGroupResult(), - op_output=op_output, - custom_deserializer=[ - serde.deserialize_output_jsonbody - ], - ) - - -def get_bucket_resource_group(client: _SyncClientImpl, request: models.GetBucketResourceGroupRequest, **kwargs) -> models.GetBucketResourceGroupResult: - """ - get_bucket_resource_group synchronously - - Args: - client (_SyncClientImpl): A agent that sends the request. - request (GetBucketResourceGroupRequest): The request for the GetBucketResourceGroup operation. - - Returns: - GetBucketResourceGroupResult: The result for the GetBucketResourceGroup operation. - """ - - op_input = serde.serialize_input_json( - request=request, - op_input=OperationInput( - op_name='GetBucketResourceGroup', - method='GET', - headers=CaseInsensitiveDict({ - 'Content-Type': 'application/json', - }), - parameters={ - 'resourceGroup': '', - }, - bucket=request.bucket, - op_metadata={'sub-resource': ['resourceGroup']}, - ), - custom_serializer=[ - serde_utils.add_content_md5 - ] - ) - - op_output = client.invoke_operation(op_input, **kwargs) - - return serde.deserialize_output( - result=models.GetBucketResourceGroupResult(), - op_output=op_output, - custom_deserializer=[ - serde.deserialize_output_jsonbody - ], - ) diff --git a/alibabacloud_oss_v2/vectors/operations/bucket_tags.py b/alibabacloud_oss_v2/vectors/operations/bucket_tags.py deleted file mode 100644 index d440ac0..0000000 --- a/alibabacloud_oss_v2/vectors/operations/bucket_tags.py +++ /dev/null @@ -1,129 +0,0 @@ -# pylint: disable=line-too-long -from ..._client import _SyncClientImpl -from ...types import OperationInput, CaseInsensitiveDict -from ... import serde -from ... import serde_utils -from .. import models - -def put_bucket_tags(client: _SyncClientImpl, request: models.PutBucketTagsRequest, **kwargs) -> models.PutBucketTagsResult: - """ - put_bucket_tags synchronously - - Args: - client (_SyncClientImpl): A agent that sends the request. - request (PutBucketTagsRequest): The request for the PutBucketTags operation. - - Returns: - PutBucketTagsResult: The result for the PutBucketTags operation. - """ - - op_input = serde.serialize_input_json( - request=request, - op_input=OperationInput( - op_name='PutBucketTags', - method='PUT', - headers=CaseInsensitiveDict({ - 'Content-Type': 'application/json', - }), - parameters={ - 'tagging': '', - }, - bucket=request.bucket, - op_metadata={'sub-resource': ['tagging']}, - ), - custom_serializer=[ - serde_utils.add_content_md5 - ] - ) - - op_output = client.invoke_operation(op_input, **kwargs) - - return serde.deserialize_output( - result=models.PutBucketTagsResult(), - op_output=op_output, - custom_deserializer=[ - serde.deserialize_output_jsonbody - ], - ) - -def get_bucket_tags(client: _SyncClientImpl, request: models.GetBucketTagsRequest, **kwargs) -> models.GetBucketTagsResult: - """ - get_bucket_tags synchronously - - Args: - client (_SyncClientImpl): A agent that sends the request. - request (GetBucketTagsRequest): The request for the GetBucketTags operation. - - Returns: - GetBucketTagsResult: The result for the GetBucketTags operation. - """ - - op_input = serde.serialize_input_json( - request=request, - op_input=OperationInput( - op_name='GetBucketTags', - method='GET', - headers=CaseInsensitiveDict({ - 'Content-Type': 'application/json', - }), - parameters={ - 'tagging': '', - }, - bucket=request.bucket, - op_metadata={'sub-resource': ['tagging']}, - ), - custom_serializer=[ - serde_utils.add_content_md5 - ] - ) - - op_output = client.invoke_operation(op_input, **kwargs) - - return serde.deserialize_output( - result=models.GetBucketTagsResult(), - op_output=op_output, - custom_deserializer=[ - serde.deserialize_output_jsonbody - ], - ) - -def delete_bucket_tags(client: _SyncClientImpl, request: models.DeleteBucketTagsRequest, **kwargs) -> models.DeleteBucketTagsResult: - """ - delete_bucket_tags synchronously - - Args: - client (_SyncClientImpl): A agent that sends the request. - request (DeleteBucketTagsRequest): The request for the DeleteBucketTags operation. - - Returns: - DeleteBucketTagsResult: The result for the DeleteBucketTags operation. - """ - - op_input = serde.serialize_input_json( - request=request, - op_input=OperationInput( - op_name='DeleteBucketTags', - method='DELETE', - headers=CaseInsensitiveDict({ - 'Content-Type': 'application/json', - }), - parameters={ - 'tagging': '', - }, - bucket=request.bucket, - op_metadata={'sub-resource': ['tagging']}, - ), - custom_serializer=[ - serde_utils.add_content_md5 - ] - ) - - op_output = client.invoke_operation(op_input, **kwargs) - - return serde.deserialize_output( - result=models.DeleteBucketTagsResult(), - op_output=op_output, - custom_deserializer=[ - serde.deserialize_output_jsonbody - ], - ) diff --git a/sample/vector/vector_delete_bucket_tags.py b/sample/vector/vector_delete_bucket_tags.py deleted file mode 100644 index 0bba50f..0000000 --- a/sample/vector/vector_delete_bucket_tags.py +++ /dev/null @@ -1,36 +0,0 @@ -import argparse -import alibabacloud_oss_v2 as oss -import alibabacloud_oss_v2.vectors as oss_vectors - -parser = argparse.ArgumentParser(description="vector delete bucket tags sample") -parser.add_argument('--region', help='The region in which the bucket is located.', required=True) -parser.add_argument('--bucket', help='The name of the bucket.', required=True) -parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--account_id', help='The account id.', required=True) - -def main(): - args = parser.parse_args() - - # Loading credentials values from the environment variables - credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider() - - # Using the SDK's default configuration - cfg = oss.config.load_default() - cfg.credentials_provider = credentials_provider - cfg.region = args.region - cfg.account_id = args.account_id - if args.endpoint is not None: - cfg.endpoint = args.endpoint - - vector_client = oss_vectors.Client(cfg) - - result = vector_client.delete_bucket_tags(oss_vectors.models.DeleteBucketTagsRequest( - bucket=args.bucket, - )) - - print(f'status code: {result.status_code},' - f' request id: {result.request_id},' - ) - -if __name__ == "__main__": - main() diff --git a/sample/vector/vector_get_bucket_resource_group.py b/sample/vector/vector_get_bucket_resource_group.py deleted file mode 100644 index 6cdcd92..0000000 --- a/sample/vector/vector_get_bucket_resource_group.py +++ /dev/null @@ -1,40 +0,0 @@ -import argparse -import alibabacloud_oss_v2 as oss -import alibabacloud_oss_v2.vectors as oss_vectors - -parser = argparse.ArgumentParser(description="vector get bucket resource group sample") -parser.add_argument('--region', help='The region in which the bucket is located.', required=True) -parser.add_argument('--bucket', help='The name of the bucket.', required=True) -parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--account_id', help='The account id.', required=True) - -def main(): - args = parser.parse_args() - - # Loading credentials values from the environment variables - credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider() - - # Using the SDK's default configuration - cfg = oss.config.load_default() - cfg.credentials_provider = credentials_provider - cfg.region = args.region - cfg.account_id = args.account_id - if args.endpoint is not None: - cfg.endpoint = args.endpoint - - vector_client = oss_vectors.Client(cfg) - - result = vector_client.get_bucket_resource_group(oss_vectors.models.GetBucketResourceGroupRequest( - bucket=args.bucket, - )) - - print(f'status code: {result.status_code},' - f' request id: {result.request_id},' - ) - - if result.bucket_resource_group_configuration.resource_group_id: - print(f'resource group id: {result.bucket_resource_group_configuration.resource_group_id}') - - -if __name__ == "__main__": - main() diff --git a/sample/vector/vector_get_bucket_tags.py b/sample/vector/vector_get_bucket_tags.py deleted file mode 100644 index eda3b69..0000000 --- a/sample/vector/vector_get_bucket_tags.py +++ /dev/null @@ -1,41 +0,0 @@ -import argparse -import alibabacloud_oss_v2 as oss -import alibabacloud_oss_v2.vectors as oss_vectors - -parser = argparse.ArgumentParser(description="vector get bucket tags sample") -parser.add_argument('--region', help='The region in which the bucket is located.', required=True) -parser.add_argument('--bucket', help='The name of the bucket.', required=True) -parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--account_id', help='The account id.', required=True) - -def main(): - args = parser.parse_args() - - # Loading credentials values from the environment variables - credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider() - - # Using the SDK's default configuration - cfg = oss.config.load_default() - cfg.credentials_provider = credentials_provider - cfg.region = args.region - cfg.account_id = args.account_id - if args.endpoint is not None: - cfg.endpoint = args.endpoint - - vector_client = oss_vectors.Client(cfg) - - result = vector_client.get_bucket_tags(oss_vectors.models.GetBucketTagsRequest( - bucket=args.bucket, - )) - - print(f'status code: {result.status_code},' - f' request id: {result.request_id},' - f' tagging: {result.tagging},' - ) - - if result.tagging.tag_set.tags: - for r in result.tagging.tag_set.tags: - print(f'result: key: {r.key}, value: {r.value}') - -if __name__ == "__main__": - main() diff --git a/sample/vector/vector_put_bucket_resource_group.py b/sample/vector/vector_put_bucket_resource_group.py deleted file mode 100644 index 7268aa7..0000000 --- a/sample/vector/vector_put_bucket_resource_group.py +++ /dev/null @@ -1,38 +0,0 @@ -import argparse -import alibabacloud_oss_v2 as oss -import alibabacloud_oss_v2.vectors as oss_vectors - -parser = argparse.ArgumentParser(description="vector put bucket resource group sample") -parser.add_argument('--region', help='The region in which the bucket is located.', required=True) -parser.add_argument('--bucket', help='The name of the bucket.', required=True) -parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--resource_group_id', help='The ID of the resource group.', required=True) -parser.add_argument('--account_id', help='The account id.', required=True) - -def main(): - args = parser.parse_args() - - # Loading credentials values from the environment variables - credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider() - - # Using the SDK's default configuration - cfg = oss.config.load_default() - cfg.credentials_provider = credentials_provider - cfg.region = args.region - cfg.account_id = args.account_id - if args.endpoint is not None: - cfg.endpoint = args.endpoint - - vector_client = oss_vectors.Client(cfg) - - result = vector_client.put_bucket_resource_group(oss_vectors.models.PutBucketResourceGroupRequest( - bucket=args.bucket, - resource_group_id=args.resource_group_id, - )) - - print(f'status code: {result.status_code},' - f' request id: {result.request_id},' - ) - -if __name__ == "__main__": - main() diff --git a/sample/vector/vector_put_bucket_tags.py b/sample/vector/vector_put_bucket_tags.py deleted file mode 100644 index dd96632..0000000 --- a/sample/vector/vector_put_bucket_tags.py +++ /dev/null @@ -1,49 +0,0 @@ -import argparse -import alibabacloud_oss_v2 as oss -import alibabacloud_oss_v2.vectors as oss_vectors - -parser = argparse.ArgumentParser(description="vector put bucket tags sample") -parser.add_argument('--region', help='The region in which the bucket is located.', required=True) -parser.add_argument('--bucket', help='The name of the bucket.', required=True) -parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') -parser.add_argument('--account_id', help='The account id.', required=True) - -def main(): - - args = parser.parse_args() - - # Loading credentials values from the environment variables - credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider() - - # Using the SDK's default configuration - cfg = oss.config.load_default() - cfg.credentials_provider = credentials_provider - cfg.region = args.region - cfg.account_id = args.account_id - if args.endpoint is not None: - cfg.endpoint = args.endpoint - - vector_client = oss_vectors.Client(cfg) - - result = vector_client.put_bucket_tags(oss_vectors.models.PutBucketTagsRequest( - bucket=args.bucket, - tagging=oss_vectors.models.Tagging( - tag_set=oss_vectors.models.TagSet( - tags=[oss_vectors.models.Tag( - key='test_key', - value='test_value', - ), oss_vectors.models.Tag( - key='test_key2', - value='test_value2', - )], - ), - ), - )) - - print(f'status code: {result.status_code},' - f' request id: {result.request_id},' - ) - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/tests/integration/vector/test_vector_bucket_resource_group_client.py b/tests/integration/vector/test_vector_bucket_resource_group_client.py deleted file mode 100644 index c081f48..0000000 --- a/tests/integration/vector/test_vector_bucket_resource_group_client.py +++ /dev/null @@ -1,50 +0,0 @@ -# pylint: skip-file - -import alibabacloud_oss_v2.models as oss -import alibabacloud_oss_v2.vectors as oss_vectors -from tests.integration import TestIntegrationVectors, random_bucket_name - - -class TestVectorBucketResourceGroup(TestIntegrationVectors): - - def test_vector_bucket_resource_group(self): - # create bucket - bucket_name = random_bucket_name() - result = self.vector_client.put_vector_bucket(oss_vectors.models.PutVectorBucketRequest( - bucket=bucket_name, - )) - self.assertEqual(200, result.status_code) - self.assertEqual('OK', result.status) - self.assertEqual(24, len(result.request_id)) - self.assertEqual(24, len(result.headers.get('x-oss-request-id'))) - - # put bucket resource group - resource_group_id = 'rg-acfmy7mo47b3ad5****' - result = self.vector_client.put_bucket_resource_group(oss_vectors.models.PutBucketResourceGroupRequest( - bucket=bucket_name, - bucket_resource_group_configuration=oss_vectors.models.BucketResourceGroupConfiguration( - resource_group_id=resource_group_id, - ), - )) - self.assertEqual(200, result.status_code) - self.assertEqual('OK', result.status) - self.assertEqual(24, len(result.request_id)) - self.assertEqual(24, len(result.headers.get('x-oss-request-id'))) - - # get bucket resource group - result = self.vector_client.get_bucket_resource_group(oss_vectors.models.GetBucketResourceGroupRequest( - bucket=bucket_name, - )) - self.assertEqual(200, result.status_code) - self.assertEqual('OK', result.status) - self.assertEqual(24, len(result.request_id)) - self.assertEqual(24, len(result.headers.get('x-oss-request-id'))) - self.assertEqual(resource_group_id, result.bucket_resource_group_configuration.resource_group_id) - - # delete bucket (cleanup) - result = self.vector_client.delete_vector_bucket(oss_vectors.models.DeleteVectorBucketRequest( - bucket=bucket_name, - )) - self.assertEqual(204, result.status_code) - self.assertEqual(24, len(result.request_id)) - self.assertEqual(24, len(result.headers.get('x-oss-request-id'))) diff --git a/tests/integration/vector/test_vector_bucket_tags_client.py b/tests/integration/vector/test_vector_bucket_tags_client.py deleted file mode 100644 index e3ec09b..0000000 --- a/tests/integration/vector/test_vector_bucket_tags_client.py +++ /dev/null @@ -1,107 +0,0 @@ -# pylint: skip-file - -import alibabacloud_oss_v2.vectors as oss_vectors -from tests.integration import TestIntegrationVectors, random_bucket_name - - -class TestVectorBucketTags(TestIntegrationVectors): - """Integration tests for Vector Bucket Tags operations.""" - - def test_vector_bucket_tags(self): - """Test put, get, and delete bucket tags operations.""" - # 1. Create bucket - bucket_name = random_bucket_name() - result = self.vector_client.put_vector_bucket( - oss_vectors.models.PutVectorBucketRequest( - bucket=bucket_name, - ) - ) - self.assertEqual(200, result.status_code) - self.assertEqual('OK', result.status) - self.assertEqual(24, len(result.request_id)) - self.assertEqual(24, len(result.headers.get('x-oss-request-id'))) - - # 2. Put bucket tags - tag1 = oss_vectors.models.Tag( - key='key1', - value='value1' - ) - tag2 = oss_vectors.models.Tag( - key='key2', - value='value2' - ) - tags = [tag1, tag2] - - put_result = self.vector_client.put_bucket_tags( - oss_vectors.models.PutBucketTagsRequest( - bucket=bucket_name, - tagging=oss_vectors.models.Tagging( - tag_set=oss_vectors.models.TagSet( - tags=tags - ) - ) - ) - ) - self.assertEqual(200, put_result.status_code) - self.assertEqual('OK', put_result.status) - self.assertEqual(24, len(put_result.request_id)) - self.assertEqual(24, len(put_result.headers.get('x-oss-request-id'))) - - # 3. Get bucket tags - get_result = self.vector_client.get_bucket_tags( - oss_vectors.models.GetBucketTagsRequest( - bucket=bucket_name - ) - ) - self.assertEqual(200, get_result.status_code) - self.assertEqual('OK', get_result.status) - self.assertEqual(24, len(get_result.request_id)) - self.assertEqual(24, len(get_result.headers.get('x-oss-request-id'))) - # Verify the tags retrieved match the ones set - self.assertIsNotNone(get_result.tagging) - self.assertIsNotNone(get_result.tagging.tag_set) - self.assertEqual(2, len(get_result.tagging.tag_set.tags)) - # Check if tags are present (order might not be guaranteed) - returned_tags = {(tag.key, tag.value) for tag in get_result.tagging.tag_set.tags} - expected_tags = {('key1', 'value1'), ('key2', 'value2')} - self.assertEqual(expected_tags, returned_tags) - - # 4. Delete bucket tags - delete_result = self.vector_client.delete_bucket_tags( - oss_vectors.models.DeleteBucketTagsRequest( - bucket=bucket_name - ) - ) - self.assertEqual(204, delete_result.status_code) # Delete typically returns 204 No Content - self.assertEqual(24, len(delete_result.request_id)) - self.assertEqual(24, len(delete_result.headers.get('x-oss-request-id'))) - - # 5. Verify tags are deleted by attempting to get them again - get_result_after_delete = self.vector_client.get_bucket_tags( - oss_vectors.models.GetBucketTagsRequest( - bucket=bucket_name - ) - ) - # According to OSS API, getting tags on a bucket with no tags might return 200 with empty TagSet - # or potentially 404 depending on implementation details. Check for empty TagSet here. - self.assertEqual(200, get_result_after_delete.status_code) - self.assertEqual('OK', get_result_after_delete.status) - self.assertEqual(24, len(get_result_after_delete.request_id)) - self.assertEqual(24, len(get_result_after_delete.headers.get('x-oss-request-id'))) - # Verify the tag set is now empty or None - # The exact behavior depends on the service, but typically TagSet would be present but empty. - self.assertIsNotNone(get_result_after_delete.tagging) - self.assertIsNotNone(get_result_after_delete.tagging.tag_set) - self.assertEqual(0, len(get_result_after_delete.tagging.tag_set.tags)) - - - # 6. Delete bucket (cleanup) - delete_bucket_result = self.vector_client.delete_vector_bucket( - oss_vectors.models.DeleteVectorBucketRequest( - bucket=bucket_name, - ) - ) - self.assertEqual(204, delete_bucket_result.status_code) - self.assertEqual(24, len(delete_bucket_result.request_id)) - self.assertEqual(24, len(delete_bucket_result.headers.get('x-oss-request-id'))) - diff --git a/tests/unit/signer/test_v4.py b/tests/unit/signer/test_v4.py index 632a337..a19c488 100644 --- a/tests/unit/signer/test_v4.py +++ b/tests/unit/signer/test_v4.py @@ -718,7 +718,7 @@ def mock_common_additional_headers(*args, **kwargs): sign_ctx.__dict__.update(base_sign_ctx.__dict__) # Merge base context sign_ctx.region = 'cn-hangzhou' canonical_request_output = signer._calc_canonical_request(sign_ctx, set()) - expected_uri_1 = f'/acs:ossvector:cn-hangzhou:{account_id}:' + expected_uri_1 = f'/acs:ossvector:cn-hangzhou::' # The canonical request format is METHOD\nURI\nQUERY\nHEADERS\nADDITIONAL_HEADERS\nPAYLOAD # So the URI should be the second line. lines = canonical_request_output.split('\n') diff --git a/tests/unit/vectors/models/test_bucket_resource_group.py b/tests/unit/vectors/models/test_bucket_resource_group.py deleted file mode 100644 index 533b8a1..0000000 --- a/tests/unit/vectors/models/test_bucket_resource_group.py +++ /dev/null @@ -1,145 +0,0 @@ -# pylint: skip-file - -import unittest -from alibabacloud_oss_v2 import serde -from alibabacloud_oss_v2.vectors.models import bucket_resource_group as model -from alibabacloud_oss_v2.types import OperationInput, OperationOutput, CaseInsensitiveDict, HttpResponse -from ... import MockHttpResponse - - -class TestPutVectorBucketResourceGroup(unittest.TestCase): - def test_constructor_request(self): - request = model.PutBucketResourceGroupRequest( - ) - self.assertIsNone(request.bucket) - self.assertIsNone(request.bucket_resource_group_configuration) - self.assertFalse(hasattr(request, 'headers')) - self.assertFalse(hasattr(request, 'parameters')) - self.assertFalse(hasattr(request, 'payload')) - self.assertIsInstance(request, serde.RequestModel) - - request = model.PutBucketResourceGroupRequest( - bucket='bucketexampletest', - bucket_resource_group_configuration=model.BucketResourceGroupConfiguration( - resource_group_id='rg-acfmy7mo47b3ad5****', - ), - ) - self.assertEqual('bucketexampletest', request.bucket) - self.assertEqual('rg-acfmy7mo47b3ad5****', request.bucket_resource_group_configuration.resource_group_id) - - def test_serialize_request(self): - request = model.PutBucketResourceGroupRequest( - bucket='bucketexampletest', - bucket_resource_group_configuration=model.BucketResourceGroupConfiguration( - resource_group_id='rg-aekz****', - ), - ) - - json_str = '{"BucketResourceGroupConfiguration": {"ResourceGroupId": "rg-aekz****"}}' - - op_input = serde.serialize_input_json(request, OperationInput( - op_name='PutBucketResourceGroup', - method='PUT', - bucket=request.bucket, - )) - self.assertEqual('PutBucketResourceGroup', op_input.op_name) - self.assertEqual('PUT', op_input.method) - self.assertEqual('bucketexampletest', op_input.bucket) - self.assertEqual(json_str, op_input.body.decode()) - - def test_constructor_result(self): - result = model.PutBucketResourceGroupResult() - self.assertIsInstance(result, serde.ResultModel) - - def test_deserialize_result(self): - json_data = None - result = model.PutBucketResourceGroupResult() - serde.deserialize_output( - result, - OperationOutput( - status='OK', - status_code=200, - headers=CaseInsensitiveDict({ - 'x-oss-request-id': '123', - 'x-oss-hash-crc64ecma': '316181249502703****', - 'x-oss-version-id': 'CAEQNhiBgMDJgZCA0BYiIDc4MGZjZGI2OTBjOTRmNTE5NmU5NmFhZjhjYmY0****', - }), - http_response=MockHttpResponse( - status_code=200, - reason='OK', - headers={'x-oss-request-id': 'id-1234'}, - body=json_data, - ) - ) - ) - self.assertEqual('OK', result.status) - self.assertEqual(200, result.status_code) - self.assertEqual('123', result.request_id) - self.assertEqual('316181249502703****', result.headers.get('x-oss-hash-crc64ecma')) - self.assertEqual('CAEQNhiBgMDJgZCA0BYiIDc4MGZjZGI2OTBjOTRmNTE5NmU5NmFhZjhjYmY0****', result.headers.get('x-oss-version-id')) - - -class TestGetVectorBucketResourceGroup(unittest.TestCase): - def test_constructor_request(self): - request = model.GetBucketResourceGroupRequest( - ) - self.assertIsNone(request.bucket) - self.assertFalse(hasattr(request, 'headers')) - self.assertFalse(hasattr(request, 'parameters')) - self.assertFalse(hasattr(request, 'payload')) - self.assertIsInstance(request, serde.RequestModel) - - request = model.GetBucketResourceGroupRequest( - bucket='bucketexampletest', - ) - self.assertEqual('bucketexampletest', request.bucket) - - def test_serialize_request(self): - request = model.GetBucketResourceGroupRequest( - bucket='bucketexampletest', - ) - - op_input = serde.serialize_input(request, OperationInput( - op_name='GetBucketResourceGroup', - method='GET', - bucket=request.bucket, - )) - self.assertEqual('GetBucketResourceGroup', op_input.op_name) - self.assertEqual('GET', op_input.method) - self.assertEqual('bucketexampletest', op_input.bucket) - - def test_constructor_result(self): - result = model.GetBucketResourceGroupResult() - self.assertIsNone(result.bucket_resource_group_configuration) - self.assertIsInstance(result, serde.Model) - - result = model.GetBucketResourceGroupResult( - bucket_resource_group_configuration=model.BucketResourceGroupConfiguration( - resource_group_id='rg-acfmy7mo47b3ad5****', - ), - ) - self.assertEqual('rg-acfmy7mo47b3ad5****', result.bucket_resource_group_configuration.resource_group_id) - - def test_deserialize_result(self): - json_data = r''' - { - "BucketResourceGroupConfiguration": { - "ResourceGroupId": "rg-acfmy7mo47b3ad5****" - } - }''' - - result = model.GetBucketResourceGroupResult() - op_output = OperationOutput( - status='OK', - status_code=200, - http_response=MockHttpResponse( - body=json_data, - ) - ) - - deserializer = [serde.deserialize_output_jsonbody] - serde.deserialize_output(result, op_output, custom_deserializer=deserializer) - self.assertEqual('OK', result.status) - self.assertEqual('rg-acfmy7mo47b3ad5****', result.bucket_resource_group_configuration.resource_group_id) - - diff --git a/tests/unit/vectors/models/test_bucket_tags.py b/tests/unit/vectors/models/test_bucket_tags.py deleted file mode 100644 index fa9375f..0000000 --- a/tests/unit/vectors/models/test_bucket_tags.py +++ /dev/null @@ -1,253 +0,0 @@ -# pylint: skip-file - -import unittest -from alibabacloud_oss_v2 import serde -from alibabacloud_oss_v2.vectors.models import bucket_tags as model -from alibabacloud_oss_v2.types import OperationInput, OperationOutput, CaseInsensitiveDict, HttpResponse -from ... import MockHttpResponse - - -class TestPutVectorBucketTags(unittest.TestCase): - def test_constructor_request(self): - request = model.PutBucketTagsRequest( - ) - self.assertIsNone(request.bucket) - self.assertIsNone(request.tagging) - self.assertFalse(hasattr(request, 'headers')) - self.assertFalse(hasattr(request, 'parameters')) - self.assertFalse(hasattr(request, 'payload')) - self.assertIsInstance(request, serde.RequestModel) - - request = model.PutBucketTagsRequest( - bucket='bucketexampletest', - tagging=model.Tagging( - tag_set=model.TagSet( - tags=[model.Tag( - key='test_key', - value='test_value', - ), model.Tag( - key='test_key', - value='test_value', - )], - ), - ), - ) - self.assertEqual('bucketexampletest', request.bucket) - self.assertEqual('test_key', request.tagging.tag_set.tags[0].key) - self.assertEqual('test_value', request.tagging.tag_set.tags[0].value) - self.assertEqual('test_key', request.tagging.tag_set.tags[1].key) - self.assertEqual('test_value', request.tagging.tag_set.tags[1].value) - - def test_serialize_request(self): - request = model.PutBucketTagsRequest( - bucket='bucketexampletest', - tagging=model.Tagging( - tag_set=model.TagSet( - tags=[model.Tag( - key='Key1', - value='value1', - ), model.Tag( - key='Key2', - value='value2', - )], - ), - ), - ) - json_str = '{"Tagging": {"TagSet": {"Tag": [{"Key": "Key1", "Value": "value1"}, {"Key": "Key2", "Value": "value2"}]}}}' - - op_input = serde.serialize_input_json(request, OperationInput( - op_name='PutBucketTags', - method='PUT', - bucket=request.bucket, - )) - self.assertEqual('PutBucketTags', op_input.op_name) - self.assertEqual('PUT', op_input.method) - self.assertEqual('bucketexampletest', op_input.bucket) - self.assertEqual(json_str, op_input.body.decode()) - - def test_constructor_result(self): - result = model.PutBucketTagsResult() - self.assertIsInstance(result, serde.ResultModel) - - def test_deserialize_result(self): - json_data = None - result = model.PutBucketTagsResult() - serde.deserialize_output( - result, - OperationOutput( - status='OK', - status_code=200, - headers=CaseInsensitiveDict({ - 'x-oss-request-id': '123', - 'x-oss-hash-crc64ecma': '316181249502703****', - 'x-oss-version-id': 'CAEQNhiBgMDJgZCA0BYiIDc4MGZjZGI2OTBjOTRmNTE5NmU5NmFhZjhjYmY0****', - }), - http_response=MockHttpResponse( - status_code=200, - reason='OK', - headers={'x-oss-request-id': 'id-1234'}, - body=json_data, - ) - ) - ) - self.assertEqual('OK', result.status) - self.assertEqual(200, result.status_code) - self.assertEqual('123', result.request_id) - self.assertEqual('316181249502703****', result.headers.get('x-oss-hash-crc64ecma')) - self.assertEqual('CAEQNhiBgMDJgZCA0BYiIDc4MGZjZGI2OTBjOTRmNTE5NmU5NmFhZjhjYmY0****', result.headers.get('x-oss-version-id')) - - -class TestGetVectorBucketTags(unittest.TestCase): - def test_constructor_request(self): - request = model.GetBucketTagsRequest( - ) - self.assertIsNone(request.bucket) - self.assertFalse(hasattr(request, 'headers')) - self.assertFalse(hasattr(request, 'parameters')) - self.assertFalse(hasattr(request, 'payload')) - self.assertIsInstance(request, serde.RequestModel) - - request = model.GetBucketTagsRequest( - bucket='bucketexampletest', - ) - self.assertEqual('bucketexampletest', request.bucket) - - def test_serialize_request(self): - request = model.GetBucketTagsRequest( - bucket='bucketexampletest', - ) - - op_input = serde.serialize_input_json(request, OperationInput( - op_name='GetBucketTags', - method='GET', - bucket=request.bucket, - )) - self.assertEqual('GetBucketTags', op_input.op_name) - self.assertEqual('GET', op_input.method) - self.assertEqual('bucketexampletest', op_input.bucket) - - def test_constructor_result(self): - result = model.GetBucketTagsResult() - self.assertIsNone(result.tagging) - self.assertIsInstance(result, serde.Model) - - result = model.GetBucketTagsResult( - tagging=model.Tagging( - tag_set=model.TagSet( - tags=[model.Tag( - key='testa', - value='test_value', - ), model.Tag( - key='testb', - value='test2_value', - )], - ), - ), - ) - self.assertEqual('testa', result.tagging.tag_set.tags[0].key) - self.assertEqual('test_value', result.tagging.tag_set.tags[0].value) - self.assertEqual('testb', result.tagging.tag_set.tags[1].key) - self.assertEqual('test2_value', result.tagging.tag_set.tags[1].value) - - def test_deserialize_result(self): - - json_data = r''' - { - "Tagging": { - } - }''' - result = model.GetBucketTagsResult() - serde.deserialize_json(json_data=json_data, obj=result) - - json_data = r''' - { - "Tagging" : { - "TagSet": { - "Tag" : [ - {"key": "Key1", "value": "value1"}, - {"key": "Key2", "value": "value2"} - ] - } - } - } - ''' - - op_output = OperationOutput( - status='OK', - status_code=200, - http_response=MockHttpResponse( - body=json_data, - ) - ) - - deserializer = [serde.deserialize_output_jsonbody] - serde.deserialize_output(result, op_output, custom_deserializer=deserializer) - self.assertEqual('OK', result.status) - self.assertEqual('Key1', result.tagging.tag_set.tags[0].key) - self.assertEqual('value1', result.tagging.tag_set.tags[0].value) - self.assertEqual('Key2', result.tagging.tag_set.tags[1].key) - self.assertEqual('value2', result.tagging.tag_set.tags[1].value) - - - - -class TestDeleteVectorBucketTags(unittest.TestCase): - def test_constructor_request(self): - request = model.DeleteBucketTagsRequest( - ) - self.assertIsNone(request.bucket) - self.assertFalse(hasattr(request, 'headers')) - self.assertFalse(hasattr(request, 'parameters')) - self.assertFalse(hasattr(request, 'payload')) - self.assertIsInstance(request, serde.RequestModel) - - request = model.DeleteBucketTagsRequest( - bucket='bucketexampletest', - ) - self.assertEqual('bucketexampletest', request.bucket) - - def test_serialize_request(self): - request = model.DeleteBucketTagsRequest( - bucket='bucketexampletest', - ) - - op_input = serde.serialize_input_json(request, OperationInput( - op_name='DeleteBucketTags', - method='DELETE', - bucket=request.bucket, - )) - self.assertEqual('DeleteBucketTags', op_input.op_name) - self.assertEqual('DELETE', op_input.method) - self.assertEqual('bucketexampletest', op_input.bucket) - - def test_constructor_result(self): - result = model.DeleteBucketTagsResult() - self.assertIsInstance(result, serde.ResultModel) - - def test_deserialize_result(self): - json_data = None - result = model.DeleteBucketTagsResult() - serde.deserialize_output( - result, - OperationOutput( - status='OK', - status_code=200, - headers=CaseInsensitiveDict({ - 'x-oss-request-id': '123', - 'x-oss-hash-crc64ecma': '316181249502703****', - 'x-oss-version-id': 'CAEQNhiBgMDJgZCA0BYiIDc4MGZjZGI2OTBjOTRmNTE5NmU5NmFhZjhjYmY0****', - }), - http_response=MockHttpResponse( - status_code=200, - reason='OK', - headers={'x-oss-request-id': 'id-1234'}, - body=json_data, - ) - ) - ) - self.assertEqual('OK', result.status) - self.assertEqual(200, result.status_code) - self.assertEqual('123', result.request_id) - self.assertEqual('316181249502703****', result.headers.get('x-oss-hash-crc64ecma')) - self.assertEqual('CAEQNhiBgMDJgZCA0BYiIDc4MGZjZGI2OTBjOTRmNTE5NmU5NmFhZjhjYmY0****', result.headers.get('x-oss-version-id')) - From 3956ee90f762e754f3318125a1962f8fc37ef1ae Mon Sep 17 00:00:00 2001 From: zhuxiaolong37 Date: Tue, 9 Sep 2025 17:08:52 +0800 Subject: [PATCH 4/9] Change Vector v4 Signature Rules --- alibabacloud_oss_v2/signer/vectors_v4.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alibabacloud_oss_v2/signer/vectors_v4.py b/alibabacloud_oss_v2/signer/vectors_v4.py index 36d3121..89484fe 100644 --- a/alibabacloud_oss_v2/signer/vectors_v4.py +++ b/alibabacloud_oss_v2/signer/vectors_v4.py @@ -242,7 +242,7 @@ def _calc_canonical_request(self, if signing_ctx.bucket is not None: uri += f'{self._account_id}:{signing_ctx.bucket}/' else: - uri += ':' + uri += ':/' if signing_ctx.key is not None: uri += f'{signing_ctx.key}' canonical_uri = quote(uri, safe='/') From d03c636476c10f1a59019295e2dd6313ecc9c0d9 Mon Sep 17 00:00:00 2001 From: zhuxiaolong37 Date: Thu, 11 Sep 2025 17:17:21 +0800 Subject: [PATCH 5/9] Optimize comments and sample files --- alibabacloud_oss_v2/vectors/models/index_basic.py | 4 ++-- alibabacloud_oss_v2/vectors/paginator.py | 4 ++-- sample/vector/vector_put_bucket_logging.py | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/alibabacloud_oss_v2/vectors/models/index_basic.py b/alibabacloud_oss_v2/vectors/models/index_basic.py index affbb1a..9833aae 100644 --- a/alibabacloud_oss_v2/vectors/models/index_basic.py +++ b/alibabacloud_oss_v2/vectors/models/index_basic.py @@ -112,7 +112,7 @@ def __init__( # List class ListVectorIndexesRequest(serde.RequestModel): """ - The request for the ListVectorsIndexes operation. + The request for the ListVectorIndexes operation. """ _attribute_map = { @@ -146,7 +146,7 @@ def __init__( class ListVectorIndexesResult(serde.ResultModel): """ - The result for the ListVectorsIndexes operation. + The result for the ListVectorIndexes operation. """ _attribute_map = { diff --git a/alibabacloud_oss_v2/vectors/paginator.py b/alibabacloud_oss_v2/vectors/paginator.py index 2dbe215..bd0ca25 100644 --- a/alibabacloud_oss_v2/vectors/paginator.py +++ b/alibabacloud_oss_v2/vectors/paginator.py @@ -89,7 +89,7 @@ def iter_page(self, request: models.ListVectorIndexesRequest, **kwargs: Any) -> limit (int, optional): The maximum number of items in the response. Yields: - Iterator[models.ListVectorsIndexResult]: An iterator of ListVectorsIndexResult from the response + Iterator[models.ListVectorIndexesResult]: An iterator of ListVectorIndexes from the response """ limit = kwargs.get('limit', self._limit) req = copy.copy(request) @@ -109,7 +109,7 @@ def iter_page(self, request: models.ListVectorIndexesRequest, **kwargs: Any) -> is_truncated = bool(next_token) def __repr__(self) -> str: - return "" + return "" diff --git a/sample/vector/vector_put_bucket_logging.py b/sample/vector/vector_put_bucket_logging.py index 5b10653..1e7c038 100644 --- a/sample/vector/vector_put_bucket_logging.py +++ b/sample/vector/vector_put_bucket_logging.py @@ -7,6 +7,7 @@ parser.add_argument('--bucket', help='The name of the bucket.', required=True) parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') parser.add_argument('--account_id', help='The account id.', required=True) +parser.add_argument('--target_bucket', help='The name of the target bucket.', required=True) def main(): args = parser.parse_args() @@ -28,7 +29,7 @@ def main(): bucket=args.bucket, bucket_logging_status=oss_vectors.models.BucketLoggingStatus( logging_enabled=oss_vectors.models.LoggingEnabled( - target_bucket='oss-python-sdk-zxl-test', + target_bucket=args.target_bucket, target_prefix='log-prefix', logging_role='AliyunOSSLoggingDefaultRole' ) From 63f8048d7690989a45f13120dcbbea1280d15b00 Mon Sep 17 00:00:00 2001 From: zhuxiaolong37 Date: Mon, 15 Sep 2025 16:23:18 +0800 Subject: [PATCH 6/9] Change the name of the sample file --- .../delete_bucket_logging.py} | 0 .../delete_bucket_policy.py} | 0 .../vector_delete_bucket.py => vectors/delete_vector_bucket.py} | 0 .../delete_vector_index.py} | 0 .../vector_delete_vectors.py => vectors/delete_vectors.py} | 0 .../get_bucket_logging.py} | 0 .../vector_get_bucket_policy.py => vectors/get_bucket_policy.py} | 0 .../{vector/vector_get_bucket.py => vectors/get_vector_bucket.py} | 0 .../vector_get_vector_index.py => vectors/get_vector_index.py} | 0 sample/{vector/vector_get_vectors.py => vectors/get_vectors.py} | 0 .../vector_list_buckets.py => vectors/list_vector_buckets.py} | 0 .../list_vector_indexes.py} | 0 sample/{vector/vector_list_vectors.py => vectors/list_vectors.py} | 0 .../put_bucket_logging.py} | 0 .../vector_put_bucket_policy.py => vectors/put_bucket_policy.py} | 0 .../{vector/vector_put_bucket.py => vectors/put_vector_bucket.py} | 0 .../vector_put_vector_index.py => vectors/put_vector_index.py} | 0 sample/{vector/vector_put_vectors.py => vectors/put_vectors.py} | 0 .../{vector/vector_query_vectors.py => vectors/query_vectors.py} | 0 19 files changed, 0 insertions(+), 0 deletions(-) rename sample/{vector/vector_delete_bucket_logging.py => vectors/delete_bucket_logging.py} (100%) rename sample/{vector/vector_delete_bucket_policy.py => vectors/delete_bucket_policy.py} (100%) rename sample/{vector/vector_delete_bucket.py => vectors/delete_vector_bucket.py} (100%) rename sample/{vector/vector_delete_vector_index.py => vectors/delete_vector_index.py} (100%) rename sample/{vector/vector_delete_vectors.py => vectors/delete_vectors.py} (100%) rename sample/{vector/vector_get_bucket_logging.py => vectors/get_bucket_logging.py} (100%) rename sample/{vector/vector_get_bucket_policy.py => vectors/get_bucket_policy.py} (100%) rename sample/{vector/vector_get_bucket.py => vectors/get_vector_bucket.py} (100%) rename sample/{vector/vector_get_vector_index.py => vectors/get_vector_index.py} (100%) rename sample/{vector/vector_get_vectors.py => vectors/get_vectors.py} (100%) rename sample/{vector/vector_list_buckets.py => vectors/list_vector_buckets.py} (100%) rename sample/{vector/vector_list_vector_index.py => vectors/list_vector_indexes.py} (100%) rename sample/{vector/vector_list_vectors.py => vectors/list_vectors.py} (100%) rename sample/{vector/vector_put_bucket_logging.py => vectors/put_bucket_logging.py} (100%) rename sample/{vector/vector_put_bucket_policy.py => vectors/put_bucket_policy.py} (100%) rename sample/{vector/vector_put_bucket.py => vectors/put_vector_bucket.py} (100%) rename sample/{vector/vector_put_vector_index.py => vectors/put_vector_index.py} (100%) rename sample/{vector/vector_put_vectors.py => vectors/put_vectors.py} (100%) rename sample/{vector/vector_query_vectors.py => vectors/query_vectors.py} (100%) diff --git a/sample/vector/vector_delete_bucket_logging.py b/sample/vectors/delete_bucket_logging.py similarity index 100% rename from sample/vector/vector_delete_bucket_logging.py rename to sample/vectors/delete_bucket_logging.py diff --git a/sample/vector/vector_delete_bucket_policy.py b/sample/vectors/delete_bucket_policy.py similarity index 100% rename from sample/vector/vector_delete_bucket_policy.py rename to sample/vectors/delete_bucket_policy.py diff --git a/sample/vector/vector_delete_bucket.py b/sample/vectors/delete_vector_bucket.py similarity index 100% rename from sample/vector/vector_delete_bucket.py rename to sample/vectors/delete_vector_bucket.py diff --git a/sample/vector/vector_delete_vector_index.py b/sample/vectors/delete_vector_index.py similarity index 100% rename from sample/vector/vector_delete_vector_index.py rename to sample/vectors/delete_vector_index.py diff --git a/sample/vector/vector_delete_vectors.py b/sample/vectors/delete_vectors.py similarity index 100% rename from sample/vector/vector_delete_vectors.py rename to sample/vectors/delete_vectors.py diff --git a/sample/vector/vector_get_bucket_logging.py b/sample/vectors/get_bucket_logging.py similarity index 100% rename from sample/vector/vector_get_bucket_logging.py rename to sample/vectors/get_bucket_logging.py diff --git a/sample/vector/vector_get_bucket_policy.py b/sample/vectors/get_bucket_policy.py similarity index 100% rename from sample/vector/vector_get_bucket_policy.py rename to sample/vectors/get_bucket_policy.py diff --git a/sample/vector/vector_get_bucket.py b/sample/vectors/get_vector_bucket.py similarity index 100% rename from sample/vector/vector_get_bucket.py rename to sample/vectors/get_vector_bucket.py diff --git a/sample/vector/vector_get_vector_index.py b/sample/vectors/get_vector_index.py similarity index 100% rename from sample/vector/vector_get_vector_index.py rename to sample/vectors/get_vector_index.py diff --git a/sample/vector/vector_get_vectors.py b/sample/vectors/get_vectors.py similarity index 100% rename from sample/vector/vector_get_vectors.py rename to sample/vectors/get_vectors.py diff --git a/sample/vector/vector_list_buckets.py b/sample/vectors/list_vector_buckets.py similarity index 100% rename from sample/vector/vector_list_buckets.py rename to sample/vectors/list_vector_buckets.py diff --git a/sample/vector/vector_list_vector_index.py b/sample/vectors/list_vector_indexes.py similarity index 100% rename from sample/vector/vector_list_vector_index.py rename to sample/vectors/list_vector_indexes.py diff --git a/sample/vector/vector_list_vectors.py b/sample/vectors/list_vectors.py similarity index 100% rename from sample/vector/vector_list_vectors.py rename to sample/vectors/list_vectors.py diff --git a/sample/vector/vector_put_bucket_logging.py b/sample/vectors/put_bucket_logging.py similarity index 100% rename from sample/vector/vector_put_bucket_logging.py rename to sample/vectors/put_bucket_logging.py diff --git a/sample/vector/vector_put_bucket_policy.py b/sample/vectors/put_bucket_policy.py similarity index 100% rename from sample/vector/vector_put_bucket_policy.py rename to sample/vectors/put_bucket_policy.py diff --git a/sample/vector/vector_put_bucket.py b/sample/vectors/put_vector_bucket.py similarity index 100% rename from sample/vector/vector_put_bucket.py rename to sample/vectors/put_vector_bucket.py diff --git a/sample/vector/vector_put_vector_index.py b/sample/vectors/put_vector_index.py similarity index 100% rename from sample/vector/vector_put_vector_index.py rename to sample/vectors/put_vector_index.py diff --git a/sample/vector/vector_put_vectors.py b/sample/vectors/put_vectors.py similarity index 100% rename from sample/vector/vector_put_vectors.py rename to sample/vectors/put_vectors.py diff --git a/sample/vector/vector_query_vectors.py b/sample/vectors/query_vectors.py similarity index 100% rename from sample/vector/vector_query_vectors.py rename to sample/vectors/query_vectors.py From e6bc6f7c2bbf648e04d43893072c7832bb5d0fa1 Mon Sep 17 00:00:00 2001 From: zhuxiaolong37 Date: Wed, 17 Sep 2025 18:01:20 +0800 Subject: [PATCH 7/9] Change the integration test of vector bucket --- alibabacloud_oss_v2/vectors/endpoints.py | 4 +- tests/integration/__init__.py | 91 ++++++++++++++- .../vector/test_vector_basic_client.py | 104 ++++++++++-------- .../vector/test_vector_bucket_basic_client.py | 10 +- .../test_vector_bucket_logging_client.py | 37 ++++--- .../test_vector_bucket_policy_client.py | 21 ++-- .../vector/test_vector_index_client.py | 37 +++---- 7 files changed, 194 insertions(+), 110 deletions(-) diff --git a/alibabacloud_oss_v2/vectors/endpoints.py b/alibabacloud_oss_v2/vectors/endpoints.py index 71ffbd8..9a2a2fe 100644 --- a/alibabacloud_oss_v2/vectors/endpoints.py +++ b/alibabacloud_oss_v2/vectors/endpoints.py @@ -6,9 +6,9 @@ def from_region(region: str, etype: str) -> str: """Generate vectors endpoint from region""" if etype == "internal": - return f"oss-{region}-internal.oss-vectors.aliyuncs.com" + return f"{region}-internal.oss-vectors.aliyuncs.com" else: - return f"oss-{region}.oss-vectors.aliyuncs.com" + return f"{region}.oss-vectors.aliyuncs.com" class VectorsEndpointProvider(EndpointProvider): diff --git a/tests/integration/__init__.py b/tests/integration/__init__.py index 5b0dbfa..97ed234 100644 --- a/tests/integration/__init__.py +++ b/tests/integration/__init__.py @@ -18,6 +18,7 @@ ACCESS_ID = os.getenv("OSS_TEST_ACCESS_KEY_ID") ACCESS_KEY = os.getenv("OSS_TEST_ACCESS_KEY_SECRET") ENDPOINT = os.getenv("OSS_TEST_ENDPOINT") +VECTOR_ENDPOINT = os.getenv("OSS_TEST_VECTOR_ENDPOINT") REGION = os.getenv("OSS_TEST_REGION", "cn-hangzhou") RAM_ROLE_ARN = os.getenv("OSS_TEST_RAM_ROLE_ARN") SIGNATURE_VERSION = os.getenv("OSS_TEST_SIGNATURE_VERSION") @@ -102,7 +103,7 @@ def get_vectors_client() -> oss_vectors.Client: cfg = oss.config.load_default() cfg.credentials_provider = oss.credentials.StaticCredentialsProvider(ACCESS_ID, ACCESS_KEY) cfg.region = REGION - cfg.endpoint = ENDPOINT + cfg.endpoint = VECTOR_ENDPOINT cfg.account_id = USER_ID return oss_vectors.Client(cfg) @@ -147,6 +148,9 @@ def random_str(n): def random_bucket_name(): return BUCKETNAME_PREFIX + random_lowstr(4) + '-' + str(int(datetime.datetime.now(datetime.timezone.utc).timestamp())) +def random_short_bucket_name(): + return BUCKETNAME_PREFIX + random_lowstr(7) + def clean_objects(client:oss.Client, bucket_name:str) -> None: marker = '' is_truncated = True @@ -253,7 +257,80 @@ def sts_assume_role(access_key_id:str, access_key_secret:str, role_arn:str) -> d response = requests.get(assume_url) return json.loads(response.content) - + + +def clean_vector_buckets(prefix: str) -> None: + vector_client = get_vectors_client() + + paginator = vector_client.list_vector_buckets_paginator() + for page in paginator.iter_page(oss_vectors.models.ListVectorBucketsRequest(prefix=prefix)): + for bucket in page.buckets: + actual_bucket_name = bucket.name.split(':')[-1] + + # Clean all content in the bucket (indexes and vectors) + clean_vector_bucket_content(vector_client, actual_bucket_name) + + # Delete the bucket itself + delete_vector_bucket(actual_bucket_name) + +def clean_vector_bucket_content(client: oss_vectors.Client, full_bucket_name: str) -> None: + """ + Clean all content in the specified vector bucket (including indexes and vectors) + """ + # Clean all vector indexes + clean_vector_indexes(client, full_bucket_name) + + +def clean_vector_indexes(client: oss_vectors.Client, bucket_name: str) -> None: + """ + Clean all vector indexes in the specified bucket and their contained vectors + """ + paginator_index = client.list_vector_indexes_paginator() + for page_index in paginator_index.iter_page( + oss_vectors.models.ListVectorIndexesRequest(bucket=bucket_name) + ): + for index in page_index.indexes: + # Clean all vectors in the index + clean_vectors(client, bucket_name, index.get("indexName")) + + # Delete the vector index + client.delete_vector_index(oss_vectors.models.DeleteVectorIndexRequest( + bucket=bucket_name, + index_name=index.get("indexName"), + )) + + +def clean_vectors(client: oss_vectors.Client, bucket_name: str, index_name: str) -> None: + """ + Clean all vectors in the specified index + """ + paginator = client.list_vectors_paginator() + request = oss_vectors.models.ListVectorsRequest( + bucket=bucket_name, + index_name=index_name, + ) + + for page_vector in paginator.iter_page(request): + keys = [] + for vec in page_vector.vectors: + keys.append(vec.get("key")) + + # Delete all vectors on the current page + if keys: + client.delete_vectors(oss_vectors.models.DeleteVectorsRequest( + bucket=bucket_name, + index_name=index_name, + keys=keys + )) + + +def delete_vector_bucket(bucket_name: str) -> None: + """ + Delete vector bucket + """ + client = get_vectors_client() + client.delete_vector_bucket(oss_vectors.models.DeleteVectorBucketRequest(bucket=bucket_name)) + class TestIntegrationVectors(TestIntegration): @@ -262,8 +339,16 @@ def setUpClass(cls): TestIntegration.setUpClass() cls.vector_client = get_vectors_client() + vector_bucket_name = random_short_bucket_name() + result = cls.vector_client.put_vector_bucket( + oss_vectors.models.PutVectorBucketRequest( + bucket=vector_bucket_name, + ) + ) + cls.vector_bucket_name = vector_bucket_name + @classmethod def tearDownClass(cls): TestIntegration.tearDownClass() - + clean_vector_buckets(BUCKETNAME_PREFIX) diff --git a/tests/integration/vector/test_vector_basic_client.py b/tests/integration/vector/test_vector_basic_client.py index 156127c..ac1e935 100644 --- a/tests/integration/vector/test_vector_basic_client.py +++ b/tests/integration/vector/test_vector_basic_client.py @@ -1,7 +1,8 @@ # pylint: skip-file +from ast import literal_eval import alibabacloud_oss_v2.vectors as oss_vectors -from tests.integration import TestIntegrationVectors, random_bucket_name +from tests.integration import TestIntegrationVectors, random_short_bucket_name class TestVectorBasic(TestIntegrationVectors): @@ -10,7 +11,9 @@ class TestVectorBasic(TestIntegrationVectors): def test_vector_basic(self): """Test put, get, list, delete and query vector operations.""" # 1. Create bucket - bucket_name = random_bucket_name() + bucket_name = random_short_bucket_name() + vector_key = "vector-key-1" + result = self.vector_client.put_vector_bucket(oss_vectors.models.PutVectorBucketRequest( bucket=bucket_name, )) @@ -20,33 +23,32 @@ def test_vector_basic(self): self.assertEqual(24, len(result.headers.get('x-oss-request-id'))) # 2. Create index (required for vector operations) - index_name = 'test-index' - dimension = 128 - distance_metric = 'EUCLIDEAN' - data_type = 'vector' + index_name = 'testIndexForIntegrationVector' + dimension = 3 + distance_metric = 'cosine' + data_type = 'float32' metadata = {"nonFilterableMetadataKeys": ["key1", "key2"]} - put_index_result = self.vector_client.put_vector_index(oss_vectors.models.PutVectorIndexRequest( + + put_index_request = oss_vectors.models.PutVectorIndexRequest( bucket=bucket_name, data_type=data_type, dimension=dimension, distance_metric=distance_metric, index_name=index_name, metadata=metadata - )) - self.assertEqual(200, put_index_result.status_code) - self.assertEqual('OK', put_index_result.status) - self.assertEqual(24, len(put_index_result.request_id)) - self.assertEqual(24, len(put_index_result.headers.get('x-oss-request-id'))) - self.assertIsNotNone(put_index_result.index) - self.assertEqual(index_name, put_index_result.index.index_name) - self.assertEqual(dimension, put_index_result.index.dimension) - self.assertEqual(distance_metric, put_index_result.index.distance_metric) + ) + + put_result = self.vector_client.put_vector_index(put_index_request) + self.assertEqual(200, put_result.status_code) + self.assertEqual('OK', put_result.status) + self.assertEqual(24, len(put_result.request_id)) + self.assertEqual(24, len(put_result.headers.get('x-oss-request-id'))) # 3. Put vectors vectors_to_put = [ { "data": {"float32": [0.1, 0.2, 0.3]}, - "key": "vector-key-1", + "key": vector_key, "metadata": {"key1": "value1", "key2": "value2"} } ] @@ -60,13 +62,12 @@ def test_vector_basic(self): self.assertEqual('OK', put_result.status) self.assertEqual(24, len(put_result.request_id)) self.assertEqual(24, len(put_result.headers.get('x-oss-request-id'))) - self.assertIsNotNone(put_result.result) # 4. Get vectors get_result = self.vector_client.get_vectors(oss_vectors.models.GetVectorsRequest( bucket=bucket_name, index_name=index_name, - keys=['vector-key-1'], + keys=[vector_key], return_data=True, return_metadata=True )) @@ -74,61 +75,70 @@ def test_vector_basic(self): self.assertEqual('OK', get_result.status) self.assertEqual(24, len(get_result.request_id)) self.assertEqual(24, len(get_result.headers.get('x-oss-request-id'))) - self.assertIsNotNone(get_result.result) - self.assertIsNotNone(get_result.result.vectors) - self.assertEqual(1, len(get_result.result.vectors)) - self.assertEqual("vector-key-1", get_result.result.vectors[0].key) - self.assertIsNotNone(get_result.result.vectors[0].data) - self.assertIsNotNone(get_result.result.vectors[0].metadata) + self.assertIsNotNone(get_result.vectors) + self.assertEqual(1, len(get_result.vectors)) + self.assertEqual(vector_key, get_result.vectors[0].get('key')) + self.assertIsNotNone(get_result.vectors[0].get('data')) + self.assertIsNotNone(get_result.vectors[0].get('metadata')) + self.assertEqual(literal_eval('{"key1": "value1", "key2": "value2"}'), get_result.vectors[0].get('metadata')) # 5. List vectors list_result = self.vector_client.list_vectors(oss_vectors.models.ListVectorsRequest( bucket=bucket_name, index_name=index_name, max_results=100, - next_token='', return_data=True, return_metadata=True, - segment_count=5, - segment_index=2 + segment_count=2, + segment_index=1 )) self.assertEqual(200, list_result.status_code) self.assertEqual('OK', list_result.status) self.assertEqual(24, len(list_result.request_id)) self.assertEqual(24, len(list_result.headers.get('x-oss-request-id'))) - self.assertIsNotNone(list_result.result) - self.assertIsNotNone(list_result.result.vectors) + self.assertIsNotNone(list_result.vectors) # Check that we have at least one vector in the list - self.assertGreaterEqual(len(list_result.result.vectors), 1) + self.assertGreaterEqual(len(list_result.vectors), 0) + self.assertEqual(vector_key, list_result.vectors[0].get('key')) + self.assertIsNotNone(list_result.vectors[0].get('data')) + self.assertIsNotNone(list_result.vectors[0].get('metadata')) + self.assertEqual(literal_eval('{"key1": "value1", "key2": "value2"}'), list_result.vectors[0].get('metadata')) + # 6. Query vectors - query_vector = [0.1, 0.2, 0.3] + query_filter = { + "$and": [{ + "type": { + "$nin": ["comedy", "documentary"] + } + }] + } + query_vector = {"float32": [0.1, 0.2, 0.3]} query_result = self.vector_client.query_vectors(oss_vectors.models.QueryVectorsRequest( bucket=bucket_name, index_name=index_name, - vector=query_vector, - top_k=1 + query_vector=query_vector, + filter=query_filter, + return_distance=True, + return_metadata=True, + top_k=10 )) self.assertEqual(200, query_result.status_code) self.assertEqual('OK', query_result.status) self.assertEqual(24, len(query_result.request_id)) self.assertEqual(24, len(query_result.headers.get('x-oss-request-id'))) - self.assertIsNotNone(query_result.result) - self.assertIsNotNone(query_result.result.matches) - # Check that we have matches returned - self.assertGreaterEqual(len(query_result.result.matches), 0) + self.assertIsNotNone(query_result) + # 7. Delete vectors delete_result = self.vector_client.delete_vectors(oss_vectors.models.DeleteVectorsRequest( bucket=bucket_name, index_name=index_name, - keys=['vector-key-1'] + keys=[vector_key] )) - self.assertEqual(200, delete_result.status_code) - self.assertEqual('OK', delete_result.status) + self.assertEqual(204, delete_result.status_code) self.assertEqual(24, len(delete_result.request_id)) self.assertEqual(24, len(delete_result.headers.get('x-oss-request-id'))) - self.assertIsNotNone(delete_result.result) # 8. Get index to verify it exists get_index_result = self.vector_client.get_vector_index(oss_vectors.models.GetVectorIndexRequest( @@ -140,7 +150,7 @@ def test_vector_basic(self): self.assertEqual(24, len(get_index_result.request_id)) self.assertEqual(24, len(get_index_result.headers.get('x-oss-request-id'))) self.assertIsNotNone(get_index_result.index) - self.assertEqual(index_name, get_index_result.index.index_name) + self.assertEqual(index_name, get_index_result.index.get('indexName')) # 9. List indexes list_index_result = self.vector_client.list_vector_indexes(oss_vectors.models.ListVectorIndexesRequest( @@ -152,17 +162,17 @@ def test_vector_basic(self): self.assertEqual(24, len(list_index_result.headers.get('x-oss-request-id'))) self.assertIsNotNone(list_index_result.indexes) # Check that we have at least one index in the list - self.assertGreaterEqual(len(list_index_result.indexes), 1) + self.assertEqual(len(list_index_result.indexes), 1) # Verify our index is in the list found_index = None for index in list_index_result.indexes: - if index.index_name == index_name: + if index.get('indexName') == index_name: found_index = index break self.assertIsNotNone(found_index) - self.assertEqual(index_name, found_index.index_name) - self.assertEqual(dimension, found_index.dimension) + self.assertEqual(index_name, found_index.get('indexName')) + self.assertEqual(dimension, found_index.get('dimension')) # 10. Delete index (cleanup) delete_index_result = self.vector_client.delete_vector_index(oss_vectors.models.DeleteVectorIndexRequest( diff --git a/tests/integration/vector/test_vector_bucket_basic_client.py b/tests/integration/vector/test_vector_bucket_basic_client.py index 8121277..0dd0cf0 100644 --- a/tests/integration/vector/test_vector_bucket_basic_client.py +++ b/tests/integration/vector/test_vector_bucket_basic_client.py @@ -1,16 +1,14 @@ # pylint: skip-file -from typing import cast -import alibabacloud_oss_v2 as oss import alibabacloud_oss_v2.vectors as oss_vectors -from tests.integration import TestIntegrationVectors, random_bucket_name +from tests.integration import TestIntegrationVectors, random_short_bucket_name, REGION, USER_ID class TestVectorBucketBasic(TestIntegrationVectors): def test_vector_bucket_basic(self): # create bucket - bucket_name = random_bucket_name() + bucket_name = random_short_bucket_name() result = self.vector_client.put_vector_bucket(oss_vectors.models.PutVectorBucketRequest( bucket=bucket_name, acl='private', @@ -28,7 +26,7 @@ def test_vector_bucket_basic(self): self.assertEqual('OK', result.status) self.assertEqual(24, len(result.request_id)) self.assertEqual(24, len(result.headers.get('x-oss-request-id'))) - self.assertEqual(bucket_name, result.bucket_info.name) + self.assertEqual(f'acs:ossvector:{REGION}:{USER_ID}:{bucket_name}', result.bucket_info.name) self.assertIsNotNone(result.bucket_info.location) self.assertIsNotNone(result.bucket_info.creation_date) @@ -44,7 +42,7 @@ def test_vector_bucket_basic(self): self.assertGreater(len(result.buckets), 0) found = False for bucket in result.buckets: - if bucket.name == bucket_name: + if bucket.name.__contains__(bucket_name): found = True break self.assertTrue(found) diff --git a/tests/integration/vector/test_vector_bucket_logging_client.py b/tests/integration/vector/test_vector_bucket_logging_client.py index 72dcdc5..d55949b 100644 --- a/tests/integration/vector/test_vector_bucket_logging_client.py +++ b/tests/integration/vector/test_vector_bucket_logging_client.py @@ -1,7 +1,8 @@ # pylint: skip-file +import alibabacloud_oss_v2 as oss import alibabacloud_oss_v2.vectors as oss_vectors -from tests.integration import TestIntegrationVectors, random_bucket_name +from tests.integration import TestIntegrationVectors, random_short_bucket_name, random_bucket_name class TestVectorBucketLogging(TestIntegrationVectors): @@ -10,9 +11,12 @@ class TestVectorBucketLogging(TestIntegrationVectors): def test_vector_bucket_logging(self): """Test put, get, and delete bucket logging operations.""" # 1. Create buckets: source bucket and target bucket - source_bucket_name = random_bucket_name() + source_bucket_name = random_short_bucket_name() target_bucket_name = random_bucket_name() + print(source_bucket_name) + print(target_bucket_name) + # Create source bucket result = self.vector_client.put_vector_bucket( oss_vectors.models.PutVectorBucketRequest( @@ -24,21 +28,24 @@ def test_vector_bucket_logging(self): self.assertEqual(24, len(result.request_id)) self.assertEqual(24, len(result.headers.get('x-oss-request-id'))) - # Create target bucket - result = self.vector_client.put_vector_bucket( - oss_vectors.models.PutVectorBucketRequest( - bucket=target_bucket_name, + + # create target bucket + result = self.client.put_bucket(oss.PutBucketRequest( + bucket=target_bucket_name, + acl='private', + create_bucket_configuration=oss.CreateBucketConfiguration( + storage_class='IA' ) - ) + )) self.assertEqual(200, result.status_code) self.assertEqual('OK', result.status) self.assertEqual(24, len(result.request_id)) self.assertEqual(24, len(result.headers.get('x-oss-request-id'))) + # 2. Put bucket logging (enable logging) logging_prefix = 'log-prefix' logging_role = 'AliyunOSSLoggingDefaultRole' - # Using all 3 parameters for LoggingEnabled: target_bucket, target_prefix, logging_role put_result = self.vector_client.put_bucket_logging( oss_vectors.models.PutBucketLoggingRequest( bucket=source_bucket_name, @@ -66,12 +73,10 @@ def test_vector_bucket_logging(self): self.assertEqual('OK', get_result.status) self.assertEqual(24, len(get_result.request_id)) self.assertEqual(24, len(get_result.headers.get('x-oss-request-id'))) - # Verify the logging configuration retrieved matches what was set self.assertIsNotNone(get_result.bucket_logging_status) self.assertIsNotNone(get_result.bucket_logging_status.logging_enabled) self.assertEqual(target_bucket_name, get_result.bucket_logging_status.logging_enabled.target_bucket) self.assertEqual(logging_prefix, get_result.bucket_logging_status.logging_enabled.target_prefix) - # Verify the third parameter self.assertEqual(logging_role, get_result.bucket_logging_status.logging_enabled.logging_role) # 4. Delete bucket logging (disable logging) @@ -90,16 +95,14 @@ def test_vector_bucket_logging(self): bucket=source_bucket_name ) ) - # When logging is disabled, LoggingEnabled should be None or absent self.assertEqual(200, get_result_after_delete.status_code) self.assertEqual('OK', get_result_after_delete.status) self.assertEqual(24, len(get_result_after_delete.request_id)) self.assertEqual(24, len(get_result_after_delete.headers.get('x-oss-request-id'))) - # Verify logging is disabled (LoggingEnabled is None or absent) self.assertIsNotNone(get_result_after_delete.bucket_logging_status) - # According to OSS API, when logging is disabled, the LoggingEnabled element is not returned - # or is None. Check for None here. - self.assertIsNone(get_result_after_delete.bucket_logging_status.logging_enabled) + self.assertIsNone(get_result_after_delete.bucket_logging_status.logging_enabled.target_bucket) + self.assertIsNone(get_result_after_delete.bucket_logging_status.logging_enabled.target_prefix) + self.assertIsNone(get_result_after_delete.bucket_logging_status.logging_enabled.logging_role) # 6. Delete buckets (cleanup) # Delete source bucket @@ -113,8 +116,8 @@ def test_vector_bucket_logging(self): self.assertEqual(24, len(delete_source_result.headers.get('x-oss-request-id'))) # Delete target bucket - delete_target_result = self.vector_client.delete_vector_bucket( - oss_vectors.models.DeleteVectorBucketRequest( + delete_target_result = self.client.delete_bucket( + oss.models.DeleteBucketRequest( bucket=target_bucket_name, ) ) diff --git a/tests/integration/vector/test_vector_bucket_policy_client.py b/tests/integration/vector/test_vector_bucket_policy_client.py index c804158..e00fbf6 100644 --- a/tests/integration/vector/test_vector_bucket_policy_client.py +++ b/tests/integration/vector/test_vector_bucket_policy_client.py @@ -1,19 +1,16 @@ # pylint: skip-file - -from typing import cast -import alibabacloud_oss_v2 as oss +import time import alibabacloud_oss_v2.vectors as oss_vectors -from tests.integration import TestIntegrationVectors, random_bucket_name +from tests.integration import TestIntegrationVectors, random_short_bucket_name class TestVectorBucketBasic(TestIntegrationVectors): def test_vector_bucket_policy(self): # create bucket - bucket_name = random_bucket_name() + bucket_name = random_short_bucket_name() result = self.vector_client.put_vector_bucket(oss_vectors.models.PutVectorBucketRequest( bucket=bucket_name, - acl='private', )) self.assertEqual(200, result.status_code) self.assertEqual('OK', result.status) @@ -24,9 +21,10 @@ def test_vector_bucket_policy(self): policy_text += '{' policy_text += '"Version":"1",' policy_text += '"Statement":[{' - policy_text += '"Action":["oss:PutObject"],' - policy_text += '"Effect":"Allow",' - policy_text += f'"Resource": ["acs:oss:*:*:{bucket_name}","acs:oss:*:*:{bucket_name}/*"]' + policy_text += '"Action":["ossvector:PutVectors","ossvector:GetVectors"],' + policy_text += '"Effect":"Deny",' + policy_text += '"Principal":["1234567890"],' + policy_text += f'"Resource": ["acs:ossvector:*:*:{bucket_name}","acs:oss:*:*:{bucket_name}/*"]' policy_text += '}]}' # put bucket policy @@ -39,6 +37,8 @@ def test_vector_bucket_policy(self): self.assertEqual(24, len(result.request_id)) self.assertEqual(24, len(result.headers.get('x-oss-request-id'))) + time.sleep(1) + # get bucket policy result = self.vector_client.get_bucket_policy(oss_vectors.models.GetBucketPolicyRequest( bucket=bucket_name, @@ -53,8 +53,7 @@ def test_vector_bucket_policy(self): result = self.vector_client.delete_bucket_policy(oss_vectors.models.DeleteBucketPolicyRequest( bucket=bucket_name, )) - self.assertEqual(200, result.status_code) - self.assertEqual('OK', result.status) + self.assertEqual(204, result.status_code) self.assertEqual(24, len(result.request_id)) self.assertEqual(24, len(result.headers.get('x-oss-request-id'))) diff --git a/tests/integration/vector/test_vector_index_client.py b/tests/integration/vector/test_vector_index_client.py index 78f7f9f..73193a7 100644 --- a/tests/integration/vector/test_vector_index_client.py +++ b/tests/integration/vector/test_vector_index_client.py @@ -1,8 +1,6 @@ # pylint: skip-file - - import alibabacloud_oss_v2.vectors as oss_vectors -from tests.integration import TestIntegrationVectors, random_bucket_name +from tests.integration import TestIntegrationVectors, random_short_bucket_name class TestVectorIndex(TestIntegrationVectors): @@ -11,7 +9,7 @@ class TestVectorIndex(TestIntegrationVectors): def test_vector_index_lifecycle(self): """Test the full lifecycle of a vector index: create (put), get, list, and delete.""" # 1. Create bucket for testing - bucket_name = random_bucket_name() + bucket_name = random_short_bucket_name() create_bucket_result = self.vector_client.put_vector_bucket( oss_vectors.models.PutVectorBucketRequest( bucket=bucket_name, @@ -23,10 +21,10 @@ def test_vector_index_lifecycle(self): self.assertEqual(24, len(create_bucket_result.headers.get('x-oss-request-id'))) # 2. Put (Create) a vector index - index_name = 'test-index-for-integration' - dimension = 128 - distance_metric = 'EUCLIDEAN' - data_type = 'vector' + index_name = 'testIndexForIntegration' + dimension = 3 + distance_metric = 'cosine' + data_type = 'float32' metadata = {"nonFilterableMetadataKeys": ["key1", "key2"]} put_index_request = oss_vectors.models.PutVectorIndexRequest( @@ -46,13 +44,6 @@ def test_vector_index_lifecycle(self): self.assertEqual(24, len(put_result.request_id)) self.assertEqual(24, len(put_result.headers.get('x-oss-request-id'))) - # Assert response contains index details - self.assertIsNotNone(put_result.index) - self.assertEqual(index_name, put_result.index.index_name) - self.assertEqual(dimension, put_result.index.dimension) - self.assertEqual(distance_metric, put_result.index.distance_metric) - # Check if other fields like status, create_time etc. are present if needed - # 3. Get the created vector index get_index_request = oss_vectors.models.GetVectorIndexRequest( bucket=bucket_name, @@ -69,9 +60,9 @@ def test_vector_index_lifecycle(self): # Assert retrieved index details match the created ones self.assertIsNotNone(get_result.index) - self.assertEqual(index_name, get_result.index.index_name) - self.assertEqual(dimension, get_result.index.dimension) - self.assertEqual(distance_metric, get_result.index.distance_metric) + self.assertEqual(index_name, get_result.index.get('indexName')) + self.assertEqual(dimension, get_result.index.get('dimension')) + self.assertEqual(distance_metric, get_result.index.get('distanceMetric')) # 4. List vector indexes and verify our index is included list_indexes_request = oss_vectors.models.ListVectorIndexesRequest( @@ -85,21 +76,19 @@ def test_vector_index_lifecycle(self): self.assertEqual('OK', list_result.status) self.assertEqual(24, len(list_result.request_id)) self.assertEqual(24, len(list_result.headers.get('x-oss-request-id'))) - - # Assert the list is present and contains our index self.assertIsNotNone(list_result.indexes) - self.assertGreater(len(list_result.indexes), 0) + self.assertEqual(len(list_result.indexes), 1) # Find our specific index in the list found_index = None for index in list_result.indexes: - if index.index_name == index_name: + if index.get('indexName') == index_name: found_index = index break self.assertIsNotNone(found_index, f"Index '{index_name}' not found in the list") - self.assertEqual(dimension, found_index.dimension) - self.assertEqual(distance_metric, found_index.distance_metric) + self.assertEqual(dimension, found_index.get('dimension')) + self.assertEqual(distance_metric, found_index.get('distanceMetric')) # 5. Delete the vector index delete_index_request = oss_vectors.models.DeleteVectorIndexRequest( From b140f14fc7c013b3d203e6621ca859695eec63bc Mon Sep 17 00:00:00 2001 From: zhuxiaolong37 Date: Wed, 17 Sep 2025 18:16:10 +0800 Subject: [PATCH 8/9] Delete printing code --- tests/integration/vector/test_vector_bucket_logging_client.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/integration/vector/test_vector_bucket_logging_client.py b/tests/integration/vector/test_vector_bucket_logging_client.py index d55949b..ec48c0f 100644 --- a/tests/integration/vector/test_vector_bucket_logging_client.py +++ b/tests/integration/vector/test_vector_bucket_logging_client.py @@ -14,9 +14,6 @@ def test_vector_bucket_logging(self): source_bucket_name = random_short_bucket_name() target_bucket_name = random_bucket_name() - print(source_bucket_name) - print(target_bucket_name) - # Create source bucket result = self.vector_client.put_vector_bucket( oss_vectors.models.PutVectorBucketRequest( From f161718ab1b6517b8c21be3993912d01ea16faa3 Mon Sep 17 00:00:00 2001 From: zhuxiaolong37 Date: Thu, 18 Sep 2025 10:22:01 +0800 Subject: [PATCH 9/9] Change the get vector index result structure --- alibabacloud_oss_v2/vectors/models/index_basic.py | 4 ---- sample/vectors/get_vector_index.py | 1 - tests/unit/vectors/models/test_index_basic.py | 8 +++----- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/alibabacloud_oss_v2/vectors/models/index_basic.py b/alibabacloud_oss_v2/vectors/models/index_basic.py index 9833aae..150c9d5 100644 --- a/alibabacloud_oss_v2/vectors/models/index_basic.py +++ b/alibabacloud_oss_v2/vectors/models/index_basic.py @@ -89,24 +89,20 @@ class GetVectorIndexResult(serde.ResultModel): _attribute_map = { 'index': {'tag': 'output', 'position': 'body', 'rename': 'index', 'type': 'dict'}, - 'vector_bucket_name': {'tag': 'output', 'position': 'body', 'rename': 'vectorBucketName', 'type': 'str'}, } def __init__( self, index: Optional[Dict] = None, - vector_bucket_name: Optional[str] = None, **kwargs: Any ) -> None: """ Args: index (Dict, optional): The vector index information. - vector_bucket_name (str, optional): The name of the vector bucket. """ super().__init__(**kwargs) self.index = index - self.vector_bucket_name = vector_bucket_name # List diff --git a/sample/vectors/get_vector_index.py b/sample/vectors/get_vector_index.py index aaf732f..7c26e3a 100644 --- a/sample/vectors/get_vector_index.py +++ b/sample/vectors/get_vector_index.py @@ -36,7 +36,6 @@ def main(): if result.index: print(f'index name: {result.index}') - print(f'vector bucket name: {result.vector_bucket_name}') diff --git a/tests/unit/vectors/models/test_index_basic.py b/tests/unit/vectors/models/test_index_basic.py index ec30b57..2b1983e 100644 --- a/tests/unit/vectors/models/test_index_basic.py +++ b/tests/unit/vectors/models/test_index_basic.py @@ -134,9 +134,9 @@ def test_deserialize_result(self): "metadata": { "nonFilterableMetadataKeys": ["key1", "key2"] }, - "status": "Active" + "status": "Active", + "vectorBucketName": "test-bucket" }, - "vectorBucketName": "test-bucket" } ''' @@ -160,9 +160,7 @@ def test_deserialize_result(self): self.assertEqual(result.index.get('distanceMetric'), 'EUCLIDEAN') self.assertEqual(result.index.get('indexName'), 'test-index') self.assertEqual(result.index.get('status'), 'Active') - self.assertEqual(result.vector_bucket_name, 'test-bucket') - self.assertIsNotNone(result.index.get('metadata')) - self.assertIn('nonFilterableMetadataKeys', result.index.get('metadata')) + self.assertEqual(result.index.get('vectorBucketName'), 'test-bucket') self.assertEqual(result.index.get('metadata').get('nonFilterableMetadataKeys'), ['key1', 'key2'])