fufu-cloud-cli 0.9.1__tar.gz → 0.9.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. {fufu_cloud_cli-0.9.1/src/fufu_cloud_cli.egg-info → fufu_cloud_cli-0.9.2}/PKG-INFO +4 -2
  2. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/README.md +3 -1
  3. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/pyproject.toml +1 -1
  4. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/__init__.py +1 -1
  5. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/secrets.py +6 -5
  6. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2/src/fufu_cloud_cli.egg-info}/PKG-INFO +4 -2
  7. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/LICENSE +0 -0
  8. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/MANIFEST.in +0 -0
  9. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/setup.cfg +0 -0
  10. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/__main__.py +0 -0
  11. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/api_backend.py +0 -0
  12. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/capabilities.json +0 -0
  13. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/capacity.py +0 -0
  14. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/cli.py +0 -0
  15. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/cloud_data.py +0 -0
  16. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/cloudflare.py +0 -0
  17. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/control.py +0 -0
  18. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/docker_backend.py +0 -0
  19. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/errors.py +0 -0
  20. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/http_runtime.py +0 -0
  21. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/iac_state.py +0 -0
  22. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/lambda_adapter.py +0 -0
  23. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/limits.py +0 -0
  24. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/manifest.py +0 -0
  25. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/object_transfer.py +0 -0
  26. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/public_access.py +0 -0
  27. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/pubsub.py +0 -0
  28. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/pulumi-endpoints.json +0 -0
  29. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/pulumi_bridge.py +0 -0
  30. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/remote_compute.py +0 -0
  31. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/runtime/functions/Dockerfile +0 -0
  32. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/runtime/ingress/Dockerfile +0 -0
  33. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/runtime/ingress/proxy.py +0 -0
  34. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/runtime_sdk.py +0 -0
  35. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/serverless.py +0 -0
  36. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/terraform_bridge/__init__.py +0 -0
  37. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/terraform_bridge/aws.py +0 -0
  38. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/terraform_bridge/aws_data.py +0 -0
  39. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/terraform_bridge/common.py +0 -0
  40. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/terraform_bridge/google.py +0 -0
  41. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/terraform_bridge/google_pubsub.py +0 -0
  42. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/terraform_bridge/remote_state.py +0 -0
  43. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli/terraform_bridge/runner.py +0 -0
  44. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli.egg-info/SOURCES.txt +0 -0
  45. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli.egg-info/dependency_links.txt +0 -0
  46. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli.egg-info/entry_points.txt +0 -0
  47. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli.egg-info/requires.txt +0 -0
  48. {fufu_cloud_cli-0.9.1 → fufu_cloud_cli-0.9.2}/src/fufu_cloud_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fufu-cloud-cli
3
- Version: 0.9.1
3
+ Version: 0.9.2
4
4
  Summary: FUFU Cloud CLI for tenant-scoped mock cloud development and deployment
5
5
  License-Expression: LicenseRef-Proprietary
6
6
  Requires-Python: >=3.10
@@ -22,6 +22,8 @@ Dynamic: license-file
22
22
  `gcloud-fufu`、`az-fufu`、`wrangler-fufu`。這是 AWS、Google Cloud、Azure 與 Cloudflare 的**明確子集**,
23
23
  只供 FUFU mock 環境使用;不會把部署轉送到正式雲端。
24
24
 
25
+ 0.9.2 新增 `gcloud-fufu secrets versions describe`,以 metadata 權限查看版本狀態而不讀取秘密;GCP 秘密內容不可為空。配套後端依真實 GCP 驗證修正 Editor/Viewer 等角色的明列權限子集、Gen 1 HTTP invoker 與 Pub/Sub 的 0 秒預設 ack deadline。這些新能力需要同步更新 FUFU 服務端;沒有完整 Google IAM、SDK/ADC 或自動擴縮相容保證。
26
+
25
27
  0.9.1 統一所有 CLI API 請求的 `User-Agent: fufu-cloud-cli`,涵蓋物件傳輸、
26
28
  Cloudflare 靜態檔案部署、IaC 遠端 state 與 Cloud Shell session,避免沿用
27
29
  Python 預設識別而遇到 Cloudflare HTTP 403/1010。識別標頭不取代 credential
@@ -32,7 +34,7 @@ Python 預設識別而遇到 Cloudflare HTTP 403/1010。識別標頭不取代
32
34
  ## Cloudflare 前端部署與 R2
33
35
 
34
36
  ```bash
35
- pip install 'fufu-cloud-cli==0.9.1'
37
+ pip install 'fufu-cloud-cli==0.9.2'
36
38
  export FUFU_CLOUDFLARE_CREDENTIAL_FILE=/run/secrets/fufu-cloudflare.json
37
39
  wrangler-fufu capabilities
38
40
  wrangler-fufu pages project create frontend --production-branch main
@@ -4,6 +4,8 @@
4
4
  `gcloud-fufu`、`az-fufu`、`wrangler-fufu`。這是 AWS、Google Cloud、Azure 與 Cloudflare 的**明確子集**,
5
5
  只供 FUFU mock 環境使用;不會把部署轉送到正式雲端。
6
6
 
7
+ 0.9.2 新增 `gcloud-fufu secrets versions describe`,以 metadata 權限查看版本狀態而不讀取秘密;GCP 秘密內容不可為空。配套後端依真實 GCP 驗證修正 Editor/Viewer 等角色的明列權限子集、Gen 1 HTTP invoker 與 Pub/Sub 的 0 秒預設 ack deadline。這些新能力需要同步更新 FUFU 服務端;沒有完整 Google IAM、SDK/ADC 或自動擴縮相容保證。
8
+
7
9
  0.9.1 統一所有 CLI API 請求的 `User-Agent: fufu-cloud-cli`,涵蓋物件傳輸、
8
10
  Cloudflare 靜態檔案部署、IaC 遠端 state 與 Cloud Shell session,避免沿用
9
11
  Python 預設識別而遇到 Cloudflare HTTP 403/1010。識別標頭不取代 credential
@@ -14,7 +16,7 @@ Python 預設識別而遇到 Cloudflare HTTP 403/1010。識別標頭不取代
14
16
  ## Cloudflare 前端部署與 R2
15
17
 
16
18
  ```bash
17
- pip install 'fufu-cloud-cli==0.9.1'
19
+ pip install 'fufu-cloud-cli==0.9.2'
18
20
  export FUFU_CLOUDFLARE_CREDENTIAL_FILE=/run/secrets/fufu-cloudflare.json
19
21
  wrangler-fufu capabilities
20
22
  wrangler-fufu pages project create frontend --production-branch main
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "fufu-cloud-cli"
7
- version = "0.9.1"
7
+ version = "0.9.2"
8
8
  description = "FUFU Cloud CLI for tenant-scoped mock cloud development and deployment"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -1,3 +1,3 @@
1
1
  """FUFU CLI 與本機部署工具;相容範圍見 capabilities.json。"""
2
2
 
3
- __version__ = "0.9.1"
3
+ __version__ = "0.9.2"
@@ -7,7 +7,7 @@ from .api_backend import ApiClient, api_selected
7
7
  from .errors import require
8
8
 
9
9
 
10
- def input_data(filename=None, variable=None):
10
+ def input_data(filename=None, variable=None, minimum=0):
11
11
  if variable:
12
12
  require(variable in os.environ, 'MISSING_ENV', '秘密環境變數未注入。')
13
13
  raw = os.environ[variable].encode()
@@ -17,6 +17,7 @@ def input_data(filename=None, variable=None):
17
17
  require(file.is_file() and not file.is_symlink() and file.stat().st_size <= 65536, 'INVALID_SECRET', '秘密來源必須是不超過 64 KiB 的一般檔案。')
18
18
  raw = file.read_bytes()
19
19
  require(len(raw) <= 65536, 'SECRET_LIMIT', '秘密上限為 64 KiB。')
20
+ require(len(raw) >= minimum, 'INVALID_SECRET', 'GCP 秘密內容不可為空。')
20
21
  return base64.b64encode(raw).decode()
21
22
 
22
23
 
@@ -46,8 +47,8 @@ def command(provider, argv, Parser):
46
47
  q.add_argument('--replication-policy', choices=['automatic'], default='automatic')
47
48
  src = q.add_mutually_exclusive_group(); src.add_argument('--data-file'); src.add_argument('--secret-env')
48
49
  versions = s.add_parser('versions').add_subparsers(dest='version_action', required=True)
49
- for action in ['add', 'list', 'access', 'enable', 'disable', 'destroy']:
50
- q = versions.add_parser(action); q.set_defaults(operation='versions' if action == 'list' else action)
50
+ for action in ['add', 'list', 'describe', 'access', 'enable', 'disable', 'destroy']:
51
+ q = versions.add_parser(action); q.set_defaults(operation={'list': 'versions', 'describe': 'describe-version'}.get(action, action))
51
52
  if action in {'add', 'list'}: q.add_argument('name')
52
53
  else: q.add_argument('version'); q.add_argument('--secret', dest='name', required=True)
53
54
  if action == 'add':
@@ -60,14 +61,14 @@ def command(provider, argv, Parser):
60
61
  if getattr(args, 'secret_string', None):
61
62
  require(args.secret_string.startswith('file://'), 'SECRET_FILE_REQUIRED', '--secret-string 只接受 file:// 路徑;亦可使用 --secret-env。')
62
63
  source = args.secret_string[7:]
63
- if source is not None or variable: body['data'] = input_data(source, variable)
64
+ if source is not None or variable: body['data'] = input_data(source, variable, minimum=1 if provider == 'gcp' else 0)
64
65
  version = getattr(args, 'version', None) or getattr(args, 'version_id', None) or getattr(args, 'client_request_token', None)
65
66
  if version is not None: body['version'] = version
66
67
  destination = getattr(args, 'out_file', None)
67
68
  if destination:
68
69
  file = Path(destination)
69
70
  require(not file.exists() and not file.is_symlink() and file.parent.is_dir(), 'OUTPUT_EXISTS', '秘密輸出必須是新檔案。')
70
- with ApiClient(provider, read_only=op in {'list', 'describe', 'versions', 'access'}) as api:
71
+ with ApiClient(provider, read_only=op in {'list', 'describe', 'describe-version', 'versions', 'access'}) as api:
71
72
  result = api.request('POST', '/secrets/' + op, body)
72
73
  if destination:
73
74
  raw = base64.b64decode(result['data'], validate=True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fufu-cloud-cli
3
- Version: 0.9.1
3
+ Version: 0.9.2
4
4
  Summary: FUFU Cloud CLI for tenant-scoped mock cloud development and deployment
5
5
  License-Expression: LicenseRef-Proprietary
6
6
  Requires-Python: >=3.10
@@ -22,6 +22,8 @@ Dynamic: license-file
22
22
  `gcloud-fufu`、`az-fufu`、`wrangler-fufu`。這是 AWS、Google Cloud、Azure 與 Cloudflare 的**明確子集**,
23
23
  只供 FUFU mock 環境使用;不會把部署轉送到正式雲端。
24
24
 
25
+ 0.9.2 新增 `gcloud-fufu secrets versions describe`,以 metadata 權限查看版本狀態而不讀取秘密;GCP 秘密內容不可為空。配套後端依真實 GCP 驗證修正 Editor/Viewer 等角色的明列權限子集、Gen 1 HTTP invoker 與 Pub/Sub 的 0 秒預設 ack deadline。這些新能力需要同步更新 FUFU 服務端;沒有完整 Google IAM、SDK/ADC 或自動擴縮相容保證。
26
+
25
27
  0.9.1 統一所有 CLI API 請求的 `User-Agent: fufu-cloud-cli`,涵蓋物件傳輸、
26
28
  Cloudflare 靜態檔案部署、IaC 遠端 state 與 Cloud Shell session,避免沿用
27
29
  Python 預設識別而遇到 Cloudflare HTTP 403/1010。識別標頭不取代 credential
@@ -32,7 +34,7 @@ Python 預設識別而遇到 Cloudflare HTTP 403/1010。識別標頭不取代
32
34
  ## Cloudflare 前端部署與 R2
33
35
 
34
36
  ```bash
35
- pip install 'fufu-cloud-cli==0.9.1'
37
+ pip install 'fufu-cloud-cli==0.9.2'
36
38
  export FUFU_CLOUDFLARE_CREDENTIAL_FILE=/run/secrets/fufu-cloudflare.json
37
39
  wrangler-fufu capabilities
38
40
  wrangler-fufu pages project create frontend --production-branch main
File without changes
File without changes