Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions conf/i18n/globalErrorCodeMapping/global-error-de-DE.json
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,7 @@
"ORG_ZSTACK_CONFIGURATION_10006": "Instanztyp[%s] wird nicht unterstützt",
"ORG_ZSTACK_MULTICAST_ROUTER_10007": "Gruppenadresse [%s] ist keine Multicast-Gruppenadresse",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "Speicher ist nicht gesund:%s",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10015": "Kein verfügbarer Backup-Speicher mit bevorzugten Typen %s für primären Speicher[uuid:%s]",
"ORG_ZSTACK_MULTICAST_ROUTER_10000": "multicastRouter[uuid:%s] wurde keinem VPC-Router zugeordnet",
"ORG_ZSTACK_MULTICAST_ROUTER_10001": "Multicast ist bereits auf dem VPC-Router UUID[:%s] aktiviert",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "Der Eigentümer-Volume-Pfad kann aus dem internen Snapshot-Pfad[%s] nicht gefunden werden, da der reguläre Ausdruck[%s] nicht mit dem Snapshot-Pfad übereinstimmt",
Expand Down
1 change: 1 addition & 0 deletions conf/i18n/globalErrorCodeMapping/global-error-en_US.json
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,7 @@
"ORG_ZSTACK_CONFIGURATION_10006": "unsupported instance type[%s]",
"ORG_ZSTACK_MULTICAST_ROUTER_10007": "group address [%s] is not a multicast group address",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "storage is not healthy:%s",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10015": "no available backup storage with preferred types %s for primary storage[uuid:%s]",
"ORG_ZSTACK_MULTICAST_ROUTER_10000": "multicastRouter[uuid:%s] has not been associated with a VPC router",
"ORG_ZSTACK_MULTICAST_ROUTER_10001": "multicast already enabled on VPC router UUID[:%s]",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "cannot find the owning volume path from the internal snapshot path[%s], as the regex[%s] fails to match the snapshot path",
Expand Down
1 change: 1 addition & 0 deletions conf/i18n/globalErrorCodeMapping/global-error-fr-FR.json
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,7 @@
"ORG_ZSTACK_CONFIGURATION_10006": "type d'instance[%s] non supporté",
"ORG_ZSTACK_MULTICAST_ROUTER_10007": "l'adresse de groupe [%s] n'est pas une adresse de groupe multicast",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "le stockage n'est pas sain : %s",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10015": "aucun stockage de sauvegarde disponible avec les types préférés %s pour le stockage principal[uuid:%s]",
"ORG_ZSTACK_MULTICAST_ROUTER_10000": "Le multicastRouter[uuid:%s] n'a pas été associé à un routeur VPC",
"ORG_ZSTACK_MULTICAST_ROUTER_10001": "Le multicast est déjà activé sur le routeur VPC UUID[:%s]",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "Impossible de trouver le chemin du volume propriétaire à partir du chemin d'instantané interne[%s], car l'expression régulière[%s] ne correspond pas au chemin d'instantané",
Expand Down
1 change: 1 addition & 0 deletions conf/i18n/globalErrorCodeMapping/global-error-id-ID.json
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,7 @@
"ORG_ZSTACK_CONFIGURATION_10006": "jenis instance[%s] tidak didukung",
"ORG_ZSTACK_MULTICAST_ROUTER_10007": "alamat grup [%s] bukan alamat grup multicast",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "penyimpanan tidak sehat:%s",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10015": "tidak ada penyimpanan cadangan yang tersedia dengan tipe yang disukai %s untuk penyimpanan utama[uuid:%s]",
"ORG_ZSTACK_MULTICAST_ROUTER_10000": "multicastRouter[uuid:%s] belum dikaitkan dengan router VPC",
"ORG_ZSTACK_MULTICAST_ROUTER_10001": "multicast sudah diaktifkan pada router VPC UUID[:%s]",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "tidak dapat menemukan jalur volume pemilik dari jalur snapshot internal[%s], karena regex[%s] tidak cocok dengan jalur snapshot",
Expand Down
1 change: 1 addition & 0 deletions conf/i18n/globalErrorCodeMapping/global-error-ja-JP.json
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,7 @@
"ORG_ZSTACK_CONFIGURATION_10006": "サポートされていないインスタンスタイプ[%s]",
"ORG_ZSTACK_MULTICAST_ROUTER_10007": "グループアドレス[%s]はマルチキャストグループアドレスではありません",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "ストレージは正常ではありません:%s",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10015": "優先タイプ%sに一致する利用可能なバックアップストレージがプライマリストレージ[uuid:%s]に存在しません",
"ORG_ZSTACK_MULTICAST_ROUTER_10000": "マルチキャストルーター[uuid:%s]はVPCルーターに関連付けられていません",
"ORG_ZSTACK_MULTICAST_ROUTER_10001": "マルチキャストは既にVPCルーターUUID[:%s]で有効化されています",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "内部スナップショットパス[%s]から所有ボリュームパスが見つかりません。正規表現[%s]がスナップショットパスに一致しません",
Expand Down
1 change: 1 addition & 0 deletions conf/i18n/globalErrorCodeMapping/global-error-ko-KR.json
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,7 @@
"ORG_ZSTACK_CONFIGURATION_10006": "지원되지 않는 인스턴스 유형[%s]",
"ORG_ZSTACK_MULTICAST_ROUTER_10007": "그룹 주소 [%s]는 멀티캐스트 그룹 주소가 아닙니다",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "저장소가 정상 상태가 아닙니다:%s",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10015": "기본 저장소[uuid:%s]에 대해 선호하는 유형 %s의 사용 가능한 백업 저장소가 없습니다",
"ORG_ZSTACK_MULTICAST_ROUTER_10000": "multicastRouter[uuid:%s]가 VPC 라우터와 연결되지 않았습니다",
"ORG_ZSTACK_MULTICAST_ROUTER_10001": "VPC 라우터 UUID[:%s]에서 멀티캐스트가 이미 활성화되어 있습니다",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "정규식[%s]이 스냅샷 경로와 일치하지 않아 내부 스냅샷 경로[%s]에서 소유 볼륨 경로를 찾을 수 없습니다",
Expand Down
1 change: 1 addition & 0 deletions conf/i18n/globalErrorCodeMapping/global-error-ru-RU.json
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,7 @@
"ORG_ZSTACK_CONFIGURATION_10006": "неподдерживаемый тип экземпляра[%s]",
"ORG_ZSTACK_MULTICAST_ROUTER_10007": "групповой адрес [%s] не является мультикаст-групповым адресом",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "хранилище нездорово:%s",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10015": "нет доступного резервного хранилища с предпочитаемыми типами %s для первичного хранилища[uuid:%s]",
"ORG_ZSTACK_MULTICAST_ROUTER_10000": "multicastRouter[uuid:%s] не был связан с VPC-роутером",
"ORG_ZSTACK_MULTICAST_ROUTER_10001": "multicast уже включен на VPC-роутере UUID[:%s]",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "невозможно найти путь к принадлежащему тому из внутреннего пути снимка[%s], так как регулярное выражение[%s] не соответствует пути снимка",
Expand Down
1 change: 1 addition & 0 deletions conf/i18n/globalErrorCodeMapping/global-error-th-TH.json
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,7 @@
"ORG_ZSTACK_CONFIGURATION_10006": "instance type[%s] ไม่รองรับ",
"ORG_ZSTACK_MULTICAST_ROUTER_10007": "group address [%s] ไม่ใช่ multicast group address",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "storage ไม่พร้อมใช้งาน:%s",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10015": "ไม่มี backup storage ที่ใช้ได้ซึ่งมีประเภทที่ต้องการ %s สำหรับ primary storage[uuid:%s]",
"ORG_ZSTACK_MULTICAST_ROUTER_10000": "multicastRouter[uuid:%s] ไม่ได้เชื่อมโยงกับ VPC router",
"ORG_ZSTACK_MULTICAST_ROUTER_10001": "multicast เปิดใช้งานอยู่แล้วบน VPC router UUID[:%s]",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "ไม่พบ path ของ volume ที่เป็นเจ้าของจาก internal snapshot path[%s] เนื่องจาก regex[%s] ไม่สามารถจับคู่กับ snapshot path ได้",
Expand Down
1 change: 1 addition & 0 deletions conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,7 @@
"ORG_ZSTACK_CONFIGURATION_10006": "不支持的实例配置类型[%s]",
"ORG_ZSTACK_MULTICAST_ROUTER_10007": "组地址 [%s] 不是多播地址",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "存储不健康:%s",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10015": "没有可用的镜像服务器匹配首选类型 %s,主存储[uuid:%s]",
"ORG_ZSTACK_MULTICAST_ROUTER_10000": "多播路由器[uuid:%s]尚未绑定到VPC路由器",
"ORG_ZSTACK_MULTICAST_ROUTER_10001": "多播已在VPC路由器uuid[:%s]上启用",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "无法从内部快照路径[%s]找到所属卷路径,因为正则表达式[%s]与快照路径不匹配",
Expand Down
1 change: 1 addition & 0 deletions conf/i18n/globalErrorCodeMapping/global-error-zh_TW.json
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,7 @@
"ORG_ZSTACK_CONFIGURATION_10006": "不支持的实例配置類型[%s]",
"ORG_ZSTACK_MULTICAST_ROUTER_10007": "组地址 [%s] 不是多播地址",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "儲儲不健康:%s",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10015": "沒有可用的鏡像服務器匹配首選類型 %s,主儲存[uuid:%s]",
"ORG_ZSTACK_MULTICAST_ROUTER_10000": "多播路由器[uuid:%s]尚未綁定到VPC路由器",
"ORG_ZSTACK_MULTICAST_ROUTER_10001": "多播已在VPC路由器uuid[:%s]上啟用",
"ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "無法从内部快照路径[%s]找到所属卷路径,因为正则表達式[%s]与快照路径不匹配",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -510,8 +510,19 @@ private void handle(final SelectBackupStorageMsg msg) {
.param("size", msg.getRequiredSize())
.list();

// sort by prefer type
availableBs.sort(Comparator.comparingInt(o -> preferBsTypes.indexOf(o.getType())));
// filter out non-preferred types, then sort by preference order
availableBs = availableBs.stream()
.filter(bs -> preferBsTypes.contains(bs.getType()))
.sorted(Comparator.comparingInt(o -> preferBsTypes.indexOf(o.getType())))
.collect(Collectors.toList());

if (availableBs.isEmpty()) {
reply.setError(operr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10015,
"no available backup storage with preferred types %s for primary storage[uuid:%s]",
preferBsTypes, self.getUuid()));
bus.reply(msg, reply);
return;
}
Comment on lines +519 to +525
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# 验证错误码定义
rg -n "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10015" --type=java

Repository: MatheMatrix/zstack

Length of output: 422


🏁 Script executed:

#!/bin/bash
# 查看 ExternalPrimaryStorage.java 的相关代码上下文
fd "ExternalPrimaryStorage.java" --type f

Repository: MatheMatrix/zstack

Length of output: 144


🏁 Script executed:

#!/bin/bash
# 搜索 preferBsTypes 的定义和类型
rg -B 5 -A 5 "preferBsTypes" storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java

Repository: MatheMatrix/zstack

Length of output: 1664


🏁 Script executed:

#!/bin/bash
# 查找国际化配置或错误消息定义
fd -e properties -e i18n | head -20

Repository: MatheMatrix/zstack

Length of output: 1185


🏁 Script executed:

#!/bin/bash
# 搜索 operr 方法的定义,了解错误信息处理
rg -n "def operr|operr(" --type=java utils/src/main/java/org/zstack/utils/ -A 3 | head -40

Repository: MatheMatrix/zstack

Length of output: 144


🏁 Script executed:

#!/bin/bash
# 查看是否有对应 10015 错误码的 i18n 翻译
rg "10015" --type=properties

Repository: MatheMatrix/zstack

Length of output: 96


🏁 Script executed:

#!/bin/bash
# 搜索 operr 方法的定义
rg -n "operr\(" --type=java utils/src/main/java/org/zstack/utils/ -A 3 | head -40

Repository: MatheMatrix/zstack

Length of output: 44


🏁 Script executed:

#!/bin/bash
# 查找包含 10015 的 i18n 文件
rg "10015" conf/i18n/

Repository: MatheMatrix/zstack

Length of output: 50375


🏁 Script executed:

#!/bin/bash
# 查看错误码对应的国际化文本定义
rg "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10015" conf/i18n/ -A 1

Repository: MatheMatrix/zstack

Length of output: 3356


🏁 Script executed:

#!/bin/bash
# 查看相似错误码(10010)在代码和i18n中的定义,作为对比
rg "10010" conf/i18n/ -B 1 -A 1

Repository: MatheMatrix/zstack

Length of output: 50375


移除可选的格式优化建议,因其会破坏国际化一致性。

错误码 ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10015 已正确定义。然而,使用 String.join(", ", preferBsTypes) 的建议应被撤销。

虽然 String.join() 在视觉上更整洁(避免方括号),但它改变了传递给国际化系统的参数格式。i18n 文件中已定义的翻译(如中文:"匹配首选类型 %s")期望接收的是 List 的原始格式。改变参数格式将导致翻译的一致性问题,违反 ZStack 维持 i18n 兼容性的原则。保留当前实现,直接使用 preferBsTypes 作为参数。

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java`
around lines 519 - 525, The review warns not to change the parameter passed to
operr for error code ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10015: keep passing the
List preferBsTypes directly (as in the current
ExternalPrimaryStorage.reply.setError(...) call using operr) and do not replace
it with String.join(", ", preferBsTypes) or any other formatted string;
revert/remove any edits that convert preferBsTypes to a joined String so the
i18n translation receives the original List as expected.

reply.setInventory(BackupStorageInventory.valueOf(availableBs.get(0)));

bus.reply(msg, reply);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
package org.zstack.test.integration.storage.primary.addon

import org.zstack.core.Platform
import org.zstack.core.cloudbus.CloudBus
import org.zstack.core.db.DatabaseFacade
import org.zstack.core.db.SQL
import org.zstack.header.message.MessageReply
import org.zstack.header.storage.backup.BackupStorageEO
import org.zstack.header.storage.backup.BackupStorageState
import org.zstack.header.storage.backup.BackupStorageStatus
import org.zstack.header.storage.backup.BackupStorageZoneRefVO
import org.zstack.header.storage.backup.BackupStorageZoneRefVO_
import org.zstack.header.storage.primary.PrimaryStorageConstant
import org.zstack.header.storage.primary.SelectBackupStorageMsg
import org.zstack.header.storage.primary.SelectBackupStorageReply
import org.zstack.sdk.PrimaryStorageInventory
import org.zstack.sdk.ZoneInventory
import org.zstack.test.integration.storage.StorageTest
import org.zstack.testlib.EnvSpec
import org.zstack.testlib.SubCase
import org.zstack.utils.data.SizeUnit

/**
* ZSTAC-71706: ExternalPrimaryStorage backup storage selection in mixed environment.
*
* Bug: List.indexOf() returns -1 for types not in preferBsTypes,
* causing ascending sort to place non-preferred types (e.g. VCenterBackupStorage)
* before preferred types in the sorted result.
*
* Fix: Filter out non-preferred backup storage types before sorting by preference.
*
* This case sets up a ZBS ExternalPrimaryStorage (preferBsTypes = [ImageStoreBackupStorage])
* with multiple backup storage types attached to the zone, then sends SelectBackupStorageMsg
* via CloudBus to verify the handler selects the correct preferred backup storage.
*/
class ExternalPrimaryStorageSelectBackupStorageCase extends SubCase {
EnvSpec env
ZoneInventory zone
PrimaryStorageInventory ps
DatabaseFacade dbf
CloudBus bus
List<String> manualBsUuids = []

@Override
void clean() {
manualBsUuids.each { uuid ->
SQL.New(BackupStorageZoneRefVO.class)
.eq(BackupStorageZoneRefVO_.backupStorageUuid, uuid)
.hardDelete()
dbf.removeByPrimaryKey(uuid, BackupStorageEO.class)
}
env.delete()
}

@Override
void setup() {
useSpring(StorageTest.springSpec)
}

@Override
void environment() {
env = makeEnv {
sftpBackupStorage {
name = "sftp"
url = "/sftp"
username = "root"
password = "password"
hostname = "127.0.0.2"

image {
name = "image"
url = "http://zstack.org/download/test.qcow2"
size = SizeUnit.GIGABYTE.toByte(1)
virtio = true
}
}

zone {
name = "zone"
description = "test"

cluster {
name = "cluster"
hypervisorType = "KVM"

kvm {
name = "kvm"
managementIp = "127.0.0.1"
username = "root"
password = "password"
}

attachL2Network("l2")
}

l2NoVlanNetwork {
name = "l2"
physicalInterface = "eth0"

l3Network {
name = "l3"

ip {
startIp = "192.168.100.10"
endIp = "192.168.100.100"
netmask = "255.255.255.0"
gateway = "192.168.100.1"
}
}
}

externalPrimaryStorage {
name = "zbs-ps"
identity = "zbs"
defaultOutputProtocol = "CBD"
config = '{"mdsUrls":["root:password@127.0.1.1","root:password@127.0.1.2","root:password@127.0.1.3"],"logicalPoolName":"lpool1"}'
url = "zbs"
}

attachBackupStorage("sftp")
}
}
}

@Override
void test() {
env.create {
zone = env.inventoryByName("zone") as ZoneInventory
ps = env.inventoryByName("zbs-ps") as PrimaryStorageInventory
dbf = bean(DatabaseFacade.class)
bus = bean(CloudBus.class)

testErrorWhenNoPreferredTypeAvailable()
testSelectPreferredOverNonPreferred()
}
}

/**
* When only non-preferred backup storage types exist in the zone,
* the selection should return an error (no matching preferred types).
* Zone has SftpBackupStorage (from env) and VCenterBackupStorage,
* neither of which is in zbs's preferBsTypes [ImageStoreBackupStorage].
*/
void testErrorWhenNoPreferredTypeAvailable() {
createAndAttachBackupStorage("vcenter-bs", "VCenterBackupStorage")

SelectBackupStorageMsg msg = new SelectBackupStorageMsg()
msg.setPrimaryStorageUuid(ps.uuid)
msg.setRequiredSize(SizeUnit.MEGABYTE.toByte(1))
bus.makeTargetServiceIdByResourceUuid(msg, PrimaryStorageConstant.SERVICE_ID, ps.uuid)
MessageReply reply = bus.call(msg)

assert !reply.isSuccess() : "Should fail when no preferred BS type is available"
}

/**
* Reproduces ZSTAC-71706: zone has both ImageStoreBackupStorage (preferred)
* and VCenterBackupStorage (non-preferred, created in previous test).
* Before the fix, indexOf() returns -1 for VCenterBackupStorage causing
* it to sort before ImageStoreBackupStorage. After the fix, non-preferred
* types are filtered out entirely, and ImageStoreBackupStorage is correctly selected.
*/
void testSelectPreferredOverNonPreferred() {
createAndAttachBackupStorage("imagestore-bs", "ImageStoreBackupStorage")

SelectBackupStorageMsg msg = new SelectBackupStorageMsg()
msg.setPrimaryStorageUuid(ps.uuid)
msg.setRequiredSize(SizeUnit.MEGABYTE.toByte(1))
bus.makeTargetServiceIdByResourceUuid(msg, PrimaryStorageConstant.SERVICE_ID, ps.uuid)
MessageReply reply = bus.call(msg)

assert reply.isSuccess() : "SelectBackupStorageMsg should succeed"
SelectBackupStorageReply bsReply = reply as SelectBackupStorageReply
assert bsReply.inventory != null
assert bsReply.inventory.type == "ImageStoreBackupStorage" :
"Should select preferred ImageStoreBackupStorage, but got ${bsReply.inventory.type}"
}

private void createAndAttachBackupStorage(String name, String type) {
String uuid = Platform.getUuid()

def bsEo = new BackupStorageEO()
bsEo.setUuid(uuid)
bsEo.setName(name)
bsEo.setType(type)
bsEo.setState(BackupStorageState.Enabled)
bsEo.setStatus(BackupStorageStatus.Connected)
bsEo.setTotalCapacity(SizeUnit.TERABYTE.toByte(100))
bsEo.setAvailableCapacity(SizeUnit.TERABYTE.toByte(100))
bsEo.setUrl("http://test-" + name)
dbf.persist(bsEo)

def ref = new BackupStorageZoneRefVO()
ref.setBackupStorageUuid(uuid)
ref.setZoneUuid(zone.uuid)
dbf.persist(ref)

manualBsUuids.add(uuid)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6506,6 +6506,8 @@ public class CloudOperationsErrorCode {

public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014";

public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10015 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10015";

public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10040 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10040";

public static final String ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10000 = "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10000";
Expand Down