diff --git a/conf/db/upgrade/V5.5.12__schema.sql b/conf/db/upgrade/V5.5.12__schema.sql new file mode 100644 index 0000000000..df41739eaa --- /dev/null +++ b/conf/db/upgrade/V5.5.12__schema.sql @@ -0,0 +1,122 @@ +-- ZSTAC-75319: Add normalizedModelName column for GPU spec dedup +CALL ADD_COLUMN('GpuDeviceSpecVO', 'normalizedModelName', 'VARCHAR(255)', 1, NULL); +CALL CREATE_INDEX('GpuDeviceSpecVO', 'idx_gpu_spec_normalized_model', 'normalizedModelName'); + +-- Add totalScore and endTime columns to ModelEvaluationTaskVO for ZQL sorting support +-- Previously these values were only stored inside the opaque JSON TEXT field, +-- making them invisible to ZQL ORDER BY queries. +CALL ADD_COLUMN('ModelEvaluationTaskVO', 'totalScore', 'DOUBLE', 1, NULL); +CALL ADD_COLUMN('ModelEvaluationTaskVO', 'endTime', 'DATETIME', 1, NULL); + +-- Add indexes to support efficient sorting +CALL CREATE_INDEX('ModelEvaluationTaskVO', 'idx_ModelEvaluationTaskVO_totalScore', 'totalScore'); +CALL CREATE_INDEX('ModelEvaluationTaskVO', 'idx_ModelEvaluationTaskVO_endTime', 'endTime'); + +-- Backfill totalScore from opaque JSON for existing completed tasks +-- Uses Json_getKeyValue defined in beforeMigrate.sql for MySQL 5.5+ compatibility +UPDATE `zstack`.`ModelEvaluationTaskVO` +SET `totalScore` = CAST(Json_getKeyValue(`opaque`, 'total_score') AS DECIMAL(20,6)) +WHERE `opaque` IS NOT NULL + AND `totalScore` IS NULL + AND Json_getKeyValue(`opaque`, 'total_score') IS NOT NULL; + +-- Backfill endTime from opaque JSON for existing completed/failed tasks +-- end_time format from Python agent: "MMM dd, yyyy hh:mm:ss a" (e.g. "Jan 01, 2025 10:30:00 AM") +UPDATE `zstack`.`ModelEvaluationTaskVO` +SET `endTime` = STR_TO_DATE( + Json_getKeyValue(`opaque`, 'end_time'), + '%b %d, %Y %h:%i:%s %p' +) +WHERE `opaque` IS NOT NULL + AND `endTime` IS NULL + AND Json_getKeyValue(`opaque`, 'end_time') IS NOT NULL + AND Json_getKeyValue(`opaque`, 'end_time') != ''; + +-- dGPU (TensorFusion) support tables + +CREATE TABLE IF NOT EXISTS `zstack`.`DGpuProfileVO` ( + `uuid` VARCHAR(32) NOT NULL, + `gpuSpecUuid` VARCHAR(32) NOT NULL, + `memorySize` BIGINT UNSIGNED NOT NULL, + `shmemSize` BIGINT UNSIGNED NOT NULL DEFAULT 268435456, + `createDate` TIMESTAMP NOT NULL, + `lastOpDate` TIMESTAMP NOT NULL, + PRIMARY KEY (`uuid`), + UNIQUE KEY `uk_dgpu_profile` (`gpuSpecUuid`, `memorySize`), + CONSTRAINT `fk_dgpu_profile_spec` + FOREIGN KEY (`gpuSpecUuid`) REFERENCES `zstack`.`GpuDeviceSpecVO`(`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`DGpuDeviceVO` ( + `uuid` VARCHAR(32) NOT NULL, + `name` VARCHAR(255) NOT NULL, + `parentGpuUuid` VARCHAR(32) NOT NULL, + `gpuSpecUuid` VARCHAR(32) NOT NULL, + `hostUuid` VARCHAR(32) NOT NULL, + `vmInstanceUuid` VARCHAR(32) DEFAULT NULL, + `allocatedMemory` BIGINT UNSIGNED NOT NULL, + `shmemSize` BIGINT UNSIGNED NOT NULL DEFAULT 268435456, + `smPercentLimit` INT NOT NULL DEFAULT 0, + `protocol` VARCHAR(16) NOT NULL DEFAULT 'shmem', + `status` VARCHAR(32) NOT NULL, + `vendorId` VARCHAR(64) DEFAULT NULL, + `vendor` VARCHAR(255) DEFAULT NULL, + `createDate` TIMESTAMP NOT NULL, + `lastOpDate` TIMESTAMP NOT NULL, + PRIMARY KEY (`uuid`), + INDEX `idx_dgpu_device_parent` (`parentGpuUuid`), + INDEX `idx_dgpu_device_spec` (`gpuSpecUuid`), + INDEX `idx_dgpu_device_host` (`hostUuid`), + INDEX `idx_dgpu_device_vm` (`vmInstanceUuid`), + CONSTRAINT `fk_dgpu_device_parent` + FOREIGN KEY (`parentGpuUuid`) REFERENCES `zstack`.`PciDeviceVO`(`uuid`) ON DELETE CASCADE, + CONSTRAINT `fk_dgpu_device_spec` + FOREIGN KEY (`gpuSpecUuid`) REFERENCES `zstack`.`GpuDeviceSpecVO`(`uuid`) ON DELETE RESTRICT, + CONSTRAINT `fk_dgpu_device_host` + FOREIGN KEY (`hostUuid`) REFERENCES `zstack`.`HostEO`(`uuid`) ON DELETE CASCADE, + CONSTRAINT `fk_dgpu_device_vm` + FOREIGN KEY (`vmInstanceUuid`) REFERENCES `zstack`.`VmInstanceEO`(`uuid`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`VmInstanceDGpuStrategyVO` ( + `id` BIGINT NOT NULL AUTO_INCREMENT, + `vmInstanceUuid` VARCHAR(32) NOT NULL, + `gpuSpecUuid` VARCHAR(32) NOT NULL, + `memorySize` BIGINT UNSIGNED NOT NULL, + `shmemSize` BIGINT UNSIGNED NOT NULL DEFAULT 268435456, + `gpuDeviceUuid` VARCHAR(32) DEFAULT NULL, + `chooser` VARCHAR(16) NOT NULL, + `autoDetachOnStop` TINYINT(1) NOT NULL DEFAULT 1, + `createDate` TIMESTAMP NOT NULL, + `lastOpDate` TIMESTAMP NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_vm_dgpu_strategy` (`vmInstanceUuid`), + INDEX `idx_vm_dgpu_strategy_spec` (`gpuSpecUuid`), + CONSTRAINT `fk_vm_dgpu_strategy_vm` + FOREIGN KEY (`vmInstanceUuid`) REFERENCES `zstack`.`VmInstanceEO`(`uuid`) ON DELETE CASCADE, + CONSTRAINT `fk_vm_dgpu_strategy_spec` + FOREIGN KEY (`gpuSpecUuid`) REFERENCES `zstack`.`GpuDeviceSpecVO`(`uuid`) ON DELETE CASCADE, + CONSTRAINT `fk_vm_dgpu_strategy_device` + FOREIGN KEY (`gpuDeviceUuid`) REFERENCES `zstack`.`PciDeviceVO`(`uuid`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ZSTAC-83157: VM model mount feature +CREATE TABLE IF NOT EXISTS `zstack`.`VmModelMountVO` ( + `uuid` VARCHAR(32) NOT NULL, + `vmInstanceUuid` VARCHAR(32) NOT NULL, + `modelUuid` VARCHAR(32) NOT NULL, + `modelName` VARCHAR(256) DEFAULT NULL, + `mountPath` VARCHAR(512) NOT NULL, + `sourcePath` VARCHAR(1024) NOT NULL, + `status` VARCHAR(32) NOT NULL, + `hostUuid` VARCHAR(32) DEFAULT NULL, + `accountUuid` VARCHAR(32) DEFAULT NULL, + `createDate` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uuid`), + UNIQUE KEY `uk_vm_mountpath` (`vmInstanceUuid`, `mountPath`(255)), + CONSTRAINT `fk_vm_model_mount_vm` + FOREIGN KEY (`vmInstanceUuid`) REFERENCES `zstack`.`VmInstanceEO`(`uuid`) ON DELETE CASCADE, + CONSTRAINT `fk_vm_model_mount_model` + FOREIGN KEY (`modelUuid`) REFERENCES `zstack`.`ModelVO`(`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/conf/db/upgrade/V5.5.16__schema.sql b/conf/db/upgrade/V5.5.16__schema.sql index 0d8412840c..08c0f98ef2 100644 --- a/conf/db/upgrade/V5.5.16__schema.sql +++ b/conf/db/upgrade/V5.5.16__schema.sql @@ -344,3 +344,24 @@ CREATE TABLE IF NOT EXISTS `zstack`.`VmInstanceDGpuStrategyVO` ( FOREIGN KEY (`gpuDeviceUuid`) REFERENCES `zstack`.`PciDeviceVO`(`uuid`) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +-- ZSTAC-83157: VM model mount feature +CREATE TABLE IF NOT EXISTS `zstack`.`VmModelMountVO` ( + `uuid` VARCHAR(32) NOT NULL, + `vmInstanceUuid` VARCHAR(32) NOT NULL, + `modelUuid` VARCHAR(32) NOT NULL, + `modelName` VARCHAR(256) DEFAULT NULL, + `mountPath` VARCHAR(512) NOT NULL, + `sourcePath` VARCHAR(1024) NOT NULL, + `status` VARCHAR(32) NOT NULL, + `hostUuid` VARCHAR(32) DEFAULT NULL, + `accountUuid` VARCHAR(32) DEFAULT NULL, + `createDate` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uuid`), + UNIQUE KEY `uk_vm_mountpath` (`vmInstanceUuid`, `mountPath`(255)), + CONSTRAINT `fk_vm_model_mount_vm` + FOREIGN KEY (`vmInstanceUuid`) REFERENCES `zstack`.`VmInstanceEO`(`uuid`) ON DELETE CASCADE, + CONSTRAINT `fk_vm_model_mount_model` + FOREIGN KEY (`modelUuid`) REFERENCES `zstack`.`ModelVO`(`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + diff --git a/conf/i18n/globalErrorCodeMapping/global-error-de-DE.json b/conf/i18n/globalErrorCodeMapping/global-error-de-DE.json index 1e24c52ea1..6671466555 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-de-DE.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-de-DE.json @@ -4716,5 +4716,6 @@ "ORG_ZSTACK_SDNCONTROLLER_10025": "SDN-Controller [UUID:%s] nicht gefunden.", "ORG_ZSTACK_ZBOX_10002": "", "ORG_ZSTACK_BILLING_10020": "Das Konto[uuid=%s] hat eine Preisliste angehängt", - "ORG_ZSTACK_BAREMETAL2_GATEWAY_10046": "Fehler beim Zerstören des Bereitstellungsnetzwerks im Gateway[uuid:%s], weil %s" + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10046": "Fehler beim Zerstören des Bereitstellungsnetzwerks im Gateway[uuid:%s], weil %s", + "ORG_ZSTACK_AI_10157": "virtiofs ist deaktiviert (ai.virtiofs.enabled=false). Bitte aktivieren Sie es, um Modelle auf VMs einzuhängen: UpdateGlobalConfig category=ai name=virtiofs.enabled value=true" } \ No newline at end of file diff --git a/conf/i18n/globalErrorCodeMapping/global-error-en_US.json b/conf/i18n/globalErrorCodeMapping/global-error-en_US.json index af8d1b29ac..6066027cd5 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-en_US.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-en_US.json @@ -4720,5 +4720,6 @@ "ORG_ZSTACK_VPCFIREWALL_10035": "could not add firewall rule[%d] because of a %s error", "ORG_ZSTACK_DGPU_10010": "Available License not found, please apply addon license for product dGPU.", "ORG_ZSTACK_DGPU_10011": "Addon license for product dGPU has expired, please renew it.", - "ORG_ZSTACK_DGPU_10012": "Insufficient dGPU GPU number licensed. Your license permits %d GPU, there are %d GPU used, shared: %d, need: %d." + "ORG_ZSTACK_DGPU_10012": "Insufficient dGPU GPU number licensed. Your license permits %d GPU, there are %d GPU used, shared: %d, need: %d.", + "ORG_ZSTACK_AI_10157": "virtiofs is disabled (ai.virtiofs.enabled=false). Please enable it to mount models to VMs: UpdateGlobalConfig category=ai name=virtiofs.enabled value=true" } diff --git a/conf/i18n/globalErrorCodeMapping/global-error-fr-FR.json b/conf/i18n/globalErrorCodeMapping/global-error-fr-FR.json index 8fb00fa577..6c5dd6f4a4 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-fr-FR.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-fr-FR.json @@ -4716,5 +4716,6 @@ "ORG_ZSTACK_ZWATCH_FUNCTION_10013": "Arguments inconnus détectés. Veuillez vous assurer que tous les paramètres de ligne de commande sont valides et consulter la documentation pour obtenir la liste des arguments acceptés.", "ORG_ZSTACK_VPCFIREWALL_10034": "impossible d'ajouter la règle de pare-feu[%d] car seul le protocole TCP prend en charge les drapeaux TCP dans cet environnement", "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007": "impossible d'arrêter le serveur DHCP sur l'instance de routeur virtuel [uuid:%s] car %s", - "ORG_ZSTACK_VPCFIREWALL_10035": "impossible d'ajouter la règle de pare-feu[%d] en raison d'une erreur %s" + "ORG_ZSTACK_VPCFIREWALL_10035": "impossible d'ajouter la règle de pare-feu[%d] en raison d'une erreur %s", + "ORG_ZSTACK_AI_10157": "virtiofs est désactivé (ai.virtiofs.enabled=false). Veuillez l'activer pour monter des modèles sur les VMs : UpdateGlobalConfig category=ai name=virtiofs.enabled value=true" } \ No newline at end of file diff --git a/conf/i18n/globalErrorCodeMapping/global-error-id-ID.json b/conf/i18n/globalErrorCodeMapping/global-error-id-ID.json index 7e41658f31..d2a99a2e16 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-id-ID.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-id-ID.json @@ -4716,5 +4716,6 @@ "ORG_ZSTACK_ZWATCH_FUNCTION_10013": "Terdeteksi argumen yang tidak diketahui. Harap pastikan semua parameter baris perintah valid dan lihat dokumentasi untuk daftar argumen yang diterima.", "ORG_ZSTACK_VPCFIREWALL_10034": "tidak dapat menambahkan aturan firewall[%d] karena hanya protokol TCP yang mendukung flag TCP di lingkungan ini", "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007": "tidak dapat menghentikan server DHCP pada instance router virtual [uuid:%s] karena %s", - "ORG_ZSTACK_VPCFIREWALL_10035": "tidak dapat menambahkan aturan firewall[%d] karena error %s" + "ORG_ZSTACK_VPCFIREWALL_10035": "tidak dapat menambahkan aturan firewall[%d] karena error %s", + "ORG_ZSTACK_AI_10157": "virtiofs dinonaktifkan (ai.virtiofs.enabled=false). Harap aktifkan untuk memasang model ke VM: UpdateGlobalConfig category=ai name=virtiofs.enabled value=true" } \ No newline at end of file diff --git a/conf/i18n/globalErrorCodeMapping/global-error-ja-JP.json b/conf/i18n/globalErrorCodeMapping/global-error-ja-JP.json index bf73aa503f..1e78ac28d3 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-ja-JP.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-ja-JP.json @@ -4716,5 +4716,6 @@ "ORG_ZSTACK_PCIDEVICE_10063": "PCIデバイス[%s]がすべて使用可能ではありません", "ORG_ZSTACK_PCIDEVICE_10058": "ホスト [%s] のメンテナンスモードへの移行に失敗しました。PCIデバイスの存在により、VM [%s] は自動移行できません。", "ORG_ZSTACK_PCIDEVICE_10052": "VM[%s]の他のPCIデバイスを取り外してから、再試行してください", - "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10024": "大規模ファイルのHMAC暗号化に失敗しました、コード: %s、詳細: %s" + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10024": "大規模ファイルのHMAC暗号化に失敗しました、コード: %s、詳細: %s", + "ORG_ZSTACK_AI_10157": "virtiofs が無効です (ai.virtiofs.enabled=false)。VM にモデルをマウントするには有効にしてください:UpdateGlobalConfig category=ai name=virtiofs.enabled value=true" } \ No newline at end of file diff --git a/conf/i18n/globalErrorCodeMapping/global-error-ko-KR.json b/conf/i18n/globalErrorCodeMapping/global-error-ko-KR.json index d932387120..c98eddbceb 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-ko-KR.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-ko-KR.json @@ -4716,5 +4716,6 @@ "ORG_ZSTACK_COMPUTE_VM_10129": "메시지 %s에서 vmUuid를 검색할 수 없습니다", "ORG_ZSTACK_COMPUTE_VM_10127": "실행 중인 VM[uuid:%s]의 CPU를 줄일 수 없습니다", "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10007": "잘못된 날짜 또는 시간[%s]으로, 현재 타임스탬프[%s]보다 이전일 수 없습니다.", - "ORG_ZSTACK_NETWORK_SERVICE_LB_10077": "세션 쿠키 이름 [%s]이(가) 잘못되었습니다. [%d]자 미만이어야 합니다" + "ORG_ZSTACK_NETWORK_SERVICE_LB_10077": "세션 쿠키 이름 [%s]이(가) 잘못되었습니다. [%d]자 미만이어야 합니다", + "ORG_ZSTACK_AI_10157": "virtiofs가 비활성화되었습니다 (ai.virtiofs.enabled=false). VM에 모델을 마운트하려면 활성화하세요: UpdateGlobalConfig category=ai name=virtiofs.enabled value=true" } \ No newline at end of file diff --git a/conf/i18n/globalErrorCodeMapping/global-error-ru-RU.json b/conf/i18n/globalErrorCodeMapping/global-error-ru-RU.json index 55bde5ee0c..c3ba615f08 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-ru-RU.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-ru-RU.json @@ -4716,5 +4716,6 @@ "ORG_ZSTACK_ZWATCH_FUNCTION_10013": "Обнаружены неизвестные аргументы. Убедитесь, что все параметры командной строки действительны, и обратитесь к документации для получения списка допустимых аргументов.", "ORG_ZSTACK_VPCFIREWALL_10034": "не удалось добавить правило брандмауэра[%d], так как только протокол TCP поддерживает TCP-флаги в этой среде", "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007": "не удалось остановить DHCP-сервер на экземпляре виртуального маршрутизатора [uuid:%s], поскольку %s", - "ORG_ZSTACK_VPCFIREWALL_10035": "не удалось добавить правило брандмауэра[%d] из-за ошибки %s" + "ORG_ZSTACK_VPCFIREWALL_10035": "не удалось добавить правило брандмауэра[%d] из-за ошибки %s", + "ORG_ZSTACK_AI_10157": "virtiofs отключён (ai.virtiofs.enabled=false). Пожалуйста, включите для монтирования моделей на ВМ: UpdateGlobalConfig category=ai name=virtiofs.enabled value=true" } \ No newline at end of file diff --git a/conf/i18n/globalErrorCodeMapping/global-error-th-TH.json b/conf/i18n/globalErrorCodeMapping/global-error-th-TH.json index 3118556b6d..2316533575 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-th-TH.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-th-TH.json @@ -4716,5 +4716,6 @@ "ORG_ZSTACK_ZWATCH_FUNCTION_10013": "ตรวจพบอาร์กิวเมนต์ที่ไม่รู้จัก โปรดตรวจสอบว่าพารามิเตอร์บรรทัดคำสั่งทั้งหมดถูกต้อง และอ้างอิงเอกสารสำหรับรายการอาร์กิวเมนต์ที่รองรับ", "ORG_ZSTACK_VPCFIREWALL_10034": "ไม่สามารถเพิ่มกฎไฟร์วอลล์[%d] เนื่องจากมีเพียงโปรโตคอล TCP ที่รองรับ TCP flags ในสภาพแวดล้อมนี้", "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007": "ไม่สามารถหยุดเซิร์ฟเวอร์ DHCP บนอินสแตนซ์เราเตอร์เสมือน [uuid:%s] เนื่องจาก %s", - "ORG_ZSTACK_VPCFIREWALL_10035": "ไม่สามารถเพิ่มกฎไฟร์วอลล์[%d] เนื่องจากเกิดข้อผิดพลาด %s" + "ORG_ZSTACK_VPCFIREWALL_10035": "ไม่สามารถเพิ่มกฎไฟร์วอลล์[%d] เนื่องจากเกิดข้อผิดพลาด %s", + "ORG_ZSTACK_AI_10157": "virtiofs ถูกปิดใช้งาน (ai.virtiofs.enabled=false) โปรดเปิดใช้งานเพื่อเมานต์โมเดลไปยัง VM: UpdateGlobalConfig category=ai name=virtiofs.enabled value=true" } \ No newline at end of file diff --git a/conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json b/conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json index be35880ac6..83279149c3 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json @@ -4720,5 +4720,19 @@ "ORG_ZSTACK_VPCFIREWALL_10035": "无法添加防火墙规则[%d]因为%s", "ORG_ZSTACK_DGPU_10010": "未找到可用的 dGPU AddOn License,请为 dGPU 产品申请并上传对应授权。", "ORG_ZSTACK_DGPU_10011": "dGPU 产品的 AddOn License 已过期,请及时续期。", - "ORG_ZSTACK_DGPU_10012": "dGPU 授权 GPU 数量不足。License 允许 %d 个 GPU,当前已使用 %d 个,其他节点共享使用 %d 个,本次还需要 %d 个。" + "ORG_ZSTACK_DGPU_10012": "dGPU 授权 GPU 数量不足。License 允许 %d 个 GPU,当前已使用 %d 个,其他节点共享使用 %d 个,本次还需要 %d 个。", + "ORG_ZSTACK_AI_10138": "虚拟机[uuid:%s]未找到", + "ORG_ZSTACK_AI_10139": "模型[uuid:%s]未找到", + "ORG_ZSTACK_AI_10140": "虚拟机[uuid:%s]必须处于运行状态才能挂载模型,当前状态: %s", + "ORG_ZSTACK_AI_10141": "虚拟机[uuid:%s]未运行在任何主机上", + "ORG_ZSTACK_AI_10142": "模型[uuid:%s]属于账户[%s]但虚拟机[uuid:%s]属于账户[%s],无法跨账户挂载模型", + "ORG_ZSTACK_AI_10143": "模型中心[uuid:%s]未找到", + "ORG_ZSTACK_AI_10144": "挂载路径[%s]已被虚拟机[uuid:%s]上的另一个挂载[uuid:%s]使用", + "ORG_ZSTACK_AI_10145": "挂载路径[%s]不允许,不能挂载到系统目录", + "ORG_ZSTACK_AI_10146": "模型安装路径[%s]无效,预期格式: file:///root/bentoml/models/", + "ORG_ZSTACK_AI_10147": "挂载记录[uuid:%s]未找到", + "ORG_ZSTACK_AI_10148": "挂载记录[uuid:%s]未处于已挂载状态,当前状态: %s", + "ORG_ZSTACK_AI_10149": "挂载模型到虚拟机失败: %s", + "ORG_ZSTACK_AI_10150": "模型[uuid:%s, 名称:%s]已挂载到虚拟机[uuid:%s],挂载路径[%s]。每个模型在每个虚拟机上只能挂载一次", + "ORG_ZSTACK_AI_10157": "virtiofs 已禁用 (ai.virtiofs.enabled=false)。请启用该配置以将模型挂载到虚拟机:UpdateGlobalConfig category=ai name=virtiofs.enabled value=true" } diff --git a/conf/i18n/globalErrorCodeMapping/global-error-zh_TW.json b/conf/i18n/globalErrorCodeMapping/global-error-zh_TW.json index b696d46d05..bc6f22f7f1 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-zh_TW.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-zh_TW.json @@ -4716,5 +4716,6 @@ "ORG_ZSTACK_ZWATCH_FUNCTION_10013": "未知參數", "ORG_ZSTACK_VPCFIREWALL_10034": "無法添加防火墙規则[%d],因为只有TCP协议可以使用TCP標誌", "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007": "無法停止虚拟路由器VM[uuid:%s]上的DHCP服務器,因为%s", - "ORG_ZSTACK_VPCFIREWALL_10035": "無法添加防火墙規则[%d]因为%s" + "ORG_ZSTACK_VPCFIREWALL_10035": "無法添加防火墙規则[%d]因为%s", + "ORG_ZSTACK_AI_10157": "virtiofs 已停用 (ai.virtiofs.enabled=false)。請啟用該設定以將模型掛載到虛擬機器:UpdateGlobalConfig category=ai name=virtiofs.enabled value=true" } \ No newline at end of file diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java index 303a12bc6f..314ff98347 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java @@ -97,6 +97,11 @@ public interface KVMConstant { String CLEAN_FIRMWARE_FLASH = "/clean/firmware/flash"; String FSTRIM_VM_PATH = "/vm/fstrim"; + // ZSTAC-83157: virtiofs model mount paths + String KVM_VIRTIOFS_ATTACH_PATH = "/virtiofs/attach"; + String KVM_VIRTIOFS_DETACH_PATH = "/virtiofs/detach"; + String KVM_MODEL_CENTER_MOUNT_PATH = "/modelcenter/mount"; + String ISO_TO = "kvm.isoto"; String ANSIBLE_PLAYBOOK_NAME = "kvm.py"; String ANSIBLE_MODULE_PATH = "ansible/kvm"; diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 1206558cff..6decef8aae 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -25,6 +25,8 @@ public class SourceClassMap { put("org.zstack.ai.entity.ModelServiceRefInventory", "org.zstack.sdk.ModelServiceRefInventory"); put("org.zstack.ai.entity.ModelServiceTemplateInventory", "org.zstack.sdk.ModelServiceTemplateInventory"); put("org.zstack.ai.entity.TrainedModelRecordInventory", "org.zstack.sdk.TrainedModelRecordInventory"); + put("org.zstack.ai.entity.VmModelMountInventory", "org.zstack.sdk.VmModelMountInventory"); + put("org.zstack.ai.entity.VmModelMountStatus", "org.zstack.sdk.VmModelMountStatus"); put("org.zstack.ai.message.ArchitectureImageMapping", "org.zstack.sdk.ArchitectureImageMapping"); put("org.zstack.ai.message.MaaSUsage", "org.zstack.sdk.MaaSUsage"); put("org.zstack.ai.message.ModelCenterServiceInventory", "org.zstack.sdk.ModelCenterServiceInventory"); @@ -1565,6 +1567,8 @@ public class SourceClassMap { put("org.zstack.sdk.VmInstancePciDeviceSpecRefInventory", "org.zstack.pciDevice.specification.pci.VmInstancePciDeviceSpecRefInventory"); put("org.zstack.sdk.VmMemoryBillingInventory", "org.zstack.billing.generator.vm.memory.VmMemoryBillingInventory"); put("org.zstack.sdk.VmMemorySpendingDetails", "org.zstack.billing.spendingcalculator.vm.VmMemorySpendingDetails"); + put("org.zstack.sdk.VmModelMountInventory", "org.zstack.ai.entity.VmModelMountInventory"); + put("org.zstack.sdk.VmModelMountStatus", "org.zstack.ai.entity.VmModelMountStatus"); put("org.zstack.sdk.VmNicBandwidthSpendingDetails", "org.zstack.billing.spendingcalculator.vmnic.VmNicBandwidthSpendingDetails"); put("org.zstack.sdk.VmNicInventory", "org.zstack.header.vm.VmNicInventory"); put("org.zstack.sdk.VmNicSecurityGroupRefInventory", "org.zstack.network.securitygroup.VmNicSecurityGroupRefInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/MountModelToVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/MountModelToVmInstanceAction.java new file mode 100644 index 0000000000..9dfca7a35d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/MountModelToVmInstanceAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class MountModelToVmInstanceAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.MountModelToVmInstanceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmInstanceUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelUuid; + + @Param(required = false, maxLength = 512, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String mountPath; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.MountModelToVmInstanceResult value = res.getResult(org.zstack.sdk.MountModelToVmInstanceResult.class); + ret.value = value == null ? new org.zstack.sdk.MountModelToVmInstanceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/vm-model-mounts"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/MountModelToVmInstanceResult.java b/sdk/src/main/java/org/zstack/sdk/MountModelToVmInstanceResult.java new file mode 100644 index 0000000000..0feb080e65 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/MountModelToVmInstanceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmModelMountInventory; + +public class MountModelToVmInstanceResult { + public VmModelMountInventory inventory; + public void setInventory(VmModelMountInventory inventory) { + this.inventory = inventory; + } + public VmModelMountInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmModelMountAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVmModelMountAction.java new file mode 100644 index 0000000000..3205a750d3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmModelMountAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryVmModelMountAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryVmModelMountResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryVmModelMountResult value = res.getResult(org.zstack.sdk.QueryVmModelMountResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryVmModelMountResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/vm-model-mounts"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmModelMountResult.java b/sdk/src/main/java/org/zstack/sdk/QueryVmModelMountResult.java new file mode 100644 index 0000000000..de488a4a8a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmModelMountResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryVmModelMountResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UnmountModelFromVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/UnmountModelFromVmInstanceAction.java new file mode 100644 index 0000000000..677cd31188 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UnmountModelFromVmInstanceAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UnmountModelFromVmInstanceAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UnmountModelFromVmInstanceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UnmountModelFromVmInstanceResult value = res.getResult(org.zstack.sdk.UnmountModelFromVmInstanceResult.class); + ret.value = value == null ? new org.zstack.sdk.UnmountModelFromVmInstanceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/vm-model-mounts/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UnmountModelFromVmInstanceResult.java b/sdk/src/main/java/org/zstack/sdk/UnmountModelFromVmInstanceResult.java new file mode 100644 index 0000000000..736cdec965 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UnmountModelFromVmInstanceResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class UnmountModelFromVmInstanceResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/VmModelMountInventory.java b/sdk/src/main/java/org/zstack/sdk/VmModelMountInventory.java new file mode 100644 index 0000000000..e328b9292b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/VmModelMountInventory.java @@ -0,0 +1,87 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmModelMountStatus; + +public class VmModelMountInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String vmInstanceUuid; + public void setVmInstanceUuid(java.lang.String vmInstanceUuid) { + this.vmInstanceUuid = vmInstanceUuid; + } + public java.lang.String getVmInstanceUuid() { + return this.vmInstanceUuid; + } + + public java.lang.String modelUuid; + public void setModelUuid(java.lang.String modelUuid) { + this.modelUuid = modelUuid; + } + public java.lang.String getModelUuid() { + return this.modelUuid; + } + + public java.lang.String modelName; + public void setModelName(java.lang.String modelName) { + this.modelName = modelName; + } + public java.lang.String getModelName() { + return this.modelName; + } + + public java.lang.String mountPath; + public void setMountPath(java.lang.String mountPath) { + this.mountPath = mountPath; + } + public java.lang.String getMountPath() { + return this.mountPath; + } + + public java.lang.String sourcePath; + public void setSourcePath(java.lang.String sourcePath) { + this.sourcePath = sourcePath; + } + public java.lang.String getSourcePath() { + return this.sourcePath; + } + + public VmModelMountStatus status; + public void setStatus(VmModelMountStatus status) { + this.status = status; + } + public VmModelMountStatus getStatus() { + return this.status; + } + + public java.lang.String accountUuid; + public void setAccountUuid(java.lang.String accountUuid) { + this.accountUuid = accountUuid; + } + public java.lang.String getAccountUuid() { + return this.accountUuid; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/VmModelMountStatus.java b/sdk/src/main/java/org/zstack/sdk/VmModelMountStatus.java new file mode 100644 index 0000000000..67222f0898 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/VmModelMountStatus.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum VmModelMountStatus { + Mounted, + Unmounting, +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 5a9b5138a3..db88ce60ba 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -27745,6 +27745,33 @@ abstract class ApiHelper { } + def mountModelToVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.MountModelToVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.MountModelToVmInstanceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def mountVmInstanceRecoveryPoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.MountVmInstanceRecoveryPointAction.class) Closure c) { def a = new org.zstack.sdk.MountVmInstanceRecoveryPointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -36211,6 +36238,35 @@ abstract class ApiHelper { } + def queryVmModelMount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmModelMountAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVmModelMountAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryVmNic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmNicAction.class) Closure c) { def a = new org.zstack.sdk.QueryVmNicAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -42673,6 +42729,33 @@ abstract class ApiHelper { } + def unmountModelFromVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UnmountModelFromVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.UnmountModelFromVmInstanceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def unmountVmInstanceRecoveryPoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UnmountVmInstanceRecoveryPointAction.class) Closure c) { def a = new org.zstack.sdk.UnmountVmInstanceRecoveryPointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid diff --git a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java index 47e32c7cf9..d4c7249349 100644 --- a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java +++ b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java @@ -14893,17 +14893,22 @@ public class CloudOperationsErrorCode { public static final String ORG_ZSTACK_AI_10137 = "ORG_ZSTACK_AI_10137"; + // VM Model Mount error codes (ZSTAC-83157) public static final String ORG_ZSTACK_AI_10138 = "ORG_ZSTACK_AI_10138"; - public static final String ORG_ZSTACK_AI_10139 = "ORG_ZSTACK_AI_10139"; - public static final String ORG_ZSTACK_AI_10140 = "ORG_ZSTACK_AI_10140"; - public static final String ORG_ZSTACK_AI_10141 = "ORG_ZSTACK_AI_10141"; - public static final String ORG_ZSTACK_AI_10142 = "ORG_ZSTACK_AI_10142"; - public static final String ORG_ZSTACK_AI_10143 = "ORG_ZSTACK_AI_10143"; + public static final String ORG_ZSTACK_AI_10144 = "ORG_ZSTACK_AI_10144"; + public static final String ORG_ZSTACK_AI_10145 = "ORG_ZSTACK_AI_10145"; + public static final String ORG_ZSTACK_AI_10146 = "ORG_ZSTACK_AI_10146"; + public static final String ORG_ZSTACK_AI_10147 = "ORG_ZSTACK_AI_10147"; + public static final String ORG_ZSTACK_AI_10148 = "ORG_ZSTACK_AI_10148"; + public static final String ORG_ZSTACK_AI_10149 = "ORG_ZSTACK_AI_10149"; + public static final String ORG_ZSTACK_AI_10150 = "ORG_ZSTACK_AI_10150"; + public static final String ORG_ZSTACK_AI_10157 = "ORG_ZSTACK_AI_10157"; + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10000 = "ORG_ZSTACK_CORE_CLOUDBUS_10000"; public static final String ORG_ZSTACK_CORE_CLOUDBUS_10001 = "ORG_ZSTACK_CORE_CLOUDBUS_10001";