ibee-cli 0.2.0__tar.gz → 0.4.0__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.
- ibee_cli-0.4.0/PKG-INFO +622 -0
- ibee_cli-0.4.0/README.md +597 -0
- {ibee_cli-0.2.0 → ibee_cli-0.4.0}/pyproject.toml +5 -4
- {ibee_cli-0.2.0 → ibee_cli-0.4.0}/src/ibee_cli/__init__.py +1 -1
- ibee_cli-0.4.0/src/ibee_cli/commands/billing.py +117 -0
- ibee_cli-0.4.0/src/ibee_cli/commands/block_storage.py +657 -0
- ibee_cli-0.4.0/src/ibee_cli/commands/buckets.py +429 -0
- ibee_cli-0.4.0/src/ibee_cli/commands/cdn.py +497 -0
- {ibee_cli-0.2.0 → ibee_cli-0.4.0}/src/ibee_cli/commands/compute.py +11 -33
- ibee_cli-0.4.0/src/ibee_cli/commands/console.py +106 -0
- ibee_cli-0.4.0/src/ibee_cli/commands/firewalls.py +334 -0
- ibee_cli-0.4.0/src/ibee_cli/commands/gpus.py +325 -0
- ibee_cli-0.4.0/src/ibee_cli/commands/load_balancers.py +610 -0
- ibee_cli-0.4.0/src/ibee_cli/commands/networking.py +1017 -0
- ibee_cli-0.4.0/src/ibee_cli/commands/ops.py +98 -0
- ibee_cli-0.4.0/src/ibee_cli/commands/reserved_ips.py +280 -0
- ibee_cli-0.4.0/src/ibee_cli/commands/secrets.py +1409 -0
- ibee_cli-0.4.0/src/ibee_cli/commands/vm_lifecycle.py +1662 -0
- ibee_cli-0.4.0/src/ibee_cli/commands/vms.py +324 -0
- ibee_cli-0.4.0/src/ibee_cli/context.py +315 -0
- ibee_cli-0.4.0/src/ibee_cli/helpers.py +749 -0
- ibee_cli-0.4.0/src/ibee_cli/main.py +121 -0
- ibee_cli-0.4.0/src/ibee_cli/render.py +612 -0
- ibee_cli-0.4.0/src/ibee_cli.egg-info/PKG-INFO +622 -0
- ibee_cli-0.4.0/src/ibee_cli.egg-info/SOURCES.txt +43 -0
- {ibee_cli-0.2.0 → ibee_cli-0.4.0}/src/ibee_cli.egg-info/requires.txt +3 -1
- ibee_cli-0.4.0/tests/test_billing_preflight.py +133 -0
- ibee_cli-0.4.0/tests/test_block_storage_cdn_commands.py +754 -0
- ibee_cli-0.4.0/tests/test_cli.py +401 -0
- ibee_cli-0.4.0/tests/test_cloud_vm_commands.py +335 -0
- ibee_cli-0.4.0/tests/test_foundations.py +796 -0
- ibee_cli-0.4.0/tests/test_networking_commands.py +198 -0
- ibee_cli-0.4.0/tests/test_networking_parity_commands.py +840 -0
- ibee_cli-0.4.0/tests/test_object_storage_commands.py +300 -0
- ibee_cli-0.4.0/tests/test_parity_alignment.py +204 -0
- ibee_cli-0.4.0/tests/test_review_fixes.py +340 -0
- ibee_cli-0.4.0/tests/test_secret_store_commands.py +684 -0
- ibee_cli-0.4.0/tests/test_vm_lifecycle_commands.py +260 -0
- ibee_cli-0.4.0/tests/test_vm_parity_commands.py +658 -0
- ibee_cli-0.2.0/PKG-INFO +0 -119
- ibee_cli-0.2.0/README.md +0 -95
- ibee_cli-0.2.0/src/ibee_cli/commands/buckets.py +0 -83
- ibee_cli-0.2.0/src/ibee_cli/commands/gpus.py +0 -170
- ibee_cli-0.2.0/src/ibee_cli/commands/ops.py +0 -31
- ibee_cli-0.2.0/src/ibee_cli/commands/secrets.py +0 -228
- ibee_cli-0.2.0/src/ibee_cli/commands/vms.py +0 -162
- ibee_cli-0.2.0/src/ibee_cli/context.py +0 -70
- ibee_cli-0.2.0/src/ibee_cli/helpers.py +0 -106
- ibee_cli-0.2.0/src/ibee_cli/main.py +0 -49
- ibee_cli-0.2.0/src/ibee_cli/render.py +0 -64
- ibee_cli-0.2.0/src/ibee_cli.egg-info/PKG-INFO +0 -119
- ibee_cli-0.2.0/src/ibee_cli.egg-info/SOURCES.txt +0 -22
- ibee_cli-0.2.0/tests/test_cli.py +0 -34
- {ibee_cli-0.2.0 → ibee_cli-0.4.0}/LICENSE +0 -0
- {ibee_cli-0.2.0 → ibee_cli-0.4.0}/setup.cfg +0 -0
- {ibee_cli-0.2.0 → ibee_cli-0.4.0}/src/ibee_cli/commands/__init__.py +0 -0
- {ibee_cli-0.2.0 → ibee_cli-0.4.0}/src/ibee_cli.egg-info/dependency_links.txt +0 -0
- {ibee_cli-0.2.0 → ibee_cli-0.4.0}/src/ibee_cli.egg-info/entry_points.txt +0 -0
- {ibee_cli-0.2.0 → ibee_cli-0.4.0}/src/ibee_cli.egg-info/top_level.txt +0 -0
ibee_cli-0.4.0/PKG-INFO
ADDED
|
@@ -0,0 +1,622 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ibee-cli
|
|
3
|
+
Version: 0.4.0
|
|
4
|
+
Summary: Official command-line interface for the IBEE Solutions cloud platform
|
|
5
|
+
Author-email: IBEE Solutions <support@ibee.ai>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://ibee.ai
|
|
8
|
+
Project-URL: Documentation, https://ibee.ai/docs/api-reference
|
|
9
|
+
Project-URL: Repository, https://github.com/devs-ibee/ibee-cli
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Requires-Python: >=3.10
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
License-File: LICENSE
|
|
16
|
+
Requires-Dist: ibee<0.5.0,>=0.4.0
|
|
17
|
+
Requires-Dist: httpx>=0.27
|
|
18
|
+
Requires-Dist: typer>=0.12
|
|
19
|
+
Requires-Dist: click>=8.1
|
|
20
|
+
Requires-Dist: rich>=13.0
|
|
21
|
+
Provides-Extra: dev
|
|
22
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
23
|
+
Requires-Dist: build; extra == "dev"
|
|
24
|
+
Dynamic: license-file
|
|
25
|
+
|
|
26
|
+
# IBEE Solutions CLI
|
|
27
|
+
|
|
28
|
+
Official command-line interface for the IBEE Solutions cloud platform. Built on the [`ibee` Python SDK](https://github.com/devs-ibee/ibee-python).
|
|
29
|
+
|
|
30
|
+
## Installation
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pip install ibee-cli
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Requires Python 3.10+.
|
|
37
|
+
|
|
38
|
+
## Authentication
|
|
39
|
+
|
|
40
|
+
Create an API token in the portal under **Settings > API Tokens**, then:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
export IBEE_TOKEN="ibee_prod_key_xxxxxxxxxxxx"
|
|
44
|
+
export IBEE_WORKSPACE_ID="710995"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Both can also be passed per command with `--token` and `--workspace`.
|
|
48
|
+
|
|
49
|
+
## Usage
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# Object storage (region defaults to in-south-1 on api.ibee.ai, in-south-2 on api.ibee.co.in)
|
|
53
|
+
ibee buckets list
|
|
54
|
+
ibee buckets list --all
|
|
55
|
+
ibee buckets create my-bucket
|
|
56
|
+
ibee buckets create locked-bucket --retention-mode GOVERNANCE --retention-days 30
|
|
57
|
+
ibee buckets get my-bucket
|
|
58
|
+
ibee buckets update my-bucket --public
|
|
59
|
+
ibee buckets update my-bucket --private --yes # removes its CDN distribution
|
|
60
|
+
ibee buckets delete my-bucket --yes # empty buckets only
|
|
61
|
+
|
|
62
|
+
# S3-compatible credentials (secret_access_key is shown only at creation)
|
|
63
|
+
ibee buckets credentials list
|
|
64
|
+
ibee buckets credentials create --name deploy # admin_rw, all buckets
|
|
65
|
+
ibee buckets credentials create \
|
|
66
|
+
--name backups --permission-type object_rw \
|
|
67
|
+
--bucket-scope specific --allowed-bucket my-bucket
|
|
68
|
+
ibee buckets credentials get ACCESS_KEY_ID
|
|
69
|
+
ibee buckets credentials delete ACCESS_KEY_ID --yes # permanent (alias: revoke)
|
|
70
|
+
|
|
71
|
+
# Secret Store — stores (archived stores are listed too; --active-only hides them)
|
|
72
|
+
ibee secrets stores list [--active-only] [--page N --limit N | --all]
|
|
73
|
+
ibee secrets stores create production-secrets --description "prod" [--if-exists reuse]
|
|
74
|
+
ibee secrets stores get STORE_ID
|
|
75
|
+
ibee secrets stores update STORE_ID --name renamed
|
|
76
|
+
ibee secrets stores archive STORE_ID --yes
|
|
77
|
+
ibee secrets stores unarchive STORE_ID [--yes]
|
|
78
|
+
ibee secrets stores delete-permanent STORE_ID --yes
|
|
79
|
+
|
|
80
|
+
# Secret Store — secrets
|
|
81
|
+
ibee secrets list --store-id STORE_ID [--query db] [--all]
|
|
82
|
+
ibee secrets create --store-id STORE_ID --name db-url --value '{"url":"postgres://..."}'
|
|
83
|
+
ibee secrets batch-create --store-id STORE_ID --file secrets.json # any size; split into 500-item / 64 KiB requests
|
|
84
|
+
ibee secrets get SECRET_ID # metadata
|
|
85
|
+
ibee secrets value SECRET_ID # current value
|
|
86
|
+
ibee secrets set-value SECRET_ID --value '{"url":"postgres://new"}' [--cas 3]
|
|
87
|
+
ibee secrets patch-value SECRET_ID --value '{"old_key":null,"new_key":"x"}'
|
|
88
|
+
ibee -o table secrets versions SECRET_ID
|
|
89
|
+
ibee secrets rollback SECRET_ID --version 2
|
|
90
|
+
ibee secrets delete SECRET_ID --yes
|
|
91
|
+
ibee secrets undelete SECRET_ID # restores the current version
|
|
92
|
+
|
|
93
|
+
# Secret Store — application identities and their store access
|
|
94
|
+
ibee secrets identities create --store-id STORE_ID --name worker --auth-method approle
|
|
95
|
+
ibee secrets identities access IDENTITY_ID --show-sensitive
|
|
96
|
+
ibee secrets identities rotate-secret-id IDENTITY_ID --show-sensitive
|
|
97
|
+
ibee secrets identities scopes create IDENTITY_ID --store-id OTHER_STORE_ID \
|
|
98
|
+
--access-mode read_write --allow-rollback
|
|
99
|
+
|
|
100
|
+
# Compute catalog (discover placement / plans / images for `create`)
|
|
101
|
+
ibee compute sites
|
|
102
|
+
ibee compute plans --vm-type cloud
|
|
103
|
+
ibee compute images --vm-type gpu
|
|
104
|
+
|
|
105
|
+
# Billing admission (SKU must come from an IBEE product catalog)
|
|
106
|
+
ibee billing eligibility --sku-code PLAN_SKU
|
|
107
|
+
ibee -o table billing eligibility --sku-code PLAN_SKU --require
|
|
108
|
+
|
|
109
|
+
# Standalone Block Storage
|
|
110
|
+
ibee block-storage list --all
|
|
111
|
+
ibee block-storage create data --size-gb 100 --site-id SITE_ID
|
|
112
|
+
ibee block-storage create gpu-data --size-gb 500 --site-id SITE_ID --vm-type gpu
|
|
113
|
+
ibee block-storage get VOLUME_ID
|
|
114
|
+
ibee block-storage operations VOLUME_ID --limit 50
|
|
115
|
+
ibee block-storage attach-vm VOLUME_ID VM_ID --wait
|
|
116
|
+
ibee block-storage detach-vm VOLUME_ID --confirm-unmounted --wait
|
|
117
|
+
ibee block-storage resize VOLUME_ID --new-size-gb 200 --vm-state stopped
|
|
118
|
+
ibee block-storage delete VOLUME_ID --yes
|
|
119
|
+
|
|
120
|
+
# CDN
|
|
121
|
+
ibee cdn list
|
|
122
|
+
ibee cdn create assets --origin-id BUCKET_NAME # the bucket must be public
|
|
123
|
+
ibee cdn get DISTRIBUTION_ID
|
|
124
|
+
ibee cdn update DISTRIBUTION_ID --cache-policy media
|
|
125
|
+
ibee cdn metrics DISTRIBUTION_ID --range 7d
|
|
126
|
+
ibee cdn website set DISTRIBUTION_ID --index-document index.html
|
|
127
|
+
ibee cdn domains create DISTRIBUTION_ID static.example.com
|
|
128
|
+
ibee cdn domains verify DISTRIBUTION_ID static.example.com --wait
|
|
129
|
+
ibee cdn purge DISTRIBUTION_ID --mode url --path /index.html --path /app.js
|
|
130
|
+
ibee cdn purge DISTRIBUTION_ID --mode all --yes
|
|
131
|
+
ibee cdn generate-url BUCKET_NAME path/to/object.jpg --expires-in 3600
|
|
132
|
+
ibee cdn delete DISTRIBUTION_ID --yes
|
|
133
|
+
|
|
134
|
+
# Cloud VMs
|
|
135
|
+
ibee vms list
|
|
136
|
+
ibee vms get VM_ID
|
|
137
|
+
ibee vms create web-01 --site-id SITE_ID --plan-id PLAN_ID --template-id IMAGE_ID \
|
|
138
|
+
--ssh-key-file ~/.ssh/id_ed25519.pub --wait
|
|
139
|
+
ibee vms create web --count 3 --site-id SITE_ID --plan-id PLAN_ID --template-id IMAGE_ID \
|
|
140
|
+
--billing-term MONTHLY --firewall-group-id FIREWALL_GROUP_ID \
|
|
141
|
+
--vpc-id VPC_ID --subnet-id SUBNET_ID --network-connectivity nat
|
|
142
|
+
ibee vms start VM_ID
|
|
143
|
+
ibee vms stop VM_ID
|
|
144
|
+
ibee vms reboot VM_ID
|
|
145
|
+
ibee vms metrics VM_ID
|
|
146
|
+
ibee vms metrics-timeseries VM_ID --range 24h
|
|
147
|
+
ibee vms bandwidth VM_ID # current UTC month; --month 2026-08 for another
|
|
148
|
+
ibee vms events VM_ID --limit 50
|
|
149
|
+
|
|
150
|
+
# Access credentials. Passwords are never accepted as command arguments.
|
|
151
|
+
printf '%s\n' "$NEW_VM_PASSWORD" | ibee vms access-update VM_ID --password-stdin --wait
|
|
152
|
+
ibee vms access-update VM_ID --prompt-password --enable-password-auth --wait
|
|
153
|
+
ibee vms access-update VM_ID --ssh-key-mode add --ssh-key-file ~/.ssh/id_ed25519.pub --wait
|
|
154
|
+
|
|
155
|
+
# Resize and persistent block volumes
|
|
156
|
+
ibee vms resize-precheck VM_ID --plan-id PLAN_ID
|
|
157
|
+
ibee vms resize VM_ID --plan-id PLAN_ID --billing-term HOURLY --wait
|
|
158
|
+
ibee vms resize VM_ID --cpu 4 --ram-mb 8192 --disk-gb 80 --wait
|
|
159
|
+
ibee vms resize-plan VM_ID --cpu 8 --ram-mb 16384 --confirm-downgrade --wait
|
|
160
|
+
ibee vms resize-root-disk VM_ID --new-size-gb 120 --wait
|
|
161
|
+
ibee vms volume-attach VM_ID VOLUME_ID --mode single-writer --wait
|
|
162
|
+
ibee vms mount-guidance-acknowledge VM_ID VOLUME_ID
|
|
163
|
+
ibee vms volume-detach VM_ID VOLUME_ID --confirm-unmounted --yes --wait
|
|
164
|
+
|
|
165
|
+
# Snapshots and restores
|
|
166
|
+
ibee vms snapshots list VM_ID
|
|
167
|
+
ibee vms snapshots create VM_ID before-upgrade --mode all_attached \
|
|
168
|
+
--billing-catalog-file snapshot-sku.json --wait
|
|
169
|
+
ibee vms snapshots get SNAPSHOT_SET_ID
|
|
170
|
+
ibee vms snapshots restore VM_ID SNAPSHOT_SET_ID \
|
|
171
|
+
--target-mode new_vm --target-plan-id PLAN_ID --target-vm-name restored-web --yes --wait
|
|
172
|
+
ibee vms snapshots restore-status RESTORE_ID --wait
|
|
173
|
+
ibee vms snapshots delete SNAPSHOT_SET_ID --yes
|
|
174
|
+
|
|
175
|
+
# Automated backup policy and manual backup runs
|
|
176
|
+
ibee vms backup-policy get VM_ID
|
|
177
|
+
ibee vms backup-policy enable VM_ID --billing-catalog-file backup-sku.json \
|
|
178
|
+
--frequency daily --timezone Asia/Kolkata --hour 2 --retention-days 30
|
|
179
|
+
ibee vms backup-policy update VM_ID --frequency weekly --day-of-week 6
|
|
180
|
+
ibee vms backup-policy reschedule VM_ID --next-run-at 2026-08-10T02:00:00Z
|
|
181
|
+
ibee vms backup-policy disable VM_ID
|
|
182
|
+
ibee vms backups list VM_ID --restorable-only
|
|
183
|
+
ibee vms backups list-all --status succeeded
|
|
184
|
+
ibee vms backups create VM_ID --billing-catalog-file backup-sku.json --reason before-release --wait
|
|
185
|
+
ibee vms backups get BACKUP_RUN_ID
|
|
186
|
+
ibee vms backups restore VM_ID RECOVERY_POINT_ID --target-mode replace --yes
|
|
187
|
+
ibee vms backups restore-status RESTORE_ID --wait
|
|
188
|
+
ibee vms backups delete BACKUP_RUN_ID --yes
|
|
189
|
+
ibee vms delete VM_ID --wait # asks: keep the public IP as a Reserved IP?
|
|
190
|
+
ibee vms delete VM_ID --yes --release-public-ip --wait
|
|
191
|
+
|
|
192
|
+
# GPU VMs expose the same lifecycle, snapshot, backup, metrics, and volume commands
|
|
193
|
+
ibee gpus list
|
|
194
|
+
ibee gpus create train-01 --site-id SITE_ID --plan-id PLAN_ID --template-id IMAGE_ID \
|
|
195
|
+
--ssh-key-file ~/.ssh/id_ed25519.pub --wait
|
|
196
|
+
ibee gpus start VM_ID
|
|
197
|
+
ibee gpus stop VM_ID
|
|
198
|
+
ibee gpus reboot VM_ID
|
|
199
|
+
ibee gpus metrics VM_ID
|
|
200
|
+
ibee gpus resize-precheck VM_ID --cpu 16 --ram-mb 65536
|
|
201
|
+
ibee gpus snapshots create VM_ID before-training --mode root_only
|
|
202
|
+
ibee gpus backup-policy enable VM_ID --billing-catalog-file backup-sku.json \
|
|
203
|
+
--frequency weekly --day-of-week 6 --retention-days 14
|
|
204
|
+
ibee gpus delete VM_ID --yes
|
|
205
|
+
|
|
206
|
+
# Short-lived graphical console sessions (cloud VMs that are running)
|
|
207
|
+
ibee console create VM_ID --vm-type cloud
|
|
208
|
+
ibee console get SESSION_ID
|
|
209
|
+
ibee console close SESSION_ID --yes
|
|
210
|
+
|
|
211
|
+
# Async operations — poll a create/delete/power action to completion
|
|
212
|
+
ibee ops get OPERATION_ID
|
|
213
|
+
ibee ops wait OPERATION_ID --timeout 1800 --poll-interval 10
|
|
214
|
+
|
|
215
|
+
# VPCs (private by default; --connectivity nat_gateway adds a managed NAT gateway)
|
|
216
|
+
ibee vpcs sites --available-only
|
|
217
|
+
ibee vpcs list
|
|
218
|
+
ibee vpcs create production --site-id SITE_ID --cidr 10.44.0.0/22
|
|
219
|
+
ibee vpcs create egress --site-id SITE_ID --connectivity nat_gateway \
|
|
220
|
+
--nat-billing-catalog-file nat-gateway-sku.json
|
|
221
|
+
ibee vpcs get VPC_ID
|
|
222
|
+
ibee vpcs update VPC_ID --name production-apps
|
|
223
|
+
ibee vpcs delete VPC_ID --yes
|
|
224
|
+
ibee vpcs delete VPC_ID --delete-nat-gateway --nat-ip-action release --yes
|
|
225
|
+
|
|
226
|
+
# Subnets and VM attachments
|
|
227
|
+
ibee vpcs subnets list VPC_ID
|
|
228
|
+
ibee vpcs subnets create VPC_ID services --cidr 10.44.1.0/24
|
|
229
|
+
ibee vpcs subnets update VPC_ID SUBNET_ID --dns 1.1.1.1 --dns 8.8.8.8
|
|
230
|
+
ibee vpcs nodes list VPC_ID
|
|
231
|
+
ibee vpcs nodes attach VPC_ID VM_ID --subnet-id SUBNET_ID --private-ip 10.44.1.20
|
|
232
|
+
ibee vpcs nodes detach VPC_ID VM_ID --yes
|
|
233
|
+
|
|
234
|
+
# NAT and port forwarding
|
|
235
|
+
ibee vpcs nat list VPC_ID
|
|
236
|
+
ibee vpcs nat create VPC_ID --reserved-ip-id RESERVED_IP_ID --billing-catalog-file nat-gateway-sku.json
|
|
237
|
+
ibee vpcs nat replace-ip VPC_ID NAT_GATEWAY_ID --reserved-ip-id RESERVED_IP_ID
|
|
238
|
+
ibee vpcs nat delete VPC_ID NAT_GATEWAY_ID --ip-action release --wait --yes
|
|
239
|
+
ibee vpcs forwarding list VPC_ID NAT_GATEWAY_ID
|
|
240
|
+
ibee vpcs forwarding create VPC_ID NAT_GATEWAY_ID ssh \
|
|
241
|
+
--external-port 2222 --internal-ip 10.44.0.10 --internal-port 22
|
|
242
|
+
ibee vpcs forwarding create VPC_ID NAT_GATEWAY_ID web \
|
|
243
|
+
--external-port 443 --internal-ip 10.44.0.50 --internal-port 443 --target vip
|
|
244
|
+
ibee vpcs forwarding update VPC_ID NAT_GATEWAY_ID RULE_ID --external-port 2200
|
|
245
|
+
ibee vpcs forwarding disable VPC_ID NAT_GATEWAY_ID RULE_ID
|
|
246
|
+
|
|
247
|
+
# Virtual IPs (MetalLB) in a VPC subnet
|
|
248
|
+
ibee vpcs virtual-ips list VPC_ID
|
|
249
|
+
ibee vpcs virtual-ips create VPC_ID --subnet-id SUBNET_ID --private-ip 10.44.0.50 \
|
|
250
|
+
--announcer-vm-id VM_1 --announcer-vm-id VM_2
|
|
251
|
+
ibee vpcs virtual-ips attach-ip VPC_ID VIRTUAL_IP_ID --reserved-ip-id RESERVED_IP_ID
|
|
252
|
+
ibee vpcs virtual-ips detach-ip VPC_ID VIRTUAL_IP_ID --yes
|
|
253
|
+
ibee vpcs virtual-ips delete VPC_ID VIRTUAL_IP_ID --yes
|
|
254
|
+
|
|
255
|
+
# Reserved public IPs
|
|
256
|
+
ibee reserved-ips list --site-id SITE_ID
|
|
257
|
+
ibee reserved-ips reserve --site-id SITE_ID --label edge --billing-catalog-file reserved-ip-sku.json
|
|
258
|
+
ibee reserved-ips convert --vm-id VM_ID --site-id SITE_ID --label web
|
|
259
|
+
ibee reserved-ips update RESERVED_IP_ID --reverse-dns app.example.com
|
|
260
|
+
ibee reserved-ips attach RESERVED_IP_ID VM_ID --vpc-id VPC_ID --subnet-id SUBNET_ID
|
|
261
|
+
ibee reserved-ips attach-virtual-ip RESERVED_IP_ID --virtual-ip-id VIRTUAL_IP_ID
|
|
262
|
+
ibee reserved-ips detach RESERVED_IP_ID
|
|
263
|
+
ibee reserved-ips move RESERVED_IP_ID NEW_VM_ID --vpc-id VPC_ID --subnet-id SUBNET_ID
|
|
264
|
+
ibee reserved-ips release RESERVED_IP_ID --yes
|
|
265
|
+
|
|
266
|
+
# Firewall groups, rules, and attachments
|
|
267
|
+
ibee firewalls list --summary
|
|
268
|
+
ibee firewalls create web --description "Web ingress"
|
|
269
|
+
ibee firewalls rules create FIREWALL_GROUP_ID --protocol tcp --port 443 --source 0.0.0.0/0
|
|
270
|
+
ibee firewalls rules create FIREWALL_GROUP_ID --protocol tcp --port 8000-8080 --source 10.0.0.0/8,192.168.1.10
|
|
271
|
+
ibee firewalls rules update FIREWALL_GROUP_ID RULE_ID --disabled
|
|
272
|
+
ibee firewalls attachments list FIREWALL_GROUP_ID
|
|
273
|
+
ibee firewalls attachments attach FIREWALL_GROUP_ID VM_ID
|
|
274
|
+
ibee firewalls attachments detach FIREWALL_GROUP_ID VM_ID --yes
|
|
275
|
+
|
|
276
|
+
# L4 and L7 load balancers
|
|
277
|
+
ibee load-balancers list --layer l7
|
|
278
|
+
ibee load-balancers create-l4 tcp-edge --backend ip:10.44.0.10:443 --health-check-type tcp
|
|
279
|
+
ibee load-balancers create-l7 web \
|
|
280
|
+
--protocol https \
|
|
281
|
+
--backend service:api:8080 --backend service:api-canary:8080:10 \
|
|
282
|
+
--algorithm least_request --timeout-ms 30000 --retries 3 \
|
|
283
|
+
--health-check-type http --health-check-path /health \
|
|
284
|
+
--rule 1:/ --rule 2:/api:X-Env=beta \
|
|
285
|
+
--custom-domain app.example.com
|
|
286
|
+
ibee load-balancers update-l7 LOAD_BALANCER_ID --name public-web --clear-custom-domain
|
|
287
|
+
ibee load-balancers status LOAD_BALANCER_ID
|
|
288
|
+
ibee load-balancers delete LOAD_BALANCER_ID --yes
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
Create/delete/power, access, resize, and volume actions are asynchronous; add
|
|
292
|
+
`--wait` to block until the operation finishes (default timeout 1200 s, polling
|
|
293
|
+
every 5 s; change with `--timeout` and `--poll-interval`), or wait later with
|
|
294
|
+
`ibee ops wait OPERATION_ID`.
|
|
295
|
+
|
|
296
|
+
Snapshot and backup restores can replace a VM, create a new VM, or restore one
|
|
297
|
+
volume. They require `--yes` (or an interactive confirmation). Run the command
|
|
298
|
+
with `--help` to see placement, plan, GPU, bandwidth, and selected-volume restore
|
|
299
|
+
options. Snapshot deletion and volume detachment use the same confirmation rule.
|
|
300
|
+
|
|
301
|
+
`access-update` never accepts a password value in the command line, so passwords
|
|
302
|
+
do not appear in shell history or process listings. Use `--prompt-password` for
|
|
303
|
+
an interactive hidden prompt, or pipe one line to `--password-stdin`.
|
|
304
|
+
|
|
305
|
+
Bucket and VM placement are automatic when `--site-id` is omitted. Use
|
|
306
|
+
`ibee compute sites` and pass `--site-id` only when placement must be pinned.
|
|
307
|
+
|
|
308
|
+
Billable creates send one product request. The public gateway performs the
|
|
309
|
+
authoritative, fail-closed billing decision before routing; a valid denial is
|
|
310
|
+
returned without calling the product service. `ibee billing eligibility`
|
|
311
|
+
remains available as an optional point-in-time preview, and the global
|
|
312
|
+
`--check-billing` flag (or `IBEE_CHECK_BILLING=1`) runs the portal's preflight
|
|
313
|
+
before a billable create: the create is sent only when billing answers
|
|
314
|
+
`allowed: true`, otherwise the portal's explanation is printed (with top-up
|
|
315
|
+
guidance when adding credits in the portal can resolve it) and the command
|
|
316
|
+
exits 1. The preflight never reserves funds.
|
|
317
|
+
|
|
318
|
+
Load balancers take backends, routing, policy, health checks and L7 rules either
|
|
319
|
+
as flags (`--backend TYPE:TARGET:PORT[:WEIGHT][:tls]`, `--rule
|
|
320
|
+
PRIORITY:PATH_PREFIX[:HEADER=VALUE]`, ...) or as JSON (`--backends`, `--routing`,
|
|
321
|
+
`--policy`, `--health-check`, `--rules`) matching the
|
|
322
|
+
[API reference](https://ibee.ai/docs/api-reference).
|
|
323
|
+
|
|
324
|
+
## VM rules the CLI applies
|
|
325
|
+
|
|
326
|
+
The VM commands follow the IBEE portal. The Python SDK checks these rules before
|
|
327
|
+
anything is sent, and a broken rule exits 2:
|
|
328
|
+
|
|
329
|
+
- **Create** needs `--site-id`. The plan and image are looked up for that site:
|
|
330
|
+
the plan must be selectable and priced, and CPU, RAM, disk, GPU model and count
|
|
331
|
+
and OS come from the plan and image (values you pass must match them). The plan's
|
|
332
|
+
billing SKU is sent for `--billing-term` (cloud VMs default to `HOURLY`; GPU VMs
|
|
333
|
+
send the plan SKU unchanged unless you pass a term). Hostnames use letters,
|
|
334
|
+
digits and `-`. `--count 2..5` creates `NAME-1..NAME-N` (or `--instance-name`
|
|
335
|
+
overrides), one request and idempotency key per VM, stopping at the first error.
|
|
336
|
+
Inline `--ssh-key`/`--ssh-key-file` public keys are recommended: saved
|
|
337
|
+
`--ssh-key-id` keys resolve only for portal users. At most one
|
|
338
|
+
`--firewall-group-id`. `--network-connectivity` needs `--vpc-id` and
|
|
339
|
+
`--subnet-id`: `nat` needs a NAT Gateway VPC, and `public_ip` on a private VPC
|
|
340
|
+
needs an unattached `--reserved-public-ip-id` in the same site (one VM only).
|
|
341
|
+
- **Windows images** need `--windows-license` (the Windows licence SKU as JSON,
|
|
342
|
+
priced per vCPU). The public API cannot list that SKU yet.
|
|
343
|
+
- **Delete** asks whether to keep an auto-assigned public IP as a Reserved IP
|
|
344
|
+
(default: release; `--yes` releases). Reserving needs
|
|
345
|
+
`--reserved-ip-billing-catalog`, the Reserved IP SKU, which you can copy from
|
|
346
|
+
the `billing_catalog` of a Reserved IP in the same site. Attached data volumes
|
|
347
|
+
are detached and kept.
|
|
348
|
+
- **State checks** (on by default; `--no-check-state` skips them): start needs a
|
|
349
|
+
stopped VM; stop, reboot, access-update and console need a running VM; resizes
|
|
350
|
+
and volume attach/detach need running, stopped or error; delete is refused while
|
|
351
|
+
the VM is being deleted or resized.
|
|
352
|
+
- **Resize** with `--plan-id` runs the precheck first and resizes only when it can
|
|
353
|
+
run in place, sending the new plan's SKU (a Windows VM keeps its licence).
|
|
354
|
+
`resize-plan` rejects an unchanged shape and needs `--confirm-downgrade` to shrink;
|
|
355
|
+
`resize-root-disk` only grows (up to 10000 GB).
|
|
356
|
+
- **Access updates** are for Linux VMs; new passwords need 8 or more characters;
|
|
357
|
+
disabling password login needs an SSH key left on the VM.
|
|
358
|
+
- **Volumes**: `volume-attach` reads the volume (it must be unattached, idle and in
|
|
359
|
+
the VM's site) and sends its Block Storage SKU; `volume-detach` needs
|
|
360
|
+
`--confirm-unmounted` or `--force`.
|
|
361
|
+
- **Snapshots and backups** are billed: `snapshots create`, `backup-policy enable`
|
|
362
|
+
and `backups create` need `--billing-catalog` (or `--billing-catalog-file`), the
|
|
363
|
+
`snapshot_storage` SKU (code `SNAPSHOT-STD`) or `backup_storage` SKU (code
|
|
364
|
+
`BACKUP-STD`). The public API cannot list these SKUs yet; copy `billing_catalog`
|
|
365
|
+
from an existing snapshot set or backup run. Backup schedules are daily or weekly
|
|
366
|
+
(`--day-of-week` 0 = Monday, required for weekly) in an IANA time zone.
|
|
367
|
+
- **Restores**: `--target-mode new_vm` resolves the plan (default: the VM's plan,
|
|
368
|
+
which must fit the captured root disk), its SKU and default names;
|
|
369
|
+
`volume_only` needs `--selected-volume-id`. `--wait` on snapshot, backup and
|
|
370
|
+
restore commands polls every 5 s for up to 30 minutes by default.
|
|
371
|
+
- `backups list-all` and `backups delete` need the backend release that provides
|
|
372
|
+
them: available on the development environment (`--dev`) today; production
|
|
373
|
+
returns 404/405 until then. They are not yet part of the published API contract;
|
|
374
|
+
behaviour may change.
|
|
375
|
+
- `backups restore` accepts a backup run ID or a recovery point ID; the run is always
|
|
376
|
+
read first and the recovery point ID it reports is sent.
|
|
377
|
+
|
|
378
|
+
## Networking rules the CLI applies
|
|
379
|
+
|
|
380
|
+
The networking commands call the Python SDK, which applies the portal's rules before
|
|
381
|
+
anything is sent; a broken rule exits 2. `--check-state/--no-check-state` (default
|
|
382
|
+
on) controls the read-only checks that need the current state.
|
|
383
|
+
|
|
384
|
+
- **VPC create** defaults to `--connectivity private` (the portal default; 0.3.0
|
|
385
|
+
sent `public`, which is now deprecated and prints a warning). Names are 1-80
|
|
386
|
+
characters. A custom `--cidr` must be aligned (the error suggests the aligned
|
|
387
|
+
network), /22 to /28, and inside 10.0.0.0/8, 172.16.0.0/12 or 192.168.0.0/16;
|
|
388
|
+
`--cidr` sends `auto_cidr=false`. The site is checked with `vpcs sites` first
|
|
389
|
+
(`--no-check-site` skips it). A `nat_gateway` VPC should carry
|
|
390
|
+
`--nat-billing-catalog` (the NAT-GATEWAY SKU); without it a warning says the
|
|
391
|
+
gateway will not be metered.
|
|
392
|
+
- **VPC delete** is refused while nodes are attached, a NAT gateway exists (unless
|
|
393
|
+
`--delete-nat-gateway`, which deletes it and waits up to 10 s first) or virtual
|
|
394
|
+
IPs remain. The Python SDK runs these checks after the confirmation and before
|
|
395
|
+
anything is deleted (virtual IPs are checked before the NAT gateway is deleted). If
|
|
396
|
+
the NAT gateway is still reconciling when the wait ends, the command exits 1 with a
|
|
397
|
+
retry hint.
|
|
398
|
+
- **Subnets** must lie inside the VPC CIDR, not overlap other subnets, be /29 or
|
|
399
|
+
larger, and a VPC holds at most 10. `--cidr` and `--prefix-length` are exclusive.
|
|
400
|
+
- **Node attach** `--private-ip` must be a usable host of the subnet (not its
|
|
401
|
+
network, broadcast or gateway address). `nat` needs a `nat_gateway` VPC with an
|
|
402
|
+
available NAT gateway; `public_ip` is not allowed in a `nat_gateway` VPC and needs
|
|
403
|
+
`--reserved-ip-id` in a private VPC. Without `--connectivity` the API picks `nat`
|
|
404
|
+
in a `nat_gateway` VPC. This creates the network allocation only; the portal's
|
|
405
|
+
VM-side attach and detach are not yet in the public API.
|
|
406
|
+
- **NAT gateways** exist only in `nat_gateway` VPCs (one per VPC; `nat create`
|
|
407
|
+
prints the existing one instead of sending a create). A Reserved IP must be in
|
|
408
|
+
the VPC's site, unattached and `reserved`. `--preflight` (or `--check-billing`)
|
|
409
|
+
checks NAT-GATEWAY eligibility first. `nat delete` shows how many NAT VMs lose
|
|
410
|
+
outbound internet and how many forwarding rules are deleted before it asks;
|
|
411
|
+
`--ip-action reserve` of a platform-assigned IP needs `--billing-catalog` (the
|
|
412
|
+
RESERVED-IP SKU); deletion is refused while a virtual IP holds a Reserved IP.
|
|
413
|
+
- **Port forwarding** uses single ports 1-65535 (no ranges) and tcp or udp; a
|
|
414
|
+
protocol and external port pair may appear once per gateway. The gateway must be
|
|
415
|
+
available; `--target vm` needs the private IP of a NAT-connected VM, `--target
|
|
416
|
+
vip` the private IP of an available MetalLB virtual IP (announcers default to
|
|
417
|
+
the virtual IP's).
|
|
418
|
+
- **Virtual IPs** need a usable host address of the subnet and, for MetalLB, 1-32
|
|
419
|
+
NAT-connected announcer VMs in the same subnet. Delete is refused while a
|
|
420
|
+
Reserved IP is attached or a forwarding rule targets the address.
|
|
421
|
+
- **Reserved IPs**: labels up to 120 characters; reverse DNS a valid hostname up to
|
|
422
|
+
253 characters (`--reverse-dns ""` clears it); `release` is refused while
|
|
423
|
+
attached; `attach` is for unattached IPs (`move` for an IP on another VM,
|
|
424
|
+
`--detach-from-service` for one on a NAT gateway or virtual IP); an attach to a VM
|
|
425
|
+
outside a VPC points at `reserved-ips convert`. `convert` runs the RESERVED-IP
|
|
426
|
+
billing check first (`--no-billing-check` skips it; it needs `billing.read`).
|
|
427
|
+
- **Firewalls**: group names are unique in any case (1-120 characters) and
|
|
428
|
+
customers cannot create default groups. Rules: tcp and udp need `--port` (22 or
|
|
429
|
+
8000-8080), icmp and any take none; sources are IPv4 addresses or CIDRs (a bare
|
|
430
|
+
IP becomes /32; default 0.0.0.0/0). System-managed rules cannot be changed.
|
|
431
|
+
Attaching a group replaces the VM's current custom group; detaching restores the
|
|
432
|
+
default group.
|
|
433
|
+
- **Load balancers**: names 1-128 characters; https and tls_passthrough get the
|
|
434
|
+
managed certificate automatically; custom certificates are refused; sticky
|
|
435
|
+
sessions and path rules are L7 only; `--custom-domain` needs https and a CNAME
|
|
436
|
+
already pointing at IBEE. Policy and health-check options fill unspecified values
|
|
437
|
+
with the portal defaults (timeout 30000 ms, 3 retries at 5000 ms; health check
|
|
438
|
+
http `/health` every 10000 ms, timeout 2000 ms, thresholds 2 and 3).
|
|
439
|
+
- Billing catalogs (`--billing-catalog`, `--nat-billing-catalog`) cannot be looked
|
|
440
|
+
up through the public API yet; copy them from your IBEE pricing, for example the
|
|
441
|
+
`billing_catalog` of an existing Reserved IP or NAT gateway in the same site.
|
|
442
|
+
- Virtual IPs, `nat replace-ip`, `reserved-ips convert` and `attach-virtual-ip`,
|
|
443
|
+
`firewalls list --summary`, `--include-deleted`, `--private-ip`, the forwarding
|
|
444
|
+
`--target` options and the load-balancer policy, health-check and logs options
|
|
445
|
+
are not yet part of the published API contract; behaviour may change.
|
|
446
|
+
|
|
447
|
+
## Storage rules the CLI applies
|
|
448
|
+
|
|
449
|
+
The Block Storage, Object Storage and CDN commands call the Python SDK, which applies
|
|
450
|
+
the portal's rules before anything is sent; a broken rule exits 2. Where a command asks
|
|
451
|
+
for confirmation, the read-only checks run first (`--no-check-state` skips them).
|
|
452
|
+
|
|
453
|
+
- **Block Storage volumes**: names are 3-255 lowercase letters, numbers and hyphens
|
|
454
|
+
(the error suggests a valid name; nothing is renamed silently); sizes are whole GB,
|
|
455
|
+
10-10000 (the site's plan may allow only some sizes); volume IDs are 24 hexadecimal
|
|
456
|
+
characters. `create` reads the compute sites to fill the site name and rejects an
|
|
457
|
+
unknown `--site-id` (`--no-check-site` skips it). `--vm-type gpu` creates a volume
|
|
458
|
+
for GPU VMs: a volume attaches only to VMs of the type it was created for.
|
|
459
|
+
- **Attach and detach** a volume to a server with `attach-vm` / `detach-vm` (or
|
|
460
|
+
`ibee vms|gpus volume-attach|volume-detach`). `attach-vm` reads the volume: it must
|
|
461
|
+
be unattached and idle, created for the VM's type (which picks the cloud or GPU
|
|
462
|
+
endpoint) and in the VM's site; the volume's Block Storage SKU is sent as the
|
|
463
|
+
billing catalog. `detach-vm` needs `--confirm-unmounted` (unmount inside the server
|
|
464
|
+
first) or `--force` (asks again), and finds the VM from the volume when omitted.
|
|
465
|
+
`--wait` polls like the portal: every 2 s, up to 120 s. `attach` and `detach` are
|
|
466
|
+
advanced storage-node commands that do not attach the disk to a VM.
|
|
467
|
+
- **Resize** grows only; an attached volume needs `--vm-state stopped|suspended` or
|
|
468
|
+
`--allow-online`. Extend the filesystem inside the server afterwards.
|
|
469
|
+
- **Delete** is refused while the volume is attached ("Detach this volume from all
|
|
470
|
+
servers before deleting.") or busy; `--force` detaches it everywhere and erases all
|
|
471
|
+
data (asks again).
|
|
472
|
+
- **Buckets**: names are 3-63 lowercase letters, numbers and hyphens, starting and
|
|
473
|
+
ending with a letter or number (upper case is rejected, not lower-cased). A default
|
|
474
|
+
retention (`--retention-mode GOVERNANCE|COMPLIANCE` with `--retention-days 1-36500`
|
|
475
|
+
or `--retention-years 1-100`) switches Object Lock on. `--private` asks first because
|
|
476
|
+
it disables the public URL and deletes any CDN distribution using the bucket.
|
|
477
|
+
`delete` is refused for a bucket with Object Lock or with objects
|
|
478
|
+
(`--skip-preflight` skips the object count, which can lag).
|
|
479
|
+
- **S3 credentials** default to `admin_rw` for all buckets; `--bucket-scope specific`
|
|
480
|
+
with `--allowed-bucket` is only for `object_rw`/`object_ro`. Names are 1-100
|
|
481
|
+
characters. The create is never retried, so the one-time secret cannot be lost.
|
|
482
|
+
`delete` (and `revoke`) permanently delete the credential.
|
|
483
|
+
- **CDN**: distribution names are 1-128 characters and cache policies are
|
|
484
|
+
`static-assets`, `media`, `short` or `no-cache`. `create` checks that the origin
|
|
485
|
+
bucket is public (`--no-check-origin` skips it). Custom domains are lower-cased and
|
|
486
|
+
must include a subdomain; `domains create` prints the CNAME record to add, and
|
|
487
|
+
`domains verify --wait` checks every 15 s for up to 600 s (exit 1 when it fails, 3 on
|
|
488
|
+
timeout). `purge` needs `--mode`; `--mode all` asks first; only the selector for the
|
|
489
|
+
mode is accepted (`--path` 1-30, https URLs only; `--hostname`, `--tag`, `--prefix`
|
|
490
|
+
1-100). A purge the CDN reports as failed exits 1.
|
|
491
|
+
- `--check-billing` (or `--preflight-billing`) checks OBJECTST-STD before a bucket or
|
|
492
|
+
S3 credential create and CUSTOMDO-STD before a custom domain.
|
|
493
|
+
- `block-storage create --vm-type`/`--delete-on-termination`, the Block Storage delete
|
|
494
|
+
idempotency key, `cdn cache-policies` and `cdn metrics` are not yet part of the
|
|
495
|
+
published API contract; behaviour may change. Block Storage plans, bucket emptying,
|
|
496
|
+
CORS, lifecycle rules and object operations are not in the public API yet (use the
|
|
497
|
+
S3 endpoint with S3 credentials for objects).
|
|
498
|
+
|
|
499
|
+
## Secret Store rules the CLI applies
|
|
500
|
+
|
|
501
|
+
Every `ibee secrets` command runs the Python SDK's Secret Store rules before it sends
|
|
502
|
+
anything (exit 2 when a rule fails); commands that ask for confirmation check their
|
|
503
|
+
inputs first.
|
|
504
|
+
|
|
505
|
+
- **Workspace and ids**: Secret Store needs a workspace id of 2-128 digits. Store,
|
|
506
|
+
secret, identity and scope ids must not contain `/`, `?`, `#` or control characters.
|
|
507
|
+
- **Stores**: names are trimmed, 1-128 characters, and need at least one letter or
|
|
508
|
+
digit. `stores list` includes archived stores (as the portal does) and asks for 100
|
|
509
|
+
per page; it prints a hint when there are more (`--page`, `--limit` 1-200, `--all`).
|
|
510
|
+
`stores create --if-exists reuse` returns the existing store with the same name or
|
|
511
|
+
store key instead of failing with 409. `archive` and `unarchive` read the store
|
|
512
|
+
first (`--no-check-state` skips it): an already archived or active store is left
|
|
513
|
+
alone, and a store being deleted is refused. `unarchive`, `identities disable` and
|
|
514
|
+
`identities enable` ask for confirmation only on a terminal, so scripts keep working.
|
|
515
|
+
A permanent store delete the API reports as incomplete (503) lists the failed steps;
|
|
516
|
+
run the same command again to finish it.
|
|
517
|
+
- **Secrets**: names are trimmed and lower-cased, as in the portal, then must be 2-64
|
|
518
|
+
lowercase letters, digits and hyphens starting with a letter or digit. Values need
|
|
519
|
+
at least one key; keys are trimmed and must not be blank or collide; empty string
|
|
520
|
+
values are refused. In `patch-value`, a JSON `null` deletes that key. `--cas` is an
|
|
521
|
+
integer >= 0; a check-and-set mismatch is reported as a conflict and never retried.
|
|
522
|
+
`list` sends a trimmed `--query` (at most 128 characters) only when it is not blank.
|
|
523
|
+
- **Billing**: `stores create` and `secrets create` check SECRETMA-STD eligibility
|
|
524
|
+
first, as the portal does (`--no-billing-check` turns it off; the global
|
|
525
|
+
`--check-billing` forces it on). When the token lacks `billing.read` the check is
|
|
526
|
+
skipped with a warning, because the API still enforces billing on the create.
|
|
527
|
+
- **Batch create**: every item follows the `secrets create` rules and the error names
|
|
528
|
+
its index. Duplicate names are reported (the API skips them). A file with more than
|
|
529
|
+
500 secrets or over 64 KiB is sent as consecutive requests and the results are
|
|
530
|
+
merged; the command exits 1 when any secret failed.
|
|
531
|
+
- **Versions**: version lists hold 1-100 integers >= 1 and are de-duplicated.
|
|
532
|
+
`rollback` reads the versions first and refuses the current, an unknown or a
|
|
533
|
+
destroyed version (`--no-check-state` skips the check). `undelete` without
|
|
534
|
+
`--versions` restores the current version, the one `delete` soft-deletes.
|
|
535
|
+
`-o table secrets versions` lists versions newest first as active, available,
|
|
536
|
+
soft_deleted or destroyed.
|
|
537
|
+
- **Identities**: names are trimmed, 1-128 characters. `--token-policy-mode` is always
|
|
538
|
+
sent (default `read_only`). Kubernetes identities need both `--k8s-namespace` and
|
|
539
|
+
`--k8s-service-account` (trimmed); AppRole identities must not have them.
|
|
540
|
+
`identities update` warns that every scope is rewritten and sessions are revoked.
|
|
541
|
+
`rotate-secret-id` reads the identity first and refuses anything but an active
|
|
542
|
+
AppRole identity. `access` and `rotate-secret-id` print credentials and are never
|
|
543
|
+
retried: each AppRole call issues a new secret ID and the old one is not revoked.
|
|
544
|
+
- **Scopes**: `scopes create` allows version reads by default (as the portal and the
|
|
545
|
+
API do; `--deny-version-read` turns it off). A `read_only` scope cannot allow
|
|
546
|
+
rollback or destroy. Unless `--no-check-state`, the identity, its scopes and the
|
|
547
|
+
stores are read first: the store must be active and not already granted, and a
|
|
548
|
+
`read_only` identity gets `read_only` access only.
|
|
549
|
+
- **Errors**: a missing store, secret, identity or scope (reported by the API as 403
|
|
550
|
+
"does not belong to workspace") is printed as not found; organization lifecycle
|
|
551
|
+
denials name the state and the operation; archived or inactive stores, disabled
|
|
552
|
+
identities and soft-deleted values print what to do next.
|
|
553
|
+
- Workload runtime access (AppRole or Kubernetes login and runtime secret reads) is
|
|
554
|
+
not in the public API yet.
|
|
555
|
+
|
|
556
|
+
## Global options
|
|
557
|
+
|
|
558
|
+
| Option | Environment variable | Meaning |
|
|
559
|
+
| --- | --- | --- |
|
|
560
|
+
| `--token` | `IBEE_TOKEN` (or `IBEE_API_TOKEN`) | API token |
|
|
561
|
+
| `--workspace`, `-w` | `IBEE_WORKSPACE_ID` | Workspace ID (a positive number) |
|
|
562
|
+
| `--dev` | `IBEE_ENV=dev` | Use the development environment |
|
|
563
|
+
| `--base-url` | `IBEE_BASE_URL`, `IBEE_ENDPOINT` | Custom API endpoint |
|
|
564
|
+
| `-o`, `--output` | `IBEE_OUTPUT` | `table`, `json`, `yaml` or `id` |
|
|
565
|
+
| `--json` | | Same as `-o json` |
|
|
566
|
+
| `--yes`, `-y` | `IBEE_ASSUME_YES=1` | Answer yes to every confirmation |
|
|
567
|
+
| `--check-billing` | `IBEE_CHECK_BILLING=1` | Billing preflight before billable creates |
|
|
568
|
+
|
|
569
|
+
Without `-o`, each command keeps its usual format (tables for most lists, JSON
|
|
570
|
+
for single resources and operation results). `-o yaml` prints YAML and `-o id`
|
|
571
|
+
prints one identifier per line (for an accepted operation, its `operation_id`):
|
|
572
|
+
|
|
573
|
+
```bash
|
|
574
|
+
ibee --json buckets list
|
|
575
|
+
ibee -o id vms list
|
|
576
|
+
ibee -o yaml vms get VM_ID
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
`ibee vms list`, `ibee gpus list` and `ibee firewalls list` (with or without `--summary`) fetch every page.
|
|
580
|
+
Pass `--limit`/`--offset` for a single page; the VM lists also take `--search`,
|
|
581
|
+
`--sort-by created_at|name|status|os_type` and `--sort-direction asc|desc`.
|
|
582
|
+
|
|
583
|
+
### Retries and idempotency keys
|
|
584
|
+
|
|
585
|
+
Reads, and writes that carry an idempotency key on a route that honours it (VM
|
|
586
|
+
create/delete/actions and Block Storage volume writes), are retried up to twice
|
|
587
|
+
on HTTP 429, 502, 503 and 504 and on network errors, honouring `Retry-After` (at
|
|
588
|
+
most 30 s). Other writes are never retried automatically, and 408, 409 and 500
|
|
589
|
+
are never retried. The keyed commands accept `--idempotency-key KEY` (1-128
|
|
590
|
+
printable ASCII characters); when a keyed write fails with a retryable error, or
|
|
591
|
+
`--wait` times out, the CLI prints `Retry safely with: --idempotency-key KEY` so
|
|
592
|
+
you can repeat the command without creating the resource twice.
|
|
593
|
+
|
|
594
|
+
### Exit codes
|
|
595
|
+
|
|
596
|
+
| Code | Meaning |
|
|
597
|
+
| --- | --- |
|
|
598
|
+
| 0 | Success (including a billing denial reported by `billing eligibility` without `--require`) |
|
|
599
|
+
| 1 | API error, network error, failed/cancelled/timed-out operation, declined confirmation, billing denial, or a server-state condition reported by the SDK (printed with its hint, for example a NAT gateway still reconciling during `vpcs delete --delete-nat-gateway`) |
|
|
600
|
+
| 2 | Usage or client-side validation error (missing token/workspace, invalid workspace ID, token/endpoint mismatch, invalid idempotency key, invalid `IBEE_ENV`, conflicting `--json`/`-o`) |
|
|
601
|
+
| 3 | `--wait` reached `--timeout` while the operation was still running; resume with `ibee ops wait OPERATION_ID` |
|
|
602
|
+
|
|
603
|
+
## Environments
|
|
604
|
+
|
|
605
|
+
The CLI targets production at `https://api.ibee.ai/v1` by default. Use `--dev`
|
|
606
|
+
(or `IBEE_ENV=dev`) for `https://api.ibee.co.in/v1`, or `--base-url` for a
|
|
607
|
+
custom endpoint. The endpoint is chosen in this order: `--base-url`,
|
|
608
|
+
`IBEE_BASE_URL`, `IBEE_ENDPOINT`, `--dev`, `IBEE_ENV`. `IBEE_ENV` accepts `dev`,
|
|
609
|
+
`development`, `prod` or `production` (any other value exits 2). Endpoints must
|
|
610
|
+
use `https://` (`http://` only for localhost) without credentials, query or
|
|
611
|
+
fragment. Production tokens (`ibee_prod_key_...`) only work with `.ai` and
|
|
612
|
+
development tokens (`ibee_dev_key_...`) only with `.co.in`; a mismatch exits 2
|
|
613
|
+
before any request. Resource IDs are environment-specific:
|
|
614
|
+
|
|
615
|
+
```bash
|
|
616
|
+
ibee --dev buckets list
|
|
617
|
+
```
|
|
618
|
+
|
|
619
|
+
## Related
|
|
620
|
+
|
|
621
|
+
- [Python SDK](https://github.com/devs-ibee/ibee-python) — `pip install ibee`
|
|
622
|
+
- [API documentation](https://ibee.ai/docs/api-reference)
|