diff --git a/conf/db/upgrade/V5.5.18__schema.sql b/conf/db/upgrade/V5.5.18__schema.sql index 84d643113a4..1a039f50af9 100644 --- a/conf/db/upgrade/V5.5.18__schema.sql +++ b/conf/db/upgrade/V5.5.18__schema.sql @@ -15,8 +15,9 @@ CREATE TABLE IF NOT EXISTS `L2GeneveNetworkVO` ( CREATE TABLE IF NOT EXISTS `ZnsTransportZoneVO` ( `uuid` varchar(32) NOT NULL, + `znsResourceUuid` varchar(64) NOT NULL, `name` varchar(255) DEFAULT NULL, - `description` varchar(2048) DEFAULT NULL, + `description` text DEFAULT NULL, `type` varchar(64) DEFAULT NULL, `physicalNetwork` varchar(255) DEFAULT NULL, `status` varchar(64) DEFAULT NULL, @@ -26,6 +27,38 @@ CREATE TABLE IF NOT EXISTS `ZnsTransportZoneVO` ( `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`uuid`), + UNIQUE KEY `uk_zns_tz_resource` (`znsSdnControllerUuid`, `znsResourceUuid`), CONSTRAINT `fkZnsTransportZoneVOSdnControllerVO` FOREIGN KEY (`znsSdnControllerUuid`) REFERENCES `SdnControllerVO` (`uuid`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ZNS Wave 2: Tenant/TenantRouter resource modeling (ZCF-2133) + +CREATE TABLE IF NOT EXISTS `ZnsTenantVO` ( + `uuid` VARCHAR(32) NOT NULL, + `sdnControllerUuid` VARCHAR(32) NOT NULL, + `znsResourceUuid` VARCHAR(64) NOT NULL, + `name` VARCHAR(255) NOT NULL, + `description` TEXT DEFAULT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`), + UNIQUE KEY `uk_zns_tenant_resource` (`sdnControllerUuid`, `znsResourceUuid`), + CONSTRAINT `fk_zns_tenant_sdn` FOREIGN KEY (`sdnControllerUuid`) REFERENCES `SdnControllerVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `ZnsTenantRouterVO` ( + `uuid` VARCHAR(32) NOT NULL, + `sdnControllerUuid` VARCHAR(32) NOT NULL, + `tenantUuid` VARCHAR(32) DEFAULT NULL, + `znsResourceUuid` VARCHAR(64) NOT NULL, + `name` VARCHAR(255) NOT NULL, + `description` TEXT DEFAULT NULL, + `state` VARCHAR(32) DEFAULT NULL COMMENT 'Active / Inactive', + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`), + UNIQUE KEY `uk_zns_tr_resource` (`sdnControllerUuid`, `znsResourceUuid`), + KEY `idx_zns_tr_tenant` (`tenantUuid`), + CONSTRAINT `fk_zns_tr_tenant` FOREIGN KEY (`tenantUuid`) REFERENCES `ZnsTenantVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventory.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventory.java index 9f364f79136..af19d2ee8cb 100644 --- a/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventory.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventory.java @@ -1,6 +1,7 @@ package org.zstack.header.network.sdncontroller; import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.log.NoLogging; import org.zstack.header.search.Inventory; import java.io.Serializable; @@ -19,6 +20,7 @@ public class SdnControllerInventory implements Serializable { private String description; private String ip; private String username; + @NoLogging private String password; private SdnControllerStatus status; private List hostRefs; diff --git a/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerStatus.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerStatus.java index 5bc0c7ebda0..babd6c060c0 100644 --- a/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerStatus.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerStatus.java @@ -3,5 +3,9 @@ public enum SdnControllerStatus { Connecting, Connected, - Disconnected + Disconnected, + /** ZNS-specific: wizard-init-sync is in progress */ + Syncing, + /** ZNS-specific: wizard-init-sync completed successfully */ + Ready } diff --git a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java index 3461a991cb7..105d863f46b 100755 --- a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java +++ b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java @@ -553,6 +553,7 @@ private void handle(APICreateL3NetworkMsg msg) { vo.setIpVersion(IPv6Constants.IPv4); } vo.setInternalId((int)dbf.generateSequenceNumber(L3NetworkSequenceNumberVO.class)); + vo.setType(msg.getType() != null ? msg.getType() : L3NetworkConstant.L3_BASIC_NETWORK_TYPE); FlowChain fchain = new SimpleFlowChain(); fchain.setName(String.format("create-l3-network-%s", vo.getUuid())); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java index 5fb9ea1c368..e06ad12d895 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java @@ -154,6 +154,8 @@ public void run(SyncTaskChain chain) { flowChain.getData().put(SDN_CONTROLLER_UUID, self.getUuid()); flowChain.setName(String.format("sync-sdn-controller-data-%s-%s", self.getUuid(), self.getName())); + // allowEmptyFlow: vendors may not provide sync flows; treat empty chain as success + flowChain.allowEmptyFlow(); // Start the chain; flows in factory-provided chain should perform data sync operations flowChain.done(new FlowDoneHandler(msg) { @Override diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java index a959dee3005..9fb54d5649e 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java @@ -53,10 +53,22 @@ public String getResourceName() { @Override public NeedReplyMessage getPingMessage(String resUuid) { SdnControllerVO vo = dbf.findByUuid(resUuid, SdnControllerVO.class); + if (vo == null) { + logger.warn(String.format("SDN controller[uuid:%s] has been deleted, skip ping sending", resUuid)); + untrack(resUuid); + return null; + } if (vo.getStatus() == SdnControllerStatus.Connecting) { return null; } + // ZNS controllers are externally-managed (state machine driven by ZNS push notifications). + // Syncing and Ready are ZNS-specific states; Cloud must NOT ping them autonomously. + if (vo.getStatus() == SdnControllerStatus.Syncing + || vo.getStatus() == SdnControllerStatus.Ready) { + return null; + } + SdnControllerPingMsg msg = new SdnControllerPingMsg(); msg.setSdnControllerUuid(resUuid); bus.makeTargetServiceIdByResourceUuid(msg, SdnControllerConstant.SERVICE_ID, resUuid); @@ -81,6 +93,11 @@ public void handleReply(final String resourceUuid, MessageReply reply) { return; } + // ZNS controllers (Syncing/Ready) are externally-managed; skip autonomous status changes. + if (vo.getStatus() == SdnControllerStatus.Syncing + || vo.getStatus() == SdnControllerStatus.Ready) { + return; + } if (!reply.isSuccess()) { logger.warn(String.format("[SDN Ping Tracker]: unable to ping the sdn controller[uuid: %s], %s", resourceUuid, reply.getError())); diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 6a739cd6dfb..a72c978b2dc 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -611,6 +611,8 @@ public class SourceClassMap { put("org.zstack.network.service.virtualrouter.VirtualRouterVmInventory", "org.zstack.sdk.VirtualRouterVmInventory"); put("org.zstack.network.zns.L2GeneveNetworkInventory", "org.zstack.sdk.network.zns.L2GeneveNetworkInventory"); put("org.zstack.network.zns.ZnsControllerInventory", "org.zstack.sdk.network.zns.ZnsControllerInventory"); + put("org.zstack.network.zns.ZnsTenantInventory", "org.zstack.sdk.network.zns.ZnsTenantInventory"); + put("org.zstack.network.zns.ZnsTenantRouterInventory", "org.zstack.sdk.network.zns.ZnsTenantRouterInventory"); put("org.zstack.network.zns.ZnsTransportZoneInventory", "org.zstack.sdk.network.zns.ZnsTransportZoneInventory"); put("org.zstack.observabilityServer.ObservabilityServerOfferingInventory", "org.zstack.sdk.ObservabilityServerOfferingInventory"); put("org.zstack.observabilityServer.ObservabilityServerVmInventory", "org.zstack.sdk.ObservabilityServerVmInventory"); @@ -1693,6 +1695,8 @@ public class SourceClassMap { put("org.zstack.sdk.license.header.server.TotalLicenseAuthorizedCapacityView", "org.zstack.license.header.server.TotalLicenseAuthorizedCapacityView"); put("org.zstack.sdk.network.zns.L2GeneveNetworkInventory", "org.zstack.network.zns.L2GeneveNetworkInventory"); put("org.zstack.sdk.network.zns.ZnsControllerInventory", "org.zstack.network.zns.ZnsControllerInventory"); + put("org.zstack.sdk.network.zns.ZnsTenantInventory", "org.zstack.network.zns.ZnsTenantInventory"); + put("org.zstack.sdk.network.zns.ZnsTenantRouterInventory", "org.zstack.network.zns.ZnsTenantRouterInventory"); put("org.zstack.sdk.network.zns.ZnsTransportZoneInventory", "org.zstack.network.zns.ZnsTransportZoneInventory"); put("org.zstack.sdk.sns.SNSAliyunSmsEndpointInventory", "org.zstack.sns.SNSAliyunSmsEndpointInventory"); put("org.zstack.sdk.sns.SNSApplicationEndpointInventory", "org.zstack.sns.SNSApplicationEndpointInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerStatus.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerStatus.java index 1e9e6f92289..626a26b0f35 100644 --- a/sdk/src/main/java/org/zstack/sdk/SdnControllerStatus.java +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerStatus.java @@ -4,4 +4,6 @@ public enum SdnControllerStatus { Connecting, Connected, Disconnected, + Syncing, + Ready, } diff --git a/sdk/src/main/java/org/zstack/sdk/network/zns/QueryZnsTenantAction.java b/sdk/src/main/java/org/zstack/sdk/network/zns/QueryZnsTenantAction.java new file mode 100644 index 00000000000..3637f519a88 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/network/zns/QueryZnsTenantAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk.network.zns; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryZnsTenantAction 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.network.zns.QueryZnsTenantResult 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.network.zns.QueryZnsTenantResult value = res.getResult(org.zstack.sdk.network.zns.QueryZnsTenantResult.class); + ret.value = value == null ? new org.zstack.sdk.network.zns.QueryZnsTenantResult() : 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 = "/sdn-controller/zns/tenants"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/network/zns/QueryZnsTenantResult.java b/sdk/src/main/java/org/zstack/sdk/network/zns/QueryZnsTenantResult.java new file mode 100644 index 00000000000..3f33998de12 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/network/zns/QueryZnsTenantResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.network.zns; + + + +public class QueryZnsTenantResult { + 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/network/zns/QueryZnsTenantRouterAction.java b/sdk/src/main/java/org/zstack/sdk/network/zns/QueryZnsTenantRouterAction.java new file mode 100644 index 00000000000..6145c60fc01 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/network/zns/QueryZnsTenantRouterAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk.network.zns; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryZnsTenantRouterAction 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.network.zns.QueryZnsTenantRouterResult 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.network.zns.QueryZnsTenantRouterResult value = res.getResult(org.zstack.sdk.network.zns.QueryZnsTenantRouterResult.class); + ret.value = value == null ? new org.zstack.sdk.network.zns.QueryZnsTenantRouterResult() : 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 = "/sdn-controller/zns/tenant-routers"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/network/zns/QueryZnsTenantRouterResult.java b/sdk/src/main/java/org/zstack/sdk/network/zns/QueryZnsTenantRouterResult.java new file mode 100644 index 00000000000..d9981b90e35 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/network/zns/QueryZnsTenantRouterResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.network.zns; + + + +public class QueryZnsTenantRouterResult { + 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/network/zns/ZnsTenantInventory.java b/sdk/src/main/java/org/zstack/sdk/network/zns/ZnsTenantInventory.java new file mode 100644 index 00000000000..def84d31247 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/network/zns/ZnsTenantInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk.network.zns; + + + +public class ZnsTenantInventory { + + 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 sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + public java.lang.String znsResourceUuid; + public void setZnsResourceUuid(java.lang.String znsResourceUuid) { + this.znsResourceUuid = znsResourceUuid; + } + public java.lang.String getZnsResourceUuid() { + return this.znsResourceUuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + 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/network/zns/ZnsTenantRouterInventory.java b/sdk/src/main/java/org/zstack/sdk/network/zns/ZnsTenantRouterInventory.java new file mode 100644 index 00000000000..a4624e92320 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/network/zns/ZnsTenantRouterInventory.java @@ -0,0 +1,79 @@ +package org.zstack.sdk.network.zns; + + + +public class ZnsTenantRouterInventory { + + 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 sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + public java.lang.String tenantUuid; + public void setTenantUuid(java.lang.String tenantUuid) { + this.tenantUuid = tenantUuid; + } + public java.lang.String getTenantUuid() { + return this.tenantUuid; + } + + public java.lang.String znsResourceUuid; + public void setZnsResourceUuid(java.lang.String znsResourceUuid) { + this.znsResourceUuid = znsResourceUuid; + } + public java.lang.String getZnsResourceUuid() { + return this.znsResourceUuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String state; + public void setState(java.lang.String state) { + this.state = state; + } + public java.lang.String getState() { + return this.state; + } + + 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/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index abc7125ca81..f86e1f39126 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -26962,26 +26962,27 @@ abstract class ApiHelper { } } + def getVpcVRouterSnatLogState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcVRouterSnatLogStateAction.class) Closure c) { def a = new org.zstack.sdk.GetVpcVRouterSnatLogStateAction() 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()) @@ -40918,26 +40919,27 @@ abstract class ApiHelper { } } + def setVpcVRouterSnatLogState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVpcVRouterSnatLogStateAction.class) Closure c) { def a = new org.zstack.sdk.SetVpcVRouterSnatLogStateAction() 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()) @@ -52242,6 +52244,64 @@ abstract class ApiHelper { } + def queryZnsTenant(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.network.zns.QueryZnsTenantAction.class) Closure c) { + def a = new org.zstack.sdk.network.zns.QueryZnsTenantAction() + 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 queryZnsTenantRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.network.zns.QueryZnsTenantRouterAction.class) Closure c) { + def a = new org.zstack.sdk.network.zns.QueryZnsTenantRouterAction() + 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 addSNSSmsReceiver(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.sns.AddSNSSmsReceiverAction.class) Closure c) { def a = new org.zstack.sdk.sns.AddSNSSmsReceiverAction() 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 b829dcd1d51..9a757d8051f 100644 --- a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java +++ b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java @@ -12033,8 +12033,8 @@ public class CloudOperationsErrorCode { // ZNS DHCP // 10020 ZNS DHCP enable/check failed due to invalid L3/segment state - // 10021 reserved - // 10022 reserved + // 10021 ZNS compute manager not found on controller + // 10022 ZNS reconnect: compute manager UUID missing // 10023 reserved // 10024 unsupported legacy SdnControllerDhcp path for ZNS L3 public static final String ORG_ZSTACK_NETWORK_ZNS_10020 = "ORG_ZSTACK_NETWORK_ZNS_10020"; @@ -12043,6 +12043,28 @@ public class CloudOperationsErrorCode { public static final String ORG_ZSTACK_NETWORK_ZNS_10023 = "ORG_ZSTACK_NETWORK_ZNS_10023"; public static final String ORG_ZSTACK_NETWORK_ZNS_10024 = "ORG_ZSTACK_NETWORK_ZNS_10024"; + // ZNS Wave 4 operation error codes + // 10025 ZNS create segment failed + // 10026 ZNS patch segment failed (e.g. CIDR/gateway sync) + // 10027 ZNS attach router to segment failed + // 10028 ZNS detach router from segment failed + // 10029 ZNS patch DHCP config on segment failed + // 10030 ZNS patch segment MTU failed + // 10031 duplicate IpRange ip_version on same ZNS L3 network + // 10032 ZNS L2 has sub-resources, cannot delete + // 10033 ZNS VPC L3 missing znsTenantRouterUuid system tag + public static final String ORG_ZSTACK_NETWORK_ZNS_10025 = "ORG_ZSTACK_NETWORK_ZNS_10025"; + public static final String ORG_ZSTACK_NETWORK_ZNS_10026 = "ORG_ZSTACK_NETWORK_ZNS_10026"; + public static final String ORG_ZSTACK_NETWORK_ZNS_10027 = "ORG_ZSTACK_NETWORK_ZNS_10027"; + public static final String ORG_ZSTACK_NETWORK_ZNS_10028 = "ORG_ZSTACK_NETWORK_ZNS_10028"; + public static final String ORG_ZSTACK_NETWORK_ZNS_10029 = "ORG_ZSTACK_NETWORK_ZNS_10029"; + public static final String ORG_ZSTACK_NETWORK_ZNS_10030 = "ORG_ZSTACK_NETWORK_ZNS_10030"; + public static final String ORG_ZSTACK_NETWORK_ZNS_10031 = "ORG_ZSTACK_NETWORK_ZNS_10031"; + public static final String ORG_ZSTACK_NETWORK_ZNS_10032 = "ORG_ZSTACK_NETWORK_ZNS_10032"; + public static final String ORG_ZSTACK_NETWORK_ZNS_10033 = "ORG_ZSTACK_NETWORK_ZNS_10033"; + // 10034 ZNS API returned HTTP 409 Conflict (sub-resources still exist) + public static final String ORG_ZSTACK_NETWORK_ZNS_10034 = "ORG_ZSTACK_NETWORK_ZNS_10034"; + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_MARKETPLACE_10000 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_MARKETPLACE_10000"; public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_IMAGESTORE_10000 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_IMAGESTORE_10000";