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");
