diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java new file mode 100644 index 00000000000..7231821c92f --- /dev/null +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -0,0 +1,113 @@ +package com.cloud.api; + +import java.util.List; + +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.domain.DomainVO; +import com.cloud.domain.dao.DomainDao; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.network.IPAddressVO; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.security.NetworkGroupManager; +import com.cloud.offering.ServiceOffering; +import com.cloud.server.Criteria; +import com.cloud.server.ManagementServer; +import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.VolumeVO; +import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.storage.dao.VolumeDao; +import com.cloud.user.Account; +import com.cloud.user.User; +import com.cloud.user.dao.AccountDao; +import com.cloud.user.dao.UserDao; +import com.cloud.utils.component.ComponentLocator; +import com.cloud.vm.UserVmVO; + +public class ApiDBUtils { + private static ManagementServer _ms; + private static NetworkGroupManager _networkGroupMgr; + private static AccountDao _accountDao; + private static DomainDao _domainDao; + private static HostDao _hostDao; + private static IPAddressDao _ipAddressDao; + private static ServiceOfferingDao _serviceOfferingDao; + private static VMTemplateDao _templateDao; + private static UserDao _userDao; + private static VolumeDao _volumeDao; + private static DataCenterDao _zoneDao; + + static { + _ms = (ManagementServer)ComponentLocator.getComponent(ManagementServer.Name); + + ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name); + _networkGroupMgr = locator.getManager(NetworkGroupManager.class); + _accountDao = locator.getDao(AccountDao.class); + _domainDao = locator.getDao(DomainDao.class); + _hostDao = locator.getDao(HostDao.class); + _ipAddressDao = locator.getDao(IPAddressDao.class); + _serviceOfferingDao = locator.getDao(ServiceOfferingDao.class); + _templateDao = locator.getDao(VMTemplateDao.class); + _userDao = locator.getDao(UserDao.class); + _volumeDao = locator.getDao(VolumeDao.class); + _zoneDao = locator.getDao(DataCenterDao.class); + } + + ///////////////////////////////////////////////////////////// + // ManagementServer methods // + ///////////////////////////////////////////////////////////// + + public static List searchForUserVMs(Criteria c) { + return _ms.searchForUserVMs(c); + } + + ///////////////////////////////////////////////////////////// + // Manager methods // + ///////////////////////////////////////////////////////////// + + public static String getNetworkGroupsNamesForVm(long vmId) { + return _networkGroupMgr.getNetworkGroupsNamesForVm(vmId); + } + + ///////////////////////////////////////////////////////////// + // Dao methods // + ///////////////////////////////////////////////////////////// + + public static Account findAccountById(Long accountId) { + return _accountDao.findById(accountId); + } + + public static DomainVO findDomainById(Long domainId) { + return _domainDao.findById(domainId); + } + + public static HostVO findHostById(Long hostId) { + return _hostDao.findById(hostId); + } + + public static IPAddressVO findIpAddressById(String address) { + return _ipAddressDao.findById(address); + } + + public static ServiceOffering findServiceOfferingById(Long serviceOfferingId) { + return _serviceOfferingDao.findById(serviceOfferingId); + } + + public static VMTemplateVO findTemplateById(Long templateId) { + return _templateDao.findById(templateId); + } + + public static User findUserById(Long userId) { + return _userDao.findById(userId); + } + + public static VolumeVO findVolumeById(Long volumeId) { + return _volumeDao.findById(volumeId); + } + + public static DataCenterVO findZoneById(Long zoneId) { + return _zoneDao.findById(zoneId); + } +} diff --git a/server/src/com/cloud/api/ApiDispatcher.java b/server/src/com/cloud/api/ApiDispatcher.java index 5aa0545e886..0c9bb35a674 100644 --- a/server/src/com/cloud/api/ApiDispatcher.java +++ b/server/src/com/cloud/api/ApiDispatcher.java @@ -152,9 +152,10 @@ public class ApiDispatcher { Field[] fields = cmd.getClass().getDeclaredFields(); for (Field field : fields) { Parameter parameterAnnotation = field.getAnnotation(Parameter.class); - if (parameterAnnotation == null) { + if ((parameterAnnotation == null) || !parameterAnnotation.expose()) { continue; } + Object paramObj = unpackedParams.get(parameterAnnotation.name()); if (paramObj == null) { if (parameterAnnotation.required()) { diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java index 2b2a62732dc..a23a9d87677 100644 --- a/server/src/com/cloud/api/ApiServer.java +++ b/server/src/com/cloud/api/ApiServer.java @@ -349,7 +349,9 @@ public class ApiServer implements HttpRequestHandler { if (cmdObj instanceof BaseAsyncCmd) { Long objectId = null; if (cmdObj instanceof BaseAsyncCreateCmd) { - objectId = _dispatcher.dispatchCreateCmd((BaseAsyncCreateCmd)cmdObj, params); + BaseAsyncCreateCmd createCmd = (BaseAsyncCreateCmd)cmdObj; + objectId = _dispatcher.dispatchCreateCmd(createCmd, params); + createCmd.setId(objectId); } BaseAsyncCmd asyncCmd = (BaseAsyncCmd)cmdObj; diff --git a/server/src/com/cloud/api/Parameter.java b/server/src/com/cloud/api/Parameter.java index a1fe480f641..beb993ee030 100644 --- a/server/src/com/cloud/api/Parameter.java +++ b/server/src/com/cloud/api/Parameter.java @@ -33,5 +33,6 @@ public @interface Parameter { boolean required() default false; CommandType type() default CommandType.OBJECT; CommandType collectionType() default CommandType.OBJECT; + boolean expose() default true; } diff --git a/server/src/com/cloud/api/commands/CreateSnapshotCmd.java b/server/src/com/cloud/api/commands/CreateSnapshotCmd.java index af44ec1bd11..be68f9160c5 100644 --- a/server/src/com/cloud/api/commands/CreateSnapshotCmd.java +++ b/server/src/com/cloud/api/commands/CreateSnapshotCmd.java @@ -20,6 +20,7 @@ package com.cloud.api.commands; import org.apache.log4j.Logger; +import com.cloud.api.ApiDBUtils; import com.cloud.api.BaseAsyncCreateCmd; import com.cloud.api.BaseCmd.Manager; import com.cloud.api.Implementation; @@ -85,14 +86,14 @@ public class CreateSnapshotCmd extends BaseAsyncCreateCmd { SnapshotResponse response = new SnapshotResponse(); response.setId(snapshot.getId()); - Account account = getAsyncJobMgr().getExecutorContext().getAccountDao().findById(snapshot.getAccountId()); + Account account = ApiDBUtils.findAccountById(snapshot.getAccountId()); if (account != null) { response.setAccountName(account.getAccountName()); response.setDomainId(account.getDomainId()); - response.setDomainName(getAsyncJobMgr().getExecutorContext().getManagementServer().findDomainIdById(account.getDomainId()).getName()); + response.setDomainName(ApiDBUtils.findDomainById(account.getDomainId()).getName()); } - VolumeVO volume = managementServer.findVolumeById(snapshot.getVolumeId()); + VolumeVO volume = ApiDBUtils.findVolumeById(snapshot.getVolumeId()); String snapshotTypeStr = SnapshotType.values()[snapshot.getSnapshotType()].name(); response.setSnapshotType(snapshotTypeStr); response.setVolumeId(snapshot.getVolumeId()); diff --git a/server/src/com/cloud/api/commands/DeployVMCmd.java b/server/src/com/cloud/api/commands/DeployVMCmd.java index 89247a38d8c..8032a46c41e 100644 --- a/server/src/com/cloud/api/commands/DeployVMCmd.java +++ b/server/src/com/cloud/api/commands/DeployVMCmd.java @@ -22,16 +22,18 @@ import java.util.List; import org.apache.log4j.Logger; +import com.cloud.api.ApiDBUtils; import com.cloud.api.BaseAsyncCmd; import com.cloud.api.BaseCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.response.UserVmResponse; +import com.cloud.offering.ServiceOffering; import com.cloud.serializer.SerializerHelper; -import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.VMTemplateVO; import com.cloud.user.Account; import com.cloud.user.User; +import com.cloud.user.UserContext; import com.cloud.uservm.UserVm; @Implementation(method="deployVirtualMachine") @@ -77,6 +79,9 @@ public class DeployVMCmd extends BaseAsyncCmd { @Parameter(name="zoneid", type=CommandType.LONG, required=true) private Long zoneId; + // unexposed parameter needed for serializing/deserializing the command + @Parameter(name="password", type=CommandType.STRING, expose=false) + private String password; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// @@ -126,6 +131,14 @@ public class DeployVMCmd extends BaseAsyncCmd { return zoneId; } + // not exposed parameter + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// @@ -149,7 +162,7 @@ public class DeployVMCmd extends BaseAsyncCmd { response.setName(userVm.getName()); response.setCreated(userVm.getCreated()); response.setZoneId(userVm.getDataCenterId()); - response.setZoneName(getManagementServer().findDataCenterById(userVm.getDataCenterId()).getName()); + response.setZoneName(ApiDBUtils.findZoneById(userVm.getDataCenterId()).getName()); response.setPrivateIp(userVm.getPrivateIpAddress()); response.setServiceOfferingId(userVm.getServiceOfferingId()); response.setHaEnable(userVm.isHaEnabled()); @@ -164,20 +177,25 @@ public class DeployVMCmd extends BaseAsyncCmd { response.setState(userVm.getState().toString()); } - VMTemplateVO template = managementServer.findTemplateById(userVm.getTemplateId()); + VMTemplateVO template = ApiDBUtils.findTemplateById(userVm.getTemplateId()); - Account acct = managementServer.findAccountById(Long.valueOf(userVm.getAccountId())); + Account acct = ApiDBUtils.findAccountById(Long.valueOf(userVm.getAccountId())); if (acct != null) { response.setAccountName(acct.getAccountName()); response.setDomainId(acct.getDomainId()); - response.setDomain(managementServer.findDomainIdById(acct.getDomainId()).getName()); + response.setDomainName(ApiDBUtils.findDomainById(acct.getDomainId()).getName()); } - - User userExecutingCmd = managementServer.getUser(userId); + + Long userId = UserContext.current().getUserId(); + if (userId == null) { + userId = User.UID_SYSTEM; + } + //this is for the case where the admin deploys a vm for a normal user - Account acctForUserExecutingCmd = managementServer.findAccountById(Long.valueOf(userExecutingCmd.getAccountId())); + User userExecutingCmd = ApiDBUtils.findUserById(userId); + Account acctForUserExecutingCmd = ApiDBUtils.findAccountById(Long.valueOf(userExecutingCmd.getAccountId())); if ((BaseCmd.isAdmin(acctForUserExecutingCmd.getType()) && (userVm.getHostId() != null)) || (BaseCmd.isAdmin(acct.getType()) && (userVm.getHostId() != null))) { - response.setHostName(managementServer.getHostBy(userVm.getHostId()).getName()); + response.setHostName(ApiDBUtils.findHostById(userVm.getHostId()).getName()); response.setHostId(userVm.getHostId()); } @@ -195,13 +213,13 @@ public class DeployVMCmd extends BaseAsyncCmd { } if (templatePasswordEnabled) { // FIXME: where will the password come from in this case? - response.setPassword(param.getPassword()); + response.setPassword(getPassword()); } // ISO Info Long isoId = userVm.getIsoId(); if (isoId != null) { - VMTemplateVO iso = getManagementServer().findTemplateById(isoId.longValue()); + VMTemplateVO iso = ApiDBUtils.findTemplateById(isoId.longValue()); if (iso != null) { response.setIsoId(isoId.longValue()); response.setIsoName(iso.getName()); @@ -221,7 +239,7 @@ public class DeployVMCmd extends BaseAsyncCmd { response.setPasswordEnabled(templatePasswordEnabled); } - ServiceOfferingVO offering = managementServer.findServiceOfferingById(userVm.getServiceOfferingId()); + ServiceOffering offering = ApiDBUtils.findServiceOfferingById(userVm.getServiceOfferingId()); response.setServiceOfferingId(userVm.getServiceOfferingId()); response.setServiceOfferingName(offering.getName()); @@ -229,7 +247,7 @@ public class DeployVMCmd extends BaseAsyncCmd { response.setCpuSpeed(offering.getSpeed()); response.setMemory(offering.getRamSize()); - response.setNetworkGroupList(managementServer.getNetworkGroupsNamesForVm(userVm.getId())); + response.setNetworkGroupList(ApiDBUtils.getNetworkGroupsNamesForVm(userVm.getId())); return SerializerHelper.toSerializedString(response); } diff --git a/server/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java b/server/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java index 8c484234d14..e765f606394 100644 --- a/server/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java +++ b/server/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java @@ -25,12 +25,14 @@ import java.util.Map; import org.apache.log4j.Logger; +import com.cloud.api.ApiDBUtils; import com.cloud.api.BaseCmd.Manager; import com.cloud.api.BaseListCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.response.FirewallRuleResponse; import com.cloud.network.FirewallRuleVO; +import com.cloud.network.IPAddressVO; import com.cloud.serializer.SerializerHelper; import com.cloud.server.Criteria; import com.cloud.vm.UserVmVO; @@ -70,6 +72,7 @@ public class ListPortForwardingRulesCmd extends BaseListCmd { public String getResponse() { List firewallRules = (List)getResponseObject(); Map userVmCache = new HashMap(); + IPAddressVO ipAddr = ApiDBUtils.findIpAddressById(ipAddress); List response = new ArrayList(); for (FirewallRuleVO fwRule : firewallRules) { @@ -83,10 +86,10 @@ public class ListPortForwardingRulesCmd extends BaseListCmd { UserVmVO userVM = userVmCache.get(fwRule.getPrivateIpAddress()); if (userVM == null) { Criteria c = new Criteria(); - c.addCriteria(Criteria.ACCOUNTID, new Object[] {addrOwner.getId()}); - c.addCriteria(Criteria.DATACENTERID, ipAddressVO.getDataCenterId()); + c.addCriteria(Criteria.ACCOUNTID, new Object[] {ipAddr.getAccountId()}); + c.addCriteria(Criteria.DATACENTERID, ipAddr.getDataCenterId()); c.addCriteria(Criteria.IPADDRESS, fwRule.getPrivateIpAddress()); - List userVMs = getManagementServer().searchForUserVMs(c); + List userVMs = ApiDBUtils.searchForUserVMs(c); if ((userVMs != null) && (userVMs.size() > 0)) { userVM = userVMs.get(0); diff --git a/server/src/com/cloud/api/commands/ListVMsCmd.java b/server/src/com/cloud/api/commands/ListVMsCmd.java index cc956a79276..6d9b644dabd 100644 --- a/server/src/com/cloud/api/commands/ListVMsCmd.java +++ b/server/src/com/cloud/api/commands/ListVMsCmd.java @@ -23,6 +23,7 @@ import java.util.List; import org.apache.log4j.Logger; +import com.cloud.api.ApiDBUtils; import com.cloud.api.BaseListCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; @@ -214,7 +215,7 @@ public class ListVMsCmd extends BaseListCmd { userVmResponse.setOsTypeId(userVm.getGuestOSId()); //network groups - userVmResponse.setNetworkGroupList(getManagementServer().getNetworkGroupsNamesForVm(userVm.getId())); + userVmResponse.setNetworkGroupList(ApiDBUtils.getNetworkGroupsNamesForVm(userVm.getId())); response.add(userVmResponse); } diff --git a/server/src/com/cloud/api/response/SnapshotResponse.java b/server/src/com/cloud/api/response/SnapshotResponse.java index e7ad60525cf..7e5bd6ca79b 100644 --- a/server/src/com/cloud/api/response/SnapshotResponse.java +++ b/server/src/com/cloud/api/response/SnapshotResponse.java @@ -33,7 +33,7 @@ public class SnapshotResponse implements ResponseObject { private Long domainId; @Param(name="domain") - private String domain; + private String domainName; @Param(name="snapshottype") private String snapshotType; @@ -86,12 +86,12 @@ public class SnapshotResponse implements ResponseObject { this.domainId = domainId; } - public String getDomain() { - return domain; + public String getDomainName() { + return domainName; } - public void setDomain(String domain) { - this.domain = domain; + public void setDomainName(String domainName) { + this.domainName = domainName; } public String getSnapshotType() { diff --git a/server/src/com/cloud/api/response/UserVmResponse.java b/server/src/com/cloud/api/response/UserVmResponse.java index aca85c958ac..a872df81fde 100644 --- a/server/src/com/cloud/api/response/UserVmResponse.java +++ b/server/src/com/cloud/api/response/UserVmResponse.java @@ -86,6 +86,9 @@ public class UserVmResponse implements ResponseObject { @Param(name="isoname") private String isoName; + @Param(name="isodisplaytext") + private String isoDisplayText; + @Param(name="serviceofferingid") private Long serviceOfferingId; @@ -116,6 +119,9 @@ public class UserVmResponse implements ResponseObject { @Param(name="networkgrouplist") private String networkGroupList; + @Param(name="password") + private String password; + @Param(name="jobid") private Long jobId; @@ -290,6 +296,14 @@ public class UserVmResponse implements ResponseObject { this.isoName = isoName; } + public String getIsoDisplayText() { + return isoDisplayText; + } + + public void setIsoDisplayText(String isoDisplayText) { + this.isoDisplayText = isoDisplayText; + } + public Long getServiceOfferingId() { return serviceOfferingId; } @@ -370,6 +384,14 @@ public class UserVmResponse implements ResponseObject { this.networkGroupList = networkGroupList; } + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + public Long getJobId() { return jobId; } diff --git a/server/src/com/cloud/async/AsyncJobManagerImpl.java b/server/src/com/cloud/async/AsyncJobManagerImpl.java index 41fe92a8340..9121defe4f3 100644 --- a/server/src/com/cloud/async/AsyncJobManagerImpl.java +++ b/server/src/com/cloud/async/AsyncJobManagerImpl.java @@ -144,11 +144,11 @@ public class AsyncJobManagerImpl implements AsyncJobManager { txt.rollback(); return; } - + job.setCompleteMsid(getMsid()); job.setStatus(jobStatus); job.setResultCode(resultCode); - + // reset attached object job.setInstanceType(null); job.setInstanceId(null); @@ -164,7 +164,7 @@ public class AsyncJobManagerImpl implements AsyncJobManager { txt.rollback(); } } - + @Override @DB public void updateAsyncJobStatus(long jobId, int processStatus, Object resultObject) { if(s_logger.isDebugEnabled()) @@ -194,7 +194,7 @@ public class AsyncJobManagerImpl implements AsyncJobManager { txt.rollback(); } } - + @Override @DB public void updateAsyncJobAttachment(long jobId, String instanceType, Long instanceId) { if(s_logger.isDebugEnabled()) @@ -204,27 +204,27 @@ public class AsyncJobManagerImpl implements AsyncJobManager { Transaction txt = Transaction.currentTxn(); try { txt.start(); - + AsyncJobVO job = _jobDao.createForUpdate(); job.setInstanceType(instanceType); job.setInstanceId(instanceId); job.setLastUpdated(DateUtil.currentGMTTime()); _jobDao.update(jobId, job); - + txt.commit(); } catch(Exception e) { s_logger.error("Unexpected exception while updating async job-" + jobId + " attachment: ", e); txt.rollback(); } } - + @Override public void syncAsyncJobExecution(long jobId, String syncObjType, long syncObjId) { if(s_logger.isDebugEnabled()) s_logger.debug("Sync job-" + jobId + " execution on object " + syncObjType + "." + syncObjId); SyncQueueVO queue = null; - + // to deal with temporary DB exceptions like DB deadlock/Lock-wait time out cased rollbacks // we retry five times until we throw an exception Random random = new Random(); @@ -246,9 +246,7 @@ public class AsyncJobManagerImpl implements AsyncJobManager { throw new CloudRuntimeException("Unable to insert queue item into database, DB is full?"); } } - - - + @Override @DB public AsyncJobResult queryAsyncJobResult(long jobId) { if(s_logger.isTraceEnabled()) diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 692c34514bb..e0c50087c7d 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -6756,13 +6756,6 @@ public class ManagementServerImpl implements ManagementServer { return null; } - @Override - public String getNetworkGroupsNamesForVm(long vmId) - { - - return _networkGroupMgr.getNetworkGroupsNamesForVm(vmId); - } - @Override public boolean checkLocalStorageConfigVal() {