Compare commits

...

442 Commits

Author SHA1 Message Date
Zexi Li
d5f3c8752f fix(llm): keep aiproxy routing across stop/restart (#25672)
Do not unsync or delete deployment ai_routing when replicas leave running; reconcile on running so routing/provider IDs stay stable.
2026-09-11 16:43:10 +08:00
Zexi Li
45fc5cf0d0 feat(llm): route MCP agent via aiproxy virtual key and routing id (#25665)
Support X-Ai-Routing-Id to pin ai_routing, treat empty model_pattern as non-wildcard, and wire MCP agent to aiproxy credentials instead of direct LLM api_key.
2026-09-11 10:13:45 +08:00
Jian Qiu
64801c02c1 fix: classic nic dhcp default gateway revisit (#25666)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-09-10 21:06:24 +08:00
Jian Qiu
8fdbce23d6 fix: keystone-role-assignments-list-scope (#25658)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-09-10 17:25:11 +08:00
Jian Qiu
82e3a751b2 fix(cloudid): omit clouduser secret from list and get responses (#25661)
Return console login details from the login-info action; skip secret in resource JSON and logs.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-10 17:24:22 +08:00
Jian Qiu
fd4f251d7a fix: keystone idp join project roles check (#25655)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-09-10 17:06:30 +08:00
Jian Qiu
d6dcae5da9 fix(llm): validate mcp agent server url and session endpoint (#25650)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-10 15:29:41 +08:00
Jian Qiu
f18dd74131 fix(llm): authenticate llm router agent route requests (#25648)
Fetch the agent with the caller session and check perform permission.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-10 14:44:38 +08:00
Jian Qiu
730fa194a5 fix(llm): require get permission when resolving llm_id (#25646)
Fetch the referenced LLM with the caller session before filling access URL fields.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-10 14:15:18 +08:00
Jian Qiu
4af0712a1b fix(identity): validate rolepolicy create and bind-role requests (#25643)
Require role_id and reuse the role add-policy checks when creating a binding.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-10 13:10:04 +08:00
屈轩
0b04770576 fix(region): convert kvm prefer storage (#25640) 2026-09-10 12:21:58 +08:00
Jian Qiu
94cff9d81e fix(identity): check assume login with system scope and target roles (#25636)
Keep the caller session when authorizing assume and reuse join-project role checks.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-10 12:14:23 +08:00
Jian Qiu
c47b7b3e06 fix(image): reject images that declare a backing file (#25634)
Treat a non-empty backing filename as unsupported on upload, convert, probe, and ceph cache.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-10 11:54:50 +08:00
Jian Qiu
83fd5378f5 fix: allow host networks no gateway (#25624)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-09-10 01:32:59 +08:00
Jian Qiu
6c441f09d9 fix: classic net distribute default route for default nic (#25616)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-09-09 22:28:38 +08:00
Zexi Li
8560cd8450 fix(region): include disabled hosts in isolated device usage stats (#25620)
Keep GPU/device usages consistent with hosts inventory; scheduling still uses enabled hosts only.
2026-09-09 22:27:46 +08:00
Jian Qiu
4aa916cc23 fix(container): validate host bind paths and create host-path files with argv (#25604)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-09 20:29:23 +08:00
wanyaoqi
c3da18df12 fix(region): set force stop default timeout 30s (#25613) 2026-09-09 20:28:14 +08:00
Zexi Li
884de1bc51 fix(llm): skip stale container status during pod transitions (#25610)
Watch container events and defer LLM status updates while the pod is starting/stopping, so exited leftovers are not treated as start_fail.
2026-09-09 16:51:57 +08:00
Zexi Li
cb876f036a fix(host): use assigned nvidia GPU memory for pod metrics (#25607)
Derive mem total from isolated-device quotas when available, and harden
losetup ListDevices against empty --json output.
2026-09-09 12:01:31 +08:00
Jian Qiu
4979e0f7b9 fix(guestfs): keep guest file deploy inside the mounted filesystem (#25601)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-08 23:47:10 +08:00
Jian Qiu
41d79c09d6 fix(identity): check SAML assertion issuer, audience, and optional signature (#25598)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-08 20:04:47 +08:00
屈轩
3597116f15 fix(region): support renew kvm vm (#25595) 2026-09-08 15:52:17 +08:00
Jian Qiu
c1e73206c8 fix(cloudcommon): fall back list query scope to the resource default view (#25589)
When admin or scope query parameters do not map to a concrete view, use the resource's own scope and keep owner filters applied.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-08 14:52:35 +08:00
wanyaoqi
a65fb1b852 fix(host): start new goroutine to stop guest (#25585) 2026-09-08 14:09:14 +08:00
Zexi Li
038e530ebc feat(llm): support force restart for LLM and deployments (#25582)
Allow force restart when instances are failed, protect restarting status
during sync, refresh GPU memory from deployment, and tolerate crash-loop
while waiting for service ready.
2026-09-07 21:13:46 +08:00
屈轩
27d6c94d7d fix(mcp-server): upgrade mcp lib (#25579) 2026-09-07 14:34:31 +08:00
Zexi Li
4ea6581102 feat(llm): allow disabling pod/container cgroup CPU and memory limits (#25576)
Inference SKUs default to off; SKU and CLI expose enable flags so hosts can skip CFS quota and memory hard limits when needed.
2026-09-07 13:04:13 +08:00
Jian Qiu
3e77511214 fix(apigateway): authenticate csrf resource requests with the caller session (#25568)
Align the csrf resource handler with other API resource handlers by requiring a token and forwarding with the caller's own session.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-07 12:13:32 +08:00
屈轩
4bf0b18ad0 fix(region): vendor update (#25572) 2026-09-07 10:28:48 +08:00
Jian Qiu
1dc0e3b5ec fix: module not found return 404 (#25560)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-09-04 19:55:06 +08:00
Jian Qiu
df217c1be2 fix: verify test revisit (#25564)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-09-04 19:40:01 +08:00
屈轩
adf05b2988 fix(region): esxi v2v prefer storage (#25556) 2026-09-04 17:33:39 +08:00
Jian Qiu
3c35e76604 fix(webconsole): authenticate sftp endpoints and check session owner (#25551)
The sftp list/download/upload endpoints were not protected by
authentication, only by the UUID4 session id. Anyone who learned the
session id (it appears in URLs and logs) could list, download and
upload files of the VM over the victim's active SSH/SFTP channel.

Wrap all three endpoints with auth.Authenticate and record the owner
of each sftp session at registration, so only the user who opened the
session can use it.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-04 13:45:50 +08:00
Jian Qiu
790d1437a8 fix(webconsole): validate ssh target ip against accessible resources (#25548)
The ssh console endpoint accepted a raw ip address in the URL path
and dialed it directly with user provided credentials, so any
authenticated user could use the webconsole service as an internal
SSH proxy, port scanner and credential brute-forcer.

Resolve the ip against hosts (access_ip) and servers (ip_addr)
visible to the user's session and require it to match one of them,
rejecting all other addresses.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-04 10:06:42 +08:00
Jian Qiu
5d5c052a9b fix(s3gateway): enforce signature freshness and single key decoding (#25536)
- Reject signed requests older or newer than 15 minutes (x-amz-date
  for v4, Date for v2), so intercepted valid requests can no longer
  be replayed indefinitely
- Decode the object key exactly once: r.URL.Path is already decoded
  by net/http and is the form the signature covers, decoding again
  let a signature for one key be replayed against another
  (e.g. %252e%252e%252f resolving to ../)
- Add unit tests for both behaviors

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-04 09:19:21 +08:00
Jian Qiu
3047bbdcda fix(webconsole): fetch kubeconfig with user session for k8s shell (#25539)
The k8s shell/log endpoints fetched the target cluster kubeconfig
with the admin session, bypassing RBAC and owner scope checks, so any
authenticated user could exec into pods and read logs of any
registered cluster.

Fetch the kubeconfig with the user's own session instead, so policy
checks and owner filtering apply, and command records are attributed
to the real user.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-04 09:18:17 +08:00
Jian Qiu
2321b65ee1 fix(webconsole): generate session key with crypto/rand (#25542)
The AES key encrypting all console session tokens was derived from
rand.Float32 with only about 24 bits of entropy, so it could be
recovered by brute force from a single known (session id, token)
pair and then be used to forge access tokens of arbitrary sessions.

Generate the key from 32 crypto/rand bytes instead (about 192 bits
of effective entropy). Sessions live in process memory only, so a
per-process random key is sufficient.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-04 09:17:22 +08:00
Jian Qiu
70391d0158 fix(webconsole): isolate RDP console sessions with unique ids (#25545)
RemoteRDPConsoleInfo.GetId() always returned an empty string, so all
RDP sessions were stored under the same key in the session manager:
any valid RDP access token resolved to whatever RDP session was stored
last, letting a user take over another user's console session
(host/port/username/password).

Give every RDP session a random UUID id and validate in
SSessionManager.Get that the presented access token is exactly the
one issued for the session, so sessions can not be reached by any
other token.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-04 09:16:43 +08:00
wanyaoqi
af794715fd fix(region): use host type hypervisor rather than kvm (#25533) 2026-09-03 23:54:21 +08:00
Jian Qiu
4f1706d285 fix(appsrv): do not honor CORS credentials for wildcard origins (#25517)
With cors_hosts unset (the default), the CORS middleware allowed all
origins and echoed the request origin together with
Access-Control-Allow-Credentials, so any website could make
authenticated cross-origin requests against the API with the user's
cookies.

Credentials are now only honored for explicitly listed origins:
with an empty or wildcard origin allowlist the middleware responds
with Access-Control-Allow-Origin: * and no credentials header.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-03 23:52:58 +08:00
Jian Qiu
d8facf9ffd fix: convert sql.ErrNoRows to 404 not found (#25524)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-09-03 23:50:55 +08:00
Jian Qiu
8cab0232c4 fix(notify): harden verification code generation and verification (#25528)
- Generate verification codes with crypto/rand instead of the
  predictable time-seeded math/rand
- Count failed verification attempts and invalidate the code after
  verify_max_attempts (default 5) failures, closing the unlimited
  online brute force of the 6-digit code at the login endpoint
- Delete the verification record after a successful check so codes
  are single use and can not be replayed within the validity window
- Add unit tests for code generation

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-03 23:48:40 +08:00
Jian Qiu
c053206af9 fix(hostimage): harden nbd export against command injection (#25531)
The nbd export endpoints interpolated the request disk_id into
shell commands (sh -c with the joined qemu-nbd command line, and
ps|grep for the process check), so a crafted disk_id could execute
arbitrary commands as root on the host image service.

- Require the disk_id to be a plain UUID in both export and close
  endpoints
- Run qemu-nbd with argv instead of sh -c
- Check the export process via its pid file and kill -0 instead of
  shell pipelines
- Add unit tests for the validation and the process check

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-03 23:47:31 +08:00
Zexi Li
a79c399c2f feat(llm): support cancel and resume for instant model import (#25520)
Allow deleting models to abort in-flight downloads, persist import input for resume-import after killed status, and clean up import cache on delete.
2026-09-03 20:14:35 +08:00
Jian Qiu
add8d8381f fix: mask tokens and passwords in logs (#25514)
Full session tokens were written to logs in policy.go, mcclient auth,
oidc handler and the webconsole session manager; guest root passwords
were logged by the linux fsdriver and the nbdkit mount command; MCP
tool arguments and full JSON-RPC bodies (which may contain
server-reset-password passwords) were logged by the llm agent.

Truncate tokens in log messages, drop or mask password values and
log only the tool/method name for MCP calls.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-03 19:27:34 +08:00
Jian Qiu
2b0d3d4362 fix(mcp-server): do not expose server-monitor as an MCP tool (#25512)
server-monitor sends arbitrary QMP/HMP commands (pmemsave, migrate,
etc.) to a running guest, which exceeds the semantics of monitoring.
As an MCP tool it could be triggered without human awareness through
LLM prompt injection or the tool-request endpoint.

Remove the mcp-desc registration tag from ServerMonitorOptions so
climcgen no longer registers the tool, drop its mention from the MCP
instructions, and add a regression test asserting it is not exposed.
The climc command and the permission-gated region API are unchanged.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-03 19:21:31 +08:00
屈轩
413f014f9c fix(region): vmware vm nic sync (#25509) 2026-09-03 18:27:32 +08:00
Jian Qiu
32477e1620 fix(hostman): harden deployer command execution against shell injection (#25499)
- Quote the heredoc delimiter when writing deploy params to the
  deployer guest, so deploy content, passwords and other
  user-supplied values are written literally and shell expansions
  ($(...), backticks, $VAR) inside them are not evaluated by the
  remote shell
- Escape JSON passed via --deploy-params as a single POSIX shell
  word, preventing single quotes in user data from breaking out of
  the argument
- Add unit tests covering injection payloads

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-03 10:55:43 +08:00
Jian Qiu
4c3c641c97 fix(webconsole): harden climc shell command execution against injection (#25497)
- Run ssh via exec.Command argv instead of "bash -c" string
  interpolation, so user-supplied fields can no longer escape into
  local shell commands on the webconsole server
- Quote every interpolated value (env, command, args) as a POSIX
  shell word, so they stay literal data on the remote shell
- Validate username charset and limit target_ip to climc pod or container
- Add unit tests covering injection payloads

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-03 10:52:10 +08:00
Jian Qiu
919d2b9d56 fix: apigateway returns cors_hosts to browser (#25492)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-09-03 00:50:01 +08:00
Jian Qiu
4e798c8b95 fix: update rpm build scripts for openeuler (#25473)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-09-02 17:50:20 +08:00
Zexi Li
071e4fcb2d Automated cherry pick of #25479: Feat/aiproxy model context window (#25480)
* feat(aiproxy): expose catalog context window on AI models

Populate known 1M+ context windows in catalog seed data and return
context_window in AI model list/detail API responses.

* feat(aiproxy): add instance test-connectivity and set-models actions

Add provider instance test-connectivity using stored ai_key secrets,
and set-models to import selected catalog models while skipping
existing model_key rows. Register corresponding climc perform commands.
2026-09-02 17:43:42 +08:00
wanyaoqi
4126bd8494 fix(region): disable startrun snapshotsCleanup (#25448) 2026-09-02 15:59:16 +08:00
Zexi Li
90364a81df fix(cloudcommon): fix err shadowing in GetPropertyDistinctField (#25471) 2026-09-02 15:58:11 +08:00
屈轩
3bcd053ad5 fix(region): optimized cachedimage list (#25467) 2026-09-02 11:40:32 +08:00
屈轩
5ea244bc5c fix(region): support filter cloudprovider by regions (#25462) 2026-09-01 16:05:55 +08:00
屈轩
b3905f139e fix(region): vendor update (#25459) 2026-09-01 13:41:41 +08:00
屈轩
8b2994a380 fix(apigateway): update mcp api addr (#25455) 2026-09-01 13:41:14 +08:00
屈轩
637c5b15a2 fix(region): optimized cachedimage list (#25452) 2026-09-01 09:18:12 +08:00
Zexi Li
69f9ff2a61 feat(llm): add llm_sku clone API and climc support (#25444) 2026-08-27 19:01:15 +08:00
wanyaoqi
8abb4057f1 fix(region,host): optimize snapshot delete (#25441)
use rebase/commit merge backing chain instead of convert.
2026-08-27 16:22:54 +08:00
wanyaoqi
8f13c93e28 fix(region): batch detach isolated devices (#25434) 2026-08-27 13:48:53 +08:00
wanyaoqi
a61a824884 fix(region): set default stop time 300s (#25431) 2026-08-26 15:15:33 +08:00
Jian Qiu
cc2cd72a2f fix: allow empty host networks (#25427)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-08-26 14:39:06 +08:00
屈轩
fa594fe753 fix(region): not real delete glance cachedimage (#25425) 2026-08-25 14:59:03 +08:00
wanyaoqi
24a245fd4f fix(host-deployer): no noeed clean failed mountpoints (#25421) 2026-08-25 11:35:02 +08:00
Jian Qiu
dbb6c4a17b fix: allow create-disk without disk args (#25414)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-08-24 15:48:00 +08:00
屈轩
139df655b7 fix(region): v2v migrate uefi check (#25418) 2026-08-24 15:40:51 +08:00
屈轩
04c6ed26bf fix(glance): avoid receive notify when glance restart (#25411) 2026-08-24 15:05:14 +08:00
wanyaoqi
8bff91b52d fix(host-health,region): host health detect network available add check peers and default gw (#25384) 2026-08-24 14:34:20 +08:00
屈轩
2898cdb20a fix(region): skip hostlocal wire when detect vmware net (#25406) 2026-08-24 14:19:39 +08:00
屈轩
c8ddc8665f fix(region): show more error info for vmware net detect (#25402) 2026-08-24 10:21:33 +08:00
Zexi Li
9f318bbff6 feat(llm): merge SKU envs into container and validate prefer_hosts updates (#25388)
Allow local_path SKUs to update prefer_hosts on edit, and overlay SKU envs onto the primary container with same-key override.
2026-08-21 14:27:42 +08:00
Jian Qiu
8081f677c7 fix: unhandled errors (#25379)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-08-20 17:30:49 +08:00
Zexi Li
a2d0a0a799 fix(host): skip unmanage interface when bridge slave has no address (#25381)
Only call tryUnmanageInterface when the slave interface has IPv4 or IPv6
addresses configured, avoiding unnecessary NetworkManager unmanage on
address-less interfaces during bridge setup.
2026-08-20 17:27:10 +08:00
屈轩
d109f5bf35 fix(region): skip sync cloudpods kvm secgroup (#25378) 2026-08-20 10:45:13 +08:00
wanyaoqi
8aed63bd0d Automated cherry pick of #25365: fix(region,host): guest stop add timeout options,and check is_force (#25368)
* fix(host): check qga guest-get-osinfo error

* fix(region,host): guest stop add timeout options and is_force check
2026-08-20 10:15:27 +08:00
屈轩
c241fc1210 fix(region): support cloudpods ipset (#25374) 2026-08-19 18:56:38 +08:00
Zexi Li
388bba8e85 fix(scheduler): report HAMI hostFree before min-memory filter (#25370)
Shortage messages now show remaining GPU memory from matched devices
before min-memory filtering, so users see actual free capacity instead of 0.
2026-08-19 16:40:13 +08:00
Jian Qiu
945a042676 fix: storage set metadata in post_create (#25363)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-08-19 16:28:31 +08:00
Jian Qiu
0a06731b8d fix: deploy qga path not found error (#25350)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-08-19 13:24:02 +08:00
Zexi Li
425231aa64 feat(llm): check sku schedule info (#25361) 2026-08-19 12:18:07 +08:00
Zexi Li
89c3068a38 fix(aiproxy): remove 30-day limit on custom usage range (#25355)
Allow querying usage statistics over custom date ranges longer than 30 days.
2026-08-17 16:59:56 +08:00
wanyaoqi
f19c914dce Automated cherry pick of #25347: fix(host): add options enabel vendor/device pt usb dev (#25348)
* fix(host): add options enabel vendor/device pt usb dev

* fix(host): add audio device for spice driver
2026-08-16 11:24:10 +08:00
Jian Qiu
73265ea559 fix: disk backup filter by server_id (#25344)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-08-15 09:37:48 +08:00
Jian Qiu
636b81973c feature: support idp driver attribtue_names (#25333)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-08-15 00:15:56 +08:00
wanyaoqi
d7e4a43b9b Automated cherry pick of #25313: Fix/device add params2 (#25314)
* fix(host): device add params use interface

* fix(host): ide device addr
2026-08-15 00:15:40 +08:00
屈轩
ce2c4a588f fix(glance): detect windows iso (#25342) 2026-08-14 19:01:53 +08:00
Zexi Li
f6edc92c62 fix(monitor): nodata 告警补充 ResIdKey 与 AlertDetails (#25338)
为 CommonAlertMetricDetails 填充资源 ID tag,并在无数据评估匹配中序列化 AlertDetails,便于下游定位资源。
2026-08-14 16:08:57 +08:00
屈轩
4096e77d48 fix(glance): iso image detect (#25331) 2026-08-14 14:55:26 +08:00
屈轩
82b468de2e fix: update telegraf version (#25324) 2026-08-14 14:53:25 +08:00
Zexi Li
5b6170421e feat(aiproxy): encrypt ai_key and virtual_key secrets at rest (#25326)
Store provider secrets and virtual keys encrypted with AES, add hash-based VK lookup, and migrate existing plaintext rows on init.
2026-08-14 14:40:22 +08:00
Zexi Li
72eb994f68 feat(aiproxy): migrate catalog resources to virtual resource base (#25317)
Give ai providers/models/keys/routing-models project scope with tenant backfill, and pass project/domain on LLM sync upserts.
2026-08-14 10:43:15 +08:00
屈轩
b12fe78267 fix(cloudmon): cloudpods metric pull delay time (#25320) 2026-08-14 10:38:04 +08:00
屈轩
be6ae61ea4 fix: mcp streamable (#25312) 2026-08-13 16:37:34 +08:00
wanyaoqi
56a5dbcaaf fix(region): server-create add src ip/mac check (#25303) 2026-08-13 10:10:31 +08:00
Zexi Li
9db72a1b5c feat(llm): sync isolated devices by sharing_mode on restart (#25306)
Respect sharing_mode when attaching/restoring GPU devices in compute,
and sync LLM guest devices with SKU config instead of only detaching
when empty.
2026-08-12 20:17:07 +08:00
Zexi Li
1baffa21e6 feat(k8s): add cluster history-data-clean climc command (#25301) 2026-08-11 13:55:28 +08:00
Jian Qiu
dc12c191fd fix: dhcp distribute static routes on condition (#25294)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-08-10 10:31:15 +08:00
Zexi Li
b19a23c701 Automated cherry pick of #25222: fix(baremetal): add IPMI LAN channel discovery with fallback (#25293)
* fix(baremetal): add AllowFallback guard for OEM profile LAN channel authority

OEM/model profiles are authoritative allowlists; their LanChannels must not be overridden by the fallback 1..11 scan. Add AllowFallback bool to LanConfigSelectionOptions, wrapping the fallback scan in a conditional. When false (default), only preferred and persisted channels are probed.

* fix(baremetal): set AllowFallback on ipmiprobe and manager callers

manager.checkIpmiInfo: AllowFallback=false (profile always present). ipmiprobe.doRawIpmiProbe: AllowFallback=profile==nil (fallback only when no profile exists).

* fix(baremetal): set AllowFallback=false in configIPMISetting, cleanup bm_register

configIPMISetting: AllowFallback=false (profile always present). bm_register.updateIpmiInfo: replace profile-based channel scan with GetLanConfig on the registered channel directly.

---------

Co-authored-by: Bo Xu <i@186526.xyz>
2026-08-07 18:26:02 +08:00
Zexi Li
e8f046de4f fix(baremetal): tolerate ipmitool exit 1 when lan output is usable (#25290)
Some BMCs return exit status 1 from ipmitool lan print even with valid
LAN config, which caused IPMI probe to fail with no IPMI lan NotFoundError.
2026-08-07 17:22:30 +08:00
Zexi Li
9d0b4bb975 fix(lbagent): generate valid UDP health check config (#25288)
Signed-off-by: DadaVinqi <DadaVinqi@users.noreply.github.com>
Co-authored-by: DadaVinqi <DadaVinqi@users.noreply.github.com>
2026-08-07 14:31:20 +08:00
屈轩
50d78a7985 fix(region): change config stop options check (#25286) 2026-08-06 17:32:35 +08:00
wanyaoqi
3d173686fc fix(host): e1000 nic add hotplug support (#25282) 2026-08-06 10:48:36 +08:00
Zexi Li
5ea8def943 fix(llm): detach stale GPUs when effective devices are empty on restart (#25279)
Avoid keeping bound isolated devices after SKU/LLM devices are cleared;
desktop container setup now follows effective devices only.
2026-08-06 10:02:09 +08:00
Zexi Li
bd33225ed0 fix(aiproxy): keep weight=1 keys selectable after health penalty (#25275)
Integer truncation of base*mul/maxScore can yield 0 for weight=1 keys,
permanently excluding them; floor effective weight at 1 when mul > 0.
2026-08-04 20:24:58 +08:00
wanyaoqi
874f82dfac fix(host): slvm create from snapshot (#25266) 2026-08-04 10:23:14 +08:00
Zexi Li
9e89074f86 feat(host): support Hygon DCU HAMI vdev core allocation (#25273) 2026-08-04 10:20:41 +08:00
wanyaoqi
bd3a1d0de9 feat(glance): support nfs as backend storage (#25242) 2026-08-03 16:01:01 +08:00
Jian Qiu
e6621aacf0 fix: region backward compatible fields for isolated_devices (#25262)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-08-03 15:45:47 +08:00
Zexi Li
97fc254cf5 fix(llm): derive aiproxy upstream model key from local_path sku (#25271) 2026-08-03 15:44:45 +08:00
Zexi Li
3d3ae1ef0c feat(llm,host): support Hygon DCU runtime for vLLM containers (#25259)
Wire vendor on LLM SKU devices, resolve supplemental groups for DCU
access, source DTK env in vLLM entrypoint, and add hysmi telegraf metrics.
2026-08-02 13:51:58 +08:00
wanyaoqi
77aa8c9471 fix(region,host,monitor): hami misc fix (#25256)
- npusmi monitor support
2026-07-31 10:10:35 +08:00
Zexi Li
8d490d5a3a fix(seclib2): support Ed25519 encryption (#25253)
Handle Ed25519 public and private keys in the AES-based encryption path.

Add round-trip coverage for OpenSSH and PKCS#8 private keys.

Co-authored-by: hechang <117586514+Haibersut@users.noreply.github.com>
2026-07-30 10:35:36 +08:00
Jian Qiu
2911f92f9b fix: handle host listen interface and master nic (#25248)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-07-29 23:46:26 +08:00
Zexi Li
c1980ee7fe feat(host): support Hygon DCU isolated device and HAMI (#25246)
Add Hygon DCU container device passthrough, HAMI vGPU sharing, vendor
field/filter on isolated devices, remote path helper, and LLM SKU mapping.
2026-07-29 19:01:41 +08:00
Zexi Li
203f5bb396 fix(llm): require memory_mb for local_path HAMi devices (#25244)
local_path SKUs cannot estimate VRAM from InstantModel; validate HAMi devices set devices[].memory_mb on create/update and deployment.
2026-07-29 10:22:39 +08:00
wanyaoqi
4a729a7639 Automated cherry pick of #25206: fix(region,host): host register with correct hostname (#25232)
* fix(region,host): host register with correct hostname

* fix(region): guest migrate reuse create params schedtag
2026-07-28 10:59:34 +08:00
wanyaoqi
712ce702ce feat(host): support ascend npu hami (#25236) 2026-07-28 10:55:50 +08:00
Zexi Li
80ea7e60e1 feat(baremetal): support IPMI RMCP+ cipher suite probe and persist (#25238)
Auto-detect working ipmitool -C suites (0/3/17) and store cipher_suite on host IPMI config for subsequent connections.
2026-07-28 10:27:06 +08:00
屈轩
daf21aa6a3 fix(climc): climc options update (#25228) 2026-07-27 19:41:40 +08:00
wanyaoqi
6bc05ca5c1 fix(host): qmp device add convert string to boolean (#25231) 2026-07-27 19:08:27 +08:00
Zexi Li
ea0e1ca42f fix(aiproxy): avoid permanent ai_key blacklist and clarify skip reasons (#25224)
Enter cooldown when health score hits zero so keys can recover, and include concrete skip reasons in resolve errors.
2026-07-27 12:15:55 +08:00
Jian Qiu
94862f5232 feature: ip set support (#25219)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-07-24 16:34:50 +08:00
Jian Qiu
887bb943b8 fix: vpc distributes static routes (#25212)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-07-23 19:12:22 +08:00
Zexi Li
205dbe2f64 feat(llm): support hami (#25214) 2026-07-23 17:08:26 +08:00
Jian Qiu
554cdd01be fix: baremetal use legacy http client (#25209)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-07-23 16:33:36 +08:00
屈轩
da03a421a5 fix(region): vendor update (#25205) 2026-07-22 11:19:14 +08:00
Jian Qiu
06517e5aa6 fix: allow empty ip on link-local nic (#25201)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-07-22 11:06:30 +08:00
屈轩
6d49bee5e6 fix(region): vendor update (#25198) 2026-07-21 23:38:10 +08:00
屈轩
033408e7d0 fix(mcp-server): optimized mcp desc (#25195) 2026-07-21 16:19:30 +08:00
屈轩
fe1846f690 fix(mcp-server): support forwarding mcp-server request (#25192) 2026-07-21 13:27:46 +08:00
屈轩
7aa20811f5 fix(mcp-server): optimized mcp server options (#25189) 2026-07-20 20:58:37 +08:00
屈轩
93971e83fb fix(mcp-server): mcp use climc struct (#25185) 2026-07-20 17:17:27 +08:00
wanyaoqi
1950824dfa feat(region,host,scheduler): isolated device refactor and hami support (#25181) 2026-07-20 13:20:49 +08:00
wanyaoqi
7fec30216b fix(host-deployer): bond netplan add vlan subinterface config (#25179) 2026-07-20 12:19:46 +08:00
wanyaoqi
23e1910817 fix(region): baremetal boot mode decided by selected host on image support both uefi&bios (#25167) 2026-07-20 12:07:39 +08:00
wanyaoqi
a8f3474fb2 fix(host-deployer): windows disk extend separate partition and filesystem (#25168) 2026-07-20 12:06:33 +08:00
wanyaoqi
bee68803b2 fix(host): add nest virtualization options (#25169) 2026-07-20 12:03:50 +08:00
wanyaoqi
f58fcc2999 fix(region): disk change driver support change aio_mode and cache_mode (#25170) 2026-07-20 11:57:55 +08:00
屈轩
fcbf833fde fix(mcp-server): query scope params (#25173) 2026-07-17 00:26:57 +08:00
屈轩
af2e410c24 fix(cloudid): batch detach policy (#25165) 2026-07-16 19:27:36 +08:00
屈轩
f6e32e7707 fix(region): support cas hypervisor (#25162) 2026-07-16 19:08:01 +08:00
Zexi Li
277546c95c fix(aiproxy): emit done events before response.completed in stream converter (#25159)
Emit output_item.done, reasoning_summary_part.done, function_call_arguments.done,
and related finalize events for text, reasoning, and tool calls before the
response.completed event to match the Responses API stream contract.
2026-07-16 17:04:02 +08:00
Zexi Li
98d4515548 feat(aiproxy): auto-provision placeholder ai_key for upstream resolve (#25155) 2026-07-15 19:24:43 +08:00
cwz_eikoh
e6c6f66760 feat(llm): add llm-router-agent (#25149) 2026-07-15 15:32:45 +08:00
cwz_eikoh
f3bc838d41 feat(llm): support llm-bench in llm (#25147) 2026-07-15 15:03:15 +08:00
Zexi Li
5505986263 feat(aiproxy): support streaming responses for visual messages (#25145)
* feat(aiproxy): support streaming responses for visual messages

* refactor(aiproxy): share API log helpers and support input/output token usage

Extract common chatlog record lifecycle across proxy handlers, and fall back
to Responses/Anthropic usage field aliases when filling token counts.
2026-07-15 10:57:37 +08:00
Zexi Li
83f4518355 feat(aiproxy): move visual provider to model columns and support streaming responses (#25143)
Promote visual_provider_id/visual_model_key to dedicated ai_model columns,
force non-stream upstream orchestration for visual paths, and synthesize SSE
chunks for streaming Responses requests that include images.
2026-07-14 18:39:44 +08:00
Zexi Li
b4e5fbb0b7 refactor(aiproxy): rename chat log config to API log with S3 fields (#25132)
* refactor(aiproxy): rename chat log config to API log with S3 fields

* feat(aiproxy): add visual extension for Responses image tools

Wire visual model catalog, orchestration, and OpenAI Responses compat so chat/Codex can invoke image generation and editing tools.
2026-07-14 11:52:43 +08:00
wanyaoqi
6e889e9cfa fix(region): reset guest quorum child index on guest shutdown (#25134) 2026-07-14 00:08:59 +08:00
屈轩
c75cfb4ca1 fix(region): split sync and probe worker (#25101) 2026-07-13 13:59:34 +08:00
Jian Qiu
2e28bd7ca7 fix: allow security group cidr have multiple prefixes (#25123)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-07-13 13:58:51 +08:00
Zexi Li
e73cb9dc43 feat(aiproxy): add Z.AI / Zhipu provider with dual OpenAI and Anthropic API modes (#25130)
Register zhipu as a public OpenAI-compat provider with GLM catalog seeds,
Anthropic passthrough routing, and v4-style base URL path handling.
2026-07-13 11:25:09 +08:00
Zexi Li
0d58ed4ccb feat(aiproxy): add OpenAI Responses API with provider adapters and Codex support (#25121)
Implement /v1/responses endpoint with multi-provider translation (OpenAI, Azure,
Anthropic, Gemini), streaming compat layers, Codex config/tool integration, and
updated functional test docs.
2026-07-10 16:40:42 +08:00
Jian Qiu
5bc80cfb42 fix: allow deleting idp without checking project count (#25109)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-07-10 08:35:32 +08:00
屈轩
214a606991 fix(region): gcp network tags (#25120) 2026-07-09 17:11:25 +08:00
屈轩
60bc65da31 fix(yunionconf): batch import tags (#25117) 2026-07-09 16:43:06 +08:00
Jian Qiu
ff9268966c fix: host order by sql redundant group by (#25113)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-07-09 14:22:38 +08:00
cwz_eikoh
e0b568d0ed feat(aiproxy): support log record in aiproxy through minio (#25115) 2026-07-09 13:01:35 +08:00
Jian Qiu
95f4bcf1f0 fix: lb listener rule specific certificates (#25105)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-07-08 12:03:36 +08:00
Zexi Li
f538dcf2e6 feat(aiproxy): add Anthropic Messages API and migrate functional tests to Go (#25097)
Add /v1/messages handler with Anthropic-to-OpenAI translation, upstream
failover, and probe endpoints. Replace shell-based functional test scripts
with pkg/aiproxy/ft and climc test commands; consolidate documentation.
2026-07-07 20:13:03 +08:00
屈轩
8c87c0e57d fix(region): pve host driver compatibility (#25099) 2026-07-03 15:37:58 +08:00
Zexi Li
c91b5bc70c feat(llm): add ModelScope instant model import and refactor model download (#25091)
Add ModelScope hub integration, download driver, and instant model import
flow parallel to HuggingFace. Extract shared HuggingFace download helpers
and reuse them across vLLM/SGLang container drivers.
2026-07-01 20:12:59 +08:00
Zexi Li
f1f3c1df2a feat(llm): support local_path scheduling with prefer_hosts and deployment restart (#25085) 2026-07-01 13:11:02 +08:00
wanyaoqi
f6e5f71fba fix(host-deployer): mount procfs before deploy guestfs (#25086) 2026-07-01 00:53:31 +08:00
Zexi Li
00bcdae23f feat(scheduler): append GPU reserved resource hints on predicate failure (#25083) 2026-06-30 15:40:34 +08:00
Zexi Li
3413845e96 feat(llm): backfill orphan LLM instances into deployments on init (#25079)
On service startup, find LLM instances without llm_deployment_id and
create a matching SLLMDeployment, then link the instance. Idempotent
across restarts; skipped on slave nodes.
2026-06-29 11:26:16 +08:00
wanyaoqi
b47a802515 fix(host-deployer): do base64 windows password (#25070) 2026-06-27 06:48:35 +08:00
屈轩
90ea5b77b0 fix(region): quota check (#25076) 2026-06-26 13:05:30 +08:00
wanyaoqi
372fae41c6 fix(region,host): kvm guest change disk driver reset uefi vars (#25068) 2026-06-26 10:20:25 +08:00
wanyaoqi
3b796dc0e8 fix(host): qemu set multifd before start incoming migration (#25064)
use drive mirror do block migration
2026-06-26 10:18:45 +08:00
Zexi Li
d3b4ab273a Automated cherry pick of #25074: feat(llm): tool call defaults & auto gpu ultilization (#25075)
* feat(llm): upgrade auto-gpu-ultilization

* feat(llm): add vllm tool call defaults

* feat(llm): add sglang tool call defaults

---------

Co-authored-by: cwz <cwz_eikoh@163.com>
2026-06-26 10:15:55 +08:00
Zexi Li
686b0f3872 feat(llm): async instant model delete and improve import status tracking (#25072)
fix(aiproxy): set OpenAI handler process timeouts and skip upstream error
response when request context is already cancelled.
2026-06-25 19:52:28 +08:00
Zexi Li
b52aa5de85 feat(llm): validate GPU devices on deployment create and improve error messages (#25062) 2026-06-24 14:26:18 +08:00
wanyaoqi
043eac88ba fix(region): snapshot validate add check guest is quorum master guest (#25052) 2026-06-24 10:30:14 +08:00
cwz_eikoh
c3db76457d Automated cherry pick of #25016: Feature/http get+llm probe (#25045)
* hostman: probe http get in pod netns

* llm: watch pod status for service readiness
2026-06-23 19:40:46 +08:00
屈轩
854b93e3a4 fix(region): filter sku by zone ids (#25061) 2026-06-23 15:14:51 +08:00
Zexi Li
5a4bbefe72 fix(aiproxy): defer stream context cancel until chunks are consumed (#25058) 2026-06-23 14:09:37 +08:00
Zexi Li
4237ce52ea feat(llm): sync llm deployment with aiproxy catalog and routing (#25013)
Add auto_register_aiproxy on llm_deployment creation, background sync task,
and register/unregister CLI actions. Link aiproxy providers, routings, and
models to llm replicas via llm_id and llm_deployment_id fields.
2026-06-22 19:35:50 +08:00
cwz_eikoh
d2bbda642b Automated cherry pick of #25044: Feature/llm route for aiproxy (#25046)
* feat(aiproxy): support routing model in aiproxy

* feat(llm): add llm-router
2026-06-22 10:09:58 +08:00
Jian Qiu
c6225bc046 fix: credential scope revisit (#25050)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-06-21 09:25:58 +08:00
wanyaoqi
c559974e44 fix(host): recycle servers dir on guest delete (#25022) 2026-06-21 08:34:26 +08:00
Jian Qiu
5392cfc8a9 fix: some host_type should consider container (#25048)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-06-20 09:47:47 +08:00
屈轩
9f0d1af484 fix(region): remove debug log (#25042) 2026-06-17 14:50:25 +08:00
屈轩
0956e660a4 fix(region): aws dedicated host sync (#25040) 2026-06-16 20:14:27 +08:00
屈轩
4bce487605 fix(compute): polish httperrors error messages in pkg/compute (#25036)
Unify spelling, grammar, and semantics of API error strings without changing error types or business logic.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-15 20:49:22 +08:00
屈轩
4e07d3b30c fix(region): vendor update (#25034) 2026-06-15 17:59:22 +08:00
Zexi Li
81ebea9451 feat(llm): add community images catalog API (#25030)
Expose llmimages.yaml as list/show/refresh endpoints with configurable
source URL, periodic cache refresh, and mcclient module support.
2026-06-15 17:26:25 +08:00
屈轩
acac258359 fix(region): filter sku by zone ids (#25029) 2026-06-15 15:50:46 +08:00
屈轩
c0f9765f9c fix(region): vendor update (#25027) 2026-06-15 14:58:14 +08:00
屈轩
fadd9b92f2 fix(region): struct tag fix (#25024) 2026-06-15 13:57:10 +08:00
wanyaoqi
a3a14bbed7 fix(region): guest detach isolated devices add is_force options (#25020) 2026-06-15 09:54:40 +08:00
屈轩
fc795b15c0 fix(region): disk througput sync (#25018) 2026-06-13 11:56:18 +08:00
wanyaoqi
8527232b7c fix(host): guest python launcher error (#25012) 2026-06-12 14:02:36 +08:00
屈轩
ded845a3dc fix(region): optimized sku query (#25009) 2026-06-11 14:31:29 +08:00
wanyaoqi
3172a1e86c fix(region): host model add api stats (#24955) 2026-06-09 23:01:40 +08:00
屈轩
7cff45fb5b feat(aiproxy): add aiproxy (#25003) 2026-06-09 18:54:54 +08:00
屈轩
5a2bfd9b5a fix(region): sku price (#25002) 2026-06-09 15:58:18 +08:00
Zexi Li
9f1e77deb6 feat(monitor): add tag name/id mapping in metric measurement API (#24999)
Return structured MetricMeasurementOutput with TagNameIdMap and
TagNameIdValueMap so callers can resolve resource names to IDs.
2026-06-09 15:14:35 +08:00
Zexi Li
72d7bd23b4 Automated cherry pick of #24985: Feat/deployment hostpath (#24993)
* feat(llm): hostpath support in deployment

* fix(llm): status error in deployment & sku deleted by deployment accidentally

---------

Co-authored-by: cwz <cwz_eikoh@163.com>
2026-06-08 11:23:48 +08:00
Zexi Li
51a85f66ba feat(host): support host_path detected in scheduler (#24992)
Co-authored-by: cwz <cwz_eikoh@163.com>
2026-06-08 11:01:14 +08:00
屈轩
035e31d9bf fix(region): avoid panic (#24989) 2026-06-08 10:58:27 +08:00
Zexi Li
3d086abf3e fix(host): rewrite vm_name in telegraf influx proxy after rename (#24983)
Sync host guest desc on local VM rename and correct vm_name (and
tenant_id) tags when metadata service proxies agent metrics to TSDB.
2026-06-08 10:43:18 +08:00
Jian Qiu
d9419958d7 fix: support ansible galaxy mirror (#24986)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-06-08 08:56:48 +08:00
屈轩
cfb9a97c78 fix(region): support rockbasecloud (#24984) 2026-06-05 19:28:48 +08:00
屈轩
957e785bd3 fix(monitor): skip disable account alert (#24980) 2026-06-05 16:14:28 +08:00
Jian Qiu
f082dc9b2d fix: lbagent service code typo 20260604 (#24976)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-06-05 01:13:36 +08:00
屈轩
f2d7af548e fix(region): prefer zones (#24972) 2026-06-04 18:52:01 +08:00
Zexi Li
e42070a852 fix(llm): 更新 model catalog 默认 URL 与 webtop 镜像同步 (#24973)
将 ModelCatalogURL 默认路径改为 model-catalog.yaml;
sync_llm_images 改为同步 fedora-xfce webtop 并注释其它候选镜像。
2026-06-04 18:51:12 +08:00
Zexi Li
a1ba61b875 fix(llm): container desktop (#24970) 2026-06-04 11:51:41 +08:00
Zexi Li
80dcd3ae42 fix(monitor): alert_state of resource metrics api (#24964) 2026-06-03 17:15:31 +08:00
屈轩
802062d0f7 fix(region): extend external_id to 512 (#24963) 2026-06-03 15:31:56 +08:00
Zexi Li
e3fb9b2295 feat(llm): container desktop (#24961) 2026-06-03 13:24:53 +08:00
屈轩
fa44e4502b fix(region): add cpu model nic bandwidth for server sku (#24954) 2026-06-03 10:59:55 +08:00
Jian Qiu
9908af95ea fix: compatibility issue with vms of empty hypervisor (#24957)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-06-03 09:57:39 +08:00
wanyaoqi
0759f3b2be fix(mps): parse pci addr convert to lower case addr (#24944) 2026-06-02 20:03:16 +08:00
wanyaoqi
b26e1568f7 fix(host): check cluster is valid before do qemuimg convert (#24946) 2026-06-02 20:01:40 +08:00
屈轩
0481bf291a fix(region): filter zone region by read only (#24951) 2026-06-02 11:15:27 +08:00
屈轩
65e5be3420 fix(region): support skip server sync by tags (#24949) 2026-06-02 11:07:36 +08:00
屈轩
adc2a468f9 fix(region): avoid create huawei windows server fail (#24940) 2026-06-01 15:52:48 +08:00
屈轩
da07addf18 fix(region): init cloudpods host type (#24934) 2026-05-31 14:17:35 +08:00
屈轩
07ca3b1520 fix(region): init external project (#24936) 2026-05-31 12:48:24 +08:00
cwz_eikoh
28b9e2e155 Automated cherry pick of #24924: Feat/auto gpu ultilization (#24929)
* fix(llm): support hf import llm_sku

* feat(llm): auto-gpu-memory-utilization
2026-05-29 17:45:48 +08:00
屈轩
c3fe7a6290 fix(host-deployer): lvm lock (#24927) 2026-05-29 15:01:20 +08:00
wanyaoqi
444cf1546c fix(host): guest sync override cpu_numa_pin before update (#24912) 2026-05-28 19:58:26 +08:00
屈轩
17445a6822 fix(region): add notices sync interval (#24923) 2026-05-28 19:48:09 +08:00
屈轩
07f434a96b fix(region): remove account id (#24920) 2026-05-28 17:40:14 +08:00
Zexi Li
fd50a6902c fix(ansibleserver): allow CreatorMark to be nullable in AnsiblePlaybookV2 (#24917) 2026-05-28 16:38:07 +08:00
Zexi Li
d87805622e Automated cherry pick of #24885: Feature/download progress (#24909)
* feat(llm): support download progress when model import

* fix(llm): unsupported catalog source \"ollama\" when model_set import llm_sku

---------

Co-authored-by: cwz <cwz_eikoh@163.com>
2026-05-27 13:20:54 +08:00
Zexi Li
8f46ef5098 feat(monitor): add ResourceMetricsDefaultInterval option (#24906) 2026-05-27 11:50:23 +08:00
屈轩
916463712a fix: upgrade go 1.26 (#24905) 2026-05-27 11:22:13 +08:00
Jian Qiu
f0647f6ee0 fix: throttle image cache progress callback to avoid download bottleneck (#24900)
When using S3/MinIO backend, the progress callback in AcquireImage was
called synchronously on every 4KB read chunk (via StreamPipe2). Each
call invokes UpdateServerProgress which makes a blocking HTTP PUT to the
compute API (~50ms), capping download speed at ~0.65 Mbps regardless of
available bandwidth.

Fix: throttle the callback to fire at most once every 5 seconds and make
the HTTP call asynchronous (goroutine), matching the behavior of v3.11.x
which used a 1-second ticker with async callbacks.

Fixes #24897

Co-authored-by: Mrliuch <liu15094534492@gmail.com>
2026-05-26 15:09:00 +08:00
屈轩
208acd9463 fix(region): skip useless addition network wire create (#24894) 2026-05-25 19:45:58 +08:00
Zexi Li
f314e7fa33 fix(host): aggregate same-type container devices for env config (#24891)
When multiple NVIDIA GPUs were attached to a container, each device was
passed individually to GetContainerExtraConfigures, producing one
NVIDIA_VISIBLE_DEVICES env per GPU. Duplicate env keys are collapsed by
the runtime to the last value, so the container only saw one GPU even
though the spec listed all of them.

Group RestDevs by DeviceType and invoke GetContainerExtraConfigures
once per type so all GPU UUIDs are joined into a single
NVIDIA_VISIBLE_DEVICES value.
2026-05-25 17:29:53 +08:00
Zexi Li
4c0dd07a91 feat(llm,scheduler): vram calculation (#24884) 2026-05-25 16:27:20 +08:00
Jian Qiu
959e03cccf fix: disable s3 direct download default (#24887)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-05-25 10:04:06 +08:00
Zexi Li
ecdf0e824f feat(llm): auto append backend_parameters in vllm & sglang (#24883)
Co-authored-by: cwz <cwz_eikoh@163.com>
2026-05-22 17:02:18 +08:00
Zexi Li
b7c90351a1 fix(region): prefer check_code series for lb backend check_status (#24877) 2026-05-22 14:17:14 +08:00
Jian Qiu
447c0a1f55 fix: set bridge up after created (#24873)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-05-21 20:30:26 +08:00
wanyaoqi
2eb6254b17 fix(scheduler): set options ContainerNumaAllocate default true (#24870) 2026-05-21 19:32:04 +08:00
Zexi Li
d41aa739ff feat(region,host): upload nvidia gpu memory size (#24866) 2026-05-21 16:20:22 +08:00
Zexi Li
7ed23c433d feat(hermes): connect vllm/sglang/ollama (#24863)
Co-authored-by: cwz <cwz_eikoh@163.com>
2026-05-21 11:41:22 +08:00
Zexi Li
c019216508 feat(llm): create llm_sku from llm_model_set (#24865)
Co-authored-by: cwz <cwz_eikoh@163.com>
2026-05-21 11:40:37 +08:00
Zexi Li
383764dbb6 feat(llm): Implement resumable downloads for models from Hugging Face (#24859)
Co-authored-by: cwz <cwz_eikoh@163.com>
2026-05-21 10:48:39 +08:00
wanyaoqi
955fc5ba54 fix(host): remove cgroup root path check quotation marks (#24852) 2026-05-21 10:33:17 +08:00
Zexi Li
b440adf404 fix(region): ensure lb backend check_status returned when check_code missing (#24854) 2026-05-21 10:18:36 +08:00
Zexi Li
9775565a53 feat(llm): llm deployemnt (#24847) 2026-05-20 11:06:13 +08:00
Jian Qiu
5cec665b48 Revert "fix: revert host masquerade setting (#24826)" (#24845)
This reverts commit a642560fce.
2026-05-19 20:57:43 +08:00
Zexi Li
e6be8d9146 fix(region): query metrics from monitor service (#24837) 2026-05-19 18:00:56 +08:00
Zexi Li
d38b835f8e fix(llm): persistent /config dir of hermes agent (#24834) 2026-05-18 14:57:26 +08:00
Zexi Li
3209292fc9 feat(climc): add generic feature-config command (#24829)
Add a generic `feature-config <feature> <on|off>` command alongside the
existing per-feature `feature-config-<name>` commands. A `--force` flag
skips the known-features validation so new features can be toggled
without a code change. Also adds "ai" to the known feature list.
2026-05-18 14:28:36 +08:00
Jian Qiu
a642560fce fix: revert host masquerade setting (#24826)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-05-15 01:57:02 +08:00
Zexi Li
41a5d7aa3f feat(llm): support sglang (#24822)
Co-authored-by: cwz <cwz_eikoh@163.com>
2026-05-14 17:07:37 +08:00
Jian Qiu
91fd01617f fix: lbagent keepalived service run may exit (#24805)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-05-13 12:08:08 +08:00
屈轩
144b0f11c2 fix(region): support stop for change vm config (#24816) 2026-05-12 20:08:11 +08:00
屈轩
240ca79b9a fix(region): update gp3 disk size (#24810) 2026-05-12 17:27:23 +08:00
Zexi Li
520bab0dca Automated cherry pick of #24801: Feature(vllm): use entrypint instead of StartLLM (#24803)
* feat(llm): use entrypoint instead of StartLLM

* feat(llm): adapt front-end in comfyui instant-model

---------

Co-authored-by: cwz <cwz_eikoh@163.com>
2026-05-12 10:46:03 +08:00
Zexi Li
48fcab103c fix(llm): honor SLLM device override when building container spec (#24798) 2026-05-11 20:06:12 +08:00
wanyaoqi
4ba4bb7d89 fix(host): remove -no-kvm args, -no-kvm argument was a synonym for setting -machine accel=tcg (#24788) 2026-05-11 20:00:44 +08:00
wanyaoqi
e1ca2530f7 fix(host): check is cpu hotplug support on guest init (#24786) 2026-05-11 19:59:35 +08:00
Zexi Li
f4503e2284 feat(llm): add SLLM mounted_models override and driver-level validation (#24795) 2026-05-11 17:41:05 +08:00
Zexi Li
310183aab2 feat(monitor): use GET for unifiedmonitors resource-metrics (#24781) 2026-05-08 16:19:22 +08:00
Zexi Li
e8cf980c79 fix(monitor): dedupe alert trigger condition in notify templates (#24778) 2026-05-07 15:52:01 +08:00
Zexi Li
dc4fd66eba Automated cherry pick of #24760: Feature/comfyui instant model (#24775)
* feat(llm): support cursor

* feat(llm): support import from huggingface

* fix(llm): direction error

* feat(llm): support instant model for comfyui

* feat(llm): support multi file select when save-instant-model

---------

Co-authored-by: cwz <cwz_eikoh@163.com>
2026-05-07 14:42:53 +08:00
wanyaoqi
12e8b22a24 feat(host): mps add container device configuration (#24772) 2026-05-07 10:03:18 +08:00
屈轩
c0400121b8 fix(esxi-agent): pve agent (#24769) 2026-05-06 17:15:41 +08:00
屈轩
0d77887890 fix(region): avoid vm set status start fail when serivce restart (#24765) 2026-05-06 12:41:00 +08:00
wanyaoqi
3774162bd8 fix(host): cpu hotplug compatible with high qemu version (#24758) 2026-05-03 23:22:01 +08:00
wanyaoqi
e935fc5689 fix(host): auto merge backinf file generate disks index (#24753) 2026-05-03 22:39:02 +08:00
Zexi Li
4eb015e649 fix(monitor): normalize resource-metrics alert_state (#24756)
Treat attach and init as init in PerformResourceMetrics output.
2026-04-30 18:42:01 +08:00
Zexi Li
0005ea8229 fix(monitor): support influxql derivative and difference function translation (#24748) 2026-04-30 13:11:45 +08:00
Jian Qiu
225791f78c fix: init ifb kernel module (#24745)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-04-29 23:48:59 +08:00
wanyaoqi
e9dde8eae6 fix(mcclient,region): add tasks mod, service app options (#24734) 2026-04-29 23:48:06 +08:00
屈轩
5375fff061 fix(region): optimized listener rule list (#24742) 2026-04-29 14:09:29 +08:00
Zexi Li
0f30ccf520 fix(host,llm): fix pod shm mount path return and llm restart memory config (#24737)
- Return shmPath instead of empty string when mountpoint is already
  mounted, so callers get the correct path
- Remove incorrect +1 offset in memory comparison and size formatting
  during LLM restart config change
2026-04-28 19:57:42 +08:00
Zexi Li
a403ad5091 fix(lbagent,monitor): use victoria-metrics for telegraf and fix influxql translation (#24732) 2026-04-27 16:41:55 +08:00
Jian Qiu
b1908b24e3 fix: create redirect lb listener fail (#24725)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-04-27 10:01:19 +08:00
屈轩
acdf623027 fix(region): lb redirect rule create validate (#24729) 2026-04-27 10:00:54 +08:00
wanyaoqi
e42d517b28 chore(host-deployer): update host-deployer-base to 1.5.9 (#24722) 2026-04-26 23:02:59 +08:00
Zexi Li
9be35e4b45 feat(llm): support OpenClaw manual config mode (#24719)
When ManualConfig is enabled, inject OPENCLAW_MANUAL_CONFIG=1 env var
and skip provider/channel credential injection, allowing users to
configure providers and channels themselves inside the desktop.
2026-04-24 11:45:46 +08:00
Zexi Li
67cceae9e2 Automated cherry pick of #24717: Feature/hf-search (#24718)
* llm: add instant-model huggingface query commands

* fix(vllm): use ping instead of health

---------

Co-authored-by: cwz <cwz_eikoh@163.com>
2026-04-24 10:28:34 +08:00
wanyaoqi
52bbe7c9a7 fix(host): usb device passthrough use hostport (#24708) 2026-04-23 13:52:49 +08:00
Jian Qiu
7e5f5cff5e fix: guest change ipaddr no-sync option (#24714)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-04-23 13:52:04 +08:00
Jian Qiu
bb7b50dbc0 fix: handling deleted task object (#24702)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-04-23 10:19:14 +08:00
屈轩
350412009e fix(notify): remove useless code (#24711) 2026-04-21 19:38:04 +08:00
Zexi Li
6372ef9819 refactor(llm): extract shared desktop webtop config (#24699)
Move common desktop/webtop container envs, base spec, rootfs, and login-info parsing
into llm_container helpers and reuse in openclaw and hermes-agent drivers.
2026-04-21 15:04:44 +08:00
Zexi Li
5577aefb22 fix(scheduler): refactor the pending usage logic (#24705) 2026-04-21 15:03:44 +08:00
Matt Gideon
cc1524a71f fix(host): fix isolated device detection regex for PCI and USB devices (#24692) 2026-04-20 14:22:38 +08:00
Zexi Li
23e21c2c16 feat(llm): support hermes-agent (#24696) 2026-04-20 12:47:23 +08:00
Zexi Li
2ee8ae31ad feat(llm): add hostpaths for llm-sku (#24695)
Co-authored-by: cwz <cwz_eikoh@163.com>
2026-04-20 10:51:40 +08:00
屈轩
c119af4b81 fix(region): show associate info (#24688) 2026-04-17 10:10:29 +08:00
Jian Qiu
e129e0477a fix: add version etc. aux handlers to mcp-server (#24686)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-04-17 09:59:56 +08:00
屈轩
c839d38f60 fix(region): vendor update (#24684) 2026-04-16 23:11:21 +08:00
Jian Qiu
54309f95f3 feature: support asymmmetric bandwidth limit (#24679)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-04-16 15:15:43 +08:00
Jian Qiu
ee66577d94 fix: climc container related commands improvements 20260414 (#24672)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-04-15 10:05:45 +08:00
屈轩
5a09e3d5c9 fix(region): sched fail notify (#24677) 2026-04-14 20:13:31 +08:00
屈轩
b55a9a5482 fix(region): disk fail notify (#24674) 2026-04-14 16:28:28 +08:00
Zexi Li
218c973638 fix(llm): harden volume resize and update size log (#24631)
- Wait for disk/desktop status after resize via backup worker
- Centralize volume SizeMB update with resize action log
- Expose vCPU/memory fields in LLM customize columns
2026-04-13 14:38:50 +08:00
Zexi Li
94d2e10f00 feat(climc): support setting rootfs sub_directory 2026-04-13 11:09:52 +08:00
Zexi Li
1b184d3ea7 fix(region): set rootfs default sub_directory (#24666) 2026-04-13 09:59:16 +08:00
屈轩
f8cab462c1 fix(esxi-agent): support esxi vm forder name same with vm name (#24664) 2026-04-13 09:50:48 +08:00
屈轩
255a1fe84f fix(region): support query public cloud vm modification types (#24654) 2026-04-10 16:54:24 +08:00
wanyaoqi
61b5b8b792 fix(region): optimize fetchHostGuestResource (#24633) 2026-04-10 16:53:03 +08:00
Zexi Li
6ccf058d5c fix(host): restart container on exit when AlwaysRestart is set (#24661) 2026-04-10 15:17:11 +08:00
Jian Qiu
258e47056c fix: vpcagent sync inconsistent networkaddress guestnetwork id (#24649)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-04-10 14:44:21 +08:00
屈轩
c568447a61 fix(mcp-server): update mcp docs (#24652) 2026-04-09 20:45:23 +08:00
屈轩
d2aef76bd5 fix(cloudmon): vendor update (#24643) 2026-04-09 16:33:12 +08:00
Jian Qiu
f9ac278ba3 fix: upgrade coredns to v1.10.1 at 4.0 (#24619)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-04-08 16:26:50 +08:00
Jian Qiu
05da992fba fix: undo pr 24532 (#24638)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-04-08 16:25:23 +08:00
wanyaoqi
99bef191f6 feat(host): container add rbd disk support (#24624) 2026-04-08 13:27:46 +08:00
屈轩
3f3c92fa7d fix(region): clean guest network when purge zone (#24627) 2026-04-07 20:55:45 +08:00
屈轩
c0c9ba6d78 fix(region): esxi wire sync (#24617) 2026-04-04 12:17:00 +08:00
Zexi Li
27874cdbeb feat(host): support CTyunOS rootfs (#24612) 2026-04-02 17:47:56 +08:00
屈轩
904ed8dd3a fix(region): vendor update (#24610) 2026-04-02 10:34:51 +08:00
Zexi Li
dffac28e32 feat(llm): get available models from base_url (for ollama & openai) (#24608)
Co-authored-by: cwz <cwz_eikoh@163.com>
2026-04-01 15:44:30 +08:00
Zexi Li
aa17f76589 fix(monitor): update silent_period when channel is empty (#24602)
silent_period is stored as Frequency on the notification, not on the
alert itself. PostUpdate only called UpdateNotification (which recreates
notifications with the new silent_period) when Channel was non-empty.
When channel was an empty array, the silent_period update was silently
skipped. Add an else-if branch to directly update the existing
notifications' Frequency when silent_period changes but channel is empty.
2026-03-31 20:00:39 +08:00
Jian Qiu
3553263bb6 fix(host): use findmnt instead of df to detect local mount point (#24599)
Co-authored-by: Haibersut <117586514+Haibersut@users.noreply.github.com>
2026-03-31 18:06:40 +08:00
Zexi Li
4f693c4641 feat(monitor): add batch resource metrics query API (#24596)
Add unifiedmonitor class action `resource-metrics` with client options/CLI command.
Implement host/guest metric drivers to query cpu/mem/disk/net rates and attach alert state.
2026-03-31 17:44:35 +08:00
Jian Qiu
11be1de968 fix: support build specific multi-arch buildx (#24588)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-03-31 17:43:09 +08:00
Jian Qiu
e1d108a7f0 fix: add customer usable filters that filter noaddr networks (#24585)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-03-31 17:27:47 +08:00
Zexi Li
ee98c29d9a fix(host): use proper shell quoting in pod tar/find commands (#24592)
Add shellQuote helper that safely escapes single quotes and apply it
consistently across tarGzDir and tarHostDir to prevent shell injection
via crafted paths, directory names, or exclude patterns.
2026-03-31 12:04:07 +08:00
Zexi Li
846ba369ac fix(host): get pod status by primary container status (#24581) 2026-03-30 16:21:18 +08:00
wanyaoqi
c61f5113d2 fix(host): add ovmf 4m code (#24575) 2026-03-30 07:54:08 +08:00
Zexi Li
e205da2232 fix(llm): 修复 llm 镜像没有根据 sku 更新的问题 (#24572) 2026-03-26 21:38:21 +08:00
屈轩
225de2334e fix(logger): add syslog init log (#24555) 2026-03-26 18:11:22 +08:00
wanyaoqi
9bb31f4b33 fix(region): validate kickstart enabled (#24558) 2026-03-26 18:09:41 +08:00
Zexi Li
9eaa72993b fix(region): order containers by created_at time (#24567) 2026-03-26 12:16:31 +08:00
Zexi Li
fb8a339cbb fix(keystone): allow blob update for image credentials (#24564)
Also fix type check to allow secret/image only.
2026-03-26 11:41:13 +08:00
屈轩
057e5ebeaa fix(region): add domain container usage (#24562) 2026-03-25 18:26:39 +08:00
Zexi Li
b1f7890324 fix(vllm): user customize args & health check in hostlocal net (#24553)
Co-authored-by: cwz <cwz_eikoh@163.com>
2026-03-25 10:36:46 +08:00
wanyaoqi
c1edcf27fe fix(host): metadata handler proxy telegraf data fix tenant_id (#24544)
* fix(host): metadata handler proxy telegraf data

* fix(host): append unknown dmesg to last entry
2026-03-25 10:34:09 +08:00
Jian Qiu
b45a5f7f9d fix: lbagent genHaproxyConfig possible nil pointer panic (#24537)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-03-25 10:32:41 +08:00
Jian Qiu
d73d3e0108 fix(hostmetrics): add checks for incomplete pod and container stats (#24549)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-03-25 10:31:07 +08:00
屈轩
84bbe1bfc1 fix(region): add container usage (#24542) 2026-03-25 10:23:27 +08:00
屈轩
b9ef8476f2 fix(host-image): update script for riscv64 host-image (#24535) 2026-03-24 11:37:36 +08:00
Zexi Li
7c26ab8db3 fix(host): probing multiple container status (#24529) 2026-03-24 10:27:06 +08:00
wanyaoqi
ab7210c6b6 fix(host): dd zero to lv wife partitions on lvremove (#24525) 2026-03-23 19:02:16 +08:00
wanyaoqi
c4a6c9ff8a fix(host-deployer): resizefs add fstype LVM2_member (#24516) 2026-03-23 00:00:17 +08:00
wanyaoqi
ec315b5516 fix(region): check instance snapshot joint is nil on snapshot purge (#24513) 2026-03-22 23:59:17 +08:00
屈轩
cb266540a1 fix(apigateway): stream download content-type (#24508) 2026-03-20 13:41:40 +08:00
Jian Qiu
64c362f20f feature: support host-local wire (#24497)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-03-20 01:36:42 +08:00
wanyaoqi
603f591ebf Cherry pick of #23094 upstream release 4.0 1770106850 (#24452)
* feat(region, climc): Add kickstart parameters and metadata

- Add kickstart parameters and metadata support
- Add kickstart CLI options and management commands
- Set kickstart metadata in PostCreate
- Add related kickstart metadata fields

* feat(host): Implement automated VM installation

- Mounts the installation ISO to a unique temp path, reusing existing mounts.
- Extracts kernel (`vmlinuz`, `initrd`) to configure QEMU boot.
- Injects kernel parameters to trigger the autoinstall.
- Add kickstart configuration validation.

Modified `guestLauncher` script to handle kernel parameters with spaces
that were previously truncated by the Python script.

* feat(host): Implement Kickstart monitoring

- Automatically updates the VM status upon
receiving `KICKSTART_SUCCESS` or `KICKSTART_FAILED` signals.
- On success, cleans up temporary mount points
and restarts the server via the Region API.

* feat(region): add kickstart type metadata

Adds the `VM_METADATA_KICKSTART_TYPE` to distinguish between
kickstart configurations passed by URL or by direct content.

* feat(host): Handle kickstart installing and timeout

- Set status to 'installing' upon successful kickstart boot
- Handle KICKSTART_INSTALLING serial message for status updates
- Add timeout handling for kickstart status monitoring

* feat(host): provide Kickstart config via content

Embed the provided config content as a file in a
labeled ISO (mkisofs), then mount the ISO during
the Kickstart installation to supply the config.

* refactor(host): Enhance the kickstart installation

- Integrates kickstart status directly into the VM status, replacing metadata.
- Unifies locations for kickstart logs and temporary files.
- Uses regex for more robust status matching.
- Moves helper functions to `kickstart_helper.go`.
- Fixes an incorrect kickstart configuration filename.
- Adjusts kickstart logging.

* feat(region, host): add kickstart support for openEuler

* refactor(host): extract kickstart cleanup function

* feat(region, climc): add kickstart-complete cli

Add this command to manually update the kickstart status and
reboot VM if needed. This is mainly used by users to manually
update the kickstart status when kickstart status detection is abnormal.

* refactor(region): reduce code duplication in Kickstart validation

- unify two validateKickstartConfig functions
- extract determineKickstartType function for type determination

* fix(region, host): fix kickstart auto-reboot

- Adjusted the timing of setting the status to
`kickstart_pending` to avoid incorrect reboot checks
- Skip setting kickstart if the status is already
`kickstart_completed` to prevent unnecessary reboots
- Added cleanup of kickstart files upon VM deletion

* feat(host): download kickstart config from URL

- download content when passing config via URL
- unified boot parameters

* feat(host): copy kickstart kernel files

* feat(host): ensure kickstart completion signal in config

---------

Co-authored-by: happygame <happygame1024@gmail.com>
2026-03-20 01:35:27 +08:00
wanyaoqi
9142916763 Fix/host deployer nbd driver40 (#24456)
* fix(host-deployer): nbd add concurrency control

* fix(host-deployer,glance): windows image add current version
2026-03-20 01:32:08 +08:00
Zexi Li
ef6241ac9b feat(llm): unify container access url info and login response (#24504) 2026-03-19 23:06:31 +08:00
wanyaoqi
508d4f7713 fix(host-deployer): get resize dev by serial panic (#24446) 2026-03-19 23:03:34 +08:00
cwz_eikoh
e3548b1830 Automated cherry pick of #24471: Feature(mcp): support x-api-key authentication for mcp-server (#24500)
* feat(mcp-server): support base64 ak/sk

* fix(mcp-agent): try to fix route of default-mcp-tools
2026-03-19 15:04:45 +08:00
cwz_eikoh
e3e04ab29d feat(llm): support model import for vllm (#24503) 2026-03-19 15:03:49 +08:00
wanyaoqi
8e83889c9f Automated cherry pick of #24473: fix(glance): cache images to ceph add brand filter (#24479)
* fix(glance): cache images to ceph add brand filter

* fix(region): iso image support default uefi boot mod
2026-03-19 11:45:43 +08:00
Jian Qiu
4314497e88 fix: logger add app-options-show api (#24493)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-03-19 11:43:55 +08:00
屈轩
f5beef50f5 fix(region): allow set disk auto-delete attribute (#24488) 2026-03-19 10:27:57 +08:00
Zexi Li
3e925b6d95 fix(llm): derive openclaw auth password from llm id (#24480) 2026-03-18 19:01:02 +08:00
屈轩
db451719dd fix(region): vendor update (#24485) 2026-03-18 18:52:18 +08:00
wanyaoqi
25fbf463bc fix(baremetal-agent): bm register reuse baseprepare updateBmInfo (#24474) 2026-03-18 10:10:31 +08:00
Zexi Li
bc9c5cf088 fix(monitor): align multi-metric alert conditions in notifications (#24468) 2026-03-17 15:57:19 +08:00
屈轩
5476c43cda fix: add more log info (#24461) 2026-03-17 14:38:57 +08:00
Zexi Li
354e3cd872 feat(llm): add llm_types filters and cleanup dify cli (#24457) 2026-03-16 17:01:36 +08:00
Zexi Li
8c6167bb7b feat(llm): 调整 openclaw 容器与 LLM 基础模型/sku 逻辑 (#24453) 2026-03-16 16:19:40 +08:00
Zexi Li
ace220a0ca fix(llm): mount openclaw home dir (#24449) 2026-03-13 20:38:28 +08:00
屈轩
f1df0e3ac1 fix(region): avoid delete ksyun vm error (#24441) 2026-03-13 15:23:11 +08:00
Jian Qiu
39f3853f3e fix: compat fixes for container host in vm (#24439)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-03-13 13:26:42 +08:00
cwz_eikoh
2c59756f75 Automated cherry pick of #24338: feat(llm): init vllm as llm_container (#24437)
* feat(llm): init vllm as llm_container

* feat(vllm): fix save-instant-model for vllm

* feat(llm): support quick-model for vllm

* feat(vllm): support preferred-model in llm

* fix(llm): add ValidateSpec in llm_container_driver

* feat(vllm): auto-set vllm params
2026-03-13 11:07:19 +08:00
Zexi Li
6c98f46671 feat(host): rotate container logs (#24432) 2026-03-12 15:14:49 +08:00
Zexi Li
25d1965950 feat(llm): add login-info api (#24429) 2026-03-12 07:20:43 +08:00
wanyaoqi
620814527a fix(region): guestnetworksecgroup list add network info (#24392) 2026-03-11 19:31:46 +08:00
wanyaoqi
c32b6792d9 fix(host): check file exist before copy ovmf vars (#24365) 2026-03-11 19:29:25 +08:00
Zexi Li
88f9b71e53 feat(llm): restart action (#24426) 2026-03-11 19:07:39 +08:00
屈轩
90cc427ad5 fix(cloudmon): update volc api (#24423) 2026-03-11 16:54:44 +08:00
Zexi Li
81d1308ddd openclaw llm agent (#24411)
* support comfyui and openclaw

feat(region,host): support env credential of container

feat(llm): openclaw url

* fix(region): delete server without host_id

* feat(llm): llm spec
2026-03-11 15:21:10 +08:00
屈轩
6b83d6148f fix(monitor): add vm out bandwidth metric (#24417) 2026-03-11 13:49:55 +08:00
屈轩
f2e3713e04 fix(region): vendor update (#24413) 2026-03-11 11:03:18 +08:00
屈轩
86ce69b4a1 fix(region): persistence server status change (#24409) 2026-03-10 15:06:47 +08:00
Zexi Li
804cbbfd45 Automated cherry pick of #24399: feat(llm): polymetric dify with llm (#24405)
* feat(llm): polymetric dify with llm

* fix(llm): drop LLMSpecHolder & fix some bugs

---------

Co-authored-by: cwz <cwz_eikoh@163.com>
2026-03-10 10:23:44 +08:00
Zexi Li
93820a5af4 fix(region): associate eip to pod (#24402) 2026-03-09 15:23:57 +08:00
Zexi Li
6eca607a9b fix(monitor): 仅在 From/To/Interval 为空时设置默认值 (#24395)
setDefaultValue 中 From、To、Interval 改为仅在当前值为空时
才用 inputQuery 覆盖,避免覆盖用户已指定的查询时间范围与间隔
2026-03-06 19:13:10 +08:00
Zexi Li
b7d7a1aa16 fix(host): hard code start index of va gpu 2026-03-05 11:49:02 +08:00
Zexi Li
5b4f6f1f72 feat(host): cgroupv2 implemented for pod (#24116) 2026-03-04 11:21:42 +08:00
cwz_eikoh
64d3842c93 Automated cherry pick of #24355: fix: some bugs in mcp-agent & llm (#24383)
* fix(mcp-agent): encoding issue when simulated streaming

* fix(mcp-agent): use chat-stream in phase tool-choose

* fix(mcp-agent): support reasoning model

* fix(llm): add pre-delete detection

* feat(mcp-agent): add default mcp-agent

* feat(mcp-agent): add default-mcp-tools
2026-03-03 16:08:22 +08:00
cwz_eikoh
6a7904788a Automated cherry pick of #24354: feat(mcp-server): add mcp-server config (#24385)
* feat(mcp-server): add mcp-server config

* fix(mcp-agent): add claude mcp-server-config
2026-03-03 16:06:15 +08:00
屈轩
30cb39af98 fix(esxi-agent): vendor update for rebuild root fail (#24380) 2026-03-03 00:17:06 +08:00
Zexi Li
acb62fc773 feat(monitor): support disable_notify_recovery for commonalert (#24375) 2026-03-02 16:12:49 +08:00
屈轩
9f4f88fc62 fix(region): check bind disk resource (#24372) 2026-03-02 12:02:53 +08:00
屈轩
bcc6800988 fix(region): snapshot size opslog (#24369) 2026-02-28 16:38:29 +08:00
屈轩
520ecda36b fix(region): avoid sync remove disk (#24362) 2026-02-27 15:06:05 +08:00
屈轩
ad4ee389e5 fix(ansibleserver): update telegraf (#24359) 2026-02-27 14:06:40 +08:00
Jian Qiu
0ff2ef0e19 fix: allow uncache deleted image (#24349)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-02-26 23:08:24 +08:00
wanyaoqi
d7b099efa0 fix(host): add guest max mem size options (#24342) 2026-02-26 20:26:41 +08:00
Zexi Li
0096082472 fix(monitor): convert SNodeAlert to SCommonAlert in FetchCustomizeColumns (#24344)
Pass cObjs of type *SCommonAlert to SCommonAlertManager.FetchCustomizeColumns
instead of *SNodeAlert so the parent correctly fetches common alert columns.
2026-02-25 19:31:51 +08:00
Jian Qiu
479e8e1b3a fix: keep climc network-create backward compatibility (#24340)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-02-25 09:03:12 +08:00
屈轩
df2a6d6170 fix(region): avoid account sync cost time abnormal (#24336) 2026-02-24 17:34:02 +08:00
Jian Qiu
b6e11061ef fix: instance snapshot virtual size (#24328)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-02-24 09:23:14 +08:00
Zexi Li
8ce635a36a fix(region): wrong args type on callback function of DiskCreateTask (#24330) 2026-02-13 17:05:22 +08:00
Zexi Li
fbd83ed9b0 fix(host): do not set cached image status to active for TGZ on host (#24324)
TGZ images are unpacked after fetch on host; leave status update to region
StorageCacheImageTask so cachedimage becomes active only in OnCacheSucc.
2026-02-13 10:04:49 +08:00
Jian Qiu
4bb85225b0 fix: ensure s3 client init for s3 storage driver (#24321)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-02-12 10:01:12 +08:00
Zexi Li
e1c2b122b1 feat(region,host): support post overlay uppper config (#24287) 2026-02-11 16:57:04 +08:00
屈轩
5a49aa6a3c fix(yunionconf): policy scope (#24314) 2026-02-11 11:23:51 +08:00
wanyaoqi
3e557a8eb9 fix(host): set dmesg parse failed log level to debug (#24309) 2026-02-11 00:59:35 +08:00
wanyaoqi
39b64b8edd fix(host-deployer): deploy single disk has no disk id (#24304) 2026-02-10 19:35:45 +08:00
wanyaoqi
1b36450a7c fix(host-deployer): online resize loop dev (#24301)
* fix(host-deployer): online resize loop dev

* fix(host-deployer): update host-deployer-base
2026-02-10 17:07:51 +08:00
Zexi Li
11ca895482 feat(monitor): support alert reason notification (#24290)
* feat(monitor): support alert reason notification

* fix(climc): commonalert list options
2026-02-10 09:06:24 +08:00
Jian Qiu
48b438d37b fix: guest syncstatus subtask for disk create task (#24292)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-02-10 09:03:19 +08:00
屈轩
99e582286c fix(notify): notify receiver (#24297) 2026-02-09 20:42:39 +08:00
Jian Qiu
42da4e038c fix: remove parent task info from task context (#24283)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-02-09 13:22:02 +08:00
wanyaoqi
33b60e4bc6 fix(host): add device_id only scsi-hd device (#24279) 2026-02-09 11:26:45 +08:00
wanyaoqi
7cc035a767 fix(host): deploy nics config defore do add nics (#24276) 2026-02-09 08:38:35 +08:00
Jian Qiu
f84b8f1a65 fix: unify lb charge type (#24272)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-02-08 18:43:14 +08:00
Jian Qiu
1659268809 feature: support postpaid traffic metering (#24269)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-02-08 12:57:45 +08:00
wanyaoqi
73f71776de feat(region,host,vpcagent): allow guest network dedicate secgroups (#24261) 2026-02-07 17:31:44 +08:00
wanyaoqi
cebeaae9d0 fix(region,host): rbd snapshot get actual size (#24240)
- add host down and auto migrate notification
2026-02-07 17:30:54 +08:00
屈轩
8b3b1a0ab6 fix(region): vendor update (#24265) 2026-02-07 13:52:06 +08:00
wanyaoqi
1479e5da3e fix(region,host): rename screen dump info structure (#24258) 2026-02-06 18:08:50 +08:00
cwz_eikoh
0b229dc00a fix(llm): add handler in apigateway for mcp-agent-chat (#24254) 2026-02-05 18:16:46 +08:00
屈轩
60da86e645 fix(region): snapshot policy operation (#24249) 2026-02-05 16:40:33 +08:00
wanyaoqi
987fca770c fix(glance): set s3 bucket name before s3 init check (#24237) 2026-02-04 23:07:33 +08:00
屈轩
ee161f21b0 fix(yunionconf): support tags (#24231) 2026-02-04 17:13:59 +08:00
屈轩
1d898e52a7 fix(region): public cloud sku create (#24226) 2026-02-04 14:56:55 +08:00
屈轩
873006650f fix(region): support cloudpods vm disk driver (#24221) 2026-02-04 14:28:09 +08:00
Zexi Li
24dda38605 fix(region,climc): persist netinterface vlan_id to hostnetwork (#24213)
- climc: add VlanId to host-add-netif, host-remove-netif, host-enable-netif,
  host-disable-netif
- region: set bn.VlanId from netif.VlanId when attaching to network
- mcclient: include Vlan_ID in baremetalnetworks list columns
2026-02-04 11:03:12 +08:00
屈轩
cc3a74b2f9 fix(host): support skip check kernel mod (#24218) 2026-02-04 10:30:02 +08:00
屈轩
522ca973f2 fix(region): avoid duplicate check when update account aksk (#24209) 2026-02-03 20:53:12 +08:00
Zexi Li
3e982a7438 Automated cherry pick of #24194: Fix(llm): some mistakes, use CmpId & InstantModelId insteadof SvrId & ModelId (#24205)
* fix(llm): some mistakes

* fix(llm): use CmpId instead of SvrId

* fix(llm): instant_model use id instead of modelId

---------

Co-authored-by: cwz <cwz_eikoh@163.com>
2026-02-03 16:46:07 +08:00
Zexi Li
05bb19c5a6 fix(monitor): comparator string (#24202) 2026-02-03 12:01:41 +08:00
屈轩
9489b6baa4 fix(region): init snapshot policy disk table (#24198) 2026-02-02 20:38:49 +08:00
wanyaoqi
e86609c969 fix(host): guestnetworksync do nothing on detach vfio nic (#24178) 2026-02-02 20:18:05 +08:00
Jian Qiu
8e1c23ec2e fix: allow guestnetwork ip4 addr field nullable (#24191)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-02-02 20:16:29 +08:00
Zexi Li
6b68d880c7 feat(monitor): add the registered model manger function (#24153) 2026-02-02 17:50:46 +08:00
屈轩
3f0c52be68 fix(climc): sku create support arch (#24186) 2026-02-02 14:17:08 +08:00
屈轩
9204340b38 fix(notify): support webhook sign (#24182) 2026-02-02 12:53:55 +08:00
wanyaoqi
c005337eed Automated cherry pick of #24126: feat(region,host): riscv64 cpu arch support (#24174)
* feat(region,host): riscv64 cpu arch support

* fix(region,host): compatible riscv64

* fix(host): add qemu v10.0.7 support
2026-02-01 20:27:12 +08:00
wanyaoqi
7d4245c677 fix(host): live migrate add timeout (#24162) 2026-02-01 20:24:00 +08:00
wanyaoqi
5341c97ccf fix(region): server add set network num queues (#24166) 2026-02-01 20:12:39 +08:00
wanyaoqi
a1bfcc1d9f fix(glance): set glance s3 bucket name default onecloud-images (#24171) 2026-02-01 20:10:57 +08:00
屈轩
e1730556e1 fix(region): defer ctx cancel (#24156) 2026-01-30 19:11:58 +08:00
cwz_eikoh
f2cc3f0c18 Automated cherry pick of #24149: Fix(llm): fix bugs & apikey encrypt & support history for mcp-agent-chat & delete modelname in llmSku (#24150)
* fix(llm): mcp-agent apiKey encrypt

* fix(llm): error-handle when instant-model import

* feature(llm): add get-available-network for llm

* feature(llm): support history for mcp-agent-chat

* fix(llm): llm create with net instead of networktype & networkid

* fix(llm): delete modelName in llmSku & fix some bugs
2026-01-29 10:50:11 +08:00
wanyaoqi
cd755ba02b fix(region): have agent add check is telegraf deployed (#24145) 2026-01-29 10:34:13 +08:00
屈轩
86ffcde03a fix(region): billing resource create time (#24140) 2026-01-28 19:59:48 +08:00
屈轩
fa08f8fd8f fix(glance): support prob iso image (#24133) 2026-01-28 15:28:56 +08:00
Zexi Li
7f54e038c0 fix(llm): add community-registry api (#24130) 2026-01-28 14:30:43 +08:00
Jian Qiu
d83585f158 fix: skip baremetal-agent riscv64 (#24123)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-01-24 20:33:16 +08:00
屈轩
855afe6dc5 fix(region): vendor update (#24118) 2026-01-23 17:03:32 +08:00
屈轩
784efcf211 fix(region): cloudpods container sync (#24113) 2026-01-21 15:33:40 +08:00
7220 changed files with 842172 additions and 420114 deletions

View File

@@ -13,7 +13,7 @@ jobs:
- name: Setup Go
uses: actions/setup-go@v4
with:
go-version: '1.25'
go-version: '1.26.3'
- name: Install check tools
shell: bash

View File

@@ -22,7 +22,7 @@ jobs:
- uses: actions/setup-go@v4
with:
go-version: '1.25'
go-version: '1.26.3'
- name: Set up QEMU
uses: docker/setup-qemu-action@v2

View File

@@ -20,7 +20,7 @@ jobs:
- uses: actions/setup-go@v4
with:
go-version: '1.25'
go-version: '1.26.3'
- name: Set up QEMU
uses: docker/setup-qemu-action@v2

View File

@@ -21,7 +21,7 @@ jobs:
- uses: actions/setup-go@v4
with:
go-version: '1.25'
go-version: '1.26.3'
- name: Set up QEMU
uses: docker/setup-qemu-action@v2

View File

@@ -19,7 +19,7 @@ jobs:
- uses: actions/setup-go@v4
with:
go-version: '1.25'
go-version: '1.26.3'
- name: Set up QEMU
uses: docker/setup-qemu-action@v2

View File

@@ -23,7 +23,7 @@ jobs:
- uses: actions/setup-go@v4
with:
go-version: '1.25'
go-version: '1.26.3'
- name: Set up QEMU
uses: docker/setup-qemu-action@v2

View File

@@ -19,7 +19,7 @@ jobs:
- uses: actions/setup-go@v4
with:
go-version: '1.25'
go-version: '1.26.3'
- name: Set up QEMU
uses: docker/setup-qemu-action@v2

View File

@@ -23,7 +23,7 @@ jobs:
- uses: actions/setup-go@v4
with:
go-version: '1.25'
go-version: '1.26.3'
- name: Set up QEMU
uses: docker/setup-qemu-action@v2

View File

@@ -23,7 +23,7 @@ jobs:
- uses: actions/setup-go@v4
with:
go-version: '1.25'
go-version: '1.26.3'
- name: Set up QEMU
uses: docker/setup-qemu-action@v2

View File

@@ -23,7 +23,7 @@ jobs:
- uses: actions/setup-go@v4
with:
go-version: '1.25'
go-version: '1.26.3'
- name: Set up QEMU
uses: docker/setup-qemu-action@v2

View File

@@ -24,7 +24,7 @@ jobs:
- uses: actions/setup-go@v4
with:
go-version: '1.25'
go-version: '1.26.3'
- name: Set up QEMU
uses: docker/setup-qemu-action@v2

View File

@@ -20,7 +20,7 @@ jobs:
- uses: actions/setup-go@v4
with:
go-version: '1.25'
go-version: '1.26.3'
- name: Set up QEMU
uses: docker/setup-qemu-action@v2

View File

@@ -23,7 +23,7 @@ jobs:
- uses: actions/setup-go@v4
with:
go-version: '1.25'
go-version: '1.26.3'
- name: Set up QEMU
uses: docker/setup-qemu-action@v2

View File

@@ -185,6 +185,7 @@ y18n-lang := en-US,zh-CN
y18n-packages := \
yunion.io/x/onecloud/cmd/apigateway \
yunion.io/x/onecloud/cmd/keystone \
yunion.io/x/onecloud/cmd/llm \
yunion.io/x/onecloud/cmd/monitor \
yunion.io/x/onecloud/cmd/region \
yunion.io/x/onecloud/cmd/yunionconf \
@@ -260,7 +261,7 @@ dep:
@echo "$$depDeprecated"
@$(MAKE) mod
RELEASE_BRANCH:=release/4.0
RELEASE_BRANCH:=release/4.0.4
GOPROXY ?= direct
mod:

View File

@@ -8,7 +8,7 @@ endif
ModBaseName:=$(notdir $(ModName))
DockerImageRegistry?=registry.cn-beijing.aliyuncs.com
DockerImageAlpineBuild?=$(DockerImageRegistry)/yunionio/alpine-build:3.22.2-go-1.24.9-0
DockerImageAlpineBuild?=$(DockerImageRegistry)/yunionio/alpine-build:3.23-go-1.26.3-0
EnvIf=$(if $($(1)),$(1)=$($(1)))

1
build/aiproxy/vars Normal file
View File

@@ -0,0 +1 @@
DESCRIPTION="Yunion Cloud AI Proxy Service"

View File

@@ -79,6 +79,8 @@ echo "# Yunion RPM spec
%global pkgname yunion-$PKG
%global homedir /var/run/%{owner}
%global use_systemd $SERVICE
%global debug_package %{nil}
%global __strip /usr/bin/eu-strip
Name: %{pkgname}
Version: $VERSION

View File

@@ -0,0 +1,3 @@
FROM registry.cn-beijing.aliyuncs.com/yunionio/onecloud-base:v3.22.2-0
ADD ./_output/alpine-build/bin/aiproxy /opt/yunion/bin/aiproxy

View File

@@ -2,7 +2,7 @@ FROM registry.cn-beijing.aliyuncs.com/yunionio/ansibleserver-base:3.22.2-0
# https://github.com/yunionio/telegraf/blob/yn-release-1.36/Makefile.yn#L28
# install playbook and telegraf install pkg
COPY --from=registry.cn-beijing.aliyuncs.com/yunionio/file-repo:v0.5.2 /opt/yunion/playbook /opt/yunion/playbook
COPY --from=registry.cn-beijing.aliyuncs.com/yunionio/file-repo:v0.5.2 /opt/yunion/ansible-install-pkg /opt/yunion/ansible-install-pkg
COPY --from=registry.cn-beijing.aliyuncs.com/yunionio/file-repo:v0.5.5 /opt/yunion/playbook /opt/yunion/playbook
COPY --from=registry.cn-beijing.aliyuncs.com/yunionio/file-repo:v0.5.5 /opt/yunion/ansible-install-pkg /opt/yunion/ansible-install-pkg
ADD ./_output/alpine-build/bin/ansibleserver /opt/yunion/bin/ansibleserver

View File

@@ -1,4 +1,4 @@
FROM registry.cn-beijing.aliyuncs.com/yunionio/baremetal-base:v0.3.9-20251215.0
FROM registry.cn-beijing.aliyuncs.com/yunionio/baremetal-base:v0.3.9-20260724.0
LABEL maintainer="Zexi Li <lizexi@yunionyun.com>"

View File

@@ -1,8 +1,8 @@
#RUN yum install -y https://iso.yunion.cn/vm-images/baremetal-pxerom-1.1.0-21092209.x86_64.rpm
#RUN yum install -y http://192.168.23.50:8083/baremetal-pxerom-1.1.0-21092209.x86_64.rpm
FROM registry.cn-beijing.aliyuncs.com/yunionio/yunionos:v4.0.0-20251201.0 as yunionos
FROM registry.cn-beijing.aliyuncs.com/yunionio/yunionos:v4.0.0-20251203.0 as yunionos
FROM centos:8 as grub-stage
FROM registry.cn-beijing.aliyuncs.com/cloudpods/centos:8 as grub-stage
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

View File

@@ -1,4 +1,4 @@
FROM registry.cn-beijing.aliyuncs.com/yunionio/host-deployer-base:1.5.3
FROM registry.cn-beijing.aliyuncs.com/yunionio/host-deployer-base:1.5.11
LABEL maintainer="Yaoqi Wan wanyaoqi@yunionyun.com"

View File

@@ -1,6 +1,7 @@
REGISTRY ?= "registry.cn-beijing.aliyuncs.com/yunionio"
DOCKER_BUILD = docker build -t $(REGISTRY)
DOCKER_BUILDX = docker buildx build --platform linux/arm64,linux/amd64,linux/riscv64 --push -t $(REGISTRY)
DOCKER_BUILDX_BM = docker buildx build --platform linux/arm64,linux/amd64 --push -t $(REGISTRY)
debian10-base:
@@ -40,7 +41,7 @@ WEBCONSOLE_BASE_VERSION_3-22-2 = 3.22.2-1
webconsole-base:
$(DOCKER_BUILDX)/webconsole-base:$(WEBCONSOLE_BASE_VERSION_3-22-2) -f ./Dockerfile.webconsole-base .
BAREMETAL_BASE_VERSION = v0.3.9-20251112.1
BAREMETAL_BASE_VERSION = v0.3.9-20260724.0
FEDORA_RISCV64_VERSION = 42
fedora-riscv64-base:
@@ -53,8 +54,9 @@ baremetal-base-riscv: fedora-riscv64-base
$(DOCKER_BUILDX)/baremetal-base:$(BAREMETAL_BASE_VERSION) -f ./Dockerfile.baremetal-base-riscv .
#docker push $(REGISTRY)/baremetal-base:$(BAREMETAL_BASE_VERSION)
# TODO: support riscv64 for baremetal-base
baremetal-base:
$(DOCKER_BUILDX)/baremetal-base:$(BAREMETAL_BASE_VERSION) -f ./Dockerfile.baremetal-base .
$(DOCKER_BUILDX_BM)/baremetal-base:$(BAREMETAL_BASE_VERSION) -f ./Dockerfile.baremetal-base .
#docker push $(REGISTRY)/baremetal-base:$(BAREMETAL_BASE_VERSION)
TORRENT_VERSION = 20210815.0
@@ -71,18 +73,6 @@ glance-base-3-22-2:
$(DOCKER_BUILDX)/glance-base:$(GLANCE_BASE_VERSION_3-22-2) -f ./Dockerfile.glance-base .
HOST_IMAGE_VERSION ?= v1.0.2
HOST_IMAGE_NAME = $(REGISTRY)/host-image:$(HOST_IMAGE_VERSION)
host-image:
docker pull $(HOST_IMAGE_NAME)-amd64 --platform amd64
docker pull $(HOST_IMAGE_NAME)-arm64 --platform arm64
docker manifest create $(HOST_IMAGE_NAME) \
$(HOST_IMAGE_NAME)-amd64 \
$(HOST_IMAGE_NAME)-arm64
docker manifest annotate $(HOST_IMAGE_NAME) $(HOST_IMAGE_NAME)-amd64 --arch amd64
docker manifest annotate $(HOST_IMAGE_NAME) $(HOST_IMAGE_NAME)-arm64 --arch arm64
docker manifest push $(HOST_IMAGE_NAME)
LBAGENT_BASE_VERSION = v0.0.5
lbagent-base:
$(DOCKER_BUILDX)/lbagent-base:$(LBAGENT_BASE_VERSION) -f ./Dockerfile.lbagent-base .

View File

@@ -2,7 +2,8 @@
触发时间: {{.start_time}}
报警级别: {{.level}}
触发条件: {{.description | unescaped}}
报警数量:{{len .matches}}
{{if .reason}}报警原因: {{.reason}}
{{end}}报警数量:{{len .matches}}
资源名称:{{.resource_name}}
详情地址: {{.web_url}}

View File

@@ -88,8 +88,19 @@
</tr>
<tr>
<td class="td">策略详情:</td>
<td>{{.description}}</td>
<td>
{{- range $i, $m := .matches -}}
{{- if $i}}<br/>{{end -}}
{{- $m.condition | unescaped -}}
{{- end -}}
</td>
</tr>
{{if .reason}}
<tr>
<td class="td">报警原因:</td>
<td>{{.reason}}</td>
</tr>
{{end}}
</table>
<table class="table" style="padding-top: 6px; padding-bottom: 10px;">
<tr>

View File

@@ -2,7 +2,8 @@ AlertName: {{.name}}
Time: {{.start_time}}
Level: {{.level}}
TriggerCondition: {{.description | unescaped}}
AlertCount: {{len .matches}}
{{if .reason}}Reason: {{.reason}}
{{end}}AlertCount: {{len .matches}}
ResourceName: {{.resource_name}}
WebUrl: {{.web_url}}

View File

@@ -88,8 +88,19 @@
</tr>
<tr>
<td class="td">Strategy details</td>
<td>{{.description}}</td>
<td>
{{- range $i, $m := .matches -}}
{{- if $i}}<br/>{{end -}}
{{- $m.condition | unescaped -}}
{{- end -}}
</td>
</tr>
{{if .reason}}
<tr>
<td class="td">Reason</td>
<td>{{.reason}}</td>
</tr>
{{end}}
</table>
<table class="table" style="padding-top: 6px; padding-bottom: 10px;">
<tr>

26
cmd/aiproxy/main.go Normal file
View File

@@ -0,0 +1,26 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"yunion.io/x/onecloud/pkg/aiproxy/service"
"yunion.io/x/onecloud/pkg/util/atexit"
)
func main() {
defer atexit.Handle()
service.StartService()
}

View File

@@ -17,6 +17,7 @@ package main
import (
"yunion.io/x/onecloud/cmd/climc/entry"
_ "yunion.io/x/onecloud/cmd/climc/shell"
_ "yunion.io/x/onecloud/cmd/climc/shell/aiproxy"
_ "yunion.io/x/onecloud/cmd/climc/shell/ansible"
_ "yunion.io/x/onecloud/cmd/climc/shell/apimap"
_ "yunion.io/x/onecloud/cmd/climc/shell/cloudevent"

View File

@@ -0,0 +1,31 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aiproxy
import (
"yunion.io/x/onecloud/cmd/climc/shell"
apmodules "yunion.io/x/onecloud/pkg/mcclient/modules/aiproxy"
apoptions "yunion.io/x/onecloud/pkg/mcclient/options/aiproxy"
)
func init() {
cmd := shell.NewResourceCmd(&apmodules.AiKeys)
cmd.Create(new(apoptions.AiKeyCreateOptions))
cmd.List(new(apoptions.AiKeyListOptions))
cmd.Show(new(apoptions.AiKeyShowOptions))
cmd.Update(new(apoptions.AiKeyUpdateOptions))
cmd.Delete(new(apoptions.AiKeyDeleteOptions))
registerEnableDisable(cmd)
}

View File

@@ -0,0 +1,31 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aiproxy
import (
"yunion.io/x/onecloud/cmd/climc/shell"
apmodules "yunion.io/x/onecloud/pkg/mcclient/modules/aiproxy"
apoptions "yunion.io/x/onecloud/pkg/mcclient/options/aiproxy"
)
func init() {
cmd := shell.NewResourceCmd(&apmodules.AiModels)
cmd.Create(new(apoptions.AiModelCreateOptions))
cmd.List(new(apoptions.AiModelListOptions))
cmd.Show(new(apoptions.AiModelShowOptions))
cmd.Update(new(apoptions.AiModelUpdateOptions))
cmd.Delete(new(apoptions.AiModelDeleteOptions))
registerEnableDisable(cmd)
}

View File

@@ -0,0 +1,35 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aiproxy
import (
"yunion.io/x/onecloud/cmd/climc/shell"
apmodules "yunion.io/x/onecloud/pkg/mcclient/modules/aiproxy"
"yunion.io/x/onecloud/pkg/mcclient/options"
apoptions "yunion.io/x/onecloud/pkg/mcclient/options/aiproxy"
)
func init() {
cmd := shell.NewResourceCmd(&apmodules.AiProviders)
cmd.Create(new(apoptions.AiProviderCreateOptions))
cmd.List(new(apoptions.AiProviderListOptions))
cmd.Show(new(apoptions.AiProviderShowOptions))
cmd.Update(new(apoptions.AiProviderUpdateOptions))
cmd.Delete(new(apoptions.AiProviderDeleteOptions))
cmd.PerformClass("test-connectivity", new(apoptions.AiProviderTestConnectivityOptions))
cmd.Perform("test-connectivity", new(options.BaseIdOptions))
cmd.Perform("set-models", new(apoptions.AiProviderSetModelsOptions))
registerEnableDisable(cmd)
}

View File

@@ -0,0 +1,32 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aiproxy
import (
"yunion.io/x/onecloud/cmd/climc/shell"
apmodules "yunion.io/x/onecloud/pkg/mcclient/modules/aiproxy"
apoptions "yunion.io/x/onecloud/pkg/mcclient/options/aiproxy"
)
func init() {
cmd := shell.NewResourceCmd(&apmodules.AiProxyNodes)
cmd.Create(new(apoptions.AiProxyNodeCreateOptions))
cmd.List(new(apoptions.AiProxyNodeListOptions))
cmd.Show(new(apoptions.AiProxyNodeShowOptions))
cmd.Update(new(apoptions.AiProxyNodeUpdateOptions))
cmd.Delete(new(apoptions.AiProxyNodeDeleteOptions))
registerEnableDisable(cmd)
cmd.PerformClass("register", new(apoptions.AiProxyNodeRegisterOptions))
}

View File

@@ -0,0 +1,55 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aiproxy
import (
"yunion.io/x/onecloud/cmd/climc/shell"
"yunion.io/x/onecloud/pkg/mcclient"
"yunion.io/x/onecloud/pkg/mcclient/modulebase"
apmodules "yunion.io/x/onecloud/pkg/mcclient/modules/aiproxy"
apoptions "yunion.io/x/onecloud/pkg/mcclient/options/aiproxy"
)
func init() {
cmd := shell.NewResourceCmd(&apmodules.AIProxyUsage)
cmd.ClassShow(new(apoptions.AiProxyUsageOverviewOptions))
cmd.ClassShow(new(apoptions.AiProxyUsageAnalysisOptions))
cmd.RunWithDesc("event-list", "List ai_proxy_usage events", new(apoptions.AiProxyUsageEventListOptions),
func(s *mcclient.ClientSession, args *apoptions.AiProxyUsageEventListOptions) error {
params, err := args.Params()
if err != nil {
return err
}
ret, err := apmodules.AIProxyUsage.Get(s, args.GetId(), params)
if err != nil {
return err
}
shell.PrintList(modulebase.JSON2ListResult(ret), []string{
"id",
"timestamp",
"model",
"provider",
"source",
"api_key_label",
"input_tokens",
"output_tokens",
"total_tokens",
"latency_ms",
"result",
"status_code",
})
return nil
})
}

View File

@@ -0,0 +1,32 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aiproxy
import (
"yunion.io/x/onecloud/cmd/climc/shell"
apmodules "yunion.io/x/onecloud/pkg/mcclient/modules/aiproxy"
apoptions "yunion.io/x/onecloud/pkg/mcclient/options/aiproxy"
)
func init() {
cmd := shell.NewResourceCmd(&apmodules.AiRoutings)
cmd.Create(new(apoptions.AiRoutingCreateOptions))
cmd.List(new(apoptions.AiRoutingListOptions))
cmd.Show(new(apoptions.AiRoutingShowOptions))
cmd.Update(new(apoptions.AiRoutingUpdateOptions))
cmd.Delete(new(apoptions.AiRoutingDeleteOptions))
cmd.Perform("set-models", new(apoptions.AiRoutingSetModelsOptions))
registerEnableDisable(cmd)
}

View File

@@ -0,0 +1,30 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aiproxy
import (
"yunion.io/x/onecloud/cmd/climc/shell"
apmodules "yunion.io/x/onecloud/pkg/mcclient/modules/aiproxy"
apoptions "yunion.io/x/onecloud/pkg/mcclient/options/aiproxy"
)
func init() {
cmd := shell.NewResourceCmd(&apmodules.AiRoutingModels)
cmd.Create(new(apoptions.AiRoutingModelCreateOptions))
cmd.List(new(apoptions.AiRoutingModelListOptions))
cmd.Show(new(apoptions.AiRoutingModelShowOptions))
cmd.Update(new(apoptions.AiRoutingModelUpdateOptions))
cmd.Delete(new(apoptions.AiRoutingModelDeleteOptions))
}

View File

@@ -0,0 +1,31 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aiproxy
import (
"yunion.io/x/onecloud/cmd/climc/shell"
apmodules "yunion.io/x/onecloud/pkg/mcclient/modules/aiproxy"
apoptions "yunion.io/x/onecloud/pkg/mcclient/options/aiproxy"
)
func init() {
cmd := shell.NewResourceCmd(&apmodules.AiVirtualKeys)
cmd.Create(new(apoptions.AiVirtualKeyCreateOptions))
cmd.List(new(apoptions.AiVirtualKeyListOptions))
cmd.Show(new(apoptions.AiVirtualKeyShowOptions))
cmd.Update(new(apoptions.AiVirtualKeyUpdateOptions))
cmd.Delete(new(apoptions.AiVirtualKeyDeleteOptions))
registerEnableDisable(cmd)
}

View File

@@ -0,0 +1,26 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aiproxy
import (
"yunion.io/x/onecloud/pkg/aiproxy/codexconfig"
"yunion.io/x/onecloud/pkg/mcclient"
)
func init() {
R(&codexconfig.Options{}, "ai-codex-config", "Generate Codex CLI config for aiproxy", func(s *mcclient.ClientSession, args *codexconfig.Options) error {
return codexconfig.Run(s, args)
})
}

View File

@@ -0,0 +1,21 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aiproxy
import (
"yunion.io/x/onecloud/cmd/climc/shell"
)
var R = shell.R

View File

@@ -0,0 +1,16 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Package aiproxy registers climc commands for the aiproxy service.
package aiproxy // import "yunion.io/x/onecloud/cmd/climc/shell/aiproxy"

View File

@@ -0,0 +1,25 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aiproxy
import (
"yunion.io/x/onecloud/cmd/climc/shell"
baseoptions "yunion.io/x/onecloud/pkg/mcclient/options"
)
func registerEnableDisable(cmd *shell.ResourceCmd) {
cmd.Perform("enable", new(baseoptions.BaseIdOptions))
cmd.Perform("disable", new(baseoptions.BaseIdOptions))
}

View File

@@ -0,0 +1,26 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aiproxy
import (
"yunion.io/x/onecloud/pkg/aiproxy/ft"
"yunion.io/x/onecloud/pkg/mcclient"
)
func init() {
R(&ft.AnthropicOptions{}, "ai-test-anthropic", "Run aiproxy Anthropic Messages API E2E test", func(s *mcclient.ClientSession, args *ft.AnthropicOptions) error {
return ft.RunAnthropicTest(s, args)
})
}

View File

@@ -0,0 +1,26 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aiproxy
import (
"yunion.io/x/onecloud/pkg/aiproxy/ft"
"yunion.io/x/onecloud/pkg/mcclient"
)
func init() {
R(&ft.ChatOptions{}, "ai-test-chat", "Run aiproxy OpenAI chat E2E test", func(s *mcclient.ClientSession, args *ft.ChatOptions) error {
return ft.RunChatTest(s, args)
})
}

View File

@@ -0,0 +1,26 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aiproxy
import (
"yunion.io/x/onecloud/pkg/aiproxy/ft"
"yunion.io/x/onecloud/pkg/mcclient"
)
func init() {
R(&ft.ProviderCreateOptions{}, "ai-test-provider-create", "Create custom ai_provider and verify", func(s *mcclient.ClientSession, args *ft.ProviderCreateOptions) error {
return ft.RunProviderCreateTest(s, args)
})
}

View File

@@ -19,7 +19,7 @@ import (
"yunion.io/x/onecloud/pkg/mcclient"
modules "yunion.io/x/onecloud/pkg/mcclient/modules/ansible"
"yunion.io/x/onecloud/pkg/mcclient/options"
options "yunion.io/x/onecloud/pkg/mcclient/options/ansible"
)
func init() {

View File

@@ -56,6 +56,9 @@ func init() {
})
R(&options.MeshNetworkUpdateOptions{}, "meshnetwork-update", "Update mesh network", func(s *mcclient.ClientSession, opts *options.MeshNetworkUpdateOptions) error {
params, err := base_options.StructToParams(opts)
if err != nil {
return err
}
mn, err := modules.MeshNetworks.Update(s, opts.ID, params)
if err != nil {
return err

View File

@@ -56,6 +56,9 @@ func init() {
})
R(&options.RouterUpdateOptions{}, "router-update", "Update router", func(s *mcclient.ClientSession, opts *options.RouterUpdateOptions) error {
params, err := base_options.StructToParams(opts)
if err != nil {
return err
}
router, err := modules.Routers.Update(s, opts.ID, params)
if err != nil {
return err

View File

@@ -56,6 +56,9 @@ func init() {
})
R(&options.RouteUpdateOptions{}, "router-route-update", "Update router route", func(s *mcclient.ClientSession, opts *options.RouteUpdateOptions) error {
params, err := base_options.StructToParams(opts)
if err != nil {
return err
}
router, err := modules.Routes.Update(s, opts.ID, params)
if err != nil {
return err

View File

@@ -56,6 +56,9 @@ func init() {
})
R(&options.RuleUpdateOptions{}, "router-rule-update", "Update router rule", func(s *mcclient.ClientSession, opts *options.RuleUpdateOptions) error {
params, err := base_options.StructToParams(opts)
if err != nil {
return err
}
router, err := modules.Rules.Update(s, opts.ID, params)
if err != nil {
return err

View File

@@ -103,4 +103,5 @@ func init() {
cmd.Perform("enable-image-cache", new(AgentEnableImageCacheOpt))
cmd.Perform("disable-image-cache", new(AgentDisableImageCacheOpt))
cmd.Delete(new(AgentDeleteOpt))
cmd.Get("app-options", &options.BaseIdOptions{})
}

View File

@@ -58,7 +58,7 @@ func init() {
type HostNetworkDetailOptions struct {
HOST string `help:"ID or Name of Host"`
NETWORK string `help:"ID or Name of Wire"`
NETWORK string `help:"ID or Name of Network"`
}
R(&HostNetworkDetailOptions{}, "host-network-show", "Show baremetal network details", func(s *mcclient.ClientSession, args *HostNetworkDetailOptions) error {
result, err := modules.Baremetalnetworks.Get(s, args.HOST, args.NETWORK, nil)

View File

@@ -24,7 +24,7 @@ func init() {
cmd := shell.NewResourceCmd(&modules.Cloudaccounts).WithKeyword("cloud-account")
cmd.List(&options.CloudaccountListOptions{})
cmd.Show(&options.SCloudAccountIdOptions{})
cmd.Show(&options.CloudaccountShowOptions{})
cmd.Delete(&options.SCloudAccountIdOptions{})
cmd.Update(&options.SCloudAccountUpdateBaseOptions{})
// cmd.PerformClassWithKeyword("preparenets-vmware", "prepare-nets", &options.SVMwareCloudAccountPrepareNetsOptions{})
@@ -41,6 +41,7 @@ func init() {
cmd.CreateWithKeyword("create-hcs", &options.SHCSAccountCreateOptions{})
cmd.CreateWithKeyword("create-hcsop", &options.SHcsOpCloudAccountCreateOptions{})
cmd.CreateWithKeyword("create-ucloud", &options.SUcloudCloudAccountCreateOptions{})
cmd.CreateWithKeyword("create-rockbase", &options.SRockbaseAccountCreateOptions{})
cmd.CreateWithKeyword("create-volcengine", &options.SVolcengineCloudAccountCreateOptions{})
cmd.CreateWithKeyword("create-zstack", &options.SZStackCloudAccountCreateOptions{})
cmd.CreateWithKeyword("create-s3", &options.SS3CloudAccountCreateOptions{})
@@ -76,6 +77,7 @@ func init() {
cmd.UpdateWithKeyword("update-hcso", &options.SHCSOAccountUpdateOptions{})
cmd.UpdateWithKeyword("update-hcs", &options.SHCSAccountUpdateOptions{})
cmd.UpdateWithKeyword("update-ucloud", &options.SUcloudCloudAccountUpdateOptions{})
cmd.UpdateWithKeyword("update-rockbase", &options.SRockbaseAccountUpdateOptions{})
cmd.UpdateWithKeyword("update-volcengine", &options.SVolcengineCloudAccountUpdateOptions{})
cmd.UpdateWithKeyword("update-zstack", &options.SZStackCloudAccountUpdateOptions{})
cmd.UpdateWithKeyword("update-s3", &options.SS3CloudAccountUpdateOptions{})
@@ -107,6 +109,7 @@ func init() {
cmd.PerformWithKeyword("update-credential-hcso", "update-credential", &options.SHCSOAccountUpdateCredentialOptions{})
cmd.PerformWithKeyword("update-credential-hcs", "update-credential", &options.SHCSOAccountUpdateCredentialOptions{})
cmd.PerformWithKeyword("update-credential-ucloud", "update-credential", &options.SUcloudCloudAccountUpdateCredentialOptions{})
cmd.PerformWithKeyword("update-credential-rockbase", "update-credential", &options.SRockbaseAccountUpdateCredentialOptions{})
cmd.PerformWithKeyword("update-credential-volcengine", "update-credential", &options.SVolcengineCloudAccountUpdateCredentialOptions{})
cmd.PerformWithKeyword("update-credential-zstack", "update-credential", &options.SZStackCloudAccountUpdateCredentialOptions{})
cmd.PerformWithKeyword("update-credential-s3", "update-credential", &options.SS3CloudAccountUpdateCredentialOptions{})
@@ -132,6 +135,7 @@ func init() {
cmd.PerformWithKeyword("test-connectivity-openstack", "test-connectivity", &options.SOpenStackCloudAccountUpdateCredentialOptions{})
cmd.PerformWithKeyword("test-connectivity-huawei", "test-connectivity", &options.SHuaweiCloudAccountUpdateCredentialOptions{})
cmd.PerformWithKeyword("test-connectivity-ucloud", "test-connectivity", &options.SUcloudCloudAccountUpdateCredentialOptions{})
cmd.PerformWithKeyword("test-connectivity-rockbase", "test-connectivity", &options.SRockbaseAccountUpdateCredentialOptions{})
cmd.PerformWithKeyword("test-connectivity-volcengine", "test-connectivity", &options.SVolcengineCloudAccountUpdateCredentialOptions{})
cmd.PerformWithKeyword("test-connectivity-zstack", "test-connectivity", &options.SZStackCloudAccountUpdateCredentialOptions{})
cmd.PerformWithKeyword("test-connectivity-s3", "test-connectivity", &options.SS3CloudAccountUpdateCredentialOptions{})

View File

@@ -26,7 +26,7 @@ import (
func init() {
type CloudproviderRegionListOptions struct {
options.BaseListOptions
Region string `help:"ID or Name of Host"`
Region string `help:"ID or Name of Region"`
Capability []string `help:"capability filter" choices:"project|compute|network|loadbalancer|objectstore|rds|cache|event"`
}

View File

@@ -34,15 +34,18 @@ func init() {
cmd.Perform("purge", &compute.CloudregionPurgeOptions{})
type CloudregionListOptions struct {
_ struct{} `mcp-desc:"【创建流程中的中间步骤】本工具不能完成创建。指定云厂商时必须传 provider例如创建阿里云provider=[\"Aliyun\"]。创建虚拟机时必须 usable=trueMCP 默认注入)。查完后继续 capability/镜像/sku最后 climc_server_create。严禁只查区域后停止"`
options.BaseListOptions
Usable *bool `help:"List regions where networks are usable"`
UsableVpc *bool `help:"List regions where VPC are usable"`
Service string `help:"List regions which service has available skus" choices:"dbinstances|servers|elasticcaches"`
Usable *bool `help:"只列网络可用的区域;创建虚拟机时必须为 trueMCP 默认注入 usable=true" mcp:"true"`
UsableVpc *bool `help:"List regions where VPC are usable" mcp:"true"`
Service string `help:"List regions which service has available skus" choices:"dbinstances|servers|elasticcaches" mcp:"true"`
ReadOnly *bool `help:"List regions with read only account"`
City string `help:"List regions in the specified city"`
City string `help:"List regions in the specified city" mcp:"true"`
Capability []string `help:"capability filter" choices:"project|compute|network|loadbalancer|objectstore|rds|cache|event"`
Capability []string `help:"capability filter" choices:"project|compute|network|loadbalancer|objectstore|rds|cache|event" mcp:"true"`
DistinctField string `help:"list the specified distinct field, e.g. city, region"`
@@ -148,7 +151,7 @@ func init() {
Desc string `help:"Description" json:"description" token:"desc"`
Latitude float32 `help:"region geographical location - latitude"`
Longitude float32 `help:"region geographical location - longitude"`
City string `help:"region geograpical location - city, e.g. Beijing, Frankfurt"`
City string `help:"region geographical location - city, e.g. Beijing, Frankfurt"`
CountryCode string `help:"region geographical location - ISO country code, e.g. CN"`
}
R(&CloudregionCreateOptions{}, "cloud-region-create", "Create a cloud region", func(s *mcclient.ClientSession, args *CloudregionCreateOptions) error {
@@ -191,7 +194,7 @@ func init() {
Desc string `help:"Description of the region" json:"description" token:"desc"`
Latitude float32 `help:"region geographical location - latitude"`
Longitude float32 `help:"region geographical location - longitude"`
City string `help:"region geograpical location - city, e.g. Beijing, Frankfurt"`
City string `help:"region geographical location - city, e.g. Beijing, Frankfurt"`
CountryCode string `help:"region geographical location - ISO country code, e.g. CN"`
}
R(&CloudregionUpdateOptions{}, "cloud-region-update", "Update a cloud region", func(s *mcclient.ClientSession, args *CloudregionUpdateOptions) error {
@@ -223,13 +226,18 @@ func init() {
})
type CloudregionCapabiltyOptions struct {
ID string `help:"ID or name of cloud region to check" json:"-"`
Domain string `help:"cloud region domain"`
_ struct{} `mcp-desc:"【创建流程中的中间步骤】查询区域能力尤其是可用磁盘存储类型storage_types2 / system_storage_types。公有云创建前必须调用ID 用 climc_cloud_region_list 返回的 id。从返回中选系统盘 backend如 cloud_essd、cloud_ssd写入 disk 的 backend=。查完继续镜像/网络/sku最后 climc_server_create"`
ID string `help:"ID or name of cloud region to check必须用 cloud-region-list 的 id" json:"-" mcp:"required"`
Domain string `help:"cloud region domain" mcp:"true"`
ShowEmulated bool `help:"show emulated cloud region"`
}
R(&CloudregionCapabiltyOptions{}, "cloud-region-capability", "Show region's capacibilities", func(s *mcclient.ClientSession, args *CloudregionCapabiltyOptions) error {
query, err := options.StructToParams(args)
if err != nil {
return err
}
result, err := modules.Cloudregions.GetSpecific(s, args.ID, "capability", query)
if err != nil {
return err

View File

@@ -24,7 +24,7 @@ var (
R = shell.R
printList = shell.PrintList
printObject = shell.PrintObject
printBatchResults = printutils.PrintJSONBatchResults
printBatchResults = shell.PrintBatchResults
InvalidUpdateError = shell.InvalidUpdateError
printObjectRecursive = printutils.PrintJSONObjectRecursive

View File

@@ -19,6 +19,7 @@ import (
"io/ioutil"
"os"
"os/exec"
"path"
"strings"
"github.com/ghodss/yaml"
@@ -31,6 +32,7 @@ import (
"yunion.io/x/onecloud/pkg/mcclient"
modules "yunion.io/x/onecloud/pkg/mcclient/modules/compute"
options "yunion.io/x/onecloud/pkg/mcclient/options/compute"
"yunion.io/x/onecloud/pkg/util/fileutils2"
"yunion.io/x/onecloud/pkg/util/pod/stream/cp"
)
@@ -137,15 +139,18 @@ func init() {
return nil
})
R(new(options.ContainerCopyOptions), "container-cp", "Container copy", func(s *mcclient.ClientSession, opts *options.ContainerCopyOptions) error {
parts := strings.Split(opts.CONTAINER_ID_FILE, ":")
copyToContainer := func(s *mcclient.ClientSession, src, dst string, rawFile bool) error {
parts := strings.Split(dst, ":")
if len(parts) != 2 {
return fmt.Errorf("invalid container id: %s", opts.CONTAINER_ID_FILE)
return fmt.Errorf("invalid container id: %s", dst)
}
if opts.RawFile {
fr, err := os.Open(opts.SRC_FILE)
if rawFile {
if fileutils2.IsDir(src) {
return fmt.Errorf("source path cannot be a directory when raw file is true: %s", src)
}
fr, err := os.Open(src)
if err != nil {
return errors.Wrapf(err, "open file: %v", opts.SRC_FILE)
return errors.Wrapf(err, "open file: %v", src)
}
defer fr.Close()
if err := modules.Containers.CopyTo(s, parts[0], parts[1], fr); err != nil {
@@ -153,22 +158,24 @@ func init() {
}
return nil
} else {
return cp.NewCopy().CopyToContainer(s, opts.SRC_FILE, cp.ContainerFileOpt{
return cp.NewCopy().CopyToContainer(s, src, cp.ContainerFileOpt{
ContainerId: parts[0],
File: parts[1],
})
}
})
R(new(options.ContainerCopyOptions), "container-cp-from", "Container copy", func(s *mcclient.ClientSession, opts *options.ContainerCopyOptions) error {
parts := strings.Split(opts.SRC_FILE, ":")
}
copyFromContainer := func(s *mcclient.ClientSession, src, dst string, rawFile bool) error {
parts := strings.Split(src, ":")
if len(parts) != 2 {
return fmt.Errorf("invalid container id: %s", opts.CONTAINER_ID_FILE)
return fmt.Errorf("invalid container id: %s", src)
}
ctrId := parts[0]
ctrFile := parts[1]
destFile := opts.CONTAINER_ID_FILE
if opts.RawFile {
destFile := dst
if fileutils2.IsDir(destFile) {
destFile = path.Join(destFile, path.Base(ctrFile))
}
if rawFile {
fw, err := os.Create(destFile)
if err != nil {
return errors.Wrapf(err, "open file: %v", destFile)
@@ -184,5 +191,37 @@ func init() {
File: ctrFile,
}, destFile)
}
}
R(new(options.ContainerCopyOptions), "container-cp", "Container copy", func(s *mcclient.ClientSession, opts *options.ContainerCopyOptions) error {
if strings.Contains(opts.SRC, ":") && !strings.Contains(opts.DST, ":") {
// copy from container to host
err := copyFromContainer(s, opts.SRC, opts.DST, opts.RawFile)
if err != nil {
return errors.Wrapf(err, "copy from container to host")
}
return nil
} else if !strings.Contains(opts.SRC, ":") && strings.Contains(opts.DST, ":") {
// copy from host to container
err := copyToContainer(s, opts.SRC, opts.DST, opts.RawFile)
if err != nil {
return errors.Wrapf(err, "copy to container")
}
return nil
} else if strings.Contains(opts.SRC, ":") && strings.Contains(opts.DST, ":") {
// copy from container to container
return fmt.Errorf("copy from container to container is not supported")
} else {
return fmt.Errorf("copy between local files is not supported")
}
})
R(new(options.ContainerCopyFromOptions), "container-cp-from", "Container copy", func(s *mcclient.ClientSession, opts *options.ContainerCopyFromOptions) error {
err := copyFromContainer(s, opts.CONTAINER_ID_PATH, opts.DST_PATH, opts.RawFile)
if err != nil {
return errors.Wrapf(err, "copy from container to host")
}
return nil
})
}

View File

@@ -29,7 +29,7 @@ func init() {
cmd.List(&compute.DBInstanceListOptions{})
cmd.Create(&compute.DBInstanceCreateOptions{})
cmd.Update(&compute.DBInstanceUpdateOptions{})
cmd.Show(&compute.DBInstanceIdOptions{})
cmd.Show(&compute.DBInstanceShowOptions{})
cmd.Delete(&compute.DBInstanceDeleteOptions{})
cmd.Perform("renew", &compute.DBInstanceRenewOptions{})
cmd.Perform("change-config", &compute.DBInstanceChangeConfigOptions{})

View File

@@ -42,6 +42,12 @@ import (
func init() {
cmd := shell.NewResourceCmd(&modules.Disks)
cmd.List(&compute_options.DiskListOptions{})
cmd.Show(&compute_options.DiskShowOptions{})
cmd.Perform("public", &compute_options.DiskIdOptions{})
cmd.Perform("private", &compute_options.DiskIdOptions{})
cmd.Perform("syncstatus", &compute_options.DiskIdOptions{})
cmd.Perform("change-owner-candidate-domains", &compute_options.DiskIdOptions{})
cmd.Perform("disk-cancel-delete", &compute_options.DiskIdOptions{})
cmd.Perform("set-class-metadata", &options.ResourceMetadataOptions{})
cmd.Perform("rebuild", &compute_options.DiskRebuildOptions{})
cmd.Perform("migrate", &compute_options.DiskMigrateOptions{})
@@ -49,33 +55,7 @@ func init() {
cmd.Perform("change-billing-type", new(compute_options.DiskChangeBillingTypeOptions))
cmd.Perform("change-storage-type", &compute_options.DiskChangeStorageTypeOptions{})
type DiskDetailOptions struct {
ID string `help:"ID or Name of disk"`
}
R(&DiskDetailOptions{}, "disk-show", "Show details of disk", func(s *mcclient.ClientSession, args *DiskDetailOptions) error {
disk, e := modules.Disks.Get(s, args.ID, nil)
if e != nil {
return e
}
printObject(disk)
return nil
})
R(&DiskDetailOptions{}, "disk-cancel-delete", "Cancel pending delete disks", func(s *mcclient.ClientSession, args *DiskDetailOptions) error {
disk, e := modules.Disks.PerformAction(s, args.ID, "cancel-delete", nil)
if e != nil {
return e
}
printObject(disk)
return nil
})
type DiskDeleteOptions struct {
ID []string `help:"ID of disks to delete" metavar:"DISK"`
OverridePendingDelete bool `help:"Delete disk directly instead of pending delete" short-token:"f"`
DeleteSnapshots bool `help:"Delete disk snapshots before delete disk"`
}
R(&DiskDeleteOptions{}, "disk-delete", "Delete a disk", func(s *mcclient.ClientSession, args *DiskDeleteOptions) error {
R(&compute_options.DiskDeleteOptions{}, "disk-delete", "Delete a disk", func(s *mcclient.ClientSession, args *compute_options.DiskDeleteOptions) error {
params := jsonutils.NewDict()
if args.OverridePendingDelete {
params.Add(jsonutils.JSONTrue, "override_pending_delete")
@@ -97,25 +77,7 @@ func init() {
return nil
})
R(&DiskDetailOptions{}, "disk-public", "Make a disk public", func(s *mcclient.ClientSession, args *DiskDetailOptions) error {
disk, e := modules.Disks.PerformAction(s, args.ID, "public", nil)
if e != nil {
return e
}
printObject(disk)
return nil
})
R(&DiskDetailOptions{}, "disk-private", "Make a disk private", func(s *mcclient.ClientSession, args *DiskDetailOptions) error {
disk, e := modules.Disks.PerformAction(s, args.ID, "private", nil)
if e != nil {
return e
}
printObject(disk)
return nil
})
R(&DiskDetailOptions{}, "disk-metadata", "Get metadata of a disk", func(s *mcclient.ClientSession, args *DiskDetailOptions) error {
R(&compute_options.DiskIdOptions{}, "disk-metadata", "Get metadata of a disk", func(s *mcclient.ClientSession, args *compute_options.DiskIdOptions) error {
meta, e := modules.Disks.GetMetadata(s, args.ID, nil)
if e != nil {
return e
@@ -124,24 +86,15 @@ func init() {
return nil
})
R(&DiskDetailOptions{}, "disk-syncstatus", "Sync status for disk", func(s *mcclient.ClientSession, args *DiskDetailOptions) error {
ret, e := modules.Disks.PerformAction(s, args.ID, "syncstatus", nil)
if e != nil {
return e
}
printObject(ret)
return nil
})
type DiskUpdateOptions struct {
ID string `help:"ID or name of disk"`
Name string `help:"New name of disk"`
Desc string `help:"Description" metavar:"DESCRIPTION"`
AutoDelete string `help:"enable/disable auto delete of disk" choices:"enable|disable"`
AutoDelete string `help:"Set disk auto_delete (true/false or enable/disable)" choices:"true|false|enable|disable"`
AutoSnapshot string `help:"enable/disable auto snapshot of disk" choices:"enable|disable"`
DiskType string `help:"Disk type" choices:"data|volume|sys"`
IsSsd *bool `help:"mark disk as ssd" negative:"no-is-ssd"`
AutoReset *bool `help:"Enable auto reset disk after geust shutdown"`
AutoReset *bool `help:"Enable auto reset disk after guest shutdown"`
}
R(&DiskUpdateOptions{}, "disk-update", "Update property of a virtual disk", func(s *mcclient.ClientSession, args *DiskUpdateOptions) error {
params := jsonutils.NewDict()
@@ -152,7 +105,7 @@ func init() {
params.Add(jsonutils.NewString(args.Desc), "description")
}
if len(args.AutoDelete) > 0 {
if args.AutoDelete == "enable" {
if args.AutoDelete == "enable" || args.AutoDelete == "true" {
params.Add(jsonutils.JSONTrue, "auto_delete")
} else {
params.Add(jsonutils.JSONFalse, "auto_delete")
@@ -214,11 +167,7 @@ func init() {
return nil
})
type DiskResizeOptions struct {
DISK string `help:"ID or name of disk"`
SIZE string `help:"Size of disk"`
}
R(&DiskResizeOptions{}, "disk-resize", "Resize a disk", func(s *mcclient.ClientSession, args *DiskResizeOptions) error {
R(&compute_options.DiskResizeOptions{}, "disk-resize", "Resize a disk", func(s *mcclient.ClientSession, args *compute_options.DiskResizeOptions) error {
params := jsonutils.NewDict()
params.Add(jsonutils.NewString(args.SIZE), "size")
disk, err := modules.Disks.PerformAction(s, args.DISK, "resize", params)
@@ -230,7 +179,7 @@ func init() {
})
type DiskResetOptions struct {
DISK string `help:"ID or name of disk"`
SNAPSHOT string `help:"snapshots ID of disk"`
SNAPSHOT string `help:"Snapshot ID of disk"`
AutoStart bool `help:"Autostart guest"`
}
R(&DiskResetOptions{}, "disk-reset", "Resize a disk", func(s *mcclient.ClientSession, args *DiskResetOptions) error {
@@ -286,9 +235,9 @@ func init() {
type DiskChangeOwnerOptions struct {
ID string `help:"Disk to change owner" json:"-"`
PROJECT string `help:"Project ID or change" json:"tenant"`
PROJECT string `help:"Project ID or name" json:"tenant"`
}
R(&DiskChangeOwnerOptions{}, "disk-change-owner", "Change owner porject of a disk", func(s *mcclient.ClientSession, opts *DiskChangeOwnerOptions) error {
R(&DiskChangeOwnerOptions{}, "disk-change-owner", "Change owner project of a disk", func(s *mcclient.ClientSession, opts *DiskChangeOwnerOptions) error {
params, err := options.StructToParams(opts)
if err != nil {
return err
@@ -301,7 +250,7 @@ func init() {
return nil
})
R(&DiskDetailOptions{}, "disk-change-owner-candidate-domains", "Get change owner candidate domain list", func(s *mcclient.ClientSession, args *DiskDetailOptions) error {
R(&compute_options.DiskIdOptions{}, "disk-change-owner-candidate-domains", "Get change owner candidate domain list", func(s *mcclient.ClientSession, args *compute_options.DiskIdOptions) error {
result, err := modules.Disks.GetSpecific(s, args.ID, "change-owner-candidate-domains", nil)
if err != nil {
return err

View File

@@ -27,7 +27,7 @@ import (
func init() {
cmd := shell.NewResourceCmd(&modules.ElasticCache).WithKeyword("elastic-cache")
cmd.List(&compute.ElasticCacheListOptions{})
cmd.Show(&compute.ElasticCacheIdOption{})
cmd.Show(&compute.ElasticCacheShowOptions{})
cmd.Create(&compute.ElasticCacheCreateOptions{})
cmd.Delete(&compute.ElasticCacheIdOption{})
cmd.Perform("restart", &compute.ElasticCacheIdOption{})

View File

@@ -27,7 +27,7 @@ func init() {
cmd.Create(&compute.EipCreateOptions{})
cmd.Delete(&options.BaseIdOptions{})
cmd.Update(&compute.EipUpdateOptions{})
cmd.Show(&options.BaseShowOptions{})
cmd.Show(&compute.EipShowOptions{})
cmd.Perform("purge", &options.BaseIdOptions{})
cmd.Perform("associate", &compute.EipAssociateOptions{})
cmd.Perform("dissociate", &compute.EipDissociateOptions{})

View File

@@ -36,7 +36,7 @@ import (
func init() {
cmd := shell.NewResourceCmd(&modules.Hosts)
cmd.List(&compute.HostListOptions{})
cmd.List(&compute.HostListForMcpOptions{})
cmd.GetMetadata(&options.BaseIdOptions{})
cmd.GetProperty(&compute.HostStatusStatisticsOptions{})
cmd.Update(&compute.HostUpdateOptions{})
@@ -77,6 +77,7 @@ func init() {
stats, _ := data.GetArray("workers")
printList(&printutils.ListResult{Data: stats}, nil)
}, &options.BaseIdOptions{})
cmd.Get("api-stats", &options.BaseIdOptions{})
cmd.Get("tap-config", &options.BaseIdOptions{})
cmd.GetWithCustomShow("nics", func(data jsonutils.JSONObject) {
results := printutils.ListResult{}
@@ -267,6 +268,7 @@ func init() {
Ip6Addr string `help:"IPv6 address"`
Bridge string `help:"Bridge of hostwire"`
Interface string `help:"Interface name, eg:eth0, en0"`
VlanId int `help:"Vlan ID"`
}
R(&HostAddNetIfOptions{}, "host-add-netif", "Host add a NIC", func(s *mcclient.ClientSession, args *HostAddNetIfOptions) error {
params := jsonutils.NewDict()
@@ -289,6 +291,7 @@ func init() {
if len(args.Interface) > 0 {
params.Add(jsonutils.NewString(args.Interface), "interface")
}
addVlanIdToParams(params, args.VlanId)
result, err := modules.Hosts.PerformAction(s, args.ID, "add-netif", params)
if err != nil {
return err
@@ -298,12 +301,14 @@ func init() {
})
type HostRemoveNetIfOptions struct {
ID string `help:"ID or Name of host"`
MAC string `help:"MAC of NIC to remove"`
ID string `help:"ID or Name of host"`
MAC string `help:"MAC of NIC to remove"`
VlanId int `help:"Vlan Id"`
}
R(&HostRemoveNetIfOptions{}, "host-remove-netif", "Remove NIC from host", func(s *mcclient.ClientSession, args *HostRemoveNetIfOptions) error {
params := jsonutils.NewDict()
params.Add(jsonutils.NewString(args.MAC), "mac")
addVlanIdToParams(params, args.VlanId)
result, err := modules.Hosts.PerformAction(s, args.ID, "remove-netif", params)
if err != nil {
return err
@@ -319,6 +324,7 @@ func init() {
Ip6 string `help:"IPv6 address"`
Network string `help:"network to connect"`
Reserved bool `help:"fetch IP from reserved pool"`
VlanId int `help:"Vlan ID"`
}
R(&HostEnableNetIfOptions{}, "host-enable-netif", "Enable a network interface for a host", func(s *mcclient.ClientSession, args *HostEnableNetIfOptions) error {
params := jsonutils.NewDict()
@@ -337,6 +343,7 @@ func init() {
if len(args.Network) > 0 {
params.Add(jsonutils.NewString(args.Network), "network")
}
addVlanIdToParams(params, args.VlanId)
result, err := modules.Hosts.PerformAction(s, args.ID, "enable-netif", params)
if err != nil {
return err
@@ -349,6 +356,7 @@ func init() {
ID string `help:"ID or Name of host"`
MAC string `help:"MAC of NIC to disable"`
Reserve bool `help:"Reserve the IP address"`
VlanId int `help:"Vlan Id"`
}
R(&HostDisableNetIfOptions{}, "host-disable-netif", "Disable a network interface", func(s *mcclient.ClientSession, args *HostDisableNetIfOptions) error {
params := jsonutils.NewDict()
@@ -356,6 +364,7 @@ func init() {
if args.Reserve {
params.Add(jsonutils.JSONTrue, "reserve")
}
addVlanIdToParams(params, args.VlanId)
result, err := modules.Hosts.PerformAction(s, args.ID, "disable-netif", params)
if err != nil {
return err
@@ -697,3 +706,9 @@ func init() {
},
)
}
func addVlanIdToParams(params *jsonutils.JSONDict, vlanId int) {
if vlanId > 1 {
params.Add(jsonutils.NewInt(int64(vlanId)), "vlan_id")
}
}

View File

@@ -0,0 +1,31 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package compute
import (
"yunion.io/x/onecloud/cmd/climc/shell"
modules "yunion.io/x/onecloud/pkg/mcclient/modules/compute"
"yunion.io/x/onecloud/pkg/mcclient/options/compute"
)
func init() {
cmd := shell.NewResourceCmd(&modules.IpSets)
cmd.List(&compute.IpSetListOptions{})
cmd.Show(&compute.IpSetIdOptions{})
cmd.Create(&compute.IpSetCreateOptions{})
cmd.Update(&compute.IpSetUpdateOptions{})
cmd.Delete(&compute.IpSetIdOptions{})
cmd.Perform("syncstatus", &compute.IpSetIdOptions{})
}

View File

@@ -26,8 +26,12 @@ func init() {
cmd.List(&compute.DeviceListOptions{})
cmd.Update(&compute.DeviceUpdateOptions{})
cmd.Show(&compute.DeviceShowOptions{})
cmd.Create(&compute.DeviceCreateOptions{})
cmd.BatchDelete(&compute.DeviceDeleteOptions{})
cmd.BatchPerform("purge", &compute.DevicePurgeOptions{})
cmd.Perform("public", &options.SharableResourcePublicOptions{})
cmd.Perform("private", &options.BaseIdOptions{})
scmd := shell.NewResourceCmd(&modules.ServerIsolatedDevices)
scmd.List(&compute.ServerDeviceListOptions{})
}

View File

@@ -25,7 +25,7 @@ func init() {
cmd := shell.NewResourceCmd(&modules.Kafkas)
cmd.List(&compute.KafkaListOptions{})
cmd.Update(&compute.KafkaUpdateOptions{})
cmd.Show(&compute.KafkaIdOption{})
cmd.Show(&compute.KafkaShowOptions{})
cmd.Get("topics", &options.BaseIdOptions{})
cmd.Delete(&compute.KafkaIdOption{})
cmd.Perform("syncstatus", &compute.KafkaIdOption{})

View File

@@ -97,6 +97,9 @@ func init() {
})
R(&options.LoadbalancerAgentUpdateOptions{}, "lbagent-update", "Update lbagent", func(s *mcclient.ClientSession, opts *options.LoadbalancerAgentUpdateOptions) error {
params, err := opts.Params()
if err != nil {
return err
}
lbagent, err := modules.LoadbalancerAgents.Update(s, opts.ID, params)
if err != nil {
return err

View File

@@ -55,6 +55,9 @@ func init() {
})
R(&options.LoadbalancerBackendUpdateOptions{}, "lbbackend-update", "Update lbbackend", func(s *mcclient.ClientSession, opts *options.LoadbalancerBackendUpdateOptions) error {
params, err := opts.Params()
if err != nil {
return err
}
lbbackend, err := modules.LoadbalancerBackends.Update(s, opts.ID, params)
if err != nil {
return err

View File

@@ -54,6 +54,9 @@ func init() {
})
R(&options.LoadbalancerListenerRuleUpdateOptions{}, "lblistenerrule-update", "Update lblistenerrule", func(s *mcclient.ClientSession, opts *options.LoadbalancerListenerRuleUpdateOptions) error {
params, err := opts.Params()
if err != nil {
return err
}
lblistenerrule, err := modules.LoadbalancerListenerRules.Update(s, opts.ID, params)
if err != nil {
return err

View File

@@ -87,6 +87,9 @@ func init() {
})
R(&options.LoadbalancerListenerUpdateOptions{}, "lblistener-update", "Update lblistener", func(s *mcclient.ClientSession, opts *options.LoadbalancerListenerUpdateOptions) error {
params, err := opts.Params()
if err != nil {
return err
}
lblistener, err := modules.LoadbalancerListeners.Update(s, opts.ID, params)
if err != nil {
return err

View File

@@ -37,7 +37,7 @@ func init() {
return nil
})
R(&options.TagListOptions{}, "tag-list", "List tags", func(s *mcclient.ClientSession, opts *options.TagListOptions) error {
R(&options.TagListOptions{}, "service-metadata-list", "List service metadata", func(s *mcclient.ClientSession, opts *options.TagListOptions) error {
var mod modulebase.IResourceManager
switch opts.Service {
case "compute":

View File

@@ -25,7 +25,7 @@ func init() {
cmd := shell.NewResourceCmd(&modules.MongoDB)
cmd.List(&compute.MongoDBListOptions{})
cmd.Update(&compute.MongoDBUpdateOptions{})
cmd.Show(&options.BaseIdOptions{})
cmd.Show(&compute.MongoDBShowOptions{})
cmd.Delete(&options.BaseIdOptions{})
cmd.Get("backups", &options.BaseIdOptions{})
cmd.Perform("syncstatus", &options.BaseIdOptions{})

View File

@@ -25,7 +25,7 @@ import (
func init() {
type NetworkinterfaceNetworkListOptions struct {
Networkinterface string `help:"ID or Name of Server"`
Networkinterface string `help:"ID or Name of Networkinterface"`
Network string `help:"Network ID or name"`
}
R(&NetworkinterfaceNetworkListOptions{}, "networkinterface-network-list", "List server network pairs", func(s *mcclient.ClientSession, args *NetworkinterfaceNetworkListOptions) error {

View File

@@ -98,6 +98,22 @@ func init() {
return nil
})
type NetworkCreate3Options struct {
compute_options.NetworkCreateOptions `start_ip->positional:"false" end_ip->positional:"false" net_mask->positional:"false"`
}
R(&NetworkCreate3Options{}, "network-create3", "Create a dual-stack virtual network", func(s *mcclient.ClientSession, args *NetworkCreate3Options) error {
params, err := args.Params()
if err != nil {
return err
}
net, err := modules.Networks.Create(s, params)
if err != nil {
return err
}
printObject(net)
return nil
})
type NetworkSplitOptions struct {
NETWORK string `help:"ID or name of network to split"`
IP string `help:"Start ip of the split network"`
@@ -196,7 +212,7 @@ func init() {
type NetworkChangeOwnerOptions struct {
ID string `help:"Network to change owner" json:"-"`
PROJECT string `help:"Project ID or change" json:"tenant"`
PROJECT string `help:"Project ID or name" json:"tenant"`
}
R(&NetworkChangeOwnerOptions{}, "network-change-owner", "Change owner project of a network", func(s *mcclient.ClientSession, args *NetworkChangeOwnerOptions) error {
params, err := options.StructToParams(args)

View File

@@ -57,6 +57,9 @@ func init() {
})
R(&options.ProxySettingUpdateOptions{}, "proxysetting-update", "Update proxysetting", func(s *mcclient.ClientSession, opts *options.ProxySettingUpdateOptions) error {
params, err := options.StructToParams(opts)
if err != nil {
return err
}
proxysetting, err := modules.ProxySettings.Update(s, opts.ID, params)
if err != nil {
return err

View File

@@ -24,10 +24,10 @@ import (
func init() {
type NetworkReserveIPOptions struct {
NETWORK string `help:"IP or name of network"`
NETWORK string `help:"ID or name of network"`
NOTES string `help:"Why reserve this IP"`
IPS []string `help:"IPs to reserve"`
Duration string `help:"reservation duration, e.g. 1I, 1H, 2M"`
Duration string `help:"reservation duration, e.g. 1D, 1H, 2M"`
Status string `help:"ip status"`
}
R(&NetworkReserveIPOptions{}, "network-reserve-ip", "Reserve an IP address from pool", func(s *mcclient.ClientSession, args *NetworkReserveIPOptions) error {
@@ -49,7 +49,7 @@ func init() {
})
type NetworkReleaseReservedIPOptions struct {
NETWORK string `help:"IP or name of network"`
NETWORK string `help:"ID or name of network"`
IP string `help:"IP to release"`
}
R(&NetworkReleaseReservedIPOptions{}, "network-release-reserved-ip", "Release a reserved IP into pool", func(s *mcclient.ClientSession, args *NetworkReleaseReservedIPOptions) error {

View File

@@ -49,6 +49,9 @@ func init() {
R(&ScalingPolicyListOptions{}, "scaling-policy-list", "List Scaling Policy", func(s *mcclient.ClientSession,
args *ScalingPolicyListOptions) error {
params, err := options.ListStructToParams(args)
if err != nil {
return err
}
policies, err := modules.ScalingPolicy.List(s, params)
if err != nil {
return err

View File

@@ -17,15 +17,14 @@ package compute
import (
"yunion.io/x/onecloud/cmd/climc/shell"
modules "yunion.io/x/onecloud/pkg/mcclient/modules/compute"
"yunion.io/x/onecloud/pkg/mcclient/options"
"yunion.io/x/onecloud/pkg/mcclient/options/compute"
)
func init() {
cmd := shell.NewResourceCmd(&modules.SecGroupRules).WithKeyword("secgroup-rule")
cmd.List(&compute.SecGroupRulesListOptions{})
cmd.Show(&options.BaseShowOptions{})
cmd.Delete(&options.BaseIdOptions{})
cmd.Show(&compute.SecGroupRuleShowOptions{})
cmd.Delete(&compute.SecGroupRuleDeleteOptions{})
cmd.Create(&compute.SecGroupRulesCreateOptions{})
cmd.Update(&compute.SecGroupRulesUpdateOptions{})
}

View File

@@ -25,9 +25,9 @@ func init() {
cmd := shell.NewResourceCmd(&modules.SecGroups)
cmd.List(&options.SecgroupListOptions{})
cmd.Create(&options.SecgroupCreateOptions{})
cmd.Show(&options.SecgroupIdOptions{})
cmd.Show(&options.SecgroupShowOptions{})
cmd.Update(&baseoptions.BaseUpdateOptions{})
cmd.Delete(&options.SecgroupIdOptions{})
cmd.Delete(&options.SecgroupDeleteOptions{})
cmd.Perform("public", &options.SecgroupIdOptions{})
cmd.Perform("syncstatus", &options.SecgroupIdOptions{})
cmd.Perform("private", &options.SecgroupIdOptions{})
@@ -36,4 +36,7 @@ func init() {
cmd.Perform("change-owner", &options.SecgroupChangeOwnerOptions{})
cmd.Perform("import-rules", &options.SecgroupImportRulesOptions{})
cmd.PerformClass("clean", &options.SecgroupCleanOptions{})
scmd := shell.NewResourceCmd(&modules.Servernetworksecgroups)
scmd.List(&options.ServerNetworkSecgroupListOptions{})
}

View File

@@ -77,22 +77,10 @@ func init() {
type ServerDiskUpdateOptions struct {
SERVER string `help:"ID or Name of server"`
DISK string `help:"ID or Name of Disk"`
Driver string `help:"Driver of vDisk" choices:"virtio|ide|sata|scsi|pvscsi"`
Cache string `help:"Cache mode of vDisk" choices:"writethrough|none|writeback|directsync"`
Aio string `help:"Asynchronous IO mode of vDisk" choices:"native|threads"`
Index int64 `help:"Index of vDisk" default:"-1"`
}
R(&ServerDiskUpdateOptions{}, "server-disk-update", "Update details of a virtual disk of a virtual server", func(s *mcclient.ClientSession, args *ServerDiskUpdateOptions) error {
params := jsonutils.NewDict()
if len(args.Driver) > 0 {
params.Add(jsonutils.NewString(args.Driver), "driver")
}
if len(args.Cache) > 0 {
params.Add(jsonutils.NewString(args.Cache), "cache_mode")
}
if len(args.Aio) > 0 {
params.Add(jsonutils.NewString(args.Aio), "aio_mode")
}
if args.Index >= 0 {
params.Add(jsonutils.NewInt(args.Index), "index")
}
@@ -125,10 +113,12 @@ func init() {
})
type ServerAttachDiskOptions struct {
_ struct{} `mcp-desc:"将已有硬盘挂载到虚机。SERVER/DISK 为 id/name可选 driver。先 climc_server_list + climc_disk_list"`
SERVER string `help:"ID or name of server"`
DISK string `help:"ID of name of disk to attach"`
Driver string `help:"Driver" choices:"virtio|ide|scsi"`
Cache string `help:"Cache mode" choices:"writeback|none|writethrought"`
DISK string `help:"ID or name of disk to attach"`
Driver string `help:"Disk driver" choices:"virtio|ide|scsi" mcp:"true"`
Cache string `help:"Cache mode" choices:"writeback|none|writethrough" mcp:"true"`
}
R(&ServerAttachDiskOptions{}, "server-attach-disk", "Attach an existing virtual disks to a virtual server", func(s *mcclient.ClientSession, args *ServerAttachDiskOptions) error {
params := jsonutils.NewDict()
@@ -148,9 +138,11 @@ func init() {
})
type ServerDetachDiskOptions struct {
_ struct{} `mcp-desc:"从虚机卸载硬盘。SERVER/DISK 为 id/name可选 delete-disk。先 climc_server_list / climc_disk_list"`
SERVER string `help:"ID or name of server"`
DISK string `help:"ID or name of disk to detach"`
DeleteDisk bool `help:"Delete disk if the disk not has flag of auto_delete when detached"`
DeleteDisk bool `help:"Delete the disk after detach (ignored if disk has auto_delete)" mcp:"true"`
}
R(&ServerDetachDiskOptions{}, "server-detach-disk", "Detach a disk from a virtual server", func(s *mcclient.ClientSession, args *ServerDetachDiskOptions) error {
params := jsonutils.NewDict()

View File

@@ -23,15 +23,15 @@ import (
func init() {
type ServerAttachDeviceOptions struct {
SERVER string `help:"ID or name of server"`
DEVICE string `help:"ID of isolated device to attach"`
Type string `help:"Device type" choices:"GPU-HPC|GPU-VGA|PCI"`
SERVER string `help:"ID or name of server"`
DEVICE string `help:"ID of isolated device to attach"`
GpuType string `help:"Type of GPU to attach to" choices:"HPC|VGA"`
}
R(&ServerAttachDeviceOptions{}, "server-attach-isolated-device", "Attach an existing isolated device to a virtual server", func(s *mcclient.ClientSession, args *ServerAttachDeviceOptions) error {
params := jsonutils.NewDict()
params.Add(jsonutils.NewString(args.DEVICE), "device")
if len(args.Type) > 0 {
params.Add(jsonutils.NewString(args.Type), "dev_type")
if args.GpuType != "" {
params.Add(jsonutils.NewString(args.GpuType), "gpu_type")
}
srv, err := modules.Servers.PerformAction(s, args.SERVER, "attach-isolated-device", params)
if err != nil {
@@ -42,12 +42,18 @@ func init() {
})
type ServerDetachDeviceOptions struct {
SERVER string `help:"ID or name of server"`
DEVICE string `help:"ID of isolated device to attach"`
SERVER string `help:"ID or name of server"`
DEVICE string `help:"ID of isolated device to detach"`
INDEX int `help:"Index of isolated device to detach"`
IsForce bool `help:"Force detach isolated device"`
}
R(&ServerDetachDeviceOptions{}, "server-detach-isolated-device", "Detach a isolated device from a virtual server", func(s *mcclient.ClientSession, args *ServerDetachDeviceOptions) error {
params := jsonutils.NewDict()
params.Add(jsonutils.NewString(args.DEVICE), "device")
params.Add(jsonutils.NewInt(int64(args.INDEX)), "index")
if args.IsForce {
params.Set("is_force", jsonutils.JSONTrue)
}
srv, err := modules.Servers.PerformAction(s, args.SERVER, "detach-isolated-device", params)
if err != nil {
return err

View File

@@ -23,14 +23,20 @@ import (
"yunion.io/x/pkg/util/printutils"
"yunion.io/x/pkg/util/regutils"
"yunion.io/x/onecloud/cmd/climc/shell"
"yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/cloudcommon/cmdline"
"yunion.io/x/onecloud/pkg/mcclient"
modules "yunion.io/x/onecloud/pkg/mcclient/modules/compute"
"yunion.io/x/onecloud/pkg/mcclient/options"
compute_options "yunion.io/x/onecloud/pkg/mcclient/options/compute"
)
func init() {
cmd := shell.NewResourceCmd(&modules.ServerNetworkTrafficLogs)
cmd.List(new(compute_options.ServerNetworkTrafficLogListOptions))
type ServerNetworkListOptions struct {
options.BaseListOptions
Server string `help:"ID or Name of Server"`
@@ -90,7 +96,7 @@ func init() {
type ServerNetworkUpdateOptions struct {
SERVER string `help:"ID or Name of Server"`
NETWORK string `help:"ID or Name of Wire"`
NETWORK string `help:"ID or Name of Network"`
Mac string `help:"Mac of NIC"`
Driver string `help:"Driver model of vNIC" choices:"virtio|e1000|vmxnet3|rtl8139"`
Index int64 `help:"Index of NIC" default:"-1"`
@@ -138,7 +144,10 @@ func init() {
type ServerNetworkBWOptions struct {
SERVER string `help:"ID or Name of server"`
MACORIP string `help:"IP, Mac, or Index of NIC"`
BW int64 `help:"Bandwidth in Mbps"`
BW int64 `help:"Bandwidth in Mbps"`
Tx int64 `help:"Tx bandwidth in Mbps"`
Rx int64 `help:"Rx bandwidth in Mbps"`
}
R(&ServerNetworkBWOptions{}, "server-change-bandwidth", "Change server network bandwidth in Mbps", func(s *mcclient.ClientSession, args *ServerNetworkBWOptions) error {
params := jsonutils.NewDict()
@@ -156,6 +165,8 @@ func init() {
return fmt.Errorf("Please specify Ip or Mac")
}
params.Add(jsonutils.NewInt(args.BW), "bandwidth")
params.Add(jsonutils.NewInt(args.Tx), "tx_bw_limit")
params.Add(jsonutils.NewInt(args.Rx), "rx_bw_limit")
server, err := modules.Servers.PerformAction(s, args.SERVER, "change-bandwidth", params)
if err != nil {
return err
@@ -194,7 +205,7 @@ func init() {
Reserve bool `help:"Put the release IP address into reserved address pool"`
Force bool `help:"detach server network by force"`
}
R(&ServerDetachNetworkOptions{}, "server-detach-network", "Detach the virtual network fron a virtual server", func(s *mcclient.ClientSession, args *ServerDetachNetworkOptions) error {
R(&ServerDetachNetworkOptions{}, "server-detach-network", "Detach the virtual network from a virtual server", func(s *mcclient.ClientSession, args *ServerDetachNetworkOptions) error {
params := jsonutils.NewDict()
// params.Add(jsonutils.NewString(args.NETWORK), "net_id")
if args.Reserve {

View File

@@ -30,6 +30,7 @@ import (
"yunion.io/x/pkg/util/printutils"
"yunion.io/x/onecloud/cmd/climc/shell"
billing_api "yunion.io/x/onecloud/pkg/apis/billing"
"yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/mcclient"
"yunion.io/x/onecloud/pkg/mcclient/modulebase"
@@ -126,13 +127,19 @@ func init() {
cmd.Perform("update-sub-ips", &options.ServerUpdateSubIpsOptions{})
cmd.BatchPerform("restore-virtual-isolated-devices", &options.ServerIdsOptions{})
cmd.BatchPerform("set-os-info", &options.ServerSetOSInfoOptions{})
cmd.BatchPerform("start-rescue", &options.ServerStartOptions{})
cmd.BatchPerform("stop-rescue", &options.ServerStartOptions{})
// 与 server-start 复用参数时单独包一层,避免继承 mcp-desc 被注册为 MCP tool
cmd.BatchPerform("start-rescue", &options.ServerStartRescueOptions{})
cmd.BatchPerform("stop-rescue", &options.ServerStopRescueOptions{})
cmd.BatchPerform("sync-os-info", &options.ServerIdsOptions{})
cmd.BatchPerform("set-root-disk-matcher", &options.ServerSetRootDiskMatcher{})
cmd.Perform("disable-auto-merge-snapshot", &options.ServerDisableAutoMergeSnapshot{})
cmd.BatchPerform("set-tpm", &options.ServerSetTpmOptions{})
cmd.Perform("set-kickstart", &options.ServerKickstartConfigOptions{})
cmd.Perform("delete-kickstart", &options.ServerIdOptions{})
cmd.Perform("kickstart-complete", &options.ServerKickstartCompleteOptions{})
cmd.Get("kickstart", new(options.ServerIdOptions))
cmd.Get("vnc", new(options.ServerVncOptions))
cmd.Get("modification-types", new(options.ServerIdOptions))
cmd.Get("desc", new(options.ServerIdOptions))
cmd.Get("status", new(options.ServerIdOptions))
cmd.Get("iso", new(options.ServerIdOptions))
@@ -148,6 +155,11 @@ func init() {
cmd.Get("screen-dump-show", new(options.ServerScreenDumpOptions))
cmd.Get("numa-info", new(options.ServerIdOptions))
cmd.BatchPerform("screen-dump", new(options.ServerIdsOptions))
cmd.Perform("set-network-num-queues", new(options.ServerSetNetworkNumQueues))
cmd.Perform("set-network-secgroup", new(options.ServerNetworkSecGroupsOptions))
cmd.Perform("add-network-secgroup", new(options.ServerNetworkSecGroupsOptions))
cmd.Perform("revoke-network-secgroup", new(options.ServerNetworkSecGroupsOptions))
cmd.Perform("change-disk-driver", new(options.ServerChangeDiskDriverOptions))
cmd.GetProperty(&options.ServerStatusStatisticsOptions{})
cmd.GetProperty(&options.ServerProjectStatisticsOptions{})
@@ -209,8 +221,10 @@ func init() {
params.Name = opts.NAME
params.AutoStart = opts.AutoStart
params.Eip = opts.Eip
params.EipChargeType = opts.EipChargeType
params.EipChargeType = billing_api.ParseNetChargeType(opts.EipChargeType)
params.EipBw = opts.EipBw
params.EipTxBw = opts.EipTxBw
params.EipRxBw = opts.EipRxBw
server, err := modules.Servers.Create(s, params.JSON(params))
if err != nil {
@@ -280,7 +294,7 @@ func init() {
type ServerDiskSnapshotOptions struct {
SERVER string `help:"server ID or Name"`
DISK string `help:"create snapshot disk id"`
DISK string `help:"Disk ID for snapshot creation"`
SNAPSHOTNAME string `help:"Snapshot name"`
}
R(&ServerDiskSnapshotOptions{}, "server-disk-create-snapshot", "Task server disk snapshot", func(s *mcclient.ClientSession, args *ServerDiskSnapshotOptions) error {
@@ -720,7 +734,7 @@ func init() {
type ServerSnapshotAndClone struct {
ID string `help:"ID or name of VM" json:"-"`
NAME string `help:"Newly instance name" json:"name"`
NAME string `help:"New instance name" json:"name"`
AutoStart bool `help:"Auto start new guest"`
AllowDelete bool `help:"Allow new guest delete" json:"-"`
Count int `help:"Guest count"`
@@ -759,7 +773,7 @@ func init() {
ID string `help:"ID or name of server"`
Save string `help:"save xml into this file"`
}
R(&ServerJnlpOptions{}, "server-jnlp", "Get baremetal server jnlp file contentn", func(s *mcclient.ClientSession, args *ServerJnlpOptions) error {
R(&ServerJnlpOptions{}, "server-jnlp", "Get baremetal server jnlp file content", func(s *mcclient.ClientSession, args *ServerJnlpOptions) error {
spec, err := modules.Servers.GetSpecific(s, args.ID, "jnlp", nil)
if err != nil {
return err

View File

@@ -30,4 +30,5 @@ func init() {
cmd.Create(&options.ServerSkusCreateOptions{})
cmd.Update(&options.ServerSkusUpdateOptions{})
cmd.ClassShow(&options.ServerSkusListOptions{})
cmd.PerformClass("batch-update-price", &options.ServerSkusBatchUpdatePriceOptions{})
}

View File

@@ -24,16 +24,18 @@ import (
func init() {
type SnapshotsListOptions struct {
_ struct{} `mcp-desc:"列出磁盘快照。可用 disk/server/disk-type 过滤"`
options.BaseListOptions
Disk string `help:"Disk snapshots" json:"disk_id"`
FakeDeleted bool `help:"Show fake deleted snapshot or not"`
Disk string `help:"Disk snapshots" json:"disk_id" mcp:"true"`
FakeDeleted bool `help:"Show fake deleted snapshot or not" mcp:"true"`
Local *bool `help:"Show local snapshots"`
Share *bool `help:"Show shared snapshots"`
DiskType string `help:"Filter by disk type" choices:"sys|data"`
Server string `help:"Filter by server" json:"server_id"`
Unused bool
StorageId string `help:"Filter by storage id"`
DiskType string `help:"Filter by disk type" choices:"sys|data" mcp:"true"`
Server string `help:"Filter by server" json:"server_id" mcp:"true"`
Unused bool `mcp:"true"`
StorageId string `help:"Filter by storage id" mcp:"true"`
OrderByGuest string
OrderByDiskName string

View File

@@ -32,7 +32,7 @@ func init() {
HostType string `help:"Host type filter" choices:"baremetal|hypervisor|esxi|kubelet|hyperv"`
Gpu bool `help:"Only show gpu devices"`
Zone string `help:"Filter by zone id or name"`
Occupied bool `help:"show occupid host" json:"-"`
Occupied bool `help:"show occupied host" json:"-"`
}
R(&ListOptions{}, "spec", "List all kinds of model specs", func(s *mcclient.ClientSession, args *ListOptions) error {
var params *jsonutils.JSONDict
@@ -76,7 +76,7 @@ func init() {
DiskSpec []string `help:"Disk spec string, like 'Linux_adapter0_HDD_111Gx4'"`
Nic int64 `help:"#Nics count of host" metavar:"<NIC_COUNT>"`
GpuModel []string `help:"GPU model, like 'GeForce GTX 1050 Ti'"`
Occupied bool `help:"Show occupid host" json:"-"`
Occupied bool `help:"Show occupied host" json:"-"`
Manufacture string `help:"Manufacture of host"`
Model string `help:"Model of host"`
}

View File

@@ -31,17 +31,19 @@ import (
)
type GeneralUsageOptions struct {
HostType []string `help:"Host types" choices:"hypervisor|baremetal|esxi|xen|kubelet|hyperv|aliyun|azure|aws|huawei|qcloud|openstack|ucloud|zstack|google|ctyun|cnware"`
Provider []string `help:"Provider" choices:"OneCloud|VMware|Aliyun|Azure|Aws|Qcloud|Huawei|OpenStack|Ucloud|VolcEngine|ZStack|Google|Ctyun|CNWare"`
Brand []string `help:"Brands" choices:"OneCloud|VMware|Aliyun|Azure|Aws|Qcloud|Huawei|OpenStack|Ucloud|VolcEngine|ZStack|Google|Ctyun|CNWare"`
Project string `help:"show usage of specified project"`
_ struct{} `mcp-desc:"资源用量汇总usages/general-usage。报表「资源概览」用本工具不要用各资源 list 凑。项目级传 project=项目名/id域级传 project-domain平台级 scope=system。返回 servers/rds/cache/loadbalancer/buckets/eip/snapshot/vpcs/networks/ports 及 running_servers、disks.attached 等"`
ProjectDomain string `help:"show usage of specified domain"`
HostType []string `help:"Host types" choices:"hypervisor|baremetal|esxi|xen|kubelet|hyperv|aliyun|azure|aws|huawei|qcloud|openstack|ucloud|zstack|google|ctyun|cnware" mcp:"true"`
Provider []string `help:"Provider" choices:"OneCloud|VMware|Aliyun|Azure|Aws|Qcloud|Huawei|OpenStack|Ucloud|VolcEngine|ZStack|Google|Ctyun|CNWare" mcp:"true"`
Brand []string `help:"Brands" choices:"OneCloud|VMware|Aliyun|Azure|Aws|Qcloud|Huawei|OpenStack|Ucloud|VolcEngine|ZStack|Google|Ctyun|CNWare" mcp:"true"`
Project string `help:"show usage of specified project" mcp:"true"`
CloudEnv string `help:"show usage of specified cloudenv" choices:"public|private|onpremise"`
Scope string `help:"show usage of specified privilege scope" choices:"system|domain|project"`
ProjectDomain string `help:"show usage of specified domain" mcp:"true"`
Refresh bool `help:"force refresh usage statistics"`
CloudEnv string `help:"show usage of specified cloudenv" choices:"public|private|onpremise" mcp:"true"`
Scope string `help:"show usage of specified privilege scope" choices:"system|domain|project" mcp:"true"`
Refresh bool `help:"force refresh usage statistics" mcp:"true"`
}
func fetchHostTypeOptions(args *GeneralUsageOptions) *jsonutils.JSONDict {

View File

@@ -57,6 +57,9 @@ func init() {
}
var result *printutils.ListResult
result, err = modules.DevToolCronjobs.List(s, params)
if err != nil {
return err
}
printList(result, modules.DevToolCronjobs.GetColumns(s))
return nil
})

View File

@@ -50,6 +50,9 @@ func init() {
}
var result *printutils.ListResult
result, err = modules.DevToolTemplates.List(s, params)
if err != nil {
return err
}
printList(result, modules.DevToolTemplates.GetColumns(s))
return nil
})

View File

@@ -25,15 +25,15 @@ import (
)
type BaseEventListOptions struct {
Scope string `help:"scope" choices:"project|domain|system"`
Scope string `help:"RBAC scope" choices:"project|domain|system"`
Since string `help:"Show logs since specific date" metavar:"DATETIME"`
Until string `help:"Show logs until specific date" metavar:"DATETIME"`
Limit int64 `help:"Limit number of logs" default:"20"`
Offset int64 `help:"Offset"`
Offset int64 `help:"Offset for pagination"`
Ascending bool `help:"Ascending order"`
Descending bool `help:"Descending order"`
OrderBy string `help:"order by specific field"`
Action []string `help:"Log action"`
Action []string `help:"Filter by log action"`
User string `help:"filter by operator user"`
Project string `help:"filter by operator user's project"`

View File

@@ -22,9 +22,9 @@ import (
var (
R = shell.R
printList = printutils.PrintJSONList
printObject = printutils.PrintJSONObject
printBatchResults = printutils.PrintJSONBatchResults
printList = shell.PrintList
printObject = shell.PrintObject
printBatchResults = shell.PrintBatchResults
InvalidUpdateError = shell.InvalidUpdateError
printObjectRecursive = printutils.PrintJSONObjectRecursive

View File

@@ -28,7 +28,7 @@ import (
func init() {
type CredentialListOptions struct {
Scope string `help:"scope" choices:"project|domain|system"`
Scope string `help:"RBAC scope" choices:"project|domain|system"`
Type string `help:"credential type" choices:"totp|recovery_secret|aksk|enc_key|container_image"`
User string `help:"filter by user"`
UserDomain string `help:"the domain of user"`

View File

@@ -32,10 +32,12 @@ func init() {
cmd.GetProperty(&identity_options.DomainGetPropertyTagValuePairOptions{})
cmd.GetProperty(&identity_options.DomainGetPropertyTagValueTreeOptions{})
type DomainDetailOptions struct {
type DomainShowOptions struct {
_ struct{} `mcp-desc:"查询域详情。ID 可用 climc_domain_list 返回的 id/name"`
ID string `help:"ID or domain"`
}
R(&DomainDetailOptions{}, "domain-show", "Show detail of domain", func(s *mcclient.ClientSession, args *DomainDetailOptions) error {
R(&DomainShowOptions{}, "domain-show", "Show detail of domain", func(s *mcclient.ClientSession, args *DomainShowOptions) error {
result, err := modules.Domains.Get(s, args.ID, nil)
if err != nil {
return err
@@ -43,7 +45,12 @@ func init() {
printObject(result)
return nil
})
R(&DomainDetailOptions{}, "domain-delete", "Delete a domain", func(s *mcclient.ClientSession, args *DomainDetailOptions) error {
type DomainDeleteOptions struct {
_ struct{} `mcp-desc:"删除域。若尚不知 id先用 climc_domain_list 定位;确认域下无项目/用户后再删"`
ID string `help:"ID or domain"`
}
R(&DomainDeleteOptions{}, "domain-delete", "Delete a domain", func(s *mcclient.ClientSession, args *DomainDeleteOptions) error {
objId, err := modules.Domains.GetId(s, args.ID, nil)
if err != nil {
return err
@@ -72,12 +79,14 @@ func init() {
}) */
type DomainCreateOptions struct {
NAME string `help:"Name of domain"`
Desc string `help:"Description"`
Enabled bool `help:"Set the domain enabled"`
Disabled bool `help:"Set the domain disabled"`
_ struct{} `mcp-desc:"创建域。NAME 必填;可选 displayname/desc/enabled"`
Displayname string `help:"display name"`
NAME string `help:"Name of domain"`
Desc string `help:"Description" mcp:"true"`
Enabled bool `help:"Set the domain enabled" mcp:"true"`
Disabled bool `help:"Set the domain disabled" mcp:"true"`
Displayname string `help:"display name" mcp:"true"`
}
R(&DomainCreateOptions{}, "domain-create", "Create a new domain", func(s *mcclient.ClientSession, args *DomainCreateOptions) error {
params := jsonutils.NewDict()

View File

@@ -775,4 +775,17 @@ func init() {
printObject(result)
return nil
})
type IdentityProviderGetPropertyAttributeNamesOptions struct {
DRIVER string `help:"driver of idp to query" json:"driver" choices:"oidc|oauth2|saml|cas"`
TEMPLATE string `help:"template of idp to query" json:"template"`
}
R(&IdentityProviderGetPropertyAttributeNamesOptions{}, "idp-attribute-names", "Get property attribute names of a idp", func(s *mcclient.ClientSession, args *IdentityProviderGetPropertyAttributeNamesOptions) error {
result, err := modules.IdentityProviders.Get(s, "attribute-names", jsonutils.Marshal(args))
if err != nil {
return err
}
printObject(result)
return nil
})
}

View File

@@ -43,8 +43,10 @@ func init() {
cmd.PerformClass("clean", &identity_options.ProjectCleanOptions{})
type ProjectShowOptions struct {
_ struct{} `mcp-desc:"查询项目详情。ID 可用 climc_project_list 返回的 id/name跨域时可传 domain"`
ID string `help:"ID or Name of project"`
Domain string `help:"Domain"`
Domain string `help:"Domain" mcp:"true"`
}
R(&ProjectShowOptions{}, "project-show", "Show details of project", func(s *mcclient.ClientSession, args *ProjectShowOptions) error {
query := jsonutils.NewDict()
@@ -62,7 +64,13 @@ func init() {
printObject(result)
return nil
})
R(&ProjectShowOptions{}, "project-delete", "Delete a project", func(s *mcclient.ClientSession, args *ProjectShowOptions) error {
type ProjectDeleteOptions struct {
_ struct{} `mcp-desc:"删除项目。若尚不知 id先用 climc_project_list 定位;跨域时可传 domain"`
ID string `help:"ID or Name of project"`
Domain string `help:"Domain" mcp:"true"`
}
R(&ProjectDeleteOptions{}, "project-delete", "Delete a project", func(s *mcclient.ClientSession, args *ProjectDeleteOptions) error {
query := jsonutils.NewDict()
if len(args.Domain) > 0 {
domainId, err := modules.Domains.GetId(s, args.Domain, nil)
@@ -83,12 +91,14 @@ func init() {
})
type ProjectCreateOptions struct {
_ struct{} `mcp-desc:"创建项目。NAME 必填;可选 domain/displayname/desc"`
NAME string `help:"Name of new project"`
Displayname string `help:"display name"`
Domain string `help:"Domain"`
Desc string `help:"Description"`
Enabled bool `help:"Project is enabled"`
Disabled bool `help:"Project is disabled"`
Displayname string `help:"display name" mcp:"true"`
Domain string `help:"Domain" mcp:"true"`
Desc string `help:"Description" mcp:"true"`
Enabled bool `help:"Project is enabled" mcp:"true"`
Disabled bool `help:"Project is disabled" mcp:"true"`
}
R(&ProjectCreateOptions{}, "project-create", "Create a project", func(s *mcclient.ClientSession, args *ProjectCreateOptions) error {
params := jsonutils.NewDict()

View File

@@ -37,11 +37,11 @@ func init() {
RoleDomain string `help:"Domain for role"`
Limit int64 `help:"maximal returned number of rows"`
Offset int64 `help:"offset index of returned results"`
Users []string `help:"fitler by user id or name"`
Groups []string `help:"fitler by group id or name"`
Roles []string `help:"fitler by role id or name"`
Projects []string `help:"fitler by project id or name"`
Domains []string `help:"fitler by domain id or name"`
Users []string `help:"filter by user id or name"`
Groups []string `help:"filter by group id or name"`
Roles []string `help:"filter by role id or name"`
Projects []string `help:"filter by project id or name"`
Domains []string `help:"filter by domain id or name"`
ProjectDomainId string
ProjectDomains []string `help:"filter by project's domain id or name"`

View File

@@ -64,12 +64,14 @@ func init() {
return nil
})*/
type UserDetailOptions struct {
type UserShowOptions struct {
_ struct{} `mcp-desc:"查询用户详情。ID 可用 climc_user_list 返回的 id/name跨域时可传 domain"`
ID string `help:"ID of user"`
Domain string `help:"Domain"`
System bool `help:"show system user"`
Domain string `help:"Domain" mcp:"true"`
System bool `help:"show system user" mcp:"true"`
}
R(&UserDetailOptions{}, "user-show", "Show details of user", func(s *mcclient.ClientSession, args *UserDetailOptions) error {
R(&UserShowOptions{}, "user-show", "Show details of user", func(s *mcclient.ClientSession, args *UserShowOptions) error {
query := jsonutils.NewDict()
if len(args.Domain) > 0 {
domainId, err := modules.Domains.GetId(s, args.Domain, nil)
@@ -89,7 +91,14 @@ func init() {
return nil
})
R(&UserDetailOptions{}, "user-delete", "Delete user", func(s *mcclient.ClientSession, args *UserDetailOptions) error {
type UserDeleteOptions struct {
_ struct{} `mcp-desc:"删除用户。若尚不知 id先用 climc_user_list 定位;跨域时可传 domain"`
ID string `help:"ID of user"`
Domain string `help:"Domain" mcp:"true"`
System bool `help:"show system user" mcp:"true"`
}
R(&UserDeleteOptions{}, "user-delete", "Delete user", func(s *mcclient.ClientSession, args *UserDeleteOptions) error {
query := jsonutils.NewDict()
if len(args.Domain) > 0 {
domainId, err := modules.Domains.GetId(s, args.Domain, nil)
@@ -109,6 +118,11 @@ func init() {
return nil
})
type UserDetailOptions struct {
ID string `help:"ID of user"`
Domain string `help:"Domain"`
System bool `help:"show system user"`
}
R(&UserDetailOptions{}, "user-project-list", "List projects of user", func(s *mcclient.ClientSession, args *UserDetailOptions) error {
query := jsonutils.NewDict()
if len(args.Domain) > 0 {
@@ -170,29 +184,31 @@ func init() {
})
type UserCreateOptions struct {
NAME string `help:"Name of the new user"`
Domain string `help:"Domain"`
Desc string `help:"Description"`
Password *string `help:"Password"`
Displayname string `help:"Displayname"`
Email string `help:"Email"`
Mobile string `help:"Mobile"`
Enabled bool `help:"Enabled"`
Disabled bool `help:"Disabled"`
_ struct{} `mcp-desc:"创建用户。NAME 必填;建议传 password可选 domain/email/mobile/displayname"`
SkipPasswordComplexityCheck bool `help:"do password complexity check, default is false"`
NAME string `help:"Name of the new user"`
Domain string `help:"Domain" mcp:"true"`
Desc string `help:"Description" mcp:"true"`
Password *string `help:"Password" mcp:"true"`
Displayname string `help:"Displayname" mcp:"true"`
Email string `help:"Email" mcp:"true"`
Mobile string `help:"Mobile" mcp:"true"`
Enabled bool `help:"Enabled" mcp:"true"`
Disabled bool `help:"Disabled" mcp:"true"`
SkipPasswordComplexityCheck bool `help:"skip password complexity check" mcp:"true"`
// DefaultProject string `help:"Default project"`
SystemAccount bool `help:"is a system account?"`
NoWebConsole bool `help:"allow web console access"`
EnableMfa bool `help:"enable TOTP mfa"`
SystemAccount bool `help:"is a system account?" mcp:"true"`
NoWebConsole bool `help:"disallow web console access" mcp:"true"`
EnableMfa bool `help:"enable TOTP mfa" mcp:"true"`
IdpId string `help:"Id of identity provider to link with"`
IdpEntityId string `help:"Entity id of identity provider to link with"`
IdpId string `help:"Id of identity provider to link with" mcp:"true"`
IdpEntityId string `help:"Entity id of identity provider to link with" mcp:"true"`
Lang string `help:"user default language"`
Lang string `help:"user default language" mcp:"true"`
Expire string `help:"user expired at"`
Expire string `help:"user expired at" mcp:"true"`
}
R(&UserCreateOptions{}, "user-create", "Create a user", func(s *mcclient.ClientSession, args *UserCreateOptions) error {
params := jsonutils.NewDict()

View File

@@ -22,9 +22,9 @@ import (
var (
R = shell.R
printList = printutils.PrintJSONList
printObject = printutils.PrintJSONObject
printBatchResults = printutils.PrintJSONBatchResults
printList = shell.PrintList
printObject = shell.PrintObject
printBatchResults = shell.PrintBatchResults
InvalidUpdateError = shell.InvalidUpdateError
printObjectRecursive = printutils.PrintJSONObjectRecursive

View File

@@ -54,12 +54,12 @@ type ImageOptionalOptions struct {
OsDist string `help:"Distribution name of OS" metavar:"OS_DISTRIBUTION"`
OsVersion string `help:"Version of OS"`
OsCodename string `help:"Codename of OS"`
OsArch string `help:"Os hardware architecture" choices:"x86|x86_64|aarch32|aarch64"`
OsArch string `help:"Os hardware architecture" choices:"x86|x86_64|aarch32|aarch64|riscv32|riscv64"`
OsLang string `help:"OS Language" choices:"zh_CN|en_US"`
Preference int64 `help:"Disk preferences"`
Preference int64 `help:"Image disk preference weight"`
Notes string `help:"Notes about the image"`
Hypervisor []string `help:"Prefer hypervisor type" choices:"kvm|esxi|baremetal|container|openstack|ctyun"`
DiskDriver string `help:"Perfer disk driver" choices:"virtio|scsi|pvscsi|ide|sata"`
DiskDriver string `help:"Prefer disk driver" choices:"virtio|scsi|pvscsi|ide|sata"`
NetDriver string `help:"Preferred network driver" choices:"virtio|e1000|vmxnet3"`
DisableUsbKbd bool `help:"Disable usb keyboard on this image(for hypervisor kvm)"`
BootMode string `help:"UEFI support" choices:"UEFI|BIOS"`

View File

@@ -52,6 +52,7 @@ func initKubeCluster() {
cmd.Perform("delete-machines", new(o.KubeClusterDeleteMachinesOptions))
cmd.Perform("add-machines", new(o.KubeClusterAddMachinesOptions))
cmd.PerformClass("gc", new(o.ClusterGCOpts))
cmd.PerformClass("history-data-clean", new(o.ClusterHistoryDataCleanOpts))
cmd.Perform("set-extra-config", new(o.ClusterSetExtraConfigOpt))
cmd.Get("extra-config", new(o.IdentOptions))
@@ -311,6 +312,9 @@ func initKubeCluster() {
// 2. edit yaml
yaml, err := shellutils.Edit(setting.YAMLString())
if err != nil {
return errors.Wrap(err, "edit component setting")
}
if len(yaml) == 0 {
if !args.Force {
log.Infof("Nothing to update")

View File

@@ -43,7 +43,7 @@ func initContainerRegistry() {
type UploadOptions struct {
REGISTRY string `help:"The name or id of registry" json:"-"`
FILE string `help:"The container tar image" json:"-"`
Name string `help:"Override image name" json:"name`
Name string `help:"Override image name" json:"name"`
Tag string `help:"Override image tag" json:"tag"`
}
R(new(UploadOptions), "k8s-container-registry-upload-image", "Upload a docker image", func(s *mcclient.ClientSession, args *UploadOptions) error {
@@ -101,6 +101,9 @@ func initContainerRegistry() {
Username: args.Username,
Password: args.Password,
})
if err != nil {
return errors.Wrap(err, "download image by manager")
}
}
output := args.Output
if output == "" && fileName != "" {

View File

@@ -7,7 +7,7 @@ import (
)
func init() {
cmd := shell.NewResourceCmd(&modules.Difies)
cmd := shell.NewResourceCmd(&modules.LLMs).WithKeyword("dify")
cmd.BatchCreate(new(options.DifyCreateOptions))
cmd.List(new(options.DifyListOptions))
cmd.Show(new(options.DifyShowOptions))

Some files were not shown because too many files have changed in this diff Show More