From 4b78ee707ee3fea3e2cda4a5b89985c84b01afa9 Mon Sep 17 00:00:00 2001 From: zhuxiaolong37 Date: Fri, 5 Sep 2025 16:15:56 +0800 Subject: [PATCH 1/6] 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/6] 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/6] 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/6] 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/6] 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/6] 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