From 37c3451aaee5ca8ae385cd62a1b9f37cc44ad3fe Mon Sep 17 00:00:00 2001 From: Rajani Karuturi Date: Mon, 7 Sep 2015 17:12:49 +0530 Subject: [PATCH 1/5] CLOUDSTACK-8816 Fixed entityUuid missing in some cases is events context parameters is Map. This has been used interchangeably with String and class object resulting the param value not being available in some cases if its put with object and get with class.forName() made the put and get consistent by using Object as key everywhere. --- server/src/com/cloud/api/ApiServer.java | 15 ++++---- .../api/dispatch/ParamProcessWorker.java | 4 +- .../src/com/cloud/event/ActionEventUtils.java | 38 ++++--------------- .../storage/snapshot/SnapshotManagerImpl.java | 2 +- .../src/com/cloud/vm/UserVmManagerImpl.java | 2 +- 5 files changed, 18 insertions(+), 43 deletions(-) diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java index 4da8b1e1be8..1459dc28325 100644 --- a/server/src/com/cloud/api/ApiServer.java +++ b/server/src/com/cloud/api/ApiServer.java @@ -277,11 +277,10 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer } } // For some reason, the instanceType / instanceId are not abstract, which means we may get null values. - org.apache.cloudstack.framework.events.Event event = new org.apache.cloudstack.framework.events.Event( - "management-server", - EventCategory.ASYNC_JOB_CHANGE_EVENT.getName(), - jobEvent, - (job.getInstanceType() != null ? job.getInstanceType().toString() : "unknown"), null); + String instanceType = job.getInstanceType() != null ? job.getInstanceType() : "unknown"; + String instanceUuid = job.getInstanceId() != null ? ApiDBUtils.findJobInstanceUuid(job) : ""; + org.apache.cloudstack.framework.events.Event event = new org.apache.cloudstack.framework.events.Event("management-server", EventCategory.ASYNC_JOB_CHANGE_EVENT.getName(), + jobEvent, instanceType, instanceUuid); Map eventDescription = new HashMap(); eventDescription.put("command", job.getCmd()); @@ -289,8 +288,8 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer eventDescription.put("account", jobOwner.getUuid()); eventDescription.put("processStatus", "" + job.getProcessStatus()); eventDescription.put("resultCode", "" + job.getResultCode()); - eventDescription.put("instanceUuid", (job.getInstanceId() != null ? ApiDBUtils.findJobInstanceUuid(job) : "" ) ); - eventDescription.put("instanceType", (job.getInstanceType() != null ? job.getInstanceType().toString() : "unknown")); + eventDescription.put("instanceUuid", instanceUuid); + eventDescription.put("instanceType", instanceType); eventDescription.put("commandEventType", cmdEventType); eventDescription.put("jobId", job.getUuid()); eventDescription.put("jobResult", job.getResult()); @@ -638,7 +637,7 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer params.put("id", objectId.toString()); Class entityClass = EventTypes.getEntityClassForEvent(createCmd.getEventType()); if (entityClass != null) - ctx.putContextParameter(entityClass.getName(), objectUuid); + ctx.putContextParameter(entityClass, objectUuid); } else { // Extract the uuid before params are processed and id reflects internal db id objectUuid = params.get(ApiConstants.ID); diff --git a/server/src/com/cloud/api/dispatch/ParamProcessWorker.java b/server/src/com/cloud/api/dispatch/ParamProcessWorker.java index eb3b77a5fa5..3c81ff6b46c 100644 --- a/server/src/com/cloud/api/dispatch/ParamProcessWorker.java +++ b/server/src/com/cloud/api/dispatch/ParamProcessWorker.java @@ -410,7 +410,7 @@ public class ParamProcessWorker implements DispatchWorker { if (internalId != null){ // Populate CallContext for each of the entity. for (final Class entity : entities) { - CallContext.current().putContextParameter(entity.getName(), internalId); + CallContext.current().putContextParameter(entity, internalId); } return internalId; } @@ -434,7 +434,7 @@ public class ParamProcessWorker implements DispatchWorker { } // Return on first non-null Id for the uuid entity if (internalId != null){ - CallContext.current().putContextParameter(entity.getName(), uuid); + CallContext.current().putContextParameter(entity, uuid); break; } } diff --git a/server/src/com/cloud/event/ActionEventUtils.java b/server/src/com/cloud/event/ActionEventUtils.java index 2ac43036c34..29eade21c96 100644 --- a/server/src/com/cloud/event/ActionEventUtils.java +++ b/server/src/com/cloud/event/ActionEventUtils.java @@ -37,7 +37,6 @@ import org.apache.cloudstack.framework.events.EventBus; import org.apache.cloudstack.framework.events.EventBusException; import com.cloud.configuration.Config; -import com.cloud.domain.Domain; import com.cloud.event.dao.EventDao; import com.cloud.server.ManagementService; import com.cloud.user.Account; @@ -204,20 +203,15 @@ public class ActionEventUtils { String entityType = null; String entityUuid = null; CallContext context = CallContext.current(); - Class entityKey = getEntityKey(eventType); - if (entityKey != null){ - //FIXME - Remove this since it should be covered by the else if condition below. - entityUuid = (String)context.getContextParameter(entityKey); - if (entityUuid != null) - entityType = entityKey.getName(); - }else if (EventTypes.getEntityClassForEvent(eventType) != null){ - //Get entity Class(Example - VirtualMachine.class) from the event Type eg. - VM.CREATE - Class entityClass = EventTypes.getEntityClassForEvent(eventType); - + //Get entity Class(Example - VirtualMachine.class) from the event Type eg. - VM.CREATE + Class entityClass = EventTypes.getEntityClassForEvent(eventType); + if (entityClass != null){ //Get uuid from id - if(context.getContextParameter(entityClass.getName()) != null){ + Object param = context.getContextParameter(entityClass); + if(param != null){ try { - entityUuid = getEntityUuid(entityClass, context.getContextParameter(entityClass.getName())); + entityUuid = getEntityUuid(entityClass, param); + entityType = entityClass.getName(); } catch (Exception e){ s_logger.debug("Caught exception while finding entityUUID, moving on"); } @@ -312,22 +306,4 @@ public class ActionEventUtils { } - private static Class getEntityKey(String eventType) - { - // FIXME - Remove this - if (eventType.startsWith("DOMAIN.")) - { - return Domain.class; - } - else if (eventType.startsWith("ACCOUNT.")) - { - return Account.class; - } - else if (eventType.startsWith("USER.")) - { - return User.class; - } - - return null; - } } diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java index c622c552710..8a21014f641 100644 --- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -777,7 +777,7 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager, } // TODO - Make createSnapshotPolicy - BaseAsyncCreate and remove this. - CallContext.current().putContextParameter(SnapshotPolicy.class.getName(), policy.getUuid()); + CallContext.current().putContextParameter(SnapshotPolicy.class, policy.getUuid()); return policy; } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index ee87ab49623..97eceaf4b43 100644 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -1212,7 +1212,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir if (guestNic == null) { throw new CloudRuntimeException("Unable to add NIC to " + vmInstance); } - CallContext.current().putContextParameter(Nic.class.getName(), guestNic.getUuid()); + CallContext.current().putContextParameter(Nic.class, guestNic.getUuid()); s_logger.debug("Successful addition of " + network + " from " + vmInstance); return _vmDao.findById(vmInstance.getId()); } From 0d1266648214cb0a007046916bd5af2ea1f692bf Mon Sep 17 00:00:00 2001 From: Rajani Karuturi Date: Mon, 7 Sep 2015 17:18:01 +0530 Subject: [PATCH 2/5] CLOUDSTACK-8816: instance uuid is missing in events for delete account instance uuid is populated from the getInstanceId of the command which is returning null. returning the correct value now. --- .../api/command/admin/account/DeleteAccountCmd.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/api/src/org/apache/cloudstack/api/command/admin/account/DeleteAccountCmd.java b/api/src/org/apache/cloudstack/api/command/admin/account/DeleteAccountCmd.java index 5754ec50108..2a2e16dd0bd 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/account/DeleteAccountCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/account/DeleteAccountCmd.java @@ -114,4 +114,9 @@ public class DeleteAccountCmd extends BaseAsyncCmd { public ApiCommandJobType getInstanceType() { return ApiCommandJobType.Account; } + + @Override + public Long getInstanceId() { + return id; + } } From b12d4730a6a3b0654c52a6ea3f0b5b75cd37d841 Mon Sep 17 00:00:00 2001 From: Rajani Karuturi Date: Wed, 9 Sep 2015 10:34:04 +0530 Subject: [PATCH 3/5] CLOUDSTACK-8816: entity uuid missing in create network event *Before* | routing_key | exchange | message_count | payload | payload_bytes | payload_encoding | redelivered | | management-server.ActionEvent.NETWORK-CREATE.Network.* | cloudstack-events | 0 | {"eventDateTime":"2015-09-09 09:35:02 +0530","status":"Completed","description":"Successfully completed creating network. Network Id: 206","event":"NETWORK.CREATE","account":"bd73dc2e-35c0-11e5-b094-d4ae52cb9af0","user":"bd7ea748-35c0-11e5-b094-d4ae52cb9af0"} | 259 | string | False | *After* | routing_key | exchange | message_count | payload | payload_bytes | payload_encoding | redelivered | | management-server.ActionEvent.NETWORK-CREATE.Network.c9ed8d0d-6e58-456e-be58-28bb809f0b3a | cloudstack-events | 52 | {"eventDateTime":"2015-09-09 10:12:37 +0530","status":"Completed","description":"Successfully completed creating network. Network Id: 210","event":"NETWORK.CREATE","entityuuid":"c9ed8d0d-6e58-456e-be58-28bb809f0b3a","entity":"com.cloud.network.Network","account":"bd73dc2e-35c0-11e5-b094-d4ae52cb9af0","user":"bd7ea748-35c0-11e5-b094-d4ae52cb9af0"} | 348 | string | False | --- .../cloudstack/engine/orchestration/NetworkOrchestrator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index 50ddc5915ca..2a87bf5eb72 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -2083,6 +2083,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra }); CallContext.current().setEventDetails("Network Id: " + network.getId()); + CallContext.current().putContextParameter(Network.class, network.getUuid()); return network; } From 3bd53521e8944db447bfa69494d7f01f73727808 Mon Sep 17 00:00:00 2001 From: Rajani Karuturi Date: Wed, 9 Sep 2015 12:18:08 +0530 Subject: [PATCH 4/5] CLOUDSTACK-8816: Project UUID is not showing for some of operations in RabbitMQ. --- api/src/org/apache/cloudstack/context/CallContext.java | 10 ++++++++++ server/src/com/cloud/api/ApiDispatcher.java | 9 +++++++++ server/src/com/cloud/event/ActionEventInterceptor.java | 2 +- server/src/com/cloud/event/ActionEventUtils.java | 2 +- server/src/com/cloud/projects/ProjectManagerImpl.java | 1 + 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/api/src/org/apache/cloudstack/context/CallContext.java b/api/src/org/apache/cloudstack/context/CallContext.java index 73da826155e..2619f4a2e2c 100644 --- a/api/src/org/apache/cloudstack/context/CallContext.java +++ b/api/src/org/apache/cloudstack/context/CallContext.java @@ -21,6 +21,7 @@ import java.util.Map; import java.util.Stack; import java.util.UUID; +import com.cloud.projects.Project; import org.apache.log4j.Logger; import org.apache.log4j.NDC; @@ -59,6 +60,7 @@ public class CallContext { private User user; private long userId; private final Map context = new HashMap(); + private Project project; static EntityManager s_entityMgr; @@ -314,6 +316,14 @@ public class CallContext { this.eventDescription = eventDescription; } + public Project getProject() { + return this.project; + } + + public void setProject(Project project) { + this.project = project; + } + /** * Whether to display the event to the end user. * @return true - if the event is to be displayed to the end user, false otherwise. diff --git a/server/src/com/cloud/api/ApiDispatcher.java b/server/src/com/cloud/api/ApiDispatcher.java index 0dc11643ba9..73755883697 100644 --- a/server/src/com/cloud/api/ApiDispatcher.java +++ b/server/src/com/cloud/api/ApiDispatcher.java @@ -21,6 +21,8 @@ import java.util.Map; import javax.annotation.PostConstruct; import javax.inject.Inject; +import com.cloud.projects.Project; +import com.cloud.utils.db.EntityManager; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.ControlledEntity; @@ -54,6 +56,9 @@ public class ApiDispatcher { @Inject AccountManager _accountMgr; + @Inject + EntityManager _entityMgr; + @Inject() protected DispatchChainFactory dispatchChainFactory; @@ -102,6 +107,10 @@ public class ApiDispatcher { final CallContext ctx = CallContext.current(); ctx.setEventDisplayEnabled(cmd.isDisplay()); + if(params.get(ApiConstants.PROJECT_ID) != null) { + Project project = _entityMgr.findByUuidIncludingRemoved(Project.class, params.get(ApiConstants.PROJECT_ID)); + ctx.setProject(project); + } // TODO This if shouldn't be here. Use polymorphism and move it to validateSpecificParameters if (cmd instanceof BaseAsyncCmd) { diff --git a/server/src/com/cloud/event/ActionEventInterceptor.java b/server/src/com/cloud/event/ActionEventInterceptor.java index 5d2d51a102a..d2dacd98a42 100644 --- a/server/src/com/cloud/event/ActionEventInterceptor.java +++ b/server/src/com/cloud/event/ActionEventInterceptor.java @@ -84,7 +84,7 @@ public class ActionEventInterceptor implements ComponentMethodInterceptor, Metho for (ActionEvent actionEvent : getActionEvents(method)) { CallContext ctx = CallContext.current(); long userId = ctx.getCallingUserId(); - long accountId = ctx.getCallingAccountId(); + long accountId = ctx.getProject() != null ? ctx.getProject().getProjectAccountId() : ctx.getCallingAccountId(); //This should be the entity owner id rather than the Calling User Account Id. long startEventId = ctx.getStartEventId(); String eventDescription = getEventDescription(actionEvent, ctx); String eventType = getEventType(actionEvent, ctx); diff --git a/server/src/com/cloud/event/ActionEventUtils.java b/server/src/com/cloud/event/ActionEventUtils.java index 29eade21c96..0ca41cc3a73 100644 --- a/server/src/com/cloud/event/ActionEventUtils.java +++ b/server/src/com/cloud/event/ActionEventUtils.java @@ -120,7 +120,7 @@ public class ActionEventUtils { public static void onStartedActionEventFromContext(String eventType, String eventDescription, boolean eventDisplayEnabled) { CallContext ctx = CallContext.current(); long userId = ctx.getCallingUserId(); - long accountId = ctx.getCallingAccountId(); + long accountId = ctx.getProject() != null ? ctx.getProject().getProjectAccountId() : ctx.getCallingAccountId(); //This should be the entity owner id rather than the Calling User Account Id. long startEventId = ctx.getStartEventId(); if (!eventType.equals("")) diff --git a/server/src/com/cloud/projects/ProjectManagerImpl.java b/server/src/com/cloud/projects/ProjectManagerImpl.java index 510b55ca1a2..95cf68a354a 100644 --- a/server/src/com/cloud/projects/ProjectManagerImpl.java +++ b/server/src/com/cloud/projects/ProjectManagerImpl.java @@ -222,6 +222,7 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager { if (project != null) { CallContext.current().setEventDetails("Project id=" + project.getId()); + CallContext.current().putContextParameter(Project.class, project.getUuid()); } //Increment resource count From 358846492a2b7b65683d8b0c4c4bdec78792dc50 Mon Sep 17 00:00:00 2001 From: Rajani Karuturi Date: Wed, 9 Sep 2015 14:21:44 +0530 Subject: [PATCH 5/5] CLOUDSTACK-8816 Systemvm reboot event doesnt have uuids. Fixed the same Also removed duplicate console proxy event thats generated both for ssvm and console proxy reboot. --- api/src/com/cloud/event/EventTypes.java | 28 +++++++++---------- .../cloud/server/ManagementServerImpl.java | 1 - 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java index 870c7e7f1f4..9a264a50e82 100644 --- a/api/src/com/cloud/event/EventTypes.java +++ b/api/src/com/cloud/event/EventTypes.java @@ -63,10 +63,8 @@ import com.cloud.storage.snapshot.SnapshotPolicy; import com.cloud.template.VirtualMachineTemplate; import com.cloud.user.Account; import com.cloud.user.User; -import com.cloud.vm.ConsoleProxy; import com.cloud.vm.Nic; import com.cloud.vm.NicSecondaryIp; -import com.cloud.vm.SecondaryStorageVm; import com.cloud.vm.VirtualMachine; import org.apache.cloudstack.config.Configuration; import org.apache.cloudstack.usage.Usage; @@ -557,13 +555,13 @@ public class EventTypes { entityEventDetails.put(EVENT_ROUTER_HA, VirtualRouter.class); entityEventDetails.put(EVENT_ROUTER_UPGRADE, VirtualRouter.class); - entityEventDetails.put(EVENT_PROXY_CREATE, ConsoleProxy.class); - entityEventDetails.put(EVENT_PROXY_DESTROY, ConsoleProxy.class); - entityEventDetails.put(EVENT_PROXY_START, ConsoleProxy.class); - entityEventDetails.put(EVENT_PROXY_STOP, ConsoleProxy.class); - entityEventDetails.put(EVENT_PROXY_REBOOT, ConsoleProxy.class); - entityEventDetails.put(EVENT_ROUTER_HA, ConsoleProxy.class); - entityEventDetails.put(EVENT_PROXY_HA, ConsoleProxy.class); + entityEventDetails.put(EVENT_PROXY_CREATE, VirtualMachine.class); + entityEventDetails.put(EVENT_PROXY_DESTROY, VirtualMachine.class); + entityEventDetails.put(EVENT_PROXY_START, VirtualMachine.class); + entityEventDetails.put(EVENT_PROXY_STOP, VirtualMachine.class); + entityEventDetails.put(EVENT_PROXY_REBOOT, VirtualMachine.class); + entityEventDetails.put(EVENT_ROUTER_HA, VirtualMachine.class); + entityEventDetails.put(EVENT_PROXY_HA, VirtualMachine.class); entityEventDetails.put(EVENT_VNC_CONNECT, "VNC"); entityEventDetails.put(EVENT_VNC_DISCONNECT, "VNC"); @@ -668,12 +666,12 @@ public class EventTypes { entityEventDetails.put(EVENT_ISO_UPLOAD, "Iso"); // SSVM - entityEventDetails.put(EVENT_SSVM_CREATE, SecondaryStorageVm.class); - entityEventDetails.put(EVENT_SSVM_DESTROY, SecondaryStorageVm.class); - entityEventDetails.put(EVENT_SSVM_START, SecondaryStorageVm.class); - entityEventDetails.put(EVENT_SSVM_STOP, SecondaryStorageVm.class); - entityEventDetails.put(EVENT_SSVM_REBOOT, SecondaryStorageVm.class); - entityEventDetails.put(EVENT_SSVM_HA, SecondaryStorageVm.class); + entityEventDetails.put(EVENT_SSVM_CREATE, VirtualMachine.class); + entityEventDetails.put(EVENT_SSVM_DESTROY, VirtualMachine.class); + entityEventDetails.put(EVENT_SSVM_START, VirtualMachine.class); + entityEventDetails.put(EVENT_SSVM_STOP, VirtualMachine.class); + entityEventDetails.put(EVENT_SSVM_REBOOT, VirtualMachine.class); + entityEventDetails.put(EVENT_SSVM_HA, VirtualMachine.class); // Service Offerings entityEventDetails.put(EVENT_SERVICE_OFFERING_CREATE, ServiceOffering.class); diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 84830182e35..25071a2b28f 100644 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -3250,7 +3250,6 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe } @Override - @ActionEvent(eventType = EventTypes.EVENT_PROXY_REBOOT, eventDescription = "", async = true) public VMInstanceVO rebootSystemVM(final RebootSystemVmCmd cmd) { final VMInstanceVO systemVm = _vmInstanceDao.findByIdTypes(cmd.getId(), VirtualMachine.Type.ConsoleProxy, VirtualMachine.Type.SecondaryStorageVm);