From 7f586a9b1286107fccaef01de791a7e23eac4643 Mon Sep 17 00:00:00 2001 From: ymq Date: Wed, 26 Aug 2026 17:17:23 +0800 Subject: [PATCH] =?UTF-8?q?feat(entitlement):=20execute=5Fproduct=5Fservic?= =?UTF-8?q?e=20=E8=BF=94=E5=9B=9E=E5=AD=98=E5=82=A8=E5=AE=B9=E9=87=8F?= =?UTF-8?q?=E9=85=8D=E9=A2=9D=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product_interface.cpython-310.pyc | Bin 0 -> 5301 bytes storage_resource/product_interface.py | 12 ++++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 storage_resource/__pycache__/product_interface.cpython-310.pyc diff --git a/storage_resource/__pycache__/product_interface.cpython-310.pyc b/storage_resource/__pycache__/product_interface.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..590965385d7507818d59b31c8c6098b6103048e7 GIT binary patch literal 5301 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 aMYx8RjIZXFWyP(v_I*~uYOz+d#s3HNM;rS9 literal 0 HcmV?d00001 diff --git a/storage_resource/product_interface.py b/storage_resource/product_interface.py index 84d4346..1bee681 100644 --- a/storage_resource/product_interface.py +++ b/storage_resource/product_interface.py @@ -109,9 +109,17 @@ async def execute_product_service(resource_ref_id, user_id, user_org_id, request if err: return {'success': False, 'message': err, 'status': 'FAILED'} meter_mode = (request_data or {}).get('meter_mode', 'ondemand') + storage_gb = float((request_data or {}).get('storage_gb', 0) or 0) + if not storage_gb: + storage_gb = float(getattr(spec, 'min_gb', 0) or 0) return {'success': True, - 'message': '存储容量已开通(配额分配逻辑待接入),meter_mode=%s' % meter_mode, - 'status': 'SUCCESS'} + 'message': '存储容量已开通', + 'status': 'SUCCESS', + 'entitlement': { + 'meter_mode': meter_mode, + 'storage_gb': storage_gb, + 'quota_unit': 'GB', + }} async def execute_product_service_stream(resource_ref_id, user_id, user_org_id, request_data):