diff --git a/plugins/hypervisors/simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java b/plugins/hypervisors/simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java index 6c12ecb5e14..6fb53725cfd 100644 --- a/plugins/hypervisors/simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java +++ b/plugins/hypervisors/simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.agent.manager; +import java.io.StringReader; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -113,6 +114,7 @@ import com.cloud.api.commands.ConfigureSimulatorCmd; import com.cloud.api.commands.QuerySimulatorMockCmd; import com.cloud.agent.api.SecStorageFirewallCfgCommand; import com.cloud.resource.SimulatorStorageProcessor; +import com.cloud.serializer.GsonHelper; import com.cloud.simulator.MockConfigurationVO; import com.cloud.simulator.MockHost; import com.cloud.simulator.MockVMVO; @@ -128,11 +130,13 @@ import com.cloud.utils.db.TransactionLegacy; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.VirtualMachine.State; import com.google.gson.Gson; +import com.google.gson.stream.JsonReader; @Component @Local(value = {SimulatorManager.class}) public class SimulatorManagerImpl extends ManagerBase implements SimulatorManager, PluggableService { private static final Logger s_logger = Logger.getLogger(SimulatorManagerImpl.class); + private static final Gson s_gson = GsonHelper.getGson(); @Inject MockVmManager _mockVmMgr; @Inject @@ -252,16 +256,20 @@ public class SimulatorManagerImpl extends ManagerBase implements SimulatorManage if (answer == null) { String message = config.getJsonResponse(); if (message != null) { - // json response looks like {"":....} - String answerType = message.split(":")[0].substring(1).replace("\"", ""); - if (answerType != null) { + // json response looks like {"":....} + String objectType = message.split(":")[0].substring(2).replace("\"", ""); + String objectData = message.substring(message.indexOf(':') + 1, message.length() - 1); + if (objectType != null) { Class clz = null; try { - clz = Class.forName(answerType); + clz = Class.forName(objectType); } catch (ClassNotFoundException e) { } if (clz != null) { - answer = (Answer)new Gson().fromJson(message, clz); + StringReader reader = new StringReader(objectData); + JsonReader jsonReader = new JsonReader(reader); + jsonReader.setLenient(true); + answer = (Answer)s_gson.fromJson(jsonReader, clz); } } } diff --git a/plugins/hypervisors/simulator/src/com/cloud/resource/AgentRoutingResource.java b/plugins/hypervisors/simulator/src/com/cloud/resource/AgentRoutingResource.java index 4b5c9fd52c7..2d75c6deebb 100644 --- a/plugins/hypervisors/simulator/src/com/cloud/resource/AgentRoutingResource.java +++ b/plugins/hypervisors/simulator/src/com/cloud/resource/AgentRoutingResource.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.resource; +import java.io.StringReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -50,6 +51,7 @@ import com.cloud.host.Host; import com.cloud.host.Host.Type; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.Networks.RouterPrivateIpStrategy; +import com.cloud.serializer.GsonHelper; import com.cloud.simulator.MockConfigurationVO; import com.cloud.simulator.MockVMVO; import com.cloud.storage.Storage.StorageResourceType; @@ -58,9 +60,12 @@ import com.cloud.utils.Pair; import com.cloud.utils.db.TransactionLegacy; import com.cloud.vm.VirtualMachine.PowerState; import com.cloud.vm.VirtualMachine.State; +import com.google.gson.Gson; +import com.google.gson.stream.JsonReader; public class AgentRoutingResource extends AgentStorageResource { private static final Logger s_logger = Logger.getLogger(AgentRoutingResource.class); + private static final Gson s_gson = GsonHelper.getGson(); protected Map _vms = new HashMap(); private Map> _runningVms = new HashMap>(); @@ -120,6 +125,29 @@ public class AgentRoutingResource extends AgentStorageResource { } } } + + config = _simMgr.getMockConfigurationDao().findByNameBottomUP(agentHost.getDataCenterId(), agentHost.getPodId(), agentHost.getClusterId(), agentHost.getId(), "PingRoutingWithNwGroupsCommand"); + if (config != null) { + String message = config.getJsonResponse(); + if (message != null) { + // json response looks like {"":....} + String objectType = message.split(":")[0].substring(2).replace("\"", ""); + String objectData = message.substring(message.indexOf(':') + 1, message.length() - 1); + if (objectType != null) { + Class clz = null; + try { + clz = Class.forName(objectType); + } catch (ClassNotFoundException e) { + } + if (clz != null) { + StringReader reader = new StringReader(objectData); + JsonReader jsonReader = new JsonReader(reader); + jsonReader.setLenient(true); + return (PingCommand)s_gson.fromJson(jsonReader, clz); + } + } + } + } } catch (Exception e) { txn.rollback(); } finally { @@ -303,8 +331,16 @@ public class AgentRoutingResource extends AgentStorageResource { protected HashMap getHostVmStateReport() { HashMap report = new HashMap(); - for (String vmName : _runningVms.keySet()) { - report.put(vmName, new HostVmStateReportEntry(PowerState.PowerOn, agentHost.getName())); + Map states = _simMgr.getVmStates(this.hostGuid); + for (String vmName : states.keySet()) { + State state = states.get(vmName); + if (state == State.Running) { + report.put(vmName, new HostVmStateReportEntry(PowerState.PowerOn, agentHost.getName())); + } else if (state == State.Stopped) { + report.put(vmName, new HostVmStateReportEntry(PowerState.PowerOff, agentHost.getName())); + } else { + report.put(vmName, new HostVmStateReportEntry(PowerState.PowerUnknown, agentHost.getName())); + } } return report;