diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java deleted file mode 100644 index 8a73e63f230..00000000000 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.apache.cloudstack.engine.subsystem.api.storage; - -public interface DataStoreLifeCycle { - public enum DataStoreEvent { - HOSTUP, - HOSTDOWN, - } - void add(); - void delete(); - void enable(); - void disable(); - void processEvent(DataStoreEvent event, Object... objs); -} diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java index 99956887384..27ea41c1a63 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java @@ -38,4 +38,6 @@ public interface PrimaryDataStoreInfo { public State getManagedState(); public String getName(); public String getType(); + public PrimaryDataStoreLifeCycle getLifeCycle(); + PrimaryDataStoreProvider getProvider(); } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/PrimaryDataStoreLifeCycle.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreLifeCycle.java similarity index 63% rename from engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/PrimaryDataStoreLifeCycle.java rename to engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreLifeCycle.java index 570a622a4ad..bcd0d851fae 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/PrimaryDataStoreLifeCycle.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreLifeCycle.java @@ -16,24 +16,22 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.cloudstack.storage.datastore.lifecycle; +package org.apache.cloudstack.engine.subsystem.api.storage; import java.util.Map; -import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; - public interface PrimaryDataStoreLifeCycle { - public PrimaryDataStoreInfo registerDataStore(Map dsInfos); + public boolean initialize(Map dsInfos); - public boolean attach(long scope); + public boolean attach(Scope scope); - public boolean dettach(long dataStoreId); + public boolean dettach(); - public boolean unmanaged(long dataStoreId); + public boolean unmanaged(); - public boolean maintain(long dataStoreId); + public boolean maintain(); - public boolean cancelMaintain(long dataStoreId); + public boolean cancelMaintain(); - public boolean deleteDataStore(long dataStoreId); + public boolean deleteDataStore(); } diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreProvider.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreProvider.java new file mode 100644 index 00000000000..c83594e6176 --- /dev/null +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreProvider.java @@ -0,0 +1,18 @@ +package org.apache.cloudstack.engine.subsystem.api.storage; + +import java.util.Map; + +public interface PrimaryDataStoreProvider { + public PrimaryDataStoreInfo getDataStore(long dataStoreId); + public long getId(); + public String getName(); + + /** + * @param dsInfos + * @return + */ + PrimaryDataStoreInfo registerDataStore(Map dsInfos); + + //LifeCycle of provider + public boolean configure(); +} diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/Scope.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/Scope.java new file mode 100644 index 00000000000..a9601a138bf --- /dev/null +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/Scope.java @@ -0,0 +1,24 @@ +/* + * 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.engine.subsystem.api.storage; + +public interface Scope { + public ScopeType getScopeType(); + public long getScopeId(); +} diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ScopeType.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ScopeType.java new file mode 100644 index 00000000000..d1606e18a74 --- /dev/null +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ScopeType.java @@ -0,0 +1,25 @@ +/* + * 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.engine.subsystem.api.storage; + +public enum ScopeType { + HOST, + CLUSTER, + ZONE; +} diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java index 2c24739b8e6..09fa3d187c3 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java @@ -35,6 +35,8 @@ import javax.naming.ConfigurationException; import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity; import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity; import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider; import org.apache.cloudstack.engine.subsystem.api.storage.disktype.QCOW2; import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VHD; import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VMDK; @@ -47,9 +49,7 @@ import org.apache.cloudstack.storage.command.CreateVolumeFromBaseImageCommand; import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStore; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO; -import org.apache.cloudstack.storage.datastore.lifecycle.PrimaryDataStoreLifeCycle; import org.apache.cloudstack.storage.datastore.provider.DefaultPrimaryDatastoreProviderImpl; -import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProvider; import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProviderManager; import org.apache.cloudstack.storage.image.ImageService; import org.apache.cloudstack.storage.image.db.ImageDataDao; diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java index b977a79d5ad..befb9d694ad 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java @@ -49,5 +49,4 @@ public interface PrimaryDataStore extends PrimaryDataStoreInfo { boolean installTemplate(TemplateOnPrimaryDataStoreInfo template); VolumeDiskType getDefaultDiskType(); - } diff --git a/engine/storage/src/org/apache/cloudstack/storage/scope/ClusterScope.java b/engine/storage/src/org/apache/cloudstack/storage/scope/ClusterScope.java new file mode 100644 index 00000000000..dad2f509bc4 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/scope/ClusterScope.java @@ -0,0 +1,42 @@ +/* + * 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.scope; + +import org.apache.cloudstack.engine.subsystem.api.storage.Scope; +import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType; + +public class ClusterScope implements Scope { + private ScopeType type = ScopeType.CLUSTER; + private long clusterId; + + public ClusterScope(long clusterId) { + this.clusterId = clusterId; + } + + @Override + public ScopeType getScopeType() { + return this.type; + } + + @Override + public long getScopeId() { + return this.clusterId; + } + +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/scope/HostScope.java b/engine/storage/src/org/apache/cloudstack/storage/scope/HostScope.java new file mode 100644 index 00000000000..a36c98e8375 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/scope/HostScope.java @@ -0,0 +1,39 @@ +/* + * 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.scope; + +import org.apache.cloudstack.engine.subsystem.api.storage.Scope; +import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType; + +public class HostScope implements Scope { + private ScopeType type = ScopeType.HOST; + private long hostId; + public HostScope(long hostId) { + this.hostId = hostId; + } + @Override + public ScopeType getScopeType() { + return this.type; + } + + @Override + public long getScopeId() { + return this.hostId; + } +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/scope/ZoneScope.java b/engine/storage/src/org/apache/cloudstack/storage/scope/ZoneScope.java new file mode 100644 index 00000000000..23a0ddbb5b3 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/scope/ZoneScope.java @@ -0,0 +1,42 @@ +/* + * 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.scope; + +import org.apache.cloudstack.engine.subsystem.api.storage.Scope; +import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType; + +public class ZoneScope implements Scope { + private ScopeType type = ScopeType.ZONE; + private long zoneId; + + public ZoneScope(long zoneId) { + this.zoneId = zoneId; + } + + @Override + public ScopeType getScopeType() { + return this.type; + } + + @Override + public long getScopeId() { + return this.zoneId; + } + +} diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DataStoreStatus.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DataStoreStatus.java index 5c61da00aa0..a40f6cf65ad 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DataStoreStatus.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DataStoreStatus.java @@ -19,5 +19,5 @@ package org.apache.cloudstack.storage.datastore; public enum DataStoreStatus { - Creating, Up, PrepareForMaintenance, ErrorInMaintenance, CancelMaintenance, Maintenance, Removed; + Initial, Initialized, Creating, Up, PrepareForMaintenance, ErrorInMaintenance, CancelMaintenance, Maintenance, Removed; } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java index b6350ed5a38..f5e7349f6c4 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java @@ -8,10 +8,13 @@ import javax.inject.Inject; import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State; import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType; import org.apache.cloudstack.storage.HypervisorHostEndPoint; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO; +import org.apache.cloudstack.storage.datastore.driver.DefaultPrimaryDataStoreDriverImpl; import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver; import org.apache.cloudstack.storage.image.TemplateInfo; import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo; @@ -33,6 +36,7 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore { protected PrimaryDataStoreDriver driver; protected PrimaryDataStoreVO pdsv; protected PrimaryDataStoreInfo pdsInfo; + protected PrimaryDataStoreLifeCycle lifeCycle; @Inject private VolumeDao volumeDao; @Inject @@ -40,14 +44,20 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore { @Inject TemplatePrimaryDataStoreManager templatePrimaryStoreMgr; - private DefaultPrimaryDataStore(PrimaryDataStoreDriver driver, PrimaryDataStoreVO pdsv, PrimaryDataStoreInfo pdsInfo) { - this.driver = driver; + private DefaultPrimaryDataStore(PrimaryDataStoreVO pdsv) { this.pdsv = pdsv; - this.pdsInfo = pdsInfo; } - public static DefaultPrimaryDataStore createDataStore(PrimaryDataStoreDriver driver, PrimaryDataStoreVO pdsv, PrimaryDataStoreInfo pdsInfo) { - DefaultPrimaryDataStore dataStore = new DefaultPrimaryDataStore(driver, pdsv, pdsInfo); + public void setDriver(PrimaryDataStoreDriver driver) { + this.driver = driver; + } + + public void setLifeCycle(PrimaryDataStoreLifeCycle lifeCycle) { + this.lifeCycle = lifeCycle; + } + + public static DefaultPrimaryDataStore createDataStore(PrimaryDataStoreVO pdsv) { + DefaultPrimaryDataStore dataStore = new DefaultPrimaryDataStore(pdsv); return ComponentInject.inject(dataStore); } @@ -120,7 +130,7 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore { @Override public VolumeObject createVolume(VolumeInfo vi, VolumeDiskType diskType) { - if (!pdsInfo.isVolumeDiskTypeSupported(diskType)) { + if (!isVolumeDiskTypeSupported(diskType)) { return null; } VolumeObject vo = (VolumeObject) vi; @@ -193,4 +203,16 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore { // TODO Auto-generated method stub return null; } + + @Override + public PrimaryDataStoreLifeCycle getLifeCycle() { + // TODO Auto-generated method stub + return null; + } + + @Override + public PrimaryDataStoreProvider getProvider() { + // TODO Auto-generated method stub + return null; + } } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreVO.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreVO.java index 6c05d104393..5a6b409e708 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreVO.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreVO.java @@ -108,7 +108,7 @@ public class PrimaryDataStoreVO implements Identity { } public PrimaryDataStoreVO() { - // TODO Auto-generated constructor stub + this.status = DataStoreStatus.Initial; } public String getName() { 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 97b49cb3c0d..db5f7e8d05f 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 @@ -1,6 +1,7 @@ package org.apache.cloudstack.storage.datastore.driver; import java.util.List; +import java.util.Map; import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; @@ -8,6 +9,7 @@ import org.apache.cloudstack.storage.command.CreateVolumeAnswer; import org.apache.cloudstack.storage.command.CreateVolumeCommand; import org.apache.cloudstack.storage.command.CreateVolumeFromBaseImageCommand; import org.apache.cloudstack.storage.command.DeleteVolume; +import org.apache.cloudstack.storage.datastore.PrimaryDataStore; import org.apache.cloudstack.storage.to.ImageOnPrimayDataStoreTO; import org.apache.cloudstack.storage.to.VolumeTO; import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo; @@ -19,10 +21,13 @@ import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; import com.cloud.utils.exception.CloudRuntimeException; -@Component 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; + } + @Override public boolean createVolume(VolumeObject vol) { // The default driver will send createvolume command to one of hosts @@ -110,4 +115,22 @@ public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver // TODO Auto-generated method stub return 0; } + + @Override + public boolean initialize(Map params) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean grantAccess(EndPoint ep) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean revokeAccess(EndPoint ep) { + // TODO Auto-generated method stub + return false; + } } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java index 271ec38cb71..a42ec16af1b 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java @@ -1,5 +1,7 @@ package org.apache.cloudstack.storage.datastore.driver; +import java.util.Map; + import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo; import org.apache.cloudstack.storage.volume.VolumeObject; @@ -18,4 +20,11 @@ public interface PrimaryDataStoreDriver { long getCapacity(); long getAvailableCapacity(); + + + //Lifecycle API + boolean initialize(Map params); + boolean grantAccess(EndPoint ep); + boolean revokeAccess(EndPoint ep); + } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java index c4c72167a59..3d611ccfddb 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java @@ -25,18 +25,23 @@ import java.util.Map; import javax.inject.Inject; import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider; +import org.apache.cloudstack.engine.subsystem.api.storage.Scope; +import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType; +import org.apache.cloudstack.storage.datastore.DataStoreStatus; +import org.apache.cloudstack.storage.datastore.PrimaryDataStore; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO; -import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProvider; import org.springframework.stereotype.Component; public class DefaultPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLifeCycle { - private final PrimaryDataStoreProvider provider; + protected PrimaryDataStoreInfo dataStore; protected PrimaryDataStoreDao dataStoreDao; - public DefaultPrimaryDataStoreLifeCycleImpl(PrimaryDataStoreProvider provider, PrimaryDataStoreDao dataStoreDao) { - this.provider = provider; + public DefaultPrimaryDataStoreLifeCycleImpl(PrimaryDataStoreDao dataStoreDao, PrimaryDataStore dataStore) { this.dataStoreDao = dataStoreDao; + this.dataStore = dataStore; } protected class DataStoreUrlParser { @@ -75,54 +80,54 @@ public class DefaultPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLif } @Override - public PrimaryDataStoreInfo registerDataStore(Map dsInfos) { + public boolean initialize(Map dsInfos) { DataStoreUrlParser parser = new DataStoreUrlParser(dsInfos.get("url")); - PrimaryDataStoreVO dataStore = new PrimaryDataStoreVO(); + PrimaryDataStoreVO dataStore = dataStoreDao.findById(this.dataStore.getId()); dataStore.setName(dsInfos.get("name")); dataStore.setPoolType(parser.getSchema()); dataStore.setPort(parser.port); - dataStore.setDataCenterId(Integer.parseInt(dsInfos.get("dcId"))); dataStore.setHostAddress(parser.getHost()); dataStore.setPath(parser.getPath()); - dataStore.setStorageProviderId(this.provider.getId()); - dataStore.setClusterId(Long.parseLong(dsInfos.get("clusterId"))); - dataStore = dataStoreDao.persist(dataStore); + dataStore.setStatus(DataStoreStatus.Initialized); + dataStoreDao.update(this.dataStore.getId(), dataStore); //TODO: add extension point for each data store - return this.provider.getDataStore(dataStore.getId()); + + this.dataStore = this.dataStore.getProvider().getDataStore(dataStore.getId()); + return true; } @Override - public boolean attach(long scope) { + public boolean attach(Scope scope) { + //if (scope.getScopeType() == ScopeType.CLUSTER) + return false; + } + + @Override + public boolean dettach() { // TODO Auto-generated method stub return false; } @Override - public boolean dettach(long dataStoreId) { + public boolean unmanaged() { // TODO Auto-generated method stub return false; } @Override - public boolean unmanaged(long dataStoreId) { + public boolean maintain() { // TODO Auto-generated method stub return false; } @Override - public boolean maintain(long dataStoreId) { + public boolean cancelMaintain() { // TODO Auto-generated method stub return false; } @Override - public boolean cancelMaintain(long dataStoreId) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean deleteDataStore(long dataStoreId) { + public boolean deleteDataStore() { // TODO Auto-generated method stub return false; } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java index 91528ba214b..139da4d729d 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java @@ -20,12 +20,13 @@ package org.apache.cloudstack.storage.datastore.manager; import javax.inject.Inject; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider; import org.apache.cloudstack.storage.datastore.PrimaryDataStore; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderDao; -import org.apache.cloudstack.storage.datastore.lifecycle.PrimaryDataStoreLifeCycle; -import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProvider; import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProviderManager; import org.springframework.stereotype.Component; @@ -43,14 +44,7 @@ public class DefaultPrimaryDataStoreManagerImpl implements PrimaryDataStoreManag PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(dataStoreId); Long providerId = dataStoreVO.getStorageProviderId(); PrimaryDataStoreProvider provider = providerManager.getDataStoreProvider(providerId); - PrimaryDataStore dataStore = provider.getDataStore(dataStoreId); + PrimaryDataStore dataStore = (PrimaryDataStore)provider.getDataStore(dataStoreId); return dataStore; } - - @Override - public PrimaryDataStoreLifeCycle getPrimaryDataStoreLifeCycle(long dataStoreId) { - // TODO Auto-generated method stub - return null; - } - } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/PrimaryDataStoreManager.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/PrimaryDataStoreManager.java index 7dd0276463e..f6b36258f00 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/PrimaryDataStoreManager.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/PrimaryDataStoreManager.java @@ -18,11 +18,10 @@ */ package org.apache.cloudstack.storage.datastore.manager; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle; import org.apache.cloudstack.storage.datastore.PrimaryDataStore; -import org.apache.cloudstack.storage.datastore.lifecycle.PrimaryDataStoreLifeCycle; public interface PrimaryDataStoreManager { public PrimaryDataStore getPrimaryDataStore(long dataStoreId); - public PrimaryDataStoreLifeCycle getPrimaryDataStoreLifeCycle(long dataStoreId); } 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 872673e03ef..f1fca31ded7 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 @@ -4,29 +4,31 @@ import java.util.Map; import javax.inject.Inject; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider; import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStore; import org.apache.cloudstack.storage.datastore.PrimaryDataStore; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderVO; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.driver.DefaultPrimaryDataStoreDriverImpl; import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver; import org.apache.cloudstack.storage.datastore.lifecycle.DefaultPrimaryDataStoreLifeCycleImpl; -import org.apache.cloudstack.storage.datastore.lifecycle.PrimaryDataStoreLifeCycle; import org.springframework.stereotype.Component; @Component public class DefaultPrimaryDatastoreProviderImpl implements PrimaryDataStoreProvider { private final String providerName = "default primary data store provider"; protected PrimaryDataStoreDriver driver; - private PrimaryDataStoreProviderVO provider; + private PrimaryDataStoreProviderVO providerVO; @Inject protected PrimaryDataStoreDao dataStoreDao; - protected PrimaryDataStoreLifeCycle dataStoreLifeCycle; + @Inject + protected PrimaryDataStoreProviderDao providerDao; public DefaultPrimaryDatastoreProviderImpl() { - this.driver = new DefaultPrimaryDataStoreDriverImpl(); - this.dataStoreLifeCycle = new DefaultPrimaryDataStoreLifeCycleImpl(this, dataStoreDao); + } @Override @@ -36,29 +38,37 @@ public class DefaultPrimaryDatastoreProviderImpl implements PrimaryDataStoreProv return null; } - PrimaryDataStore pds = DefaultPrimaryDataStore.createDataStore(driver, dsv, null); + DefaultPrimaryDataStore pds = DefaultPrimaryDataStore.createDataStore(dsv); + + PrimaryDataStoreDriver driver = new DefaultPrimaryDataStoreDriverImpl(pds); + pds.setDriver(driver); + + DefaultPrimaryDataStoreLifeCycleImpl lifeCycle = new DefaultPrimaryDataStoreLifeCycleImpl(dataStoreDao, pds); + pds.setLifeCycle(lifeCycle); + return pds; } - + @Override - public PrimaryDataStoreLifeCycle getDataStoreLifeCycle() { - return dataStoreLifeCycle; + public PrimaryDataStore registerDataStore(Map dsInfos) { + PrimaryDataStoreVO dataStoreVO = new PrimaryDataStoreVO(); + dataStoreVO.setStorageProviderId(this.getId()); + dataStoreVO = dataStoreDao.persist(dataStoreVO); + + PrimaryDataStore dataStore = this.getDataStore(dataStoreVO.getId()); + PrimaryDataStoreLifeCycle lifeCycle = dataStore.getLifeCycle(); + lifeCycle.initialize(dsInfos); + return getDataStore(dataStore.getId()); } @Override public long getId() { - return this.provider.getId(); + return this.providerVO.getId(); } @Override - public boolean register(PrimaryDataStoreProviderVO provider, Map params) { - this.provider = provider; - return true; - } - - @Override - public boolean init(PrimaryDataStoreProviderVO provider) { - this.provider = provider; + public boolean configure() { + this.providerVO = providerDao.findByName(this.providerName); return true; } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProvider.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProvider.java deleted file mode 100644 index c87542623a1..00000000000 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProvider.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.apache.cloudstack.storage.datastore.provider; - -import java.util.Map; - -import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; -import org.apache.cloudstack.storage.datastore.PrimaryDataStore; -import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderVO; -import org.apache.cloudstack.storage.datastore.lifecycle.PrimaryDataStoreLifeCycle; - -public interface PrimaryDataStoreProvider { - public PrimaryDataStore getDataStore(long dataStoreId); - public PrimaryDataStoreLifeCycle getDataStoreLifeCycle(); - public long getId(); - public String getName(); - public boolean register(PrimaryDataStoreProviderVO provider, Map params); - public boolean init(PrimaryDataStoreProviderVO provider); -} diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java index 5ede09c943b..dae9f1113b2 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java @@ -2,6 +2,8 @@ package org.apache.cloudstack.storage.datastore.provider; import java.util.List; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider; + import com.cloud.utils.component.Manager; public interface PrimaryDataStoreProviderManager extends Manager { diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java index c0ad052e50e..d064cce54db 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java @@ -24,6 +24,7 @@ import java.util.Map; import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderVO; import org.springframework.stereotype.Component; @@ -60,10 +61,9 @@ public class PrimaryDataStoreProviderManagerImpl implements PrimaryDataStoreProv PrimaryDataStoreProviderVO dataStoreProvider = new PrimaryDataStoreProviderVO(); dataStoreProvider.setName(provider.getName()); dataStoreProvider = providerDao.persist(dataStoreProvider); - provider.register(dataStoreProvider, params); } - PrimaryDataStoreProviderVO providervo = providerDao.findByName(provider.getName()); - provider.init(providervo); + + provider.configure(); } return true; } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java index 5b2d1cb3bda..b197ba1bd24 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java @@ -72,23 +72,35 @@ public class TemplatePrimaryDataStoreManagerImpl implements TemplatePrimaryDataS retries--; } while (retries > 0); + if (templateStoreVO == null) { + throw new CloudRuntimeException("waiting too long for template downloading, marked it as failed"); + } + return templateStoreVO; } @Override public TemplateOnPrimaryDataStoreObject createTemplateOnPrimaryDataStore(TemplateInfo template, PrimaryDataStoreInfo dataStore) { - - TemplatePrimaryDataStoreVO templateStoreVO = new TemplatePrimaryDataStoreVO(dataStore.getId(), template.getId()); - try { - templateStoreVO = templateStoreDao.persist(templateStoreVO); - } catch (Throwable th) { - templateStoreVO = templateStoreDao.findByTemplateIdAndPoolId(template.getId(), dataStore.getId()); - if (templateStoreVO != null) { - templateStoreVO = waitingForTemplateDownload(template, dataStore); - } else { - throw new CloudRuntimeException("Failed create db entry: " + th.toString()); + TemplatePrimaryDataStoreVO templateStoreVO = null; + boolean freshNewTemplate = false; + templateStoreVO = templateStoreDao.findByTemplateIdAndPoolId(template.getId(), dataStore.getId()); + if (templateStoreVO == null) { + try { + templateStoreVO = new TemplatePrimaryDataStoreVO(dataStore.getId(), template.getId()); + templateStoreVO = templateStoreDao.persist(templateStoreVO); + freshNewTemplate = true; + } catch (Throwable th) { + templateStoreVO = templateStoreDao.findByTemplateIdAndPoolId(template.getId(), dataStore.getId()); + if (templateStoreVO == null) { + throw new CloudRuntimeException("Failed create db entry: " + th.toString()); + } } } + //If it's not a fresh template downloading, waiting for other people downloading finished. + if (!freshNewTemplate && templateStoreVO.getState() != TemplateOnPrimaryDataStoreStateMachine.State.Ready) { + templateStoreVO = waitingForTemplateDownload(template, dataStore); + } + TemplateOnPrimaryDataStoreObject templateStoreObject = new TemplateOnPrimaryDataStoreObject(dataStore, template, templateStoreVO, templateStoreDao, this); return templateStoreObject; } diff --git a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java index bd3844a9b08..8d96711c756 100644 --- a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java +++ b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java @@ -1,5 +1,7 @@ package org.apache.cloudstack.storage.datastore.driver; +import java.util.Map; + import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo; import org.apache.cloudstack.storage.volume.VolumeObject; @@ -49,4 +51,22 @@ public class SolidfirePrimaryDataStoreDriver implements PrimaryDataStoreDriver { return 0; } + @Override + public boolean initialize(Map params) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean grantAccess(EndPoint ep) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean revokeAccess(EndPoint ep) { + // TODO Auto-generated method stub + return false; + } + } diff --git a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java index a66fac20c48..2fbcc2c5157 100644 --- a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java +++ b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java @@ -1,24 +1,21 @@ package org.apache.cloudstack.storage.datastore.provider; -import javax.inject.Inject; - import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStore; import org.apache.cloudstack.storage.datastore.PrimaryDataStore; -import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO; import org.apache.cloudstack.storage.datastore.driver.SolidfirePrimaryDataStoreDriver; +import org.apache.cloudstack.storage.datastore.lifecycle.DefaultPrimaryDataStoreLifeCycleImpl; import org.springframework.stereotype.Component; @Component public class SolidfirePrimaryDataStoreProvider extends DefaultPrimaryDatastoreProviderImpl { private final String name = "Solidfre Primary Data Store Provider"; - private SolidfirePrimaryDataStoreDriver driver; - - @Inject - public SolidfirePrimaryDataStoreProvider(PrimaryDataStoreDao dataStoreDao) { - super(dataStoreDao); - driver = new SolidfirePrimaryDataStoreDriver(); + + + public SolidfirePrimaryDataStoreProvider() { + super(); + // TODO Auto-generated constructor stub } @@ -34,7 +31,12 @@ public class SolidfirePrimaryDataStoreProvider extends return null; } - PrimaryDataStore pds = DefaultPrimaryDataStore.createDataStore(driver, dsv, null); + DefaultPrimaryDataStore pds = DefaultPrimaryDataStore.createDataStore(dsv); + SolidfirePrimaryDataStoreDriver driver = new SolidfirePrimaryDataStoreDriver(); + pds.setDriver(driver); + + DefaultPrimaryDataStoreLifeCycleImpl lifeCycle = new DefaultPrimaryDataStoreLifeCycleImpl(super.dataStoreDao, pds); + pds.setLifeCycle(lifeCycle); return pds; } } diff --git a/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java b/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java index 39ecc0c1029..eb0550a4faf 100644 --- a/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java +++ b/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java @@ -12,11 +12,11 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider; import org.apache.cloudstack.storage.command.CreateVolumeAnswer; import org.apache.cloudstack.storage.command.CreateVolumeFromBaseImageCommand; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; -import org.apache.cloudstack.storage.datastore.lifecycle.PrimaryDataStoreLifeCycle; -import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProvider; import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProviderManager; import org.junit.Before; import org.junit.Test; @@ -120,13 +120,12 @@ public class VolumeTest { try { primaryDataStoreProviderMgr.configure("primary data store mgr", new HashMap()); PrimaryDataStoreProvider provider = primaryDataStoreProviderMgr.getDataStoreProvider("Solidfre Primary Data Store Provider"); - PrimaryDataStoreLifeCycle lifeCycle = provider.getDataStoreLifeCycle(); Map params = new HashMap(); params.put("url", "nfs://test/test"); params.put("dcId", dcId.toString()); params.put("clusterId", clusterId.toString()); params.put("name", "my primary data store"); - PrimaryDataStoreInfo primaryDataStoreInfo = lifeCycle.registerDataStore(params); + PrimaryDataStoreInfo primaryDataStoreInfo = provider.registerDataStore(params); return primaryDataStoreInfo; } catch (ConfigurationException e) { return null;