Skip to content

Commit 3e86874

Browse files
committed
changes and refactor to fix command deserialization issue
Signed-off-by: Abhishek Kumar <[email protected]>
1 parent b0c7e2e commit 3e86874

File tree

12 files changed

+55
-81
lines changed

12 files changed

+55
-81
lines changed

api/src/main/java/com/cloud/agent/api/Command.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@
1919
import java.util.HashMap;
2020
import java.util.Map;
2121

22-
import com.cloud.agent.api.LogLevel.Log4jLevel;
23-
import org.apache.logging.log4j.Logger;
2422
import org.apache.logging.log4j.LogManager;
23+
import org.apache.logging.log4j.Logger;
24+
25+
import com.cloud.agent.api.LogLevel.Log4jLevel;
2526

2627
/**
2728
* implemented by classes that extends the Command class. Command specifies
@@ -60,6 +61,7 @@ public enum State {
6061
private int wait; //in second
6162
private boolean bypassHostMaintenance = false;
6263
private transient long requestSequence = 0L;
64+
protected Map<String, Map<String, String>> externalDetails;
6365

6466
protected Command() {
6567
this.wait = 0;
@@ -128,6 +130,14 @@ public void setRequestSequence(long requestSequence) {
128130
this.requestSequence = requestSequence;
129131
}
130132

133+
public void setExternalDetails(Map<String, Map<String, String>> externalDetails) {
134+
this.externalDetails = externalDetails;
135+
}
136+
137+
public Map<String, Map<String, String>> getExternalDetails() {
138+
return externalDetails;
139+
}
140+
131141
@Override
132142
public boolean equals(Object o) {
133143
if (this == o) return true;

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

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,11 @@
1818
//
1919
package com.cloud.agent.api;
2020

21-
import java.util.Map;
22-
2321
import com.cloud.agent.api.to.VirtualMachineTO;
2422

2523
public class PrepareExternalProvisioningCommand extends Command {
2624

2725
VirtualMachineTO virtualMachineTO;
28-
Long clusterId;
29-
Map<String, Object> externalDetails;
3026

3127
public PrepareExternalProvisioningCommand(VirtualMachineTO vmTO) {
3228
this.virtualMachineTO = vmTO;
@@ -36,14 +32,6 @@ public VirtualMachineTO getVirtualMachineTO() {
3632
return virtualMachineTO;
3733
}
3834

39-
public Map<String, Object> getExternalDetails() {
40-
return externalDetails;
41-
}
42-
43-
public void setExternalDetails(Map<String, Object> externalDetails) {
44-
this.externalDetails = externalDetails;
45-
}
46-
4735
@Override
4836
public boolean executeInSequence() {
4937
return false;

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

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,11 @@
1919

2020
package com.cloud.agent.api;
2121

22-
import java.util.Map;
23-
2422
import com.cloud.agent.api.to.VirtualMachineTO;
2523

2624
public class RebootCommand extends Command {
2725
String vmName;
2826
VirtualMachineTO vm;
29-
private Map<String, Object> externalDetails;
3027
protected boolean executeInSequence = false;
3128

3229
protected RebootCommand() {
@@ -49,14 +46,6 @@ public VirtualMachineTO getVirtualMachine() {
4946
return vm;
5047
}
5148

52-
public void setExternalDetails(Map<String, Object> externalDetails) {
53-
this.externalDetails = externalDetails;
54-
}
55-
56-
public Map<String, Object> getExternalDetails() {
57-
return externalDetails;
58-
}
59-
6049
@Override
6150
public boolean executeInSequence() {
6251
return this.executeInSequence;

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

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ public class RunCustomActionCommand extends Command {
2626
String actionName;
2727
Long vmId;
2828
Map<String, Object> parameters;
29-
Map<String, Object> externalDetails;
3029

3130
public RunCustomActionCommand(String actionName) {
3231
this.actionName = actionName;
@@ -53,14 +52,6 @@ public void setParameters(Map<String, Object> parameters) {
5352
this.parameters = parameters;
5453
}
5554

56-
public Map<String, Object> getExternalDetails() {
57-
return externalDetails;
58-
}
59-
60-
public void setExternalDetails(Map<String, Object> externalDetails) {
61-
this.externalDetails = externalDetails;
62-
}
63-
6455
@Override
6556
public boolean executeInSequence() {
6657
return false;

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

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919

2020
package com.cloud.agent.api;
2121

22-
import java.util.Map;
23-
2422
import com.cloud.agent.api.to.VirtualMachineTO;
2523
import com.cloud.host.Host;
2624

@@ -31,7 +29,6 @@ public class StartCommand extends Command {
3129
String hostIp;
3230
boolean executeInSequence = false;
3331
String secondaryStorage;
34-
Map<String, Object> externalDetails;
3532

3633
public VirtualMachineTO getVirtualMachine() {
3734
return vm;
@@ -67,12 +64,4 @@ public String getSecondaryStorage() {
6764
public void setSecondaryStorage(String secondary) {
6865
this.secondaryStorage = secondary;
6966
}
70-
71-
public Map<String, Object> getExternalDetails() {
72-
return externalDetails;
73-
}
74-
75-
public void setExternalDetails(Map<String, Object> externalDetails) {
76-
this.externalDetails = externalDetails;
77-
}
7867
}

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

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ public class StopCommand extends RebootCommand {
3939
Map<String, Boolean> vlanToPersistenceMap;
4040
boolean expungeVM = false;
4141

42-
private Map<String, Object> externalDetails;
43-
4442
public Map<String, DpdkTO> getDpdkInterfaceMapping() {
4543
return dpdkInterfaceMapping;
4644
}
@@ -149,12 +147,4 @@ public boolean isExpungeVM() {
149147
public void setExpungeVM(boolean expungeVM) {
150148
this.expungeVM = expungeVM;
151149
}
152-
153-
public void setExternalDetails(Map<String, Object> externalDetails) {
154-
this.externalDetails = externalDetails;
155-
}
156-
157-
public Map<String, Object> getExternalDetails() {
158-
return externalDetails;
159-
}
160150
}

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1272,7 +1272,7 @@ protected void processPrepareExternalProvisioning(boolean firstStart, Host host,
12721272
virtualMachineTO.setNics(nicTOs);
12731273
}
12741274
Map<String, String> vmDetails = virtualMachineTO.getExternalDetails();
1275-
Map<String, Object> externalDetails = extensionsManager.getExternalAccessDetails(host,
1275+
Map<String, Map<String, String>> externalDetails = extensionsManager.getExternalAccessDetails(host,
12761276
vmDetails);
12771277
PrepareExternalProvisioningCommand cmd = new PrepareExternalProvisioningCommand(virtualMachineTO);
12781278
cmd.setExternalDetails(externalDetails);
@@ -1677,7 +1677,7 @@ protected void updateStartCommandWithExternalDetails(Host host, VirtualMachineTO
16771677
vmExternalDetails.put(VmDetailConstants.CLOUDSTACK_VLAN, Networks.BroadcastDomainType.getValue(nic.getBroadcastUri()));
16781678
}
16791679
}
1680-
Map<String, Object> externalDetails = extensionsManager.getExternalAccessDetails(host, vmExternalDetails);
1680+
Map<String, Map<String, String>> externalDetails = extensionsManager.getExternalAccessDetails(host, vmExternalDetails);
16811681
command.setExternalDetails(externalDetails);
16821682
}
16831683

@@ -1691,7 +1691,16 @@ protected void updateStopCommandForExternalHypervisorType(final HypervisorType h
16911691
return;
16921692
}
16931693
VirtualMachineTO vmTO = ObjectUtils.defaultIfNull(stopCommand.getVirtualMachine(), toVmTO(vmProfile));
1694-
Map<String, Object> externalDetails = extensionsManager.getExternalAccessDetails(host, vmTO.getExternalDetails());
1694+
if (MapUtils.isEmpty(vmTO.getGuestOsDetails())) {
1695+
vmTO.setGuestOsDetails(null);
1696+
}
1697+
if (MapUtils.isEmpty(vmTO.getExtraConfig())) {
1698+
vmTO.setExtraConfig(null);
1699+
}
1700+
if (MapUtils.isEmpty(vmTO.getNetworkIdToNetworkNameMap())) {
1701+
vmTO.setNetworkIdToNetworkNameMap(null);
1702+
}
1703+
Map<String, Map<String, String>> externalDetails = extensionsManager.getExternalAccessDetails(host, vmTO.getExternalDetails());
16951704
stopCommand.setVirtualMachine(vmTO);
16961705
stopCommand.setExternalDetails(externalDetails);
16971706
}
@@ -1700,7 +1709,7 @@ protected void updateRebootCommandWithExternalDetails(Host host, VirtualMachineT
17001709
if (!HypervisorType.External.equals(host.getHypervisorType())) {
17011710
return;
17021711
}
1703-
Map<String, Object> externalDetails = extensionsManager.getExternalAccessDetails(host, vmTO.getExternalDetails());
1712+
Map<String, Map<String, String>> externalDetails = extensionsManager.getExternalAccessDetails(host, vmTO.getExternalDetails());
17041713
rebootCmd.setExternalDetails(externalDetails);
17051714
}
17061715

framework/extensions/src/main/java/org/apache/cloudstack/framework/extensions/manager/ExtensionsManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public interface ExtensionsManager extends Manager {
8484

8585
ExtensionCustomActionResponse createCustomActionResponse(ExtensionCustomAction customAction);
8686

87-
Map<String, Object> getExternalAccessDetails(Host host, Map<String, String> vmDetails);
87+
Map<String, Map<String, String>> getExternalAccessDetails(Host host, Map<String, String> vmDetails);
8888

8989
String handleExtensionServerCommands(ExtensionServerActionBaseCommand cmd);
9090
}

framework/extensions/src/main/java/org/apache/cloudstack/framework/extensions/manager/ExtensionsManagerImpl.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -461,14 +461,16 @@ protected void updateAllExtensionHosts(Extension extension, Long clusterId, bool
461461
executorService.shutdown();
462462
}
463463

464-
protected Map<String, Object> getExternalAccessDetails(Map<String, String> actionDetails, long hostId,
464+
protected Map<String, Map<String, String>> getExternalAccessDetails(Map<String, String> actionDetails, long hostId,
465465
ExtensionResourceMap resourceMap) {
466-
Map<String, Object> externalDetails = new HashMap<>();
466+
Map<String, Map<String, String>> externalDetails = new HashMap<>();
467467
if (MapUtils.isNotEmpty(actionDetails)) {
468468
externalDetails.put(ApiConstants.ACTION, actionDetails);
469469
}
470470
Map<String, String> hostDetails = getFilteredExternalDetails(hostDetailsDao.findDetails(hostId));
471-
externalDetails.put(ApiConstants.HOST, hostDetails);
471+
if (MapUtils.isNotEmpty(hostDetails)) {
472+
externalDetails.put(ApiConstants.HOST, hostDetails);
473+
}
472474
if (resourceMap == null) {
473475
return externalDetails;
474476
}
@@ -477,7 +479,9 @@ protected Map<String, Object> getExternalAccessDetails(Map<String, String> actio
477479
externalDetails.put(ApiConstants.RESOURCE_MAP, resourceDetails);
478480
}
479481
Map<String, String> extensionDetails = extensionDetailsDao.listDetailsKeyPairs(resourceMap.getExtensionId(), true);
480-
externalDetails.put(ApiConstants.EXTENSION, extensionDetails);
482+
if (MapUtils.isNotEmpty(extensionDetails)) {
483+
externalDetails.put(ApiConstants.EXTENSION, extensionDetails);
484+
}
481485
return externalDetails;
482486
}
483487

@@ -1326,10 +1330,12 @@ public CustomActionResultResponse runCustomAction(RunCustomActionCmd cmd) {
13261330
response.setSuccess(false);
13271331
result.put(ApiConstants.MESSAGE, getActionMessage(false, customActionVO, extensionVO,
13281332
actionResourceType, entity));
1329-
Map<String, Object> externalDetails = getExternalAccessDetails(allDetails.first(), hostId, extensionResource);
1333+
Map<String, Map<String, String>> externalDetails =
1334+
getExternalAccessDetails(allDetails.first(), hostId, extensionResource);
13301335
runCustomActionCommand.setParameters(parameters);
13311336
runCustomActionCommand.setExternalDetails(externalDetails);
13321337
try {
1338+
logger.info("Running custom action: {}", GsonHelper.getGson().toJson(runCustomActionCommand));
13331339
Answer answer = agentMgr.send(hostId, runCustomActionCommand);
13341340
if (!(answer instanceof RunCustomActionAnswer)) {
13351341
logger.error("Unexpected answer [{}] received for {}", answer.getClass().getSimpleName(),
@@ -1393,11 +1399,11 @@ public ExtensionCustomActionResponse createCustomActionResponse(ExtensionCustomA
13931399
}
13941400

13951401
@Override
1396-
public Map<String, Object> getExternalAccessDetails(Host host, Map<String, String> vmDetails) {
1402+
public Map<String, Map<String, String>> getExternalAccessDetails(Host host, Map<String, String> vmDetails) {
13971403
long clusterId = host.getClusterId();
13981404
ExtensionResourceMapVO resourceMap = extensionResourceMapDao.findByResourceIdAndType(clusterId,
13991405
ExtensionResourceMap.ResourceType.Cluster);
1400-
Map<String, Object> details = getExternalAccessDetails(null, host.getId(), resourceMap);
1406+
Map<String, Map<String, String>> details = getExternalAccessDetails(null, host.getId(), resourceMap);
14011407
if (MapUtils.isNotEmpty(vmDetails)) {
14021408
details.put(ApiConstants.VIRTUAL_MACHINE, vmDetails);
14031409
}

framework/extensions/src/test/java/org/apache/cloudstack/framework/extensions/manager/ExtensionsManagerImplTest.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -497,17 +497,19 @@ public void updateAllExtensionHostsHandlesNullClusterId() throws OperationTimedo
497497

498498
@Test
499499
public void getExternalAccessDetailsReturnsMapWithHostAndExtension() {
500-
Map<String, String> actionDetails = new HashMap<>();
501-
actionDetails.put("external.detail.key", "value");
500+
Map<String, String> map = new HashMap<>();
501+
map.put("external.detail.key", "value");
502502
long hostId = 1L;
503503
ExtensionResourceMap resourceMap = mock(ExtensionResourceMap.class);
504504
when(resourceMap.getId()).thenReturn(2L);
505505
when(resourceMap.getExtensionId()).thenReturn(3L);
506-
when(hostDetailsDao.findDetails(hostId)).thenReturn(actionDetails);
507-
when(extensionResourceMapDetailsDao.listDetailsKeyPairs(2L, true)).thenReturn(actionDetails);
508-
when(extensionDetailsDao.listDetailsKeyPairs(3L, true)).thenReturn(actionDetails);
509-
Map<String, Object> result = extensionsManager.getExternalAccessDetails(actionDetails, hostId, resourceMap);
510-
assertTrue(result.containsKey(ApiConstants.HOST));
506+
when(hostDetailsDao.findDetails(hostId)).thenReturn(null);
507+
when(extensionResourceMapDetailsDao.listDetailsKeyPairs(2L, true)).thenReturn(Collections.emptyMap());
508+
when(extensionDetailsDao.listDetailsKeyPairs(3L, true)).thenReturn(map);
509+
Map<String, Map<String, String>> result = extensionsManager.getExternalAccessDetails(map, hostId, resourceMap);
510+
assertTrue(result.containsKey(ApiConstants.ACTION));
511+
assertFalse(result.containsKey(ApiConstants.HOST));
512+
assertFalse(result.containsKey(ApiConstants.RESOURCE_MAP));
511513
assertTrue(result.containsKey(ApiConstants.EXTENSION));
512514
}
513515

0 commit comments

Comments
 (0)