Skip to content

Commit b8901a1

Browse files
committed
fetch domainxml from vm
1 parent 88333b3 commit b8901a1

File tree

4 files changed

+37
-65
lines changed

4 files changed

+37
-65
lines changed

core/src/main/java/com/cloud/agent/api/UnmanageInstanceAnswer.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,4 @@ public class UnmanageInstanceAnswer extends Answer {
2424
public UnmanageInstanceAnswer(UnmanageInstanceCommand cmd, boolean success, String details) {
2525
super(cmd, success, details);
2626
}
27-
28-
public UnmanageInstanceAnswer(UnmanageInstanceCommand cmd, Exception e) {
29-
super(cmd, e);
30-
}
31-
3227
}

core/src/main/java/com/cloud/agent/api/UnmanageInstanceCommand.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,32 +19,27 @@
1919

2020
package com.cloud.agent.api;
2121

22-
import com.cloud.agent.api.to.VirtualMachineTO;
23-
2422
/**
2523
*/
2624
public class UnmanageInstanceCommand extends Command {
27-
VirtualMachineTO vm;
25+
String instanceName;
2826
boolean executeInSequence = false;
2927

30-
public VirtualMachineTO getVirtualMachine() {
31-
return vm;
32-
}
33-
3428
@Override
3529
public boolean executeInSequence() {
3630
//VR start doesn't go through queue
37-
if (vm.getName() != null && vm.getName().startsWith("r-")) {
31+
if (instanceName != null && instanceName.startsWith("r-")) {
3832
return false;
3933
}
4034
return executeInSequence;
4135
}
4236

43-
protected UnmanageInstanceCommand() {
37+
public UnmanageInstanceCommand(String instanceName, boolean executeInSequence) {
38+
this.instanceName = instanceName;
39+
this.executeInSequence = executeInSequence;
4440
}
4541

46-
public UnmanageInstanceCommand(VirtualMachineTO vm, boolean executeInSequence) {
47-
this.vm = vm;
48-
this.executeInSequence = executeInSequence;
42+
public String getInstanceName() {
43+
return instanceName;
4944
}
5045
}

engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,6 +1171,8 @@ protected void checkAndAttemptMigrateVmAcrossCluster(final VMInstanceVO vm, fina
11711171
markVolumesInPool(vm, answer);
11721172
}
11731173

1174+
1175+
11741176
protected void updateVmMetadataManufacturerAndProduct(VirtualMachineTO vmTO, VMInstanceVO vm) {
11751177
String metadataManufacturer = VmMetadataManufacturer.valueIn(vm.getDataCenterId());
11761178
if (StringUtils.isBlank(metadataManufacturer)) {
@@ -2015,19 +2017,19 @@ public boolean unmanage(String vmUuid) {
20152017
throw new ConcurrentOperationException(msg);
20162018
}
20172019

2018-
boolean isCmdAnswerSuccess = true;
2019-
// define domain for kvm host
2020+
boolean isDomainXMLPreserved = true;
2021+
// persist domain for kvm host
20202022
if (HypervisorType.KVM.equals(vm.getHypervisorType())) {
2021-
final UnmanageInstanceCommand unmanageInstanceCommand = new UnmanageInstanceCommand(getVmTO(vm.getId()), false);
2023+
final UnmanageInstanceCommand unmanageInstanceCommand = new UnmanageInstanceCommand(vm.getName(), false);
20222024
try {
20232025
Answer answer = _agentMgr.send(vm.getHostId(), unmanageInstanceCommand);
2024-
isCmdAnswerSuccess = (answer instanceof UnmanageInstanceAnswer && answer.getResult());
2026+
isDomainXMLPreserved = (answer instanceof UnmanageInstanceAnswer && answer.getResult());
20252027
} catch (Exception ex) {
2026-
isCmdAnswerSuccess = false;
2028+
isDomainXMLPreserved = false;
20272029
}
20282030
}
20292031

2030-
if (isCmdAnswerSuccess) {
2032+
if (isDomainXMLPreserved) {
20312033
logger.debug("Unmanaging VM {}", vm);
20322034
Boolean result = Transaction.execute(new TransactionCallback<Boolean>() {
20332035
@Override
@@ -2050,6 +2052,8 @@ public Boolean doInTransaction(TransactionStatus status) {
20502052
}
20512053
});
20522054
return BooleanUtils.isTrue(result);
2055+
} else {
2056+
logger.error("Error encountered persisting domainXML for vm: {}", vm.getName());
20532057
}
20542058
return false;
20552059
}
@@ -4017,6 +4021,17 @@ private void checkAndSetEnterSetupMode(VirtualMachineTO vmTo, Map<VirtualMachine
40174021
vmTo.setEnterHardwareSetup(enterSetup == null ? false : enterSetup);
40184022
}
40194023

4024+
protected VirtualMachineTO prepareVMTo(Long vmId) {
4025+
VMInstanceVO vm = _vmDao.findById(vmId);
4026+
VirtualMachineProfile vmProfile = new VirtualMachineProfileImpl(vm);
4027+
HypervisorGuru vmGuru = _hvGuruMgr.getGuru(vm.getHypervisorType());
4028+
VirtualMachineTO vmTO = vmGuru.implement(vmProfile);
4029+
updateVmMetadataManufacturerAndProduct(vmTO, vm);
4030+
setVmNetworkDetails(vm, vmTO);
4031+
return vmTO;
4032+
}
4033+
4034+
40204035
protected VirtualMachineTO getVmTO(Long vmId) {
40214036
final VMInstanceVO vm = _vmDao.findById(vmId);
40224037
final VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUnmanageInstanceCommandWrapper.java

Lines changed: 9 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -20,68 +20,35 @@
2020
package com.cloud.hypervisor.kvm.resource.wrapper;
2121

2222
import org.libvirt.Connect;
23+
import org.libvirt.Domain;
2324
import org.libvirt.LibvirtException;
2425

2526
import com.cloud.agent.api.Answer;
2627
import com.cloud.agent.api.UnmanageInstanceAnswer;
2728
import com.cloud.agent.api.UnmanageInstanceCommand;
28-
import com.cloud.agent.api.to.NicTO;
29-
import com.cloud.agent.api.to.VirtualMachineTO;
3029
import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource;
31-
import com.cloud.hypervisor.kvm.resource.LibvirtKvmAgentHook;
32-
import com.cloud.hypervisor.kvm.resource.LibvirtVMDef;
3330
import com.cloud.resource.CommandWrapper;
3431
import com.cloud.resource.ResourceWrapper;
35-
import com.cloud.vm.VirtualMachine;
3632

3733
@ResourceWrapper(handles = UnmanageInstanceCommand.class)
3834
public final class LibvirtUnmanageInstanceCommandWrapper extends CommandWrapper<UnmanageInstanceCommand, Answer, LibvirtComputingResource> {
3935

4036

4137
@Override
4238
public Answer execute(final UnmanageInstanceCommand command, final LibvirtComputingResource libvirtComputingResource) {
43-
final VirtualMachineTO vmSpec = command.getVirtualMachine();
44-
LibvirtVMDef vm = null;
39+
String instanceName = command.getInstanceName();
4540
final LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper();
46-
Connect conn = null;
41+
logger.debug("Unmanaging KVM instance: {}", instanceName);
4742
try {
48-
49-
vm = libvirtComputingResource.createVMFromSpec(vmSpec);
50-
conn = libvirtUtilitiesHelper.getConnectionByType(vm.getHvsType());
51-
52-
final NicTO[] nics = vmSpec.getNics();
53-
54-
for (final NicTO nic : nics) {
55-
if (vmSpec.getType() != VirtualMachine.Type.User) {
56-
nic.setPxeDisable(true);
57-
}
58-
}
59-
60-
String vmInitialSpecification = vm.toString();
61-
String vmFinalSpecification = performXmlTransformHook(vmInitialSpecification, libvirtComputingResource);
62-
libvirtComputingResource.defineVMDomain(conn, vmFinalSpecification);
63-
43+
Connect conn = libvirtUtilitiesHelper.getConnectionByVmName(instanceName);
44+
Domain dom = conn.domainLookupByName(instanceName);
45+
String domainXML = dom.getXMLDesc(1);
46+
conn.domainDefineXML(domainXML);
47+
logger.debug("Successfully unmanaged KVM instance: {}", instanceName);
6448
return new UnmanageInstanceAnswer(command, true, "Successfully unmanaged");
6549
} catch (final LibvirtException ex) {
66-
logger.warn("LibvirtException ", ex);
50+
logger.warn("LibvirtException occurred during unmanaging instance: {} ", instanceName, ex);
6751
return new UnmanageInstanceAnswer(command, false, ex.getMessage());
6852
}
6953
}
70-
71-
private String performXmlTransformHook(String vmInitialSpecification, final LibvirtComputingResource libvirtComputingResource) {
72-
String vmFinalSpecification;
73-
try {
74-
// if transformer fails, everything must go as it's just skipped.
75-
LibvirtKvmAgentHook t = libvirtComputingResource.getTransformer();
76-
vmFinalSpecification = (String) t.handle(vmInitialSpecification);
77-
if (null == vmFinalSpecification) {
78-
logger.warn("Libvirt XML transformer returned NULL, will use XML specification unchanged.");
79-
vmFinalSpecification = vmInitialSpecification;
80-
}
81-
} catch(Exception e) {
82-
logger.warn("Exception occurred when handling LibVirt XML transformer hook: {}", e);
83-
vmFinalSpecification = vmInitialSpecification;
84-
}
85-
return vmFinalSpecification;
86-
}
8754
}

0 commit comments

Comments
 (0)