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
35 changes: 34 additions & 1 deletion conf/db/upgrade/V5.5.18__schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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;
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<SdnControllerHostRefInventory> hostRefs;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -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()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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()));
Expand Down
4 changes: 4 additions & 0 deletions sdk/src/main/java/SourceClassMap.java
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down Expand Up @@ -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");
Expand Down
2 changes: 2 additions & 0 deletions sdk/src/main/java/org/zstack/sdk/SdnControllerStatus.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@ public enum SdnControllerStatus {
Connecting,
Connected,
Disconnected,
Syncing,
Ready,
}
Original file line number Diff line number Diff line change
@@ -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<String, Parameter> parameterMap = new HashMap<>();

private static final HashMap<String, Parameter> 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<Result> completion) {
ZSClient.call(this, new InternalCompletion() {
@Override
public void complete(ApiResult res) {
completion.complete(makeResult(res));
}
});
}

protected Map<String, Parameter> getParameterMap() {
return parameterMap;
}

protected Map<String, Parameter> 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;
}

}
Original file line number Diff line number Diff line change
@@ -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;
}

}
Original file line number Diff line number Diff line change
@@ -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<String, Parameter> parameterMap = new HashMap<>();

private static final HashMap<String, Parameter> 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<Result> completion) {
ZSClient.call(this, new InternalCompletion() {
@Override
public void complete(ApiResult res) {
completion.complete(makeResult(res));
}
});
}

protected Map<String, Parameter> getParameterMap() {
return parameterMap;
}

protected Map<String, Parameter> 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;
}

}
Original file line number Diff line number Diff line change
@@ -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;
}

}
Loading