From 640a3dc239a2f5fb8ad03ee6792a166d48c67c7d Mon Sep 17 00:00:00 2001 From: Kris McQueen Date: Thu, 28 Oct 2010 17:35:21 -0700 Subject: [PATCH 1/5] bug 6818: if the userAccount is null, the user is either removed or does not exist. Since we can't log them out in those cases, just skip saving the logout event (and hence avoid the NPE). status 6818: resolved fixed --- server/src/com/cloud/server/ManagementServerImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index cb3c56ec646..adf6fc98160 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -4535,7 +4535,9 @@ public class ManagementServerImpl implements ManagementServer { @Override public void logoutUser(Long userId) { UserAccount userAcct = _userAccountDao.findById(userId); - EventUtils.saveEvent(userId, userAcct.getAccountId(), EventTypes.EVENT_USER_LOGOUT, "user has logged out"); + if (userAcct != null) { + EventUtils.saveEvent(userId, userAcct.getAccountId(), EventTypes.EVENT_USER_LOGOUT, "user has logged out"); + } // else log some kind of error event? This likely means the user doesn't exist, or has been deleted... } @Override From 642b8a56f4f08706db3399122f4294ae743bae89 Mon Sep 17 00:00:00 2001 From: Kris McQueen Date: Thu, 28 Oct 2010 17:50:44 -0700 Subject: [PATCH 2/5] If the create command returns null for whatever reason, throw an exception so it aborts scheduling the async job to act on the created object --- server/src/com/cloud/api/ApiDispatcher.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/src/com/cloud/api/ApiDispatcher.java b/server/src/com/cloud/api/ApiDispatcher.java index 860d5c47e5e..2f3b366ad7e 100644 --- a/server/src/com/cloud/api/ApiDispatcher.java +++ b/server/src/com/cloud/api/ApiDispatcher.java @@ -83,6 +83,10 @@ public class ApiDispatcher { Method method = mgr.getClass().getMethod(methodName, cmd.getClass()); Object dbObject = method.invoke(mgr, cmd); + if (dbObject == null) { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Create method " + methodName + " in class " + cmd.getClass().getSimpleName() + " failed to create an object."); + } + Method getIdMethod = dbObject.getClass().getMethod("getId"); Object id = getIdMethod.invoke(dbObject); From ebac4539d02cbc846fdf33412f0864775d3ebad8 Mon Sep 17 00:00:00 2001 From: Kris McQueen Date: Thu, 28 Oct 2010 17:51:48 -0700 Subject: [PATCH 3/5] it's possible createSnapshotDB will return null, handle that case. However, if createSnapshotDB returns null because there was no work to do (empty snapshot) we should probably throw an exception that reports that fact instead of returning null and throwing an internal error --- .../cloud/api/commands/CreateSnapshotCmd.java | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/server/src/com/cloud/api/commands/CreateSnapshotCmd.java b/server/src/com/cloud/api/commands/CreateSnapshotCmd.java index d34a8a90164..2996c266617 100644 --- a/server/src/com/cloud/api/commands/CreateSnapshotCmd.java +++ b/server/src/com/cloud/api/commands/CreateSnapshotCmd.java @@ -22,8 +22,10 @@ import org.apache.log4j.Logger; import com.cloud.api.ApiDBUtils; import com.cloud.api.BaseAsyncCreateCmd; +import com.cloud.api.BaseCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; import com.cloud.api.response.SnapshotResponse; import com.cloud.event.EventTypes; import com.cloud.storage.Snapshot.SnapshotType; @@ -104,26 +106,30 @@ public class CreateSnapshotCmd extends BaseAsyncCreateCmd { public SnapshotResponse getResponse() { SnapshotVO snapshot = (SnapshotVO)getResponseObject(); - SnapshotResponse response = new SnapshotResponse(); - response.setId(snapshot.getId()); + if (snapshot != null) { + SnapshotResponse response = new SnapshotResponse(); + response.setId(snapshot.getId()); - Account account = ApiDBUtils.findAccountById(snapshot.getAccountId()); - if (account != null) { - response.setAccountName(account.getAccountName()); - response.setDomainId(account.getDomainId()); - response.setDomainName(ApiDBUtils.findDomainById(account.getDomainId()).getName()); + Account account = ApiDBUtils.findAccountById(snapshot.getAccountId()); + if (account != null) { + response.setAccountName(account.getAccountName()); + response.setDomainId(account.getDomainId()); + response.setDomainName(ApiDBUtils.findDomainById(account.getDomainId()).getName()); + } + + VolumeVO volume = ApiDBUtils.findVolumeById(snapshot.getVolumeId()); + String snapshotTypeStr = SnapshotType.values()[snapshot.getSnapshotType()].name(); + response.setSnapshotType(snapshotTypeStr); + response.setVolumeId(snapshot.getVolumeId()); + response.setVolumeName(volume.getName()); + response.setVolumeType(volume.getVolumeType().toString()); + response.setCreated(snapshot.getCreated()); + response.setName(snapshot.getName()); + + response.setResponseName(getName()); + return response; } - VolumeVO volume = ApiDBUtils.findVolumeById(snapshot.getVolumeId()); - String snapshotTypeStr = SnapshotType.values()[snapshot.getSnapshotType()].name(); - response.setSnapshotType(snapshotTypeStr); - response.setVolumeId(snapshot.getVolumeId()); - response.setVolumeName(volume.getName()); - response.setVolumeType(volume.getVolumeType().toString()); - response.setCreated(snapshot.getCreated()); - response.setName(snapshot.getName()); - - response.setResponseName(getName()); - return response; + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create snapshot due to an internal error creating snapshot for volume " + volumeId); } } From b5ca63c4f0c552a30c3092085edec6c02d784f17 Mon Sep 17 00:00:00 2001 From: NIKITA Date: Thu, 28 Oct 2010 18:20:15 -0700 Subject: [PATCH 4/5] Statistics UI added for Instanct tab --- ui/new/css/main.css | 2 +- ui/new/jsp/instance.jsp | 61 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/ui/new/css/main.css b/ui/new/css/main.css index de34e7720cc..7c7ebd5153e 100644 --- a/ui/new/css/main.css +++ b/ui/new/css/main.css @@ -949,7 +949,7 @@ a:hover { font-size:10px; font-weight:normal; text-align:left; - margin:1px 0 0 0; + margin:0px 0 0 0; padding:0; } .rev_wiztemp_ownertext span { diff --git a/ui/new/jsp/instance.jsp b/ui/new/jsp/instance.jsp index 79bb19f9434..e5dad5d3e43 100644 --- a/ui/new/jsp/instance.jsp +++ b/ui/new/jsp/instance.jsp @@ -221,7 +221,61 @@ @@ -309,8 +363,7 @@ Blank Template
-
- +
@@ -700,7 +753,7 @@
Centos
-
+
Hypervisor: