From a6a774f6c05f98a862ef81ab309dc9b274afc278 Mon Sep 17 00:00:00 2001 From: nit Date: Tue, 30 Nov 2010 15:49:29 +0530 Subject: [PATCH] bug 7369 : Resolving NPE while creating a private template from detached volume. The instance id is null when it is detached which was the culprit here. status 7369: resolved fixed --- .../com/cloud/server/ManagementServerImpl.java | 2 +- server/src/com/cloud/vm/UserVmManagerImpl.java | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 26030f138b8..31df6ab1c93 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -5196,7 +5196,7 @@ public class ManagementServerImpl implements ManagementServer { } VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId()); - boolean isExtractable = template != null && template.isExtractable() && !(template.getTemplateType()== Storage.TemplateType.SYSTEM || template.getTemplateType()== Storage.TemplateType.BUILTIN); + boolean isExtractable = template != null && template.isExtractable() && template.getTemplateType() != Storage.TemplateType.SYSTEM; if( !isExtractable && account!=null && account.getType() != Account.ACCOUNT_TYPE_ADMIN){ // Global admins are allowed to extract throw new PermissionDeniedException("The volume:" +volumeId+ " is not allowed to be extracted"); } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 20ffc5193ca..af6470c4100 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -2487,7 +2487,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM Long nextTemplateId = _templateDao.getNextInSequence(Long.class, "id"); String description = cmd.getDisplayText(); VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId()); - boolean isExtractable = template != null && template.isExtractable() && !(template.getTemplateType()== Storage.TemplateType.SYSTEM || template.getTemplateType()== Storage.TemplateType.BUILTIN); + boolean isExtractable = template != null && template.isExtractable() && template.getTemplateType() != Storage.TemplateType.SYSTEM ; privateTemplate = new VMTemplateVO(nextTemplateId, uniqueName, @@ -2591,13 +2591,14 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM if( volume == null ) { throw new CloudRuntimeException("Unable to find volume for Id " + volumeId); } - long instanceId = volume.getInstanceId(); - VMInstanceVO vm = _vmDao.findById(instanceId); - State vmState = vm.getState(); - if( !vmState.equals(State.Stopped) && !vmState.equals(State.Destroyed)) { - throw new CloudRuntimeException("Please put VM " + vm.getHostName() + " into Stopped state first"); - } - + Long instanceId = volume.getInstanceId(); + if (instanceId != null){ + VMInstanceVO vm = _vmDao.findById(instanceId); + State vmState = vm.getState(); + if( !vmState.equals(State.Stopped) && !vmState.equals(State.Destroyed)) { + throw new CloudRuntimeException("Please put VM " + vm.getHostName() + " into Stopped state first"); + } + } cmd = new CreatePrivateTemplateFromVolumeCommand(secondaryStorageURL, templateId, volume.getAccountId(), command.getTemplateName(), uniqueName, volume.getPath(), vmName);