diff --git a/agent-simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java b/agent-simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java index df6d1344acb..cd7cca7d143 100644 --- a/agent-simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java +++ b/agent-simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java @@ -136,15 +136,26 @@ public class SimulatorManagerImpl implements SimulatorManager { try { MockHost host = _mockHost.findByGuid(hostGuid); - MockConfigurationVO config = _mockConfigDao.findByCommand(host.getDataCenterId(), host.getPodId(), host.getClusterId(), host.getId(), cmd.toString()); - if (config == null) { - config = _mockConfigDao.findByGlobal(cmd.toString()); + String cmdName = cmd.toString(); + int index = cmdName.lastIndexOf("."); + if (index != -1) { + cmdName = cmdName.substring(index + 1); } + MockConfigurationVO config = _mockConfigDao.findByNameBottomUP(host.getDataCenterId(), host.getPodId(), host.getClusterId(), host.getId(), cmdName); if (config != null) { Map configParameters = config.getParameters(); - if (configParameters.get("enabled").equalsIgnoreCase("false")) { + if ("false".equalsIgnoreCase(configParameters.get("enabled"))) { return new Answer(cmd, false, "cmd is disabled"); + } else if (configParameters.get("timeout") != null) { + try { + int timeout = Integer.valueOf(configParameters.get("timeout")); + Thread.sleep(timeout * 1000); + } catch (NumberFormatException e) { + s_logger.debug("invalid timeout parameter: " + e.toString()); + } catch (InterruptedException e) { + s_logger.debug("thread is interrupted: " + e.toString()); + } } } @@ -257,14 +268,20 @@ public class SimulatorManagerImpl implements SimulatorManager { @Override public boolean configureSimulator(Long zoneId, Long podId, Long clusterId, Long hostId, String command, String values) { - MockConfigurationVO config = new MockConfigurationVO(); - config.setClusterId(clusterId); - config.setDataCenterId(zoneId); - config.setPodId(podId); - config.setHostId(hostId); - config.setName(command); - config.setValues(values); - _mockConfigDao.persist(config); + MockConfigurationVO config = _mockConfigDao.findByCommand(zoneId, podId, clusterId, hostId, command); + if (config == null) { + config = new MockConfigurationVO(); + config.setClusterId(clusterId); + config.setDataCenterId(zoneId); + config.setPodId(podId); + config.setHostId(hostId); + config.setName(command); + config.setValues(values); + _mockConfigDao.persist(config); + } else { + config.setValues(values); + _mockConfigDao.update(config.getId(), config); + } return true; } diff --git a/agent-simulator/src/com/cloud/api/commands/ConfigureSimulatorCmd.java b/agent-simulator/src/com/cloud/api/commands/ConfigureSimulatorCmd.java index 6af52801423..3c4ad8653f3 100644 --- a/agent-simulator/src/com/cloud/api/commands/ConfigureSimulatorCmd.java +++ b/agent-simulator/src/com/cloud/api/commands/ConfigureSimulatorCmd.java @@ -5,9 +5,12 @@ import org.apache.log4j.Logger; import com.cloud.agent.manager.SimulatorManager; import com.cloud.api.ApiConstants; import com.cloud.api.BaseCmd; +import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; +import com.cloud.api.repsonse.ConfigureSimulatorResponse; import com.cloud.api.response.BaseResponse; +import com.cloud.api.response.SuccessResponse; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceAllocationException; @@ -16,6 +19,7 @@ import com.cloud.server.ManagementService; import com.cloud.user.Account; import com.cloud.utils.component.ComponentLocator; +@Implementation(description="configure simulator", responseObject=SuccessResponse.class) public class ConfigureSimulatorCmd extends BaseCmd { public static final Logger s_logger = Logger.getLogger(ConfigureSimulatorCmd.class.getName()); private static final String s_name = "configuresimulatorresponse"; @@ -47,8 +51,7 @@ public class ConfigureSimulatorCmd extends BaseCmd { throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to configure simulator"); } - BaseResponse response = new BaseResponse(); - response.setResponseName(getCommandName()); + SuccessResponse response = new SuccessResponse(getCommandName()); this.setResponseObject(response); } diff --git a/agent-simulator/src/com/cloud/simulator/MockConfigurationVO.java b/agent-simulator/src/com/cloud/simulator/MockConfigurationVO.java index f167949c735..0a4800f0a58 100644 --- a/agent-simulator/src/com/cloud/simulator/MockConfigurationVO.java +++ b/agent-simulator/src/com/cloud/simulator/MockConfigurationVO.java @@ -90,9 +90,9 @@ public class MockConfigurationVO { return maps; } - String[] vals = this.values.split(";"); + String[] vals = this.values.split("\\|"); for (String val : vals) { - String[] paras = val.split("="); + String[] paras = val.split(":"); maps.put(paras[0], paras[1]); } return maps; diff --git a/agent-simulator/src/com/cloud/simulator/dao/MockConfigurationDao.java b/agent-simulator/src/com/cloud/simulator/dao/MockConfigurationDao.java index d684a349c61..fd07041195a 100644 --- a/agent-simulator/src/com/cloud/simulator/dao/MockConfigurationDao.java +++ b/agent-simulator/src/com/cloud/simulator/dao/MockConfigurationDao.java @@ -6,5 +6,6 @@ import com.cloud.utils.db.GenericDao; public interface MockConfigurationDao extends GenericDao { MockConfigurationVO findByCommand(Long dcId, Long podId, Long clusterId, Long hostId, String name); - MockConfigurationVO findByGlobal(String name); + MockConfigurationVO findByNameBottomUP(Long dcId, Long podId, + Long clusterId, Long hostId, String name); } diff --git a/agent-simulator/src/com/cloud/simulator/dao/MockConfigurationDaoImpl.java b/agent-simulator/src/com/cloud/simulator/dao/MockConfigurationDaoImpl.java index aa3a9f0f30a..8476bb0c73a 100644 --- a/agent-simulator/src/com/cloud/simulator/dao/MockConfigurationDaoImpl.java +++ b/agent-simulator/src/com/cloud/simulator/dao/MockConfigurationDaoImpl.java @@ -1,11 +1,19 @@ package com.cloud.simulator.dao; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.Formatter; +import java.util.List; + import javax.ejb.Local; import com.cloud.simulator.MockConfigurationVO; +import com.cloud.storage.VMTemplateHostVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.Transaction; @Local(value={MockConfigurationDao.class}) public class MockConfigurationDaoImpl extends GenericDaoBase implements MockConfigurationDao { @@ -14,21 +22,30 @@ public class MockConfigurationDaoImpl extends GenericDaoBase _searchByDcIDPodIdClusterIdName; private SearchBuilder _searchByDcIDPodIdClusterIdHostIdName; private SearchBuilder _searchByGlobalName; + public MockConfigurationDaoImpl() { _searchByGlobalName = createSearchBuilder(); _searchByGlobalName.and("dcId", _searchByGlobalName.entity().getDataCenterId(), SearchCriteria.Op.NULL); + _searchByGlobalName.and("podId", _searchByGlobalName.entity().getPodId(), SearchCriteria.Op.NULL); + _searchByGlobalName.and("clusterId", _searchByGlobalName.entity().getClusterId(), SearchCriteria.Op.NULL); + _searchByGlobalName.and("hostId", _searchByGlobalName.entity().getHostId(), SearchCriteria.Op.NULL); _searchByGlobalName.and("name", _searchByGlobalName.entity().getName(), SearchCriteria.Op.EQ); _searchByGlobalName.done(); _searchByDcIdName = createSearchBuilder(); _searchByDcIdName.and("dcId", _searchByDcIdName.entity().getDataCenterId(), SearchCriteria.Op.EQ); + _searchByDcIdName.and("podId", _searchByDcIdName.entity().getPodId(), SearchCriteria.Op.NULL); + _searchByDcIdName.and("clusterId", _searchByDcIdName.entity().getClusterId(), SearchCriteria.Op.NULL); + _searchByDcIdName.and("hostId", _searchByDcIdName.entity().getHostId(), SearchCriteria.Op.NULL); _searchByDcIdName.and("name", _searchByDcIdName.entity().getName(), SearchCriteria.Op.EQ); _searchByDcIdName.done(); _searchByDcIDPodIdName = createSearchBuilder(); _searchByDcIDPodIdName.and("dcId", _searchByDcIDPodIdName.entity().getDataCenterId(), SearchCriteria.Op.EQ); _searchByDcIDPodIdName.and("podId", _searchByDcIDPodIdName.entity().getPodId(), SearchCriteria.Op.EQ); + _searchByDcIDPodIdName.and("clusterId", _searchByDcIDPodIdName.entity().getClusterId(), SearchCriteria.Op.NULL); + _searchByDcIDPodIdName.and("hostId", _searchByDcIDPodIdName.entity().getHostId(), SearchCriteria.Op.NULL); _searchByDcIDPodIdName.and("name", _searchByDcIDPodIdName.entity().getName(), SearchCriteria.Op.EQ); _searchByDcIDPodIdName.done(); @@ -36,6 +53,7 @@ public class MockConfigurationDaoImpl extends GenericDaoBase