Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
8070464
<feature>[dpu-bm2]: support attaching novlan and vxlan network to bar…
Mar 23, 2026
1f69b47
<feature>[kvm]: user vm mount model
Mar 26, 2026
d913f84
<fix>[conf]: add errorcode and sql
Mar 29, 2026
80ddd20
<fix>[aios]: add i18n mapping for fatal image pull error
Apr 20, 2026
3936530
<fix>[conf]: Add ORG_ZSTACK_AI_10158 error code"
Mar 31, 2026
b217181
Merge branch 'fix/ZSTAC-83881@@2' into '5.5.16'
Apr 21, 2026
38fc186
<fix>[flatNetworkProvider]: keep userdata immutable
AlanJager Apr 21, 2026
3696498
<fix>[sdk,db]: add PodInventory request fields
Apr 21, 2026
a26f6ee
Merge branch 'feature-dpu-baremetal@@2' into '5.5.16'
Apr 21, 2026
c8d25fd
Merge branch 'fix/5.5.16-revert-userdata' into '5.5.16'
Apr 22, 2026
2697ef2
<fix>[kvm]: unify TLS cert IP collection to avoid reconnect-triggered…
huhu0316 Apr 21, 2026
c096635
Merge branch 'fix/ZSTAC-84446' into '5.5.16'
Apr 23, 2026
16950d3
<fix>[sdk]: sync OSPF neighbor adjacency fields
ruansteve Apr 27, 2026
52b4749
Merge branch 'fix/ZSTAC-84175-TIPS-@@2' into '5.5.16'
AlanJager Apr 27, 2026
e6cdf84
Merge branch 'fixbug/ZSTAC-80103@@2' into '5.5.16'
AlanJager Apr 27, 2026
51086ae
<fix>[conf]: fix ai error-code 10138-10144 collisions and add 10159-1…
Abortbeen Apr 24, 2026
e693653
Merge branch 'shixin.ruan-ZSTAC-84571@@2' into '5.5.16'
Apr 27, 2026
ad8a4c5
<fix>[kvm]: decouple TLS cert detection from libvirtd restart toggle
huhu0316 Apr 27, 2026
ce7b222
Merge branch 'fix/ZSTAC-84677@@2' into '5.5.16'
Apr 27, 2026
1bc1ded
Merge branch 'fix/ZSTAC-84446-reopen' into '5.5.16'
Apr 28, 2026
c5011ac
<fix>[portforwarding]: skip detach when serviceUuids is empty
ruansteve Apr 27, 2026
83b68d0
Merge branch 'shixin-ZSTAC-84748@@2' into '5.5.16'
Apr 28, 2026
f8e039a
<fix>[primaryStorage]: validate ExternalPrimaryStorage config JSON at…
MaJin1996 Apr 28, 2026
f98a027
<fix>[allocator]: thread HostAllocationPurpose through allocator path
Apr 28, 2026
3b7611c
Merge branch 'fix/ZSTAC-84817' into '5.5.16'
Apr 28, 2026
120bd51
Merge branch 'fix_84839@@2' into '5.5.16'
AlanJager Apr 29, 2026
a544065
<fix>[kvm]: exclude br_conn_all_ns IP from TLS cert SAN
huhu0316 Apr 29, 2026
3330ffa
Merge branch 'fix/ZSTAC-84446-reopen' into '5.5.16'
Apr 29, 2026
18b0d53
bump version to 5.5.22
May 2, 2026
fe02151
<feature>[ai]: schema add ModelVO.pipelineTag/manifestJson and ModelS…
AlanJager Apr 27, 2026
0311282
<feature>[ai]: sdk AutoMatchModelServiceByModel action and UpdateMode…
AlanJager Apr 27, 2026
4b352ab
<chore>[ai]: regenerate ApiHelper.groovy with autoMatchModelServiceBy…
AlanJager Apr 27, 2026
23cb764
<chore>[sdk]: Update all sdks
AlanJager May 7, 2026
165548d
<fix>[ai]: make schema strict-mode safe
AlanJager May 7, 2026
1b617a7
<fix>[ai]: avoid second timestamp default
AlanJager May 7, 2026
621c295
<fix>[ai]: drop redundant isDefault backfill
AlanJager May 7, 2026
1418759
Merge branch 'feat/ZSTAC-84025-auto-match@@2' into '5.5.22'
May 7, 2026
96fe476
<feature>[utils]: Network group high availability strategy
Ezreal-07 Feb 4, 2026
4eaa430
<fix>[xinfini]: fail blacklist to prevent split-brain on VM start
PandaWuu May 1, 2026
bb28dd0
<feature>[sdk]: regenerate SDK for RegexAgainst/NotEqual operators
May 9, 2026
241fb89
Merge branch 'cherry-pick-024c4452' into '5.5.22'
May 10, 2026
c202c84
Merge branch 'ZSTAC-84454@@2' into '5.5.22'
May 11, 2026
bf86016
<fix>[kvm]: skip known systemd timeout on reconnect
May 11, 2026
401874c
Merge branch 'shixin.ruan-ZSTAC-77120' into '5.5.22'
May 12, 2026
ff13481
<feature>[conf]: recover stale mariadb socket
May 11, 2026
6a440b8
<fix>[virtualRouter]: skip grayscale upgrade check on auto reconnect …
bustezero May 12, 2026
29e7dc6
Merge branch 'fv-81413@@3' into '5.5.22'
May 12, 2026
b6044a6
Merge branch 'shixin-ZSTAC-83507' into '5.5.22'
May 12, 2026
f1810bf
Merge branch 'fix-79075@@2' into '5.5.22'
May 13, 2026
5f2afee
<fix>[ai]: persist mount restore epoch schema
AlanJager May 13, 2026
6007871
<fix>[compute]: avoid stale iso detach NPE
May 13, 2026
57a496a
Merge branch 'fix/ZSTAC-84246-5522@@2' into '5.5.22'
May 13, 2026
4cdaed7
Merge branch 'fix/ZSTAC-84919-vm-detach-iso' into '5.5.22'
May 14, 2026
12fa09a
<fix>[ai]: keep 5.5.16 schema unchanged
AlanJager May 15, 2026
8ac6344
Merge branch 'fix/ZSTAC-84246-schema-5522' into '5.5.22'
AlanJager May 15, 2026
7bbc774
<fix>[loadBalancer]: support disabling UDP listener health check
Ezreal-07 May 14, 2026
39c155a
Merge branch 'fix-85167@@2' into '5.5.22'
PandaWuu May 15, 2026
2e9bf4a
<fix>[zbs]: ensure heartbeat before host check
May 14, 2026
3cffcd3
<fix>[utils]: SshShell add ssh client timeouts
MaJin1996 May 14, 2026
8a4e9aa
Merge branch 'fix/5.5.22/ZSTAC-79201' into '5.5.22'
May 15, 2026
6cc8ffb
Merge branch 'fix/ZSTAC-72837' into '5.5.22'
May 15, 2026
2920db2
<feature>[zns]: squash zcf changes to 5.5.22
ruansteve May 16, 2026
0848933
<feature>[iam2]: add ZIAM provider name constant (P1)
liang-hanyu Apr 24, 2026
1144366
<refactor>[iam2]: add ZIAM_DEFAULT_SCOPE constant
liang-hanyu Apr 24, 2026
f34f0b5
<fix>[sdk]: fix Go SDK generator for Delete-via-POST and Get patterns
liang-hanyu Mar 9, 2026
c928b03
<fix>[rest]: port Go SDK generator bug fixes from ZSV-11399
AlanJager Mar 27, 2026
abc1ece
<fix>[rest]: GoInventory.reset() must clear all instance caches
AlanJager Mar 27, 2026
64805eb
<fix>[sdk]: fix Go SDK POST path generation
liang-hanyu May 9, 2026
8f432a4
<fix>[identity]: keep login user type in session
liang-hanyu May 11, 2026
39bfd0b
<fix>[sdk]: add context import for Go SDK actions
liang-hanyu May 11, 2026
995fff9
<fix>[sdk]: pass context to async Go SDK calls
liang-hanyu May 11, 2026
7f37922
<fix>[sdnController]: move ZNS API config
liang-hanyu May 13, 2026
2cfc651
<fix>[zcf]: fix cherry-pick whitespace
ruansteve May 16, 2026
5171999
<fix>[zns]: address review comments
ruansteve May 16, 2026
0a307e7
<fix>[zns]: address review notes
May 16, 2026
1013db3
<fix>[compute]: avoid duplicate tag cleanup
May 16, 2026
34ffd7c
<fix>[compute]: preserve local nic cleanup
May 17, 2026
315dabe
<fix>[sdk]: update source class map
May 17, 2026
27513a5
Merge branch 'shixin-ZCF-1936@@3' into '5.5.22'
ruansteve May 17, 2026
e009499
<fix>[snapshot]: ZSTAC-61889 handle late snapshot success
May 17, 2026
8ffea20
<feature>[license]: support license lsclient
liang-hanyu May 16, 2026
5e88688
<test>[case]: stabilize integration cases
liang-hanyu May 16, 2026
d2fe302
Merge branch '3300@@2' into '5.5.22'
ruansteve May 17, 2026
d75e924
Merge branch 'fix/5.5.22/ZSTAC-61889' into '5.5.22'
May 17, 2026
5818d95
<fix>[network]: rollback failed service attach
May 17, 2026
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
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
MAJOR=5
MINOR=5
UPDATE=16
UPDATE=22
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,7 @@ public interface OAuth2PluginConstants {
String ZF_PROVIDER_NAME = "zf";
String ALI_PROVIDER_NAME = "ali_idaas_private";
String MAX_KEY_PROVIDER_NAME = "max_key";
String ZIAM_PROVIDER_NAME = "ziam";
String LOGIN_TYPE_IAM2_ROPC = "iam2_ropc";
String ZIAM_DEFAULT_SCOPE = "openid profile email";
}
5 changes: 5 additions & 0 deletions build/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -636,6 +636,11 @@
<artifactId>ovn</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.zstack</groupId>
<artifactId>zns</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.zstack</groupId>
<artifactId>observabilityServer</artifactId>
Expand Down
15 changes: 15 additions & 0 deletions compute/src/main/java/org/zstack/compute/host/HostTrackImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public class HostTrackImpl implements HostTracker, ManagementNodeChangeListener,
private final static CLogger logger = Utils.getLogger(HostTrackImpl.class);

private Map<String, Tracker> trackers = new ConcurrentHashMap<>();
private volatile boolean stopped;
private static boolean alwaysStartRightNow = false;
private static final Cache<String, Long> skippedPingHostDeadline = CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.HOURS).build();

Expand Down Expand Up @@ -251,6 +252,11 @@ public void cancel() {


public void trackHost(String hostUuid) {
if (stopped) {
logger.debug(String.format("skip tracking host[uuid:%s], host tracker is stopped", hostUuid));
return;
}

if (!destMaker.isManagedByUs(hostUuid)) {
logger.debug(String.format("skip tracking host[uuid:%s], not managed by us", hostUuid));
return;
Expand Down Expand Up @@ -285,6 +291,11 @@ public void untrackHost(String huuid) {

@Override
public void trackHost(Collection<String> huuids) {
if (stopped) {
logger.debug(String.format("skip tracking hosts%s, host tracker is stopped", huuids));
return;
}

huuids.forEach(this::trackHost);
}

Expand Down Expand Up @@ -353,6 +364,7 @@ private HostReconnectTaskFactory getHostReconnectTaskFactory(String hvType) {

@Override
public boolean start() {
stopped = false;
populateExtensions();
onHostStatusChange();
onHostPingSkip();
Expand Down Expand Up @@ -421,6 +433,9 @@ protected void run(Map tokens, Object data) {

@Override
public boolean stop() {
stopped = true;
new HashSet<>(trackers.values()).forEach(Tracker::cancel);
trackers.clear();
return true;
}
}
238 changes: 155 additions & 83 deletions compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java

Large diffs are not rendered by default.

131 changes: 131 additions & 0 deletions compute/src/main/java/org/zstack/compute/vm/VmAllocateSdnNicFlow.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
package org.zstack.compute.vm;

import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.zstack.core.asyncbatch.While;
import org.zstack.core.componentloader.PluginRegistry;
import org.zstack.header.core.Completion;
import org.zstack.header.core.WhileDoneCompletion;
import org.zstack.header.core.workflow.Flow;
import org.zstack.header.core.workflow.FlowRollback;
import org.zstack.header.core.workflow.FlowTrigger;
import org.zstack.header.errorcode.ErrorCode;
import org.zstack.header.errorcode.ErrorCodeList;
import org.zstack.header.network.l3.UsedIpInventory;
import org.zstack.header.network.sdncontroller.SdnControllerConstant;
import org.zstack.header.vm.*;
import org.zstack.utils.Utils;
import org.zstack.utils.logging.CLogger;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import static org.zstack.core.progress.ProgressReportService.taskProgress;

/**
* Placed after VmAllocateNicIpFlow in the flow chain.
*
* For each NIC belonging to an SDN-managed L2 network, this flow delegates
* to the registered {@link AfterAllocateSdnNicExtensionPoint} implementations
* (typically {@code SdnControllerManagerImpl}) which:
*
* - OVN: calls addLogicalPorts() with already-allocated IPs
* - ZNS: calls createSegmentPort(), receives IP back from ZNS, writes to DB
* - H3C/Sugon: default no-op
*
* Non-SDN NICs are skipped by the extension implementation internally.
*/
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE)
public class VmAllocateSdnNicFlow implements Flow {
private static final CLogger logger = Utils.getLogger(VmAllocateSdnNicFlow.class);

@Autowired
private PluginRegistry pluginRgty;

@Override
public void run(final FlowTrigger trigger, final Map data) {
taskProgress("create SDN ports for nics");

final VmInstanceSpec spec = (VmInstanceSpec) data.get(VmInstanceConstant.Params.VmInstanceSpec.toString());
final List<VmNicInventory> nics = spec.getDestNics();
List<UsedIpInventory> allocatedIpsOnStart = (List<UsedIpInventory>) data.get(VmAllocateNicForStartingVmFlow.class);
if (allocatedIpsOnStart != null) {
spec.putExtensionData(SdnControllerConstant.ALLOCATED_IPS_ON_START, allocatedIpsOnStart.stream()
.map(UsedIpInventory::getVmNicUuid)
.collect(Collectors.toList()));
}

if (nics == null || nics.isEmpty()) {
trigger.next();
return;
}

List<AfterAllocateSdnNicExtensionPoint> exts =
pluginRgty.getExtensionList(AfterAllocateSdnNicExtensionPoint.class);
if (exts.isEmpty()) {
trigger.next();
return;
}

new While<>(exts).each((ext, wcomp) -> {
ext.afterAllocateSdnNic(spec, nics, new Completion(wcomp) {
@Override
public void success() {
wcomp.done();
}

@Override
public void fail(ErrorCode errorCode) {
wcomp.addError(errorCode);
wcomp.allDone();
}
});
}).run(new WhileDoneCompletion(trigger) {
@Override
public void done(ErrorCodeList errorCodeList) {
if (!errorCodeList.getCauses().isEmpty()) {
trigger.fail(errorCodeList.getCauses().get(0));
} else {
trigger.next();
}
}
});
}

@Override
public void rollback(final FlowRollback chain, Map data) {
final VmInstanceSpec spec = (VmInstanceSpec) data.get(VmInstanceConstant.Params.VmInstanceSpec.toString());
final List<VmNicInventory> nics = spec.getDestNics();

List<AfterAllocateSdnNicExtensionPoint> exts =
pluginRgty.getExtensionList(AfterAllocateSdnNicExtensionPoint.class);

if (exts.isEmpty() || nics == null || nics.isEmpty()) {
chain.rollback();
return;
}

new While<>(exts).each((ext, wcomp) -> {
ext.rollbackSdnNic(spec, nics, new Completion(wcomp) {
@Override
public void success() {
wcomp.done();
}

@Override
public void fail(ErrorCode errorCode) {
// best-effort: log and continue
logger.warn(String.format("failed to rollback SDN nic: %s", errorCode));
wcomp.done();
}
});
}).run(new WhileDoneCompletion(chain) {
@Override
public void done(ErrorCodeList errorCodeList) {
chain.rollback();
}
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,7 @@ protected List<DetachNicFromVmMsg> handleDeletionForIpRange(List<VmDeletionStruc
}
}


return msgs;
}

Expand Down
62 changes: 60 additions & 2 deletions compute/src/main/java/org/zstack/compute/vm/VmDetachNicFlow.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,14 @@
import org.zstack.core.asyncbatch.While;
import org.zstack.core.cloudbus.CloudBus;
import org.zstack.core.cloudbus.CloudBusCallBack;
import org.zstack.core.componentloader.PluginRegistry;
import org.zstack.core.db.DatabaseFacade;
import org.zstack.core.db.UpdateQuery;
import org.zstack.header.core.Completion;
import org.zstack.header.core.WhileDoneCompletion;
import org.zstack.header.core.workflow.FlowTrigger;
import org.zstack.header.core.workflow.NoRollbackFlow;
import org.zstack.header.errorcode.ErrorCode;
import org.zstack.header.errorcode.ErrorCodeList;
import org.zstack.header.message.MessageReply;
import org.zstack.header.network.l3.L3NetworkConstant;
Expand All @@ -20,19 +23,28 @@
import org.zstack.utils.CollectionUtils;
import org.zstack.utils.function.Function;

import org.zstack.utils.Utils;
import org.zstack.utils.logging.CLogger;

import java.util.List;
import java.util.Map;

/**
* Created by frank on 7/18/2015.
*/
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE)
public class VmDetachNicFlow extends NoRollbackFlow {
private static final CLogger logger = Utils.getLogger(VmDetachNicFlow.class);
@Autowired
private DatabaseFacade dbf;
@Autowired
private CloudBus bus;
@Autowired
private VmInstanceDeviceManager vidm;
@Autowired
private VmInstanceManager vmMgr;
@Autowired
private PluginRegistry pluginRgty;

@Override
public void run(FlowTrigger trigger, Map data) {
Expand Down Expand Up @@ -68,6 +80,10 @@ public String call(VmNicInventory arg) {
return;
}

returnIpsAndDeleteNic(nic, trigger);
}

private void returnIpsAndDeleteNic(VmNicInventory nic, FlowTrigger trigger) {
new While<>(nic.getUsedIps()).all((ip, comp) -> {
ReturnIpMsg msg = new ReturnIpMsg();
msg.setUsedIpUuid(ip.getUuid());
Expand All @@ -82,9 +98,51 @@ public void run(MessageReply reply) {
}).run(new WhileDoneCompletion(trigger){
@Override
public void done(ErrorCodeList errorCodeList) {
dbf.removeByPrimaryKey(nic.getUuid(), VmNicVO.class);
trigger.next();
callReleaseSdnNics(java.util.Collections.singletonList(nic), new Completion(trigger) {
@Override
public void success() {
dbf.removeByPrimaryKey(nic.getUuid(), VmNicVO.class);
trigger.next();
}

@Override
public void fail(ErrorCode errorCode) {
logger.warn(String.format("releaseSdnNics failed for nic[uuid:%s]: %s, continue",
nic.getUuid(), errorCode));
dbf.removeByPrimaryKey(nic.getUuid(), VmNicVO.class);
trigger.next();
}
});
}
});
}

private void callReleaseSdnNics(List<VmNicInventory> nics, Completion completion) {
List<AfterAllocateSdnNicExtensionPoint> exts = pluginRgty.getExtensionList(AfterAllocateSdnNicExtensionPoint.class);
if (exts.isEmpty()) {
completion.success();
return;
}

new While<>(exts).each((ext, wcomp) -> {
ext.releaseSdnNics(nics, new Completion(wcomp) {
@Override
public void success() {
wcomp.done();
}

@Override
public void fail(ErrorCode errorCode) {
logger.warn(String.format("releaseSdnNics extension failed: %s, continue", errorCode));
wcomp.done();
}
});
}).run(new WhileDoneCompletion(completion) {
@Override
public void done(ErrorCodeList errorCodeList) {
completion.success();
}
});
}

}
Loading