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/springConfigXml/ConsoleManager.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
<zstack:extension interface="org.zstack.header.vm.PostVmInstantiateResourceExtensionPoint"/>
<zstack:extension interface="org.zstack.header.managementnode.ManagementNodeChangeListener" />
<zstack:extension interface="org.zstack.header.identity.SessionLogoutExtensionPoint" />
<zstack:extension interface="org.zstack.header.vm.KvmReportVmShutdownFromGuestEventExtensionPoint"/>
</zstack:plugin>

<property name="useBackend" value="ManagementServerConsoleProxyBackend" />
Expand Down
22 changes: 21 additions & 1 deletion console/src/main/java/org/zstack/console/ConsoleManagerImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
* To change this template use File | Settings | File Templates.
*/
public class ConsoleManagerImpl extends AbstractService implements ConsoleManager, VmInstanceMigrateExtensionPoint, ManagementNodeChangeListener,
VmReleaseResourceExtensionPoint, SessionLogoutExtensionPoint, PostVmInstantiateResourceExtensionPoint {
VmReleaseResourceExtensionPoint, SessionLogoutExtensionPoint, PostVmInstantiateResourceExtensionPoint, KvmReportVmShutdownFromGuestEventExtensionPoint {
private static CLogger logger = Utils.getLogger(ConsoleManagerImpl.class);

@Autowired
Expand Down Expand Up @@ -357,4 +357,24 @@ public void fail(ErrorCode errorCode) {
public void postReleaseVmResource(VmInstanceSpec spec, Completion completion) {
completion.success();
}

@Override
public void kvmReportVmShutdownEvent(String vmUuid) {
VmInstanceVO vmvo = Q.New(VmInstanceVO.class).eq(VmInstanceVO_.uuid, vmUuid).find();
if (vmvo == null) {
return;
}
VmInstanceInventory inv = VmInstanceInventory.valueOf(vmvo);
ConsoleBackend backend = getBackend();
backend.deleteConsoleSession(inv, new Completion(null) {
@Override
public void success() {}

@Override
public void fail(ErrorCode errorCode) {
logger.warn(String.format(
"failed to delete console session for vm[uuid:%s] on guest shutdown, because %s", vmUuid, errorCode));
}
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ package org.zstack.test.integration.console

import org.springframework.http.HttpEntity
import org.zstack.console.ConsoleGlobalConfig
import org.zstack.header.vm.VmInstanceConstant
import org.zstack.core.CoreGlobalProperty
import org.zstack.core.Platform
import org.zstack.core.cloudbus.CloudBus
import org.zstack.core.db.DatabaseFacade
import org.zstack.core.db.Q
import org.zstack.core.gc.GCStatus
Expand All @@ -12,6 +14,7 @@ import org.zstack.header.console.ConsoleProxyAgentVO
import org.zstack.header.console.ConsoleProxyCommands
import org.zstack.header.console.ConsoleProxyVO
import org.zstack.header.console.ConsoleProxyVO_
import org.zstack.header.vm.KvmReportVmShutdownFromGuestEventMsg
import org.zstack.sdk.ConsoleInventory
import org.zstack.sdk.GarbageCollectorInventory
import org.zstack.sdk.SessionInventory
Expand All @@ -25,6 +28,7 @@ import org.zstack.utils.data.SizeUnit
class ConsoleProxyCase extends SubCase {
EnvSpec env
DatabaseFacade dbf
CloudBus bus;

@Override
void setup() {
Expand All @@ -34,6 +38,7 @@ class ConsoleProxyCase extends SubCase {
@Override
void environment() {
dbf = bean(DatabaseFacade.class)
bus = bean(CloudBus.class)
env = env {
account {
name = "test"
Expand Down Expand Up @@ -119,6 +124,7 @@ class ConsoleProxyCase extends SubCase {
@Override
void test() {
env.create {
testConsoleProxyCleanupOnGuestShutdown()
testUpdateConsoleProxyAgent()
testConsoleProxyGC()
}
Expand Down Expand Up @@ -245,6 +251,27 @@ class ConsoleProxyCase extends SubCase {
}
}

void testConsoleProxyCleanupOnGuestShutdown() {
VmInstanceInventory vm = env.inventoryByName("vm")
requestConsoleAccess {
vmInstanceUuid = vm.uuid
}
def consoleProxyCount = Q.New(ConsoleProxyVO.class)
.eq(ConsoleProxyVO_.vmInstanceUuid, vm.uuid)
.count()
assert consoleProxyCount == 1
KvmReportVmShutdownFromGuestEventMsg msg = new KvmReportVmShutdownFromGuestEventMsg()
msg.vmInstanceUuid = vm.uuid
bus.makeTargetServiceIdByResourceUuid(msg, VmInstanceConstant.SERVICE_ID, vm.uuid)
bus.send(msg)
retryInSecs {
consoleProxyCount = Q.New(ConsoleProxyVO.class)
.eq(ConsoleProxyVO_.vmInstanceUuid, vm.uuid)
.count()
assert consoleProxyCount == 0
}
}

@Override
void clean() {
env.delete()
Expand Down