From 3c40e8bb3f6278f78c24c6317d513bd5ad599944 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Sun, 18 Aug 2013 16:25:59 -0700 Subject: [PATCH] CLOUDSTACK-4338: fix NPE if create volume failed --- .../kvm/storage/KVMStorageProcessorTest.java | 47 +++++++++++++++++++ .../CloudStackPrimaryDataStoreDriverImpl.java | 10 +++- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/storage/KVMStorageProcessorTest.java diff --git a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/storage/KVMStorageProcessorTest.java b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/storage/KVMStorageProcessorTest.java new file mode 100644 index 00000000000..f107bffaeb8 --- /dev/null +++ b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/storage/KVMStorageProcessorTest.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package com.cloud.hypervisor.kvm.storage; + +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import org.junit.Before; +import org.junit.Test; + +import javax.naming.ConfigurationException; +import java.util.HashMap; + +public class KVMStorageProcessorTest { + KVMStorageProcessor processor; + LibvirtComputingResource resource; + @Before + public void setUp() throws ConfigurationException { + System.setProperty("paths.script", "/devel/asf-master"); + resource = new LibvirtComputingResource(); + resource.configure("testResource", new HashMap()); + } + @Test + public void testCloneVolumeFromBaseTemplate() throws Exception { + + + } + + @Test + public void testCopyVolumeFromImageCacheToPrimary() throws Exception { + + } +} diff --git a/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java b/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java index c071c088e18..1e04a76e73e 100644 --- a/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java +++ b/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java @@ -104,9 +104,18 @@ public class CloudStackPrimaryDataStoreDriverImpl implements PrimaryDataStoreDri public void createAsync(DataStore dataStore, DataObject data, AsyncCompletionCallback callback) { String errMsg = null; Answer answer = null; + CreateCmdResult result = new CreateCmdResult(null, null); if (data.getType() == DataObjectType.VOLUME) { try { answer = createVolume((VolumeInfo) data); + if ((answer == null) || (!answer.getResult())) { + result.setSuccess(false); + if (answer != null) { + result.setResult(answer.getDetails()); + } + } else { + result.setAnswer(answer); + } } catch (StorageUnavailableException e) { s_logger.debug("failed to create volume", e); errMsg = e.toString(); @@ -115,7 +124,6 @@ public class CloudStackPrimaryDataStoreDriverImpl implements PrimaryDataStoreDri errMsg = e.toString(); } } - CreateCmdResult result = new CreateCmdResult(null, answer); if (errMsg != null) { result.setResult(errMsg); }