diff --git a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java index 7c105489d72..a6f8a93543f 100755 --- a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java +++ b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java @@ -1494,10 +1494,14 @@ SecondaryStorageResource { try { Class clazz = Class.forName(value); - _storage = (StorageLayer)ComponentContext.inject(clazz); + _storage = (StorageLayer)clazz.newInstance(); _storage.configure("StorageLayer", params); } catch (ClassNotFoundException e) { throw new ConfigurationException("Unable to find class " + value); + } catch (InstantiationException e) { + throw new ConfigurationException("Unable to find class " + value); + } catch (IllegalAccessException e) { + throw new ConfigurationException("Unable to find class " + value); } } _storage.mkdirs(_parent); diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java index edc194c0e1f..fb4f9ca8e95 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java @@ -90,9 +90,9 @@ public class TemplateObject implements TemplateInfo { } else { ObjectInDataStoreVO obj = ojbectInStoreMgr.findObject(this.imageVO.getId(), DataObjectType.TEMPLATE, this.dataStore.getId(), this.dataStore.getRole()); if (obj.getState() != ObjectInDataStoreStateMachine.State.Ready) { - return this.dataStore.getUri() + File.separator + "?type=" + DataObjectType.TEMPLATE + "&size=" + this.imageVO.getSize(); + return this.dataStore.getUri() + File.separator + "&objType=" + DataObjectType.TEMPLATE + "&size=" + this.imageVO.getSize(); } else { - return this.dataStore.getUri() + File.separator + "?type=" + DataObjectType.TEMPLATE + "&path=" + obj.getInstallPath(); + return this.dataStore.getUri() + File.separator + "&objType=" + DataObjectType.TEMPLATE + "&path=" + obj.getInstallPath(); } } } diff --git a/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeCommand.java b/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeCommand.java deleted file mode 100644 index db643feac41..00000000000 --- a/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeCommand.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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 org.apache.cloudstack.storage.command; - -import com.cloud.agent.api.Command; - -public class CreateVolumeCommand extends Command implements StorageSubSystemCommand { - protected String volumeUri; - - public CreateVolumeCommand(String volumeUri) { - super(); - this.volumeUri = volumeUri; - } - - protected CreateVolumeCommand() { - super(); - } - - @Override - public boolean executeInSequence() { - // TODO Auto-generated method stub - return false; - } - - public String getVolume() { - return this.volumeUri; - } - -} diff --git a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java index 5d1e1ff27f4..846697ce613 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java +++ b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java @@ -39,6 +39,7 @@ import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.utils.db.DB; import com.cloud.utils.db.Transaction; +import com.cloud.utils.exception.CloudRuntimeException; @Component public class DefaultEndPointSelector implements EndPointSelector { @@ -48,6 +49,8 @@ public class DefaultEndPointSelector implements EndPointSelector { HostDao hostDao; private String findOneHostInaScope = "select id from host where " + " status == 'Up' and hypervisor_type != 'VMware' and type in ('Routing', 'SecondaryStorageVM') "; + private String findOneHostOnPrimaryStorage = "select id from host where" + + "status == 'Up' and type == 'Routing' "; protected boolean moveBetweenPrimaryImage(DataStore srcStore, DataStore destStore) { @@ -62,9 +65,9 @@ public class DefaultEndPointSelector implements EndPointSelector { } @DB - protected EndPoint findEndPointInScope(Scope scope) { + protected EndPoint findEndPointInScope(Scope scope, String sqlBase) { StringBuilder sbuilder = new StringBuilder(); - sbuilder.append(findOneHostInaScope); + sbuilder.append(sqlBase); if (scope.getScopeType() == ScopeType.HOST) { sbuilder.append(" and id = "); @@ -76,7 +79,7 @@ public class DefaultEndPointSelector implements EndPointSelector { sbuilder.append(" and data_center_id = "); sbuilder.append(scope.getScopeId()); } - +//TODO: order by rand() is slow if there are lot of hosts sbuilder.append(" ORDER by rand() limit 1"); String sql = sbuilder.toString(); PreparedStatement pstmt = null; @@ -129,7 +132,7 @@ public class DefaultEndPointSelector implements EndPointSelector { // if both are zone scope selectedScope = srcScope; } - return findEndPointInScope(selectedScope); + return findEndPointInScope(selectedScope, findOneHostInaScope); } @Override @@ -146,4 +149,19 @@ public class DefaultEndPointSelector implements EndPointSelector { // TODO Auto-generated method stub return null; } + + protected EndPoint findEndpointForPrimaryStorage(DataStore store) { + return findEndPointInScope(store.getScope(), findOneHostOnPrimaryStorage); + } + + @Override + public EndPoint select(DataObject object) { + DataStore store = object.getDataStore(); + if (store.getRole() == DataStoreRole.Primary) { + return findEndpointForPrimaryStorage(store); + } else { + throw new CloudRuntimeException("not implemented yet"); + } + + } } diff --git a/engine/storage/src/org/apache/cloudstack/storage/endpoint/EndPointSelector.java b/engine/storage/src/org/apache/cloudstack/storage/endpoint/EndPointSelector.java index 274c5dcf53b..9f93cdacfb1 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/endpoint/EndPointSelector.java +++ b/engine/storage/src/org/apache/cloudstack/storage/endpoint/EndPointSelector.java @@ -23,4 +23,10 @@ import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; public interface EndPointSelector { public EndPoint select(DataObject srcData, DataObject destData); + + /** + * @param object + * @return + */ + EndPoint select(DataObject object); } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java index 3cf5697ee9c..dfc65664d65 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java @@ -16,9 +16,10 @@ // under the License. package org.apache.cloudstack.storage.datastore.driver; -import java.util.List; import java.util.Set; +import javax.inject.Inject; + import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult; import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult; import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; @@ -28,10 +29,10 @@ import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.framework.async.AsyncRpcConext; +import org.apache.cloudstack.storage.command.CreateObjectCommand; import org.apache.cloudstack.storage.command.CreateVolumeAnswer; -import org.apache.cloudstack.storage.command.CreateVolumeCommand; import org.apache.cloudstack.storage.command.DeleteCommand; -import org.apache.cloudstack.storage.datastore.PrimaryDataStore; +import org.apache.cloudstack.storage.endpoint.EndPointSelector; import org.apache.cloudstack.storage.snapshot.SnapshotInfo; import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver; import org.apache.log4j.Logger; @@ -41,11 +42,9 @@ import com.cloud.agent.api.Answer; public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver { private static final Logger s_logger = Logger.getLogger(DefaultPrimaryDataStoreDriverImpl.class); - protected PrimaryDataStore dataStore; - public DefaultPrimaryDataStoreDriverImpl(PrimaryDataStore dataStore) { - this.dataStore = dataStore; - } - + @Inject + EndPointSelector selector; + public DefaultPrimaryDataStoreDriverImpl() { } @@ -83,8 +82,8 @@ public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver @Override public void deleteAsync(DataObject vo, AsyncCompletionCallback callback) { DeleteCommand cmd = new DeleteCommand(vo.getUri()); - List endPoints = null; - EndPoint ep = endPoints.get(0); + + EndPoint ep = selector.select(vo); AsyncRpcConext context = new AsyncRpcConext(callback); AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); caller.setCallback(caller.getTarget().deleteCallback(null, null)) @@ -153,9 +152,8 @@ public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver @Override public void createAsync(DataObject vol, AsyncCompletionCallback callback) { - List endPoints = null; - EndPoint ep = endPoints.get(0); - CreateVolumeCommand createCmd = new CreateVolumeCommand(vol.getUri()); + EndPoint ep = selector.select(vol); + CreateObjectCommand createCmd = new CreateObjectCommand(vol.getUri()); CreateVolumeContext context = null; AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); @@ -163,7 +161,6 @@ public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver .setCallback(caller.getTarget().createAsyncCallback(null, null)); ep.sendMessageAsync(createCmd, caller); - } @Override 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 d47da9b0183..a245fb7bb73 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,7 +33,7 @@ import org.apache.cloudstack.storage.command.CopyCmd; import org.apache.cloudstack.storage.command.CopyCmdAnswer; import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd; import org.apache.cloudstack.storage.command.CreateVolumeAnswer; -import org.apache.cloudstack.storage.command.CreateVolumeCommand; +import org.apache.cloudstack.storage.command.CreateObjectCommand; import org.apache.cloudstack.storage.command.CreateVolumeFromBaseImageCommand; import org.apache.cloudstack.storage.command.StorageSubSystemCommand; import org.apache.cloudstack.storage.datastore.protocol.DataStoreProtocol; @@ -82,8 +82,8 @@ public class XenServerStorageResource { return execute((CreatePrimaryDataStoreCmd) command); } else if (command instanceof CreateVolumeFromBaseImageCommand) { return execute((CreateVolumeFromBaseImageCommand)command); - } else if (command instanceof CreateVolumeCommand) { - return execute((CreateVolumeCommand) command); + } else if (command instanceof CreateObjectCommand) { + return execute((CreateObjectCommand) command); } else if (command instanceof DeleteVolumeCommand) { return execute((DeleteVolumeCommand)command); } @@ -114,7 +114,7 @@ public class XenServerStorageResource { vdi.destroy(conn); } - protected CreateVolumeAnswer execute(CreateVolumeCommand cmd) { + protected CreateVolumeAnswer execute(CreateObjectCommand cmd) { VolumeTO volume = null; PrimaryDataStoreTO primaryDataStore = volume.getDataStore(); Connection conn = hypervisorResource.getConnection();