From ebbd4008ad779fb0f296d1f6c1c8d31a821023eb Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Fri, 7 Jun 2013 18:15:55 -0700 Subject: [PATCH] zone creation complete once more --- api/src/com/cloud/agent/api/to/NetworkTO.java | 4 +- api/src/com/cloud/agent/api/to/NicTO.java | 10 ++-- .../cloud/deploy/DataCenterDeployment.java | 1 + .../api/response/AsyncJobResponse.java | 8 --- .../api/response/SystemVmResponse.java | 8 +-- .../cloudstack/context/CallContext.java | 59 ++++++++++--------- core/src/com/cloud/agent/api/StopAnswer.java | 7 --- .../cloudstack/vm/jobs/VmWorkJobVO.java | 7 ++- .../cloudstack/framework/jobs/AsyncJob.java | 2 + .../framework/jobs/impl/AsyncJobVO.java | 18 +++++- .../hypervisor/kvm/resource/OvsVifDriver.java | 2 +- .../xen/resource/CitrixResourceBase.java | 4 +- .../network/resource/MidoNetVifDriver.java | 2 +- .../com/cloud/api/ApiAsyncJobDispatcher.java | 2 +- server/src/com/cloud/api/ApiServer.java | 2 +- server/src/com/cloud/api/ApiServlet.java | 4 +- .../cloud/hypervisor/HypervisorGuruBase.java | 2 +- .../com/cloud/network/NetworkManagerImpl.java | 2 +- .../VirtualNetworkApplianceManagerImpl.java | 2 +- .../cloud/vm/VirtualMachineManagerImpl.java | 12 ++-- .../src/com/cloud/vm/VmWorkJobDispatcher.java | 2 +- server/test/com/cloud/vm/VmWorkTest.java | 31 +++++----- .../cloud/vm/VmWorkTestApiJobDispatcher.java | 2 +- server/test/com/cloud/vm/dao/VmDaoTest.java | 15 ++--- setup/db/db/schema-410to420.sql | 2 + .../com/cloud/utils/db/GenericDaoBase.java | 11 ++-- 26 files changed, 117 insertions(+), 104 deletions(-) diff --git a/api/src/com/cloud/agent/api/to/NetworkTO.java b/api/src/com/cloud/agent/api/to/NetworkTO.java index 3edd4c0f937..4790c91a4c7 100644 --- a/api/src/com/cloud/agent/api/to/NetworkTO.java +++ b/api/src/com/cloud/agent/api/to/NetworkTO.java @@ -42,11 +42,11 @@ public class NetworkTO { public NetworkTO() { } - public String getUuid() { + public String getNicUuid() { return uuid; } - public void setUuid(String uuid) { + public void setNicUuid(String uuid) { this.uuid = uuid; } diff --git a/api/src/com/cloud/agent/api/to/NicTO.java b/api/src/com/cloud/agent/api/to/NicTO.java index ccebe115f97..29f04ae113b 100644 --- a/api/src/com/cloud/agent/api/to/NicTO.java +++ b/api/src/com/cloud/agent/api/to/NicTO.java @@ -23,7 +23,7 @@ public class NicTO extends NetworkTO { Integer networkRateMbps; Integer networkRateMulticastMbps; boolean defaultNic; - String uuid; + String nicUuid; List nicSecIps; public NicTO() { @@ -59,13 +59,13 @@ public class NicTO extends NetworkTO { } @Override - public String getUuid() { - return uuid; + public String getNicUuid() { + return nicUuid; } @Override - public void setUuid(String uuid) { - this.uuid = uuid; + public void setNicUuid(String uuid) { + this.nicUuid = uuid; } @Override diff --git a/api/src/com/cloud/deploy/DataCenterDeployment.java b/api/src/com/cloud/deploy/DataCenterDeployment.java index d709ce7a541..b17bae16c98 100644 --- a/api/src/com/cloud/deploy/DataCenterDeployment.java +++ b/api/src/com/cloud/deploy/DataCenterDeployment.java @@ -54,6 +54,7 @@ public class DataCenterDeployment implements DeploymentPlan { _poolId = poolId; _physicalNetworkId = physicalNetworkId; _context = context; + _avoids = new ExcludeList(); } @Override diff --git a/api/src/org/apache/cloudstack/api/response/AsyncJobResponse.java b/api/src/org/apache/cloudstack/api/response/AsyncJobResponse.java index dadcf6cf753..622c7c02fbd 100644 --- a/api/src/org/apache/cloudstack/api/response/AsyncJobResponse.java +++ b/api/src/org/apache/cloudstack/api/response/AsyncJobResponse.java @@ -40,9 +40,6 @@ public class AsyncJobResponse extends BaseResponse { @SerializedName("cmd") @Param(description="the async command executed") private String cmd; - @SerializedName("jobstatus") @Param(description="the current job status-should be 0 for PENDING") - private Integer jobStatus; - @SerializedName("jobprocstatus") @Param(description="the progress information of the PENDING job") private Integer jobProcStatus; @@ -76,11 +73,6 @@ public class AsyncJobResponse extends BaseResponse { this.cmd = cmd; } - @Override - public void setJobStatus(Integer jobStatus) { - this.jobStatus = jobStatus; - } - public void setJobProcStatus(Integer jobProcStatus) { this.jobProcStatus = jobProcStatus; } diff --git a/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java b/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java index aff553498f4..3f1d955763d 100644 --- a/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java +++ b/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java @@ -35,12 +35,6 @@ public class SystemVmResponse extends BaseResponse { @SerializedName("systemvmtype") @Param(description="the system VM type") private String systemVmType; - @SerializedName("jobid") @Param(description="the job ID associated with the system VM. This is only displayed if the router listed is part of a currently running asynchronous job.") - private String jobId; - - @SerializedName("jobstatus") @Param(description="the job status associated with the system VM. This is only displayed if the router listed is part of a currently running asynchronous job.") - private Integer jobStatus; - @SerializedName("zoneid") @Param(description="the Zone ID for the system VM") private String zoneId; @@ -119,7 +113,7 @@ public class SystemVmResponse extends BaseResponse { @Override public String getObjectId() { - return this.getId(); + return getId(); } diff --git a/api/src/org/apache/cloudstack/context/CallContext.java b/api/src/org/apache/cloudstack/context/CallContext.java index c804c87e164..66108968ddf 100644 --- a/api/src/org/apache/cloudstack/context/CallContext.java +++ b/api/src/org/apache/cloudstack/context/CallContext.java @@ -18,6 +18,7 @@ package org.apache.cloudstack.context; import java.util.HashMap; import java.util.Map; +import java.util.UUID; import org.apache.log4j.Logger; import org.apache.log4j.NDC; @@ -26,6 +27,7 @@ import com.cloud.dao.EntityManager; import com.cloud.exception.CloudAuthenticationException; import com.cloud.user.Account; import com.cloud.user.User; +import com.cloud.utils.UuidUtils; import com.cloud.utils.exception.CloudRuntimeException; /** @@ -37,7 +39,7 @@ public class CallContext { private static final Logger s_logger = Logger.getLogger(CallContext.class); private static ThreadLocal s_currentContext = new ThreadLocal(); - private String sessionId; + private String contextId; private Account account; private long startEventId = 0; private String eventDetails; @@ -53,10 +55,10 @@ public class CallContext { public CallContext() { } - protected CallContext(User user, Account account, String sessionId) { + protected CallContext(User user, Account account, String contextId) { this.user = user; this.account = account; - this.sessionId = sessionId; + this.contextId = contextId; } public void putContextParameter(String key, Object value) { @@ -75,8 +77,8 @@ public class CallContext { return user; } - public String getSessionId() { - return sessionId; + public String getContextId() { + return contextId; } public Account getCallingAccount() { @@ -87,17 +89,18 @@ public class CallContext { return s_currentContext.get(); } - public static CallContext register(User callingUser, Account callingAccount, String sessionId) { + public static CallContext register(User callingUser, Account callingAccount, String contextId) { assert s_currentContext.get() == null : "There's a context already so what does this new register context mean? " + s_currentContext.get().toString(); if (s_currentContext.get() != null) { // FIXME: This should be removed soon. I added this check only to surface all the places that have this problem. throw new CloudRuntimeException("There's a context already so what does this new register context mean? " + s_currentContext.get().toString()); } - CallContext callingContext = new CallContext(callingUser, callingAccount, sessionId); - s_currentContext.set(callingContext); - if (sessionId != null) { - NDC.push("job-" + sessionId); + if (contextId == null) { + contextId = UUID.randomUUID().toString(); } - s_logger.debug("Setting calling context: " + s_currentContext.get()); + CallContext callingContext = new CallContext(callingUser, callingAccount, contextId); + s_currentContext.set(callingContext); + NDC.push("ctx-" + UuidUtils.first(contextId)); + s_logger.debug("Setting calling context: " + callingContext); return callingContext; } @@ -111,7 +114,7 @@ public class CallContext { return context; } - public static CallContext register(String callingUserUuid, String callingAccountUuid, String sessionId) { + public static CallContext register(String callingUserUuid, String callingAccountUuid, String contextId) { Account account = s_entityMgr.findByUuid(Account.class, callingAccountUuid); if (account == null) { throw new CloudAuthenticationException("The account is no longer current.").add(Account.class, callingAccountUuid); @@ -121,10 +124,10 @@ public class CallContext { if (user == null) { throw new CloudAuthenticationException("The user is no longer current.").add(User.class, callingUserUuid); } - return register(user, account, sessionId); + return register(user, account, contextId); } - public static CallContext register(long callingUserId, long callingAccountId, String sessionId) throws CloudAuthenticationException { + public static CallContext register(long callingUserId, long callingAccountId, String contextId) throws CloudAuthenticationException { Account account = s_entityMgr.findById(Account.class, callingAccountId); if (account == null) { throw new CloudAuthenticationException("The account is no longer current.").add(Account.class, Long.toString(callingAccountId)); @@ -133,15 +136,15 @@ public class CallContext { if (user == null) { throw new CloudAuthenticationException("The user is no longer current.").add(User.class, Long.toString(callingUserId)); } - return register(user, account, sessionId); + return register(user, account, contextId); } - public static CallContext register(long callingUserId, Account callingAccount, String sessionId, boolean apiServer) { + public static CallContext register(long callingUserId, Account callingAccount, String contextId, boolean apiServer) { User user = s_entityMgr.findById(User.class, callingUserId); if (user == null) { throw new CloudAuthenticationException("The user is no longer current.").add(User.class, Long.toString(callingUserId)); } - return register(user, callingAccount, sessionId); + return register(user, callingAccount, contextId); } public static CallContext unregister() { @@ -152,17 +155,15 @@ public class CallContext { } s_currentContext.remove(); s_logger.debug("Context removed " + context); - String sessionId = context.getSessionId(); - if (sessionId != null) { - String sessionIdOnStack = null; - String sessionIdPushedToNDC = "job-" + sessionId; - while ((sessionIdOnStack = NDC.pop()) != null) { - if (sessionIdPushedToNDC.equals(sessionIdOnStack)) { - break; - } - if (s_logger.isTraceEnabled()) { - s_logger.trace("Popping from NDC: " + sessionId); - } + String contextId = context.getContextId(); + String sessionIdOnStack = null; + String sessionIdPushedToNDC = "ctx-" + UuidUtils.first(contextId); + while ((sessionIdOnStack = NDC.pop()) != null) { + if (sessionIdPushedToNDC.equals(sessionIdOnStack)) { + break; + } + if (s_logger.isTraceEnabled()) { + s_logger.trace("Popping from NDC: " + contextId); } } return context; @@ -200,7 +201,7 @@ public class CallContext { public String toString() { return new StringBuffer("CallContext[acct=").append(account.getId()) .append("; user=").append(user.getId()) - .append("; session=").append(sessionId) + .append("; session=").append(contextId) .append("]").toString(); } } diff --git a/core/src/com/cloud/agent/api/StopAnswer.java b/core/src/com/cloud/agent/api/StopAnswer.java index 1111fed1375..034534ae3d9 100755 --- a/core/src/com/cloud/agent/api/StopAnswer.java +++ b/core/src/com/cloud/agent/api/StopAnswer.java @@ -17,8 +17,6 @@ package com.cloud.agent.api; public class StopAnswer extends RebootAnswer { - Integer vncPort; - protected StopAnswer() { } @@ -37,9 +35,4 @@ public class StopAnswer extends RebootAnswer { super(cmd, e); } - @Override - public Integer getVncPort() { - return vncPort; - } - } diff --git a/engine/schema/src/org/apache/cloudstack/vm/jobs/VmWorkJobVO.java b/engine/schema/src/org/apache/cloudstack/vm/jobs/VmWorkJobVO.java index f4dd3959b37..ca52263917b 100644 --- a/engine/schema/src/org/apache/cloudstack/vm/jobs/VmWorkJobVO.java +++ b/engine/schema/src/org/apache/cloudstack/vm/jobs/VmWorkJobVO.java @@ -27,7 +27,6 @@ import javax.persistence.Table; import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO; import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VirtualMachine.Type; @Entity @@ -56,7 +55,11 @@ public class VmWorkJobVO extends AsyncJobVO { @Column(name="vm_instance_id") long vmInstanceId; - public VmWorkJobVO() { + protected VmWorkJobVO() { + } + + public VmWorkJobVO(String related) { + setRelated(related); } public Step getStep() { diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJob.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJob.java index 14d6479a2fa..8f52073cc4a 100644 --- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJob.java +++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJob.java @@ -101,4 +101,6 @@ public interface AsyncJob extends Job { SyncQueueItem getSyncSource(); void setSyncSource(SyncQueueItem item); + + String getRelated(); } diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobVO.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobVO.java index bb7d8726a49..13b0d126543 100644 --- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobVO.java +++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobVO.java @@ -71,6 +71,9 @@ public class AsyncJobVO implements AsyncJob, Job { @Column(name="job_cmd_ver") private int cmdVersion; + @Column(name = "related") + private String related; + @Column(name="job_cmd_info", length=65535) private String cmdInfo; @@ -123,14 +126,16 @@ public class AsyncJobVO implements AsyncJob, Job { public AsyncJobVO() { uuid = UUID.randomUUID().toString(); + related = UUID.randomUUID().toString(); } - public AsyncJobVO(String uuid, long userId, long accountId, String cmd, String cmdInfo, Long instanceId, String instanceType) { + public AsyncJobVO(String related, long userId, long accountId, String cmd, String cmdInfo, Long instanceId, String instanceType) { this.userId = userId; this.accountId = accountId; this.cmd = cmd; this.cmdInfo = cmdInfo; - this.uuid = uuid; + uuid = UUID.randomUUID().toString(); + this.related = related; this.instanceId = instanceId; this.instanceType = instanceType; } @@ -149,6 +154,15 @@ public class AsyncJobVO implements AsyncJob, Job { return UuidUtils.first(uuid); } + public void setRelated(String related) { + this.related = related; + } + + @Override + public String getRelated() { + return related; + } + @Override public String getType() { return type; diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/OvsVifDriver.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/OvsVifDriver.java index eac32485e53..3f153a00f65 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/OvsVifDriver.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/OvsVifDriver.java @@ -93,7 +93,7 @@ public class OvsVifDriver extends VifDriverBase { } } else if (nic.getBroadcastType() == Networks.BroadcastDomainType.Lswitch) { s_logger.debug("nic " + nic + " needs to be connected to LogicalSwitch " + logicalSwitchUuid); - intf.setVirtualPortInterfaceId(nic.getUuid()); + intf.setVirtualPortInterfaceId(nic.getNicUuid()); String brName = (trafficLabel != null && !trafficLabel.isEmpty()) ? _pifs.get(trafficLabel) : _pifs.get("private"); intf.defBridgeNet(brName, null, nic.getMac(), getGuestNicModel(guestOsType)); } diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 8f6eb8daf86..03d86d772af 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -1055,7 +1055,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } protected VIF createVif(Connection conn, String vmName, VM vm, NicTO nic) throws XmlRpcException, XenAPIException { - assert(nic.getUuid() != null) : "Nic should have a uuid value"; + assert(nic.getNicUuid() != null) : "Nic should have a uuid value"; if (s_logger.isDebugEnabled()) { s_logger.debug("Creating VIF for " + vmName + " on nic " + nic); @@ -1067,7 +1067,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe // Nicira needs these IDs to find the NIC vifr.otherConfig = new HashMap(); - vifr.otherConfig.put("nicira-iface-id", nic.getUuid()); + vifr.otherConfig.put("nicira-iface-id", nic.getNicUuid()); vifr.otherConfig.put("nicira-vm-id", vm.getUuid(conn)); vifr.network = getNetwork(conn, nic); diff --git a/plugins/network-elements/midonet/src/com/cloud/network/resource/MidoNetVifDriver.java b/plugins/network-elements/midonet/src/com/cloud/network/resource/MidoNetVifDriver.java index 3c7c23d669f..96f2549f638 100644 --- a/plugins/network-elements/midonet/src/com/cloud/network/resource/MidoNetVifDriver.java +++ b/plugins/network-elements/midonet/src/com/cloud/network/resource/MidoNetVifDriver.java @@ -145,7 +145,7 @@ public class MidoNetVifDriver extends VifDriverBase { if (b.getName().equals(netName)) { for (BridgePort p : b.getPorts()) { UUID pvif = p.getVifId(); - if (pvif != null && p.getVifId().toString().equals(nic.getUuid())){ + if (pvif != null && p.getVifId().toString().equals(nic.getNicUuid())){ getMyHost(api).addHostInterfacePort() .interfaceName(tapName) .portId(p.getId()) diff --git a/server/src/com/cloud/api/ApiAsyncJobDispatcher.java b/server/src/com/cloud/api/ApiAsyncJobDispatcher.java index 081bcc139ab..c442559fd37 100644 --- a/server/src/com/cloud/api/ApiAsyncJobDispatcher.java +++ b/server/src/com/cloud/api/ApiAsyncJobDispatcher.java @@ -87,7 +87,7 @@ public class ApiAsyncJobDispatcher extends AdapterBase implements AsyncJobDispat accountObject = _accountDao.findById(Long.parseLong(acctIdStr)); } - CallContext.register(userId, accountObject, "job-" + job.getShortUuid(), false); + CallContext.register(userId, accountObject, job.getRelated(), false); try { // dispatch could ultimately queue the job _dispatcher.dispatch(cmdObj, params, true); diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java index 28638035fff..11e873f80e7 100755 --- a/server/src/com/cloud/api/ApiServer.java +++ b/server/src/com/cloud/api/ApiServer.java @@ -520,7 +520,7 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer params.put("ctxStartEventId", String.valueOf(startEventId)); Long instanceId = (objectId == null) ? asyncCmd.getInstanceId() : objectId; - AsyncJobVO job = new AsyncJobVO(ctx.getSessionId(), callerUserId, caller.getId(), cmdObj.getClass().getName(), + AsyncJobVO job = new AsyncJobVO(ctx.getContextId(), callerUserId, caller.getId(), cmdObj.getClass().getName(), ApiGsonHelper.getBuilder().create().toJson(params), instanceId, asyncCmd.getInstanceType() != null ? asyncCmd.getInstanceType().toString() : null); job.setDispatcher(_asyncDispatcher.getName()); diff --git a/server/src/com/cloud/api/ApiServlet.java b/server/src/com/cloud/api/ApiServlet.java index 0ac002d3bf7..7afb7973cc1 100755 --- a/server/src/com/cloud/api/ApiServlet.java +++ b/server/src/com/cloud/api/ApiServlet.java @@ -266,7 +266,7 @@ public class ApiServlet extends HttpServlet { writeResponse(resp, serializedResponse, HttpServletResponse.SC_BAD_REQUEST, responseType); return; } - CallContext.register(userId, ((Account)accountObj).getId(), session.getId()); + CallContext.register(userId, ((Account)accountObj).getId(), null); } else { // Invalidate the session to ensure we won't allow a request across management server // restarts if the userId was serialized to the stored session @@ -332,7 +332,7 @@ public class ApiServlet extends HttpServlet { s_logger.debug("===END=== " + StringUtils.cleanString(reqStr)); } // cleanup user context to prevent from being peeked in other request context ??? - CallContext.unregister(); + CallContext.unregister(); } catch(Throwable e) { s_logger.error("Really unexpected exception", e); } diff --git a/server/src/com/cloud/hypervisor/HypervisorGuruBase.java b/server/src/com/cloud/hypervisor/HypervisorGuruBase.java index e18c164ed36..80575da85b5 100644 --- a/server/src/com/cloud/hypervisor/HypervisorGuruBase.java +++ b/server/src/com/cloud/hypervisor/HypervisorGuruBase.java @@ -73,7 +73,7 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis // Workaround to make sure the TO has the UUID we need for Niciri integration NicVO nicVO = _nicDao.findById(profile.getId()); - to.setUuid(nicVO.getUuid()); + to.setNicUuid(nicVO.getUuid()); //check whether the this nic has secondary ip addresses set //set nic secondary ip address in NicTO which are used for security group // configuration. Use full when vm stop/start diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 69a39a305f4..4ce8c6dcfdf 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -1771,7 +1771,7 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L Integer networkRate = _networkModel.getNetworkRate(config.getId(), null); to.setNetworkRateMbps(networkRate); - to.setUuid(config.getUuid()); + to.setNicUuid(config.getUuid()); return to; } diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index ac61da98c84..df1687bf402 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -1282,7 +1282,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V @Override public void run() { try { - CallContext.register(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, null); + CallContext.registerOnceOnly(); while (true) { try { Long networkId = _vrUpdateQueue.take(); diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index ec9c3ddd14c..1774e1b230f 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -351,7 +351,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac @Override public VirtualMachineGuru getVmGuru(VirtualMachine vm) { - return _vmGurus.values().iterator().next(); + return _vmGurus.get(vm.getType()); } @Override @@ -540,6 +540,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac RootVolumeSearch = _entityMgr.createSearchBuilder(VolumeVO.class); VolumeVO rvsEntity = RootVolumeSearch.entity(); RootVolumeSearch.and(rvsEntity.getVolumeType(), SearchCriteria.Op.EQ).values(Volume.Type.ROOT) + .and(rvsEntity.getState(), SearchCriteria.Op.EQ).values(Volume.State.Ready) .and(rvsEntity.getInstanceId(), SearchCriteria.Op.EQ, "instance") .and(rvsEntity.getDeviceId(), SearchCriteria.Op.EQ).values(0) .done(); @@ -761,7 +762,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac assert(pendingWorkJobs.size() == 1); workJob = pendingWorkJobs.get(0); } else { - workJob = new VmWorkJobVO(); + workJob = new VmWorkJobVO(context.getContextId()); workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER); workJob.setCmd(VmWorkJobDispatcher.Start); @@ -848,6 +849,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac if (vol.isRecreatable() && volTemplateId != null && vm.getTemplateId() != -1 && volTemplateId.longValue() != vm.getTemplateId()) { job.log(s_logger, "Recreating" + vol + " of " + vm + " because its template has changed."); + plan.setPoolId(null); } else { StoragePool pool = (StoragePool)dataStoreMgr.getPrimaryDataStore(vol.getPoolId()); Long rootVolPodId = pool.getPodId(); @@ -1176,6 +1178,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac @Override public void advanceStop(final String vmUuid, boolean forced, User user, Account account) throws ResourceUnavailableException, OperationTimedoutException, ConcurrentOperationException { + CallContext context = CallContext.current(); final VMInstanceVO vm = _vmDao.findByUuid(vmUuid); VmWorkJobVO workJob = null; Transaction txn = Transaction.currentTxn(); @@ -1191,7 +1194,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac assert(pendingWorkJobs.size() == 1); workJob = pendingWorkJobs.get(0); } else { - workJob = new VmWorkJobVO(); + workJob = new VmWorkJobVO(context.getContextId()); workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER); workJob.setCmd(VmWorkJobDispatcher.Stop); @@ -1953,6 +1956,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac public VirtualMachine migrateWithStorage(String vmUuid, long srcHostId, long destHostId, Map volumeToPool) throws ResourceUnavailableException, ConcurrentOperationException, ManagementServerException, VirtualMachineMigrationException { + CallContext context = CallContext.current(); VMInstanceVO vm = _vmDao.findByUuid(vmUuid); HostVO srcHost = _hostDao.findById(srcHostId); @@ -1989,7 +1993,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType()); VirtualMachineTO to = hvGuru.implement(profile); - VmWorkJobVO work = new VmWorkJobVO(); + VmWorkJobVO work = new VmWorkJobVO(context.getContextId()); // VmWorkJobVO work = new VmWorkJobVO(UUID.randomUUID().toString(), _nodeId, State.Migrating, vm.getType(), vm.getId()); // work.setStep(Step.Prepare); // work.setResourceType(ItWorkVO.ResourceType.Host); diff --git a/server/src/com/cloud/vm/VmWorkJobDispatcher.java b/server/src/com/cloud/vm/VmWorkJobDispatcher.java index fa33ecd38d5..dcb91d24b9e 100644 --- a/server/src/com/cloud/vm/VmWorkJobDispatcher.java +++ b/server/src/com/cloud/vm/VmWorkJobDispatcher.java @@ -59,7 +59,7 @@ public class VmWorkJobDispatcher extends AdapterBase implements AsyncJobDispatch work = (VmWork)ApiSerializerHelper.fromSerializedString(job.getCmdInfo()); assert(work != null); - CallContext context = CallContext.register(work.getUserId(), work.getAccountId(), "job-" + job.getShortUuid()); + CallContext.register(work.getUserId(), work.getAccountId(), job.getRelated()); VMInstanceVO vm = _instanceDao.findById(work.getVmId()); if (vm == null) { diff --git a/server/test/com/cloud/vm/VmWorkTest.java b/server/test/com/cloud/vm/VmWorkTest.java index d236cc367de..4a6ccb8cb5f 100644 --- a/server/test/com/cloud/vm/VmWorkTest.java +++ b/server/test/com/cloud/vm/VmWorkTest.java @@ -20,9 +20,12 @@ import java.sql.SQLException; import java.sql.Statement; import java.util.HashMap; import java.util.Map; +import java.util.UUID; import javax.inject.Inject; +import junit.framework.TestCase; + import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -32,7 +35,14 @@ import org.mockito.Mockito; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import junit.framework.TestCase; +import com.google.gson.Gson; + +import org.apache.cloudstack.framework.jobs.AsyncJobManager; +import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO; +import org.apache.cloudstack.framework.jobs.impl.JobSerializerHelper; +import org.apache.cloudstack.vm.jobs.VmWorkJobDao; +import org.apache.cloudstack.vm.jobs.VmWorkJobVO; +import org.apache.cloudstack.vm.jobs.VmWorkJobVO.Step; import com.cloud.api.ApiSerializerHelper; import com.cloud.cluster.ClusterManager; @@ -45,14 +55,6 @@ import com.cloud.utils.LogUtils; import com.cloud.utils.Predicate; import com.cloud.utils.component.ComponentContext; import com.cloud.utils.db.Transaction; -import com.google.gson.Gson; - -import org.apache.cloudstack.framework.jobs.AsyncJobManager; -import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO; -import org.apache.cloudstack.framework.jobs.impl.JobSerializerHelper; -import org.apache.cloudstack.vm.jobs.VmWorkJobDao; -import org.apache.cloudstack.vm.jobs.VmWorkJobVO; -import org.apache.cloudstack.vm.jobs.VmWorkJobVO.Step; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:/VmWorkTestContext.xml") @@ -90,10 +92,11 @@ public class VmWorkTest extends TestCase { } } - @After - public void tearDown() { - Transaction.currentTxn().close(); - } + @Override + @After + public void tearDown() { + Transaction.currentTxn().close(); + } @Test public void testDeployPlanSerialization() { @@ -122,7 +125,7 @@ public class VmWorkTest extends TestCase { } public void testVmWorkDispatcher() { - VmWorkJobVO workJob = new VmWorkJobVO(); + VmWorkJobVO workJob = new VmWorkJobVO(UUID.randomUUID().toString()); workJob.setDispatcher("VmWorkJobDispatcher"); workJob.setCmd("doVmWorkStart"); workJob.setAccountId(1L); diff --git a/server/test/com/cloud/vm/VmWorkTestApiJobDispatcher.java b/server/test/com/cloud/vm/VmWorkTestApiJobDispatcher.java index 064fab7f839..4e7d90c77ba 100644 --- a/server/test/com/cloud/vm/VmWorkTestApiJobDispatcher.java +++ b/server/test/com/cloud/vm/VmWorkTestApiJobDispatcher.java @@ -54,7 +54,7 @@ public class VmWorkTestApiJobDispatcher extends AdapterBase implements AsyncJobD } } - VmWorkJobVO workJob = new VmWorkJobVO(); + VmWorkJobVO workJob = new VmWorkJobVO(job.getRelated()); workJob.setDispatcher("TestWorkJobDispatcher"); workJob.setCmd(VmWorkJobDispatcher.Start); diff --git a/server/test/com/cloud/vm/dao/VmDaoTest.java b/server/test/com/cloud/vm/dao/VmDaoTest.java index d9819168b3d..72c04b1e71b 100644 --- a/server/test/com/cloud/vm/dao/VmDaoTest.java +++ b/server/test/com/cloud/vm/dao/VmDaoTest.java @@ -19,9 +19,13 @@ package com.cloud.vm.dao; import java.sql.SQLException; import java.sql.Statement; import java.util.List; +import java.util.UUID; import javax.inject.Inject; +import junit.framework.Assert; +import junit.framework.TestCase; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -38,9 +42,6 @@ import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; -import junit.framework.Assert; -import junit.framework.TestCase; - @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:/vmdaoTestContext.xml") public class VmDaoTest extends TestCase { @@ -76,11 +77,11 @@ public class VmDaoTest extends TestCase { @Test public void testPowerStateUpdate() { - UserVmVO userVmInstance = new UserVmVO(1L, "Dummy", "DummyInstance", + UserVmVO userVmInstance = new UserVmVO(1L, "Dummy", "DummyInstance", 1L, HypervisorType.Any, 1L, true, false, 1L, 1L, 1L, null, null, null); userVmDao.persist(userVmInstance); - userVmInstance = new UserVmVO(2L, "Dummy2", "DummyInstance2", + userVmInstance = new UserVmVO(2L, "Dummy2", "DummyInstance2", 1L, HypervisorType.Any, 1L, true, false, 1L, 1L, 1L, null, null, null); userVmDao.persist(userVmInstance); @@ -147,7 +148,7 @@ public class VmDaoTest extends TestCase { @Test public void testVmWork() { - VmWorkJobVO workJob = new VmWorkJobVO(); + VmWorkJobVO workJob = new VmWorkJobVO(UUID.randomUUID().toString()); workJob.setAccountId(1); workJob.setUserId(1L); workJob.setCmd("StartVM"); @@ -158,7 +159,7 @@ public class VmDaoTest extends TestCase { workJobDao.persist(workJob); - VmWorkJobVO workJob2 = new VmWorkJobVO(); + VmWorkJobVO workJob2 = new VmWorkJobVO(UUID.randomUUID().toString()); workJob2.setAccountId(1); workJob2.setUserId(1L); workJob2.setCmd("StopVM"); diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql index 6517cc4d71d..0cf7356e352 100644 --- a/setup/db/db/schema-410to420.sql +++ b/setup/db/db/schema-410to420.sql @@ -83,6 +83,8 @@ CREATE TABLE `cloud`.`image_data_store` ( PRIMARY KEY(`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +ALTER TABLE `cloud`.`async_job` ADD COLUMN `related` CHAR(40) NOT NULL; + ALTER TABLE `cloud`.`vm_template` ADD COLUMN `image_data_store_id` bigint unsigned; ALTER TABLE `cloud`.`service_offering` ADD COLUMN `is_volatile` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if the vm needs to be volatile, i.e., on every reboot of vm from API root disk is discarded and creates a new root disk'; diff --git a/utils/src/com/cloud/utils/db/GenericDaoBase.java b/utils/src/com/cloud/utils/db/GenericDaoBase.java index f0fc7006003..9e91ef66d85 100755 --- a/utils/src/com/cloud/utils/db/GenericDaoBase.java +++ b/utils/src/com/cloud/utils/db/GenericDaoBase.java @@ -68,7 +68,6 @@ import com.cloud.utils.DateUtil; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.Ternary; -import com.cloud.utils.component.ComponentContext; import com.cloud.utils.component.ComponentLifecycle; import com.cloud.utils.component.ComponentLifecycleBase; import com.cloud.utils.component.ComponentMethodInterceptable; @@ -130,8 +129,8 @@ public abstract class GenericDaoBase extends Compone protected Field[] _embeddedFields; // This is private on purpose. Everyone should use createPartialSelectSql() - private Pair _partialSelectSql; - private Pair _partialQueryCacheSelectSql; + private final Pair _partialSelectSql; + private final Pair _partialQueryCacheSelectSql; protected StringBuilder _discriminatorClause; protected Map _discriminatorValues; protected String _selectByIdSql; @@ -178,6 +177,7 @@ public abstract class GenericDaoBase extends Compone return builder; } + @Override public Map getAllAttributes() { return _allAttributes; } @@ -351,7 +351,7 @@ public abstract class GenericDaoBase extends Compone } @Override - public List searchIncludingRemoved(SearchCriteria sc, final Filter filter, final Boolean lock, + public List searchIncludingRemoved(SearchCriteria sc, final Filter filter, final Boolean lock, final boolean cache, final boolean enable_query_cache) { String clause = sc != null ? sc.getWhereClause() : null; if (clause != null && clause.length() == 0) { @@ -420,6 +420,9 @@ public abstract class GenericDaoBase extends Compone @Override @SuppressWarnings("unchecked") public List customSearchIncludingRemoved(SearchCriteria sc, final Filter filter) { + if (sc.isSelectAll()) { + return (List)searchIncludingRemoved((SearchCriteria)sc, filter, null, false); + } String clause = sc != null ? sc.getWhereClause() : null; if (clause != null && clause.length() == 0) { clause = null;