http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d9916139/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java
----------------------------------------------------------------------
diff --git 
a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java
 
b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java
index 3bd4113..f89ba80 100644
--- 
a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java
+++ 
b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java
@@ -14,7 +14,7 @@ import 
org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvid
 import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStore;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
 import 
org.apache.cloudstack.storage.datastore.configurator.PrimaryDataStoreConfigurator;
-import 
org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator;
+import 
org.apache.cloudstack.storage.datastore.configurator.validator.StorageProtocolTransformer;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderDao;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderVO;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
@@ -44,21 +44,6 @@ public class DefaultPrimaryDatastoreProviderImpl implements 
PrimaryDataStoreProv
     protected ClusterDao clusterDao;
     protected Map<String, PrimaryDataStoreConfigurator> configuratorMaps = new 
HashMap<String, PrimaryDataStoreConfigurator>();
 
-    @Qualifier("defaultProvider") 
-    @Inject
-    List<PrimaryDataStoreConfigurator> defaultConfigurators;
-    
-    public DefaultPrimaryDatastoreProviderImpl() {
-    }
-    
-    @PostConstruct
-    public void intialize() {
-        for (PrimaryDataStoreConfigurator configurator : defaultConfigurators) 
{
-            String key = generateKey(configurator.getSupportedHypervisor(), 
configurator.getSupportedDataStoreType().toString());
-            configuratorMaps.put(key, configurator);
-        }
-    }
-
     @Inject
     public DefaultPrimaryDatastoreProviderImpl(@Qualifier("defaultProvider") 
List<PrimaryDataStoreConfigurator> configurators) {
         for (PrimaryDataStoreConfigurator configurator : configurators) {
@@ -114,10 +99,15 @@ public class DefaultPrimaryDatastoreProviderImpl 
implements PrimaryDataStoreProv
             throw new CloudRuntimeException("can't find configurator from key: 
" + key);
         }
 
-        ProtocolValidator validator = configurator.getValidator();
-        validator.validate(dsInfos);
+        StorageProtocolTransformer validator = 
configurator.getProtocolTransformer();
+        validator.normalizeUserInput(dsInfos);
 
-        PrimaryDataStoreVO dataStoreVO = new PrimaryDataStoreVO();
+        PrimaryDataStoreVO dataStoreVO = 
dataStoreDao.findPoolByUUID(dsInfos.get("uuid"));
+        if (dataStoreVO != null) {
+            throw new CloudRuntimeException("duplicate uuid: " + 
dsInfos.get("uuid"));
+        }
+        
+        dataStoreVO = new PrimaryDataStoreVO();
         dataStoreVO.setStorageProviderId(this.getId());
         dataStoreVO.setHostAddress(dsInfos.get("server"));
         dataStoreVO.setPath(dsInfos.get("path"));

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d9916139/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java
----------------------------------------------------------------------
diff --git 
a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java
 
b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java
index 9d6452d..0ae45e3 100644
--- 
a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java
+++ 
b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java
@@ -71,13 +71,17 @@ public class TemplateOnPrimaryDataStoreObject implements 
TemplateOnPrimaryDataSt
     public void updateStatus(Status status) {
         vo.setDownloadState(status);
         templateStoreDao.update(vo.getId(), vo);
+        vo = templateStoreDao.findById(vo.getId());
     }
     
     public void stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event 
event) {
         try {
             this.stateMachine.transitTo(vo, event, null, templateStoreDao);
+            vo = templateStoreDao.findById(vo.getId());
         } catch (NoTransitionException e) {
            throw new CloudRuntimeException("Failed change state", e);
+        } catch (Exception e) {
+            throw new CloudRuntimeException("Failed change state", e);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d9916139/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
 
b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
index 10a298a..712b0ef 100644
--- 
a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
+++ 
b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
@@ -187,10 +187,8 @@ public class VolumeServiceImpl implements VolumeService {
         CommandResult result = callback.getResult();
         TemplateOnPrimaryDataStoreObject templateOnPrimaryStoreObj = 
context.getTemplate();
         if (result.isSuccess()) {
-            templateOnPrimaryStoreObj.updateStatus(Status.DOWNLOADED);
             
templateOnPrimaryStoreObj.stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event.OperationSuccessed);
         } else {
-            templateOnPrimaryStoreObj.updateStatus(Status.ABANDONED);
             
templateOnPrimaryStoreObj.stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event.OperationFailed);
         }
         

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d9916139/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackDispatcher.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackDispatcher.java
 
b/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackDispatcher.java
index f3cb60c..92a9d39 100644
--- 
a/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackDispatcher.java
+++ 
b/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackDispatcher.java
@@ -22,6 +22,8 @@ package org.apache.cloudstack.framework.async;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
+import net.sf.cglib.proxy.CallbackFilter;
+import net.sf.cglib.proxy.Callback;
 import net.sf.cglib.proxy.Enhancer;
 import net.sf.cglib.proxy.MethodInterceptor;
 import net.sf.cglib.proxy.MethodProxy;
@@ -52,14 +54,33 @@ public class AsyncCallbackDispatcher<T> implements 
AsyncCompletionCallback {
        
        @SuppressWarnings("unchecked")
        public T getTarget() {
-               return (T)Enhancer.create(_targetObject.getClass(), new 
MethodInterceptor() {
-                       @Override
-                       public Object intercept(Object arg0, Method arg1, 
Object[] arg2,
-                               MethodProxy arg3) throws Throwable {
-                               _callbackMethod = arg1;
-                               return null;
-                       }
-               });
+           Enhancer en = new Enhancer();
+           en.setSuperclass(_targetObject.getClass());
+           en.setCallbacks(new Callback[]{new MethodInterceptor() {
+            @Override
+            public Object intercept(Object arg0, Method arg1, Object[] arg2,
+                MethodProxy arg3) throws Throwable {
+                _callbackMethod = arg1;
+                return null;
+            }
+        }, 
+        new MethodInterceptor() {
+            @Override
+            public Object intercept(Object arg0, Method arg1, Object[] arg2,
+                MethodProxy arg3) throws Throwable {
+                return null;
+            }
+        }
+           });
+           en.setCallbackFilter(new CallbackFilter() {
+               public int accept(Method method) {
+                   if (method.getParameterTypes().length == 0 && 
method.getName().equals("finalize")) {
+                       return 1;
+                   }
+                   return 0;
+               }}
+              );
+               return (T)en.create();
        }
 
        public AsyncCallbackDispatcher<T> setCallback(Object useless) {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d9916139/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
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 9cd1bf6..9a04903 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
@@ -338,6 +338,9 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         s_statesTable.put(Types.VmPowerState.UNRECOGNIZED, State.Unknown);
     }
 
+    public XsHost getHost() {
+        return this._host;
+    }
 
     protected boolean cleanupHaltedVms(Connection conn) throws 
XenAPIException, XmlRpcException {
         Host host = Host.getByUuid(conn, _host.uuid);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d9916139/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java
 
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java
index 7b2de95..af6f80d 100644
--- 
a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java
+++ 
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java
@@ -33,9 +33,13 @@ import 
org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd;
 import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageCmd;
 import 
org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageAnswer;
 import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd;
+import org.apache.cloudstack.storage.command.CreateVolumeAnswer;
+import org.apache.cloudstack.storage.command.CreateVolumeFromBaseImageCommand;
 import org.apache.cloudstack.storage.command.StorageSubSystemCommand;
+import org.apache.cloudstack.storage.datastore.protocol.DataStoreProtocol;
 import org.apache.cloudstack.storage.to.ImageDataStoreTO;
 import org.apache.cloudstack.storage.to.ImageOnPrimayDataStoreTO;
+import org.apache.cloudstack.storage.to.NfsPrimaryDataStoreTO;
 import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
 import org.apache.cloudstack.storage.to.TemplateTO;
 import org.apache.commons.httpclient.HttpClient;
@@ -86,14 +90,20 @@ public class XenServerStorageResource {
             return this.execute((AttachPrimaryDataStoreCmd)command);
         } else if (command instanceof CreatePrimaryDataStoreCmd) {
             return execute((CreatePrimaryDataStoreCmd) command);
+        } else if (command instanceof CreateVolumeFromBaseImageCommand) {
+            return execute((CreateVolumeFromBaseImageCommand)command);
         }
         return new Answer((Command)command, false, "not implemented yet"); 
     }
-    /*
-    protected SR getNfsSR(Connection conn, PrimaryDataStoreTO pool) {
+    
+    public Answer execute(CreateVolumeFromBaseImageCommand cmd) {
+        return new CreateVolumeAnswer(cmd, UUID.randomUUID().toString());
+    }
+    
+    protected SR getNfsSR(Connection conn, NfsPrimaryDataStoreTO pool) {
         Map<String, String> deviceConfig = new HashMap<String, String>();
         try {
-            String server = pool.getHost();
+            String server = pool.getServer();
             String serverpath = pool.getPath();
             serverpath = serverpath.replace("//", "/");
             Set<SR> srs = SR.getAll(conn);
@@ -125,13 +135,13 @@ public class XenServerStorageResource {
 
                 if (server.equals(dc.get("server")) && 
serverpath.equals(dc.get("serverpath"))) {
                     throw new CloudRuntimeException("There is a SR using the 
same configuration server:" + dc.get("server") + ", serverpath:"
-                            + dc.get("serverpath") + " for pool " + 
pool.getUuid() + "on host:" + _host.uuid);
+                            + dc.get("serverpath") + " for pool " + 
pool.getUuid() + "on host:" + hypervisorResource.getHost().uuid);
                 }
 
             }
             deviceConfig.put("server", server);
             deviceConfig.put("serverpath", serverpath);
-            Host host = Host.getByUuid(conn, _host.uuid);
+            Host host = Host.getByUuid(conn, 
hypervisorResource.getHost().uuid);
             SR sr = SR.create(conn, host, deviceConfig, new Long(0), 
pool.getUuid(), Long.toString(pool.getId()), SRType.NFS.toString(), "user", 
true,
                     new HashMap<String, String>());
             sr.scan(conn);
@@ -142,7 +152,7 @@ public class XenServerStorageResource {
             throw new CloudRuntimeException("Unable to create NFS SR " + 
pool.toString(), e);
         }
     }
-    
+    /*
     protected SR getIscsiSR(Connection conn, PrimaryDataStoreTO pool) {
         synchronized (pool.getUuid().intern()) {
             Map<String, String> deviceConfig = new HashMap<String, String>();
@@ -271,9 +281,9 @@ public class XenServerStorageResource {
         Connection conn = hypervisorResource.getConnection();
         PrimaryDataStoreTO dataStore = cmd.getDataStore();
         try {
-            if (dataStore.getType() == 
StoragePoolType.NetworkFilesystem.toString()) {
-                //getNfsSR(conn, dataStore);
-            } else if (dataStore.getType() == 
StoragePoolType.IscsiLUN.toString()) {
+            if 
(DataStoreProtocol.NFS.toString().equalsIgnoreCase(dataStore.getType())) {
+                getNfsSR(conn, (NfsPrimaryDataStoreTO)dataStore);
+            } else if 
(DataStoreProtocol.NFS.toString().equalsIgnoreCase(dataStore.getType())) {
                 //getIscsiSR(conn, dataStore);
             } else if (dataStore.getType() == 
StoragePoolType.PreSetup.toString()) {
             } else {
@@ -366,11 +376,11 @@ public class XenServerStorageResource {
         boolean result = false;
         try {
             
-            SR sr = SR.getByUuid(conn, primaryStoreUuid);
-            if (sr == null) {
+            Set<SR> srs = SR.getByNameLabel(conn, primaryStoreUuid);
+            if (srs.size() != 1) {
                 throw new CloudRuntimeException("storage uuid: " + 
primaryStoreUuid + " is not unique");
             }
-            poolsr = sr;
+            poolsr = srs.iterator().next();
             VDI.Record vdir = new VDI.Record();
             vdir.nameLabel = "Base-Image-" + UUID.randomUUID().toString();
             vdir.SR = poolsr;
@@ -381,15 +391,20 @@ public class XenServerStorageResource {
             
             vdir = vdi.getRecord(conn);
             String vdiLocation = vdir.location;
-            Set<PBD> pbds = poolsr.getPBDs(conn);
-            if (pbds.size() != 1) {
-                throw new CloudRuntimeException("Don't how to handle multiple 
pbds:" + pbds.size() + " for sr: " + poolsr.getUuid(conn));
+            String pbdLocation = null;
+            if 
(primarDataStore.getType().equalsIgnoreCase(DataStoreProtocol.NFS.toString())) {
+                pbdLocation = "/run/sr-mount/" + poolsr.getUuid(conn);
+            } else {
+                Set<PBD> pbds = poolsr.getPBDs(conn);
+                if (pbds.size() != 1) {
+                    throw new CloudRuntimeException("Don't how to handle 
multiple pbds:" + pbds.size() + " for sr: " + poolsr.getUuid(conn));
+                }
+                PBD pbd = pbds.iterator().next();
+                Map<String, String> deviceCfg = pbd.getDeviceConfig(conn);
+                pbdLocation = deviceCfg.get("location");
             }
-            PBD pbd = pbds.iterator().next();
-            Map<String, String> deviceCfg = pbd.getDeviceConfig(conn);
-            String pbdLocation = deviceCfg.get("location");
             if (pbdLocation == null) {
-                throw new CloudRuntimeException("Can't get pbd: " + 
pbd.getUuid(conn) + " location");
+                throw new CloudRuntimeException("Can't get pbd location");
             }
             
             String vdiPath = pbdLocation + "/" + vdiLocation + ".vhd";
@@ -454,8 +469,7 @@ public class XenServerStorageResource {
     protected Answer execute(CopyTemplateToPrimaryStorageCmd cmd) {
         ImageOnPrimayDataStoreTO imageTO = cmd.getImage();
         TemplateTO template = imageTO.getTemplate();
-        ImageDataStoreTO imageStore = template.getImageDataStore();
-        if (imageStore.getType().equalsIgnoreCase("http")) {
+        if (template.getPath().startsWith("http")) {
             return directDownloadHttpTemplate(cmd, template, 
imageTO.getPrimaryDataStore());
         } else {
             return new Answer(cmd, false, "not implemented yet");

Reply via email to