You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ed...@apache.org on 2013/01/15 03:04:54 UTC
[24/44] Revert "Merge remote-tracking branch 'origin/javelin' into
javelin"
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java
----------------------------------------------------------------------
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 c3372b7..658d4db 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
@@ -21,10 +21,9 @@ package org.apache.cloudstack.storage.datastore.lifecycle;
import java.util.Map;
import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
-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.ZoneScope;
+import org.apache.cloudstack.storage.EndPoint;
import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd;
import org.apache.cloudstack.storage.datastore.DataStoreStatus;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
@@ -39,21 +38,29 @@ public class DefaultPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLif
}
@Override
- public boolean initialize(DataStore store, Map<String, String> dsInfos) {
+ public void setDataStore(PrimaryDataStoreInfo dataStore) {
+ this.dataStore = (PrimaryDataStore)dataStore;
+ }
+
+ @Override
+ public boolean initialize(Map<String, String> dsInfos) {
+ PrimaryDataStoreVO dataStore = dataStoreDao.findById(this.dataStore.getId());
+ dataStore.setStatus(DataStoreStatus.Initialized);
+ dataStoreDao.update(this.dataStore.getId(), dataStore);
//TODO: add extension point for each data store
return true;
}
protected void attachCluster() {
//send down AttachPrimaryDataStoreCmd command to all the hosts in the cluster
- AttachPrimaryDataStoreCmd cmd = new AttachPrimaryDataStoreCmd(this.dataStore.getUri());
- /*for (EndPoint ep : dataStore.getEndPoints()) {
+ AttachPrimaryDataStoreCmd cmd = new AttachPrimaryDataStoreCmd(this.dataStore.getDataStoreTO());
+ for (EndPoint ep : dataStore.getEndPoints()) {
ep.sendMessage(cmd);
- } */
+ }
}
@Override
- public boolean attachCluster(DataStore dataStore, ClusterScope scope) {
+ public boolean attachCluster(ClusterScope scope) {
PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(this.dataStore.getId());
dataStoreVO.setDataCenterId(scope.getZoneId());
dataStoreVO.setPodId(scope.getPodId());
@@ -100,12 +107,4 @@ public class DefaultPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLif
return false;
}
-
-
- @Override
- public boolean attachZone(DataStore dataStore, ZoneScope scope) {
- // TODO Auto-generated method stub
- return false;
- }
-
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultXenPrimaryDataStoreLifeCycle.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultXenPrimaryDataStoreLifeCycle.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultXenPrimaryDataStoreLifeCycle.java
index da61825..bb255b0 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultXenPrimaryDataStoreLifeCycle.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultXenPrimaryDataStoreLifeCycle.java
@@ -18,7 +18,7 @@
*/
package org.apache.cloudstack.storage.datastore.lifecycle;
-import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
+import org.apache.cloudstack.storage.EndPoint;
import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd;
import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
@@ -39,9 +39,8 @@ public class DefaultXenPrimaryDataStoreLifeCycle extends DefaultPrimaryDataStore
@Override
public void attachCluster() {
- String result = null;
//send one time is enough, as xenserver is clustered
- /*CreatePrimaryDataStoreCmd cmd = new CreatePrimaryDataStoreCmd(this.dataStore.getDataStoreTO());
+ CreatePrimaryDataStoreCmd cmd = new CreatePrimaryDataStoreCmd(this.dataStore.getDataStoreTO());
String result = null;
for (EndPoint ep : dataStore.getEndPoints()) {
Answer answer = ep.sendMessage(cmd);
@@ -49,7 +48,7 @@ public class DefaultXenPrimaryDataStoreLifeCycle extends DefaultPrimaryDataStore
return;
}
result = answer.getDetails();
- }*/
+ }
if (result != null)
throw new CloudRuntimeException("AttachPrimaryDataStoreCmd failed: " + result);
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..139da4d
--- /dev/null
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java
@@ -0,0 +1,50 @@
+/*
+ * 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.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.provider.PrimaryDataStoreProviderManager;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DefaultPrimaryDataStoreManagerImpl implements PrimaryDataStoreManager {
+ @Inject
+ PrimaryDataStoreProviderDao dataStoreProviderDao;
+ @Inject
+ PrimaryDataStoreProviderManager providerManager;
+ @Inject
+ PrimaryDataStoreDao dataStoreDao;
+
+ @Override
+ public PrimaryDataStore getPrimaryDataStore(long dataStoreId) {
+ PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(dataStoreId);
+ Long providerId = dataStoreVO.getStorageProviderId();
+ PrimaryDataStoreProvider provider = providerManager.getDataStoreProvider(providerId);
+ PrimaryDataStore dataStore = (PrimaryDataStore)provider.getDataStore(dataStoreId);
+ return dataStore;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreProviderManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreProviderManagerImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreProviderManagerImpl.java
deleted file mode 100644
index fd66ffb..0000000
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreProviderManagerImpl.java
+++ /dev/null
@@ -1,67 +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.datastore.manager;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.inject.Inject;
-
-import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStore;
-import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
-import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
-import org.apache.cloudstack.storage.datastore.db.DataStoreProviderDao;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
-import org.apache.cloudstack.storage.datastore.provider.DataStoreProvider;
-import org.apache.cloudstack.storage.datastore.provider.DataStoreProviderManager;
-import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
-import org.springframework.stereotype.Component;
-
-@Component
-public class DefaultPrimaryDataStoreProviderManagerImpl implements PrimaryDataStoreProviderManager {
- @Inject
- DataStoreProviderDao dataStoreProviderDao;
- @Inject
- DataStoreProviderManager providerManager;
- @Inject
- PrimaryDataStoreDao dataStoreDao;
- Map<String, PrimaryDataStoreDriver> driverMaps = new HashMap<String, PrimaryDataStoreDriver>();
-
- @Override
- public PrimaryDataStore getPrimaryDataStore(long dataStoreId) {
- PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(dataStoreId);
- long providerId = dataStoreVO.getStorageProviderId();
- DataStoreProvider provider = providerManager.getDataStoreProviderById(providerId);
- DefaultPrimaryDataStore dataStore = DefaultPrimaryDataStore.createDataStore(dataStoreVO,
- driverMaps.get(provider.getUuid()),
- provider);
-
- return dataStore;
- }
-
- @Override
- public boolean registerDriver(String uuid, PrimaryDataStoreDriver driver) {
- if (driverMaps.get(uuid) != null) {
- return false;
- }
- driverMaps.put(uuid, driver);
- return true;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/PrimaryDataStoreManager.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..f6b3625
--- /dev/null
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/PrimaryDataStoreManager.java
@@ -0,0 +1,27 @@
+/*
+ * 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.datastore.manager;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
+import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
+
+public interface PrimaryDataStoreManager {
+ public PrimaryDataStore getPrimaryDataStore(long dataStoreId);
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/data model.ucls
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/data model.ucls b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/data model.ucls
deleted file mode 100644
index 2e09bd5..0000000
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/data model.ucls
+++ /dev/null
@@ -1,57 +0,0 @@
-<class-diagram version="1.0.11" icons="true" always-add-relationships="false" generalizations="true" realizations="true"
- associations="true" dependencies="false" nesting-relationships="true">
- <interface id="1" corner="BOTTOM_RIGHT" language="java"
- name="org.apache.cloudstack.engine.subsystem.api.storage.DataObject" project="cloud-engine-api"
- file="/cloud-engine-api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObject.java" binary="false">
- <position height="-1" width="-1" x="311" y="101"/>
- <display autosize="true" stereotype="true" package="true" initial-value="false" signature="true" visibility="true">
- <attributes public="true" package="true" protected="true" private="true"/>
- <operations public="true" package="true" protected="true" private="true"/>
- </display>
- </interface>
- <interface id="2" corner="BOTTOM_RIGHT" language="java"
- name="org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo" project="cloud-engine-api"
- file="/cloud-engine-api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java" binary="false">
- <position height="-1" width="-1" x="146" y="279"/>
- <display autosize="true" stereotype="true" package="true" initial-value="false" signature="true" visibility="true">
- <attributes public="true" package="true" protected="true" private="true"/>
- <operations public="true" package="true" protected="true" private="true"/>
- </display>
- </interface>
- <interface id="3" corner="BOTTOM_RIGHT" language="java" name="org.apache.cloudstack.storage.snapshot.SnapshotInfo"
- project="cloud-engine-storage"
- file="/cloud-engine-storage/src/org/apache/cloudstack/storage/snapshot/SnapshotInfo.java" binary="false">
- <position height="-1" width="-1" x="361" y="282"/>
- <display autosize="true" stereotype="true" package="true" initial-value="false" signature="true" visibility="true">
- <attributes public="true" package="true" protected="true" private="true"/>
- <operations public="true" package="true" protected="true" private="true"/>
- </display>
- </interface>
- <interface id="4" corner="BOTTOM_RIGHT" language="java" name="org.apache.cloudstack.storage.image.TemplateInfo"
- project="cloud-engine-storage"
- file="/cloud-engine-storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java" binary="false">
- <position height="-1" width="-1" x="573" y="292"/>
- <display autosize="true" stereotype="true" package="true" initial-value="false" signature="true" visibility="true">
- <attributes public="true" package="true" protected="true" private="true"/>
- <operations public="true" package="true" protected="true" private="true"/>
- </display>
- </interface>
- <generalization id="5">
- <end type="SOURCE" refId="3"/>
- <end type="TARGET" refId="1"/>
- </generalization>
- <generalization id="6">
- <end type="SOURCE" refId="4"/>
- <end type="TARGET" refId="1"/>
- </generalization>
- <generalization id="7">
- <end type="SOURCE" refId="2"/>
- <end type="TARGET" refId="1"/>
- </generalization>
- <classifier-display autosize="true" stereotype="true" package="true" initial-value="false" signature="true"
- visibility="true">
- <attributes public="true" package="true" protected="true" private="true"/>
- <operations public="true" package="true" protected="true" private="true"/>
- </classifier-display>
- <association-display labels="true" multiplicity="true"/>
-</class-diagram>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/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 fe44ed8..55966be 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
@@ -1,55 +1,166 @@
+// 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.datastore.provider;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.List;
import java.util.Map;
+import javax.annotation.PostConstruct;
import javax.inject.Inject;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle;
-import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
+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.configurator.PrimaryDataStoreConfigurator;
+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;
+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.volume.PrimaryDataStoreDriver;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
-import com.cloud.utils.component.ComponentContext;
+import com.cloud.dc.ClusterVO;
+import com.cloud.dc.dao.ClusterDao;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.utils.exception.CloudRuntimeException;
@Component
public class DefaultPrimaryDatastoreProviderImpl implements PrimaryDataStoreProvider {
private final String providerName = "default primary data store provider";
protected PrimaryDataStoreDriver driver;
+ private PrimaryDataStoreProviderVO providerVO;
@Inject
- PrimaryDataStoreProviderManager storeMgr;
- protected DataStoreLifeCycle lifecyle;
- protected String uuid;
- protected long id;
+ protected PrimaryDataStoreDao dataStoreDao;
+ @Inject
+ protected PrimaryDataStoreProviderDao providerDao;
+ @Inject
+ protected ClusterDao clusterDao;
+ protected Map<String, PrimaryDataStoreConfigurator> configuratorMaps = new HashMap<String, PrimaryDataStoreConfigurator>();
+
+ @Inject
+ public DefaultPrimaryDatastoreProviderImpl(@Qualifier("defaultProvider") List<PrimaryDataStoreConfigurator> configurators) {
+ for (PrimaryDataStoreConfigurator configurator : configurators) {
+ String key = generateKey(configurator.getSupportedHypervisor(), configurator.getSupportedDataStoreType().toString());
+ configuratorMaps.put(key, configurator);
+ }
+ }
+
+ // TODO: Remove this. I put this in to get over the compilation problem. Edison needs to look at Solidfire's implementation which requires this.
+ public DefaultPrimaryDatastoreProviderImpl() {
+
+ }
+
+ protected String generateKey(HypervisorType hypervisor, String poolType) {
+ return hypervisor.toString().toLowerCase() + "_" + poolType.toString().toLowerCase();
+ }
+
@Override
- public String getName() {
- return providerName;
+ public PrimaryDataStore getDataStore(long dataStoreId) {
+ PrimaryDataStoreVO dsv = dataStoreDao.findById(dataStoreId);
+ if (dsv == null) {
+ return null;
+ }
+
+ String key = dsv.getKey();
+
+ PrimaryDataStoreConfigurator configurator = configuratorMaps.get(key);
+
+ DefaultPrimaryDataStore dataStore = (DefaultPrimaryDataStore)configurator.getDataStore(dataStoreId);
+ dataStore.setProvider(this);
+ return dataStore;
}
@Override
- public DataStoreLifeCycle getLifeCycle() {
- return this.lifecyle;
+ public PrimaryDataStore registerDataStore(Map<String, String> dsInfos) {
+ String url = dsInfos.get("url");
+ URI uri = null;
+ try {
+ uri = new URI(url);
+ } catch (URISyntaxException e) {
+ throw new CloudRuntimeException("invalid url: " + e.toString());
+ }
+ String protocol = uri.getScheme();
+ Long cluster = null;
+ try {
+ cluster = Long.parseLong(dsInfos.get("clusterId"));
+ } catch (NumberFormatException e) {
+ throw new CloudRuntimeException("Failed to get clusterId");
+ }
+ ClusterVO clusterVO = clusterDao.findById(cluster);
+ if (clusterVO == null) {
+ throw new CloudRuntimeException("Can't find cluster: " + cluster);
+ }
+ HypervisorType hypervisor = clusterVO.getHypervisorType();
+ String key = generateKey(hypervisor, protocol);
+ PrimaryDataStoreConfigurator configurator = configuratorMaps.get(key);
+ if (configurator == null) {
+ throw new CloudRuntimeException("can't find configurator from key: " + key);
+ }
+
+ StorageProtocolTransformer validator = configurator.getProtocolTransformer();
+ validator.normalizeUserInput(dsInfos);
+
+ 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"));
+ dataStoreVO.setPoolType(protocol);
+ dataStoreVO.setPort(Integer.parseInt(dsInfos.get("port")));
+ dataStoreVO.setKey(key);
+ dataStoreVO.setName(dsInfos.get("name"));
+ dataStoreVO.setUuid(dsInfos.get("uuid"));
+ dataStoreVO = dataStoreDao.persist(dataStoreVO);
+
+ DefaultPrimaryDataStore dataStore = (DefaultPrimaryDataStore)configurator.getDataStore(dataStoreVO.getId());
+ dataStore.setProvider(this);
+
+ PrimaryDataStoreLifeCycle lifeCycle = dataStore.getLifeCycle();
+ lifeCycle.initialize(dsInfos);
+ return getDataStore(dataStore.getId());
}
@Override
- public boolean configure(Map<String, Object> params) {
- lifecyle = ComponentContext.inject(DefaultPrimaryDataStoreLifeCycleImpl.class);
- driver = ComponentContext.inject(DefaultPrimaryDataStoreDriverImpl.class);
- uuid = (String)params.get("uuid");
- id = (Long)params.get("id");
- storeMgr.registerDriver(uuid, this.driver);
- return true;
+ public long getId() {
+ return this.providerVO.getId();
}
@Override
- public String getUuid() {
- return this.uuid;
+ public boolean configure() {
+ this.providerVO = providerDao.findByName(this.providerName);
+ return true;
}
@Override
- public long getId() {
- return this.id;
+ public String getName() {
+ return providerName;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..c77f7a3
--- /dev/null
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java
@@ -0,0 +1,29 @@
+// 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.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 {
+ public PrimaryDataStoreProvider getDataStoreProvider(Long providerId);
+ public PrimaryDataStoreProvider getDataStoreProvider(String name);
+ public List<PrimaryDataStoreProvider> getDataStoreProviders();
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..33d98db
--- /dev/null
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java
@@ -0,0 +1,106 @@
+/*
+ * 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.datastore.provider;
+
+import java.util.List;
+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;
+
+import com.cloud.utils.db.DB;
+
+@Component
+public class PrimaryDataStoreProviderManagerImpl implements PrimaryDataStoreProviderManager {
+ @Inject
+ List<PrimaryDataStoreProvider> providers;
+ @Inject
+ PrimaryDataStoreProviderDao providerDao;
+
+ @Override
+ public PrimaryDataStoreProvider getDataStoreProvider(Long providerId) {
+ for (PrimaryDataStoreProvider provider : providers) {
+ if (provider.getId() == providerId) {
+ return provider;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ @DB
+ public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+ List<PrimaryDataStoreProviderVO> providerVos = providerDao.listAll();
+ for (PrimaryDataStoreProvider provider : providers) {
+ boolean existingProvider = false;
+ for (PrimaryDataStoreProviderVO providerVo : providerVos) {
+ if (providerVo.getName().equalsIgnoreCase(provider.getName())) {
+ existingProvider = true;
+ break;
+ }
+ }
+ if (!existingProvider) {
+ PrimaryDataStoreProviderVO dataStoreProvider = new PrimaryDataStoreProviderVO();
+ dataStoreProvider.setName(provider.getName());
+ dataStoreProvider = providerDao.persist(dataStoreProvider);
+ }
+
+ provider.configure();
+ }
+ return true;
+ }
+
+ @Override
+ public boolean start() {
+ // TODO Auto-generated method stub
+ return true;
+ }
+
+ @Override
+ public boolean stop() {
+ // TODO Auto-generated method stub
+ return true;
+ }
+
+ @Override
+ public String getName() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public PrimaryDataStoreProvider getDataStoreProvider(String name) {
+ for (PrimaryDataStoreProvider provider : providers) {
+ if (provider.getName().equalsIgnoreCase(name)) {
+ return provider;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public List<PrimaryDataStoreProvider> getDataStoreProviders() {
+ return providers;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateInstallStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateInstallStrategy.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateInstallStrategy.java
deleted file mode 100644
index 7679bb3..0000000
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateInstallStrategy.java
+++ /dev/null
@@ -1,28 +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.volume;
-
-import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
-import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
-import org.apache.cloudstack.storage.image.TemplateInfo;
-import org.apache.cloudstack.storage.volume.VolumeServiceImpl.CreateBaseImageResult;
-
-public interface TemplateInstallStrategy {
- public Void installAsync(TemplateInfo template, PrimaryDataStore store, AsyncCompletionCallback<CreateBaseImageResult> callback);
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateInstallStrategyImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateInstallStrategyImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateInstallStrategyImpl.java
deleted file mode 100644
index ec6b032..0000000
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateInstallStrategyImpl.java
+++ /dev/null
@@ -1,293 +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.volume;
-
-import javax.inject.Inject;
-
-import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
-import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
-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.datastore.ObjectInDataStoreManager;
-import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
-import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
-import org.apache.cloudstack.storage.image.ImageDataFactory;
-import org.apache.cloudstack.storage.image.TemplateInfo;
-import org.apache.cloudstack.storage.motion.DataMotionService;
-import org.apache.cloudstack.storage.volume.VolumeServiceImpl.CreateBaseImageResult;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.fsm.NoTransitionException;
-
-@Component
-public class TemplateInstallStrategyImpl implements TemplateInstallStrategy {
- private static final Logger s_logger = Logger
- .getLogger(TemplateInstallStrategyImpl.class);
- @Inject
- ObjectInDataStoreManager objectInDataStoreMgr;
- @Inject
- DataMotionService motionSrv;
- @Inject
- ImageDataFactory imageFactory;
- protected long waitingTime = 1800; // half an hour
- protected long waitingRetries = 10;
-
- protected TemplateInfo waitingForTemplateDownload(TemplateInfo template,
- PrimaryDataStore dataStore) {
- long retries = this.waitingRetries;
- ObjectInDataStoreVO obj = null;
- do {
- try {
- Thread.sleep(waitingTime);
- } catch (InterruptedException e) {
- s_logger.debug("sleep interrupted", e);
- throw new CloudRuntimeException("sleep interrupted", e);
- }
-
- obj = objectInDataStoreMgr.findObject(template.getId(),
- template.getType(), dataStore.getId(), dataStore.getRole());
- if (obj == null) {
- s_logger.debug("can't find object in db, maybe it's cleaned up already, exit waiting");
- break;
- }
- if (obj.getState() == ObjectInDataStoreStateMachine.State.Ready) {
- break;
- }
- retries--;
- } while (retries > 0);
-
- if (obj == null || retries <= 0) {
- s_logger.debug("waiting too long for template downloading, marked it as failed");
- throw new CloudRuntimeException(
- "waiting too long for template downloading, marked it as failed");
- }
- return imageFactory.getTemplate(template.getId(), dataStore);
- }
-
- class InstallContext<T> extends AsyncRpcConext<T> {
- final TemplateInfo destTemplate;
- final TemplateInfo srcTemplate;
-
- public InstallContext(AsyncCompletionCallback<T> callback,
- TemplateInfo destTemplate, TemplateInfo srcTemplate) {
- super(callback);
- this.destTemplate = destTemplate;
- this.srcTemplate = srcTemplate;
- }
-
- }
-
- @Override
- public Void installAsync(TemplateInfo template, PrimaryDataStore store,
- AsyncCompletionCallback<CreateBaseImageResult> callback) {
- ObjectInDataStoreVO obj = objectInDataStoreMgr.findObject(
- template.getId(), template.getType(), store.getId(),
- store.getRole());
- TemplateInfo templateOnPrimaryStoreObj = null;
- boolean freshNewTemplate = false;
- if (obj == null) {
- try {
- templateOnPrimaryStoreObj = objectInDataStoreMgr.create(
- template, store);
- freshNewTemplate = true;
- } catch (Throwable e) {
- obj = objectInDataStoreMgr.findObject(template.getId(),
- template.getType(), store.getId(), store.getRole());
- if (obj == null) {
- CreateBaseImageResult result = new CreateBaseImageResult(
- null);
- result.setSucess(false);
- result.setResult(e.toString());
- callback.complete(result);
- return null;
- }
- }
- }
-
- if (!freshNewTemplate
- && obj.getState() != ObjectInDataStoreStateMachine.State.Ready) {
- try {
- templateOnPrimaryStoreObj = waitingForTemplateDownload(
- template, store);
- } catch (Exception e) {
- CreateBaseImageResult result = new CreateBaseImageResult(null);
- result.setSucess(false);
- result.setResult(e.toString());
- callback.complete(result);
- return null;
- }
-
- CreateBaseImageResult result = new CreateBaseImageResult(
- templateOnPrimaryStoreObj);
- callback.complete(result);
- return null;
- }
-
- try {
- objectInDataStoreMgr.update(templateOnPrimaryStoreObj,
- ObjectInDataStoreStateMachine.Event.CreateRequested);
- } catch (NoTransitionException e) {
- try {
- objectInDataStoreMgr.update(templateOnPrimaryStoreObj,
- ObjectInDataStoreStateMachine.Event.OperationFailed);
- } catch (NoTransitionException e1) {
- s_logger.debug("state transation failed", e1);
- }
- CreateBaseImageResult result = new CreateBaseImageResult(null);
- result.setSucess(false);
- result.setResult(e.toString());
- callback.complete(result);
- return null;
- }
-
- InstallContext<CreateBaseImageResult> context = new InstallContext<CreateBaseImageResult>(
- callback, templateOnPrimaryStoreObj, template);
- AsyncCallbackDispatcher<TemplateInstallStrategyImpl, CreateCmdResult> caller = AsyncCallbackDispatcher
- .create(this);
- caller.setCallback(
- caller.getTarget().installTemplateCallback(null, null))
- .setContext(context);
-
- store.getDriver().createAsync(templateOnPrimaryStoreObj, caller);
- return null;
- }
-
- class CopyTemplateContext<T> extends AsyncRpcConext<T> {
- TemplateInfo template;
-
- public CopyTemplateContext(AsyncCompletionCallback<T> callback,
- TemplateInfo template) {
- super(callback);
- this.template = template;
- }
- }
-
- protected Void installTemplateCallback(
- AsyncCallbackDispatcher<TemplateInstallStrategyImpl, CreateCmdResult> callback,
- InstallContext<CreateBaseImageResult> context) {
- CreateCmdResult result = callback.getResult();
- TemplateInfo templateOnPrimaryStoreObj = context.destTemplate;
- CreateBaseImageResult upResult = new CreateBaseImageResult(
- templateOnPrimaryStoreObj);
- if (result.isFailed()) {
- upResult.setResult(result.getResult());
- context.getParentCallback().complete(upResult);
- return null;
- }
-
- ObjectInDataStoreVO obj = objectInDataStoreMgr.findObject(
- templateOnPrimaryStoreObj.getId(), templateOnPrimaryStoreObj
- .getType(), templateOnPrimaryStoreObj.getDataStore()
- .getId(), templateOnPrimaryStoreObj.getDataStore()
- .getRole());
-
- obj.setInstallPath(result.getPath());
- try {
- objectInDataStoreMgr.update(templateOnPrimaryStoreObj,
- ObjectInDataStoreStateMachine.Event.OperationSuccessed);
- } catch (NoTransitionException e) {
- try {
- objectInDataStoreMgr.update(templateOnPrimaryStoreObj,
- ObjectInDataStoreStateMachine.Event.OperationFailed);
- } catch (NoTransitionException e1) {
- s_logger.debug("failed to change state", e1);
- }
-
- upResult.setResult(e.toString());
- context.getParentCallback().complete(upResult);
- return null;
- }
-
- moveTemplate(context.srcTemplate, templateOnPrimaryStoreObj, obj,
- context.getParentCallback());
- return null;
- }
-
- protected void moveTemplate(TemplateInfo srcTemplate,
- TemplateInfo destTemplate, ObjectInDataStoreVO obj,
- AsyncCompletionCallback<CreateBaseImageResult> callback) {
- // move template into primary storage
- try {
- objectInDataStoreMgr.update(destTemplate,
- ObjectInDataStoreStateMachine.Event.CopyingRequested);
- } catch (NoTransitionException e) {
- s_logger.debug("failed to change state", e);
- try {
- objectInDataStoreMgr.update(destTemplate,
- ObjectInDataStoreStateMachine.Event.OperationFailed);
- } catch (NoTransitionException e1) {
-
- }
- CreateBaseImageResult res = new CreateBaseImageResult(destTemplate);
- res.setResult("Failed to change state: " + e.toString());
- callback.complete(res);
- }
-
- CopyTemplateContext<CreateBaseImageResult> anotherCall = new CopyTemplateContext<CreateBaseImageResult>(
- callback, destTemplate);
- AsyncCallbackDispatcher<TemplateInstallStrategyImpl, CopyCommandResult> caller = AsyncCallbackDispatcher
- .create(this);
- caller.setCallback(caller.getTarget().copyTemplateCallback(null, null))
- .setContext(anotherCall);
-
- motionSrv.copyAsync(srcTemplate, destTemplate, caller);
- }
-
- protected Void copyTemplateCallback(
- AsyncCallbackDispatcher<TemplateInstallStrategyImpl, CopyCommandResult> callback,
- CopyTemplateContext<CreateBaseImageResult> context) {
- CopyCommandResult result = callback.getResult();
- TemplateInfo templateOnPrimaryStoreObj = context.template;
- if (result.isFailed()) {
- CreateBaseImageResult res = new CreateBaseImageResult(
- templateOnPrimaryStoreObj);
- res.setResult(result.getResult());
- context.getParentCallback().complete(res);
- }
- ObjectInDataStoreVO obj = objectInDataStoreMgr.findObject(
- templateOnPrimaryStoreObj.getId(), templateOnPrimaryStoreObj
- .getType(), templateOnPrimaryStoreObj.getDataStore()
- .getId(), templateOnPrimaryStoreObj.getDataStore()
- .getRole());
-
- obj.setInstallPath(result.getPath());
- CreateBaseImageResult res = new CreateBaseImageResult(
- templateOnPrimaryStoreObj);
- try {
- objectInDataStoreMgr.update(templateOnPrimaryStoreObj,
- ObjectInDataStoreStateMachine.Event.OperationSuccessed);
- } catch (NoTransitionException e) {
- s_logger.debug("Failed to update copying state: ", e);
- try {
- objectInDataStoreMgr.update(templateOnPrimaryStoreObj,
- ObjectInDataStoreStateMachine.Event.OperationFailed);
- } catch (NoTransitionException e1) {
- }
-
- res.setResult("Failed to update copying state: " + e.toString());
- context.getParentCallback().complete(res);
- }
- context.getParentCallback().complete(res);
- return null;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/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
new file mode 100644
index 0000000..9221fb4
--- /dev/null
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java
@@ -0,0 +1,87 @@
+/*
+ * 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.volume;
+
+import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
+import org.apache.cloudstack.storage.image.TemplateInfo;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.State;
+import org.apache.cloudstack.storage.volume.db.TemplatePrimaryDataStoreDao;
+import org.apache.cloudstack.storage.volume.db.TemplatePrimaryDataStoreVO;
+
+import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.fsm.NoTransitionException;
+import com.cloud.utils.fsm.StateMachine2;
+
+public class TemplateOnPrimaryDataStoreObject implements TemplateOnPrimaryDataStoreInfo {
+ protected PrimaryDataStore dataStore;
+ protected TemplateInfo template;
+ protected TemplatePrimaryDataStoreVO vo;
+ protected TemplatePrimaryDataStoreDao templateStoreDao;
+ protected TemplatePrimaryDataStoreManager mgr;
+ protected StateMachine2<State, Event, TemplatePrimaryDataStoreVO> stateMachine;
+
+ public TemplateOnPrimaryDataStoreObject(PrimaryDataStore primaryDataStore, TemplateInfo template, TemplatePrimaryDataStoreVO vo,
+ TemplatePrimaryDataStoreDao templateStoreDao, TemplatePrimaryDataStoreManager mgr) {
+ this.dataStore = primaryDataStore;
+ this.template = template;
+ this.vo = vo;
+ this.templateStoreDao = templateStoreDao;
+ this.mgr = mgr;
+ this.stateMachine = mgr.getStateMachine();
+ }
+
+ @Override
+ public String getPath() {
+ return vo.getInstallPath();
+ }
+
+ @Override
+ public void setPath(String path) {
+ this.vo.setInstallPath(path);
+ }
+
+ @Override
+ public PrimaryDataStore getPrimaryDataStore() {
+ return this.dataStore;
+ }
+
+ @Override
+ public TemplateInfo getTemplate() {
+ return this.template;
+ }
+
+ public void updateStatus(Status status) {
+ vo.setDownloadState(status);
+ templateStoreDao.update(vo.getId(), vo);
+ vo = templateStoreDao.findById(vo.getId());
+ }
+
+ public void stateTransit(ObjectInDataStoreStateMachine.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/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManager.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManager.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManager.java
new file mode 100644
index 0000000..5978424
--- /dev/null
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManager.java
@@ -0,0 +1,35 @@
+/*
+ * 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.volume;
+
+import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
+import org.apache.cloudstack.storage.image.TemplateInfo;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.State;
+import org.apache.cloudstack.storage.volume.db.TemplatePrimaryDataStoreVO;
+
+import com.cloud.utils.fsm.StateMachine2;
+
+public interface TemplatePrimaryDataStoreManager {
+ public TemplateOnPrimaryDataStoreInfo createTemplateOnPrimaryDataStore(TemplateInfo template, PrimaryDataStore dataStore);
+
+ public TemplateOnPrimaryDataStoreInfo findTemplateOnPrimaryDataStore(TemplateInfo template, PrimaryDataStore dataStore);
+
+ public StateMachine2<State, Event, TemplatePrimaryDataStoreVO> getStateMachine();
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..fc4e4fd
--- /dev/null
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java
@@ -0,0 +1,129 @@
+/*
+ * 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.volume;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
+import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
+import org.apache.cloudstack.storage.image.TemplateInfo;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.State;
+import org.apache.cloudstack.storage.volume.db.TemplatePrimaryDataStoreDao;
+import org.apache.cloudstack.storage.volume.db.TemplatePrimaryDataStoreVO;
+import org.springframework.stereotype.Component;
+
+import com.cloud.storage.VMTemplateStorageResourceAssoc;
+import com.cloud.utils.db.SearchCriteria2;
+import com.cloud.utils.db.SearchCriteriaService;
+import com.cloud.utils.db.SearchCriteria.Op;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.fsm.StateMachine2;
+
+@Component
+public class TemplatePrimaryDataStoreManagerImpl implements TemplatePrimaryDataStoreManager {
+ @Inject
+ TemplatePrimaryDataStoreDao templateStoreDao;
+ protected long waitingTime = 1800; //half an hour
+ protected long waitingReties = 10;
+ protected StateMachine2<State, Event, TemplatePrimaryDataStoreVO> stateMachines;
+ public TemplatePrimaryDataStoreManagerImpl() {
+ stateMachines = new StateMachine2<State, Event, TemplatePrimaryDataStoreVO>();
+ stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Allocated, Event.CreateRequested, ObjectInDataStoreStateMachine.State.Creating);
+ stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Creating, Event.OperationSuccessed, ObjectInDataStoreStateMachine.State.Ready);
+ stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Creating, Event.OperationFailed, ObjectInDataStoreStateMachine.State.Failed);
+ stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Failed, Event.CreateRequested, ObjectInDataStoreStateMachine.State.Creating);
+ stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Ready, Event.DestroyRequested, ObjectInDataStoreStateMachine.State.Destroying);
+ stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Destroying, Event.OperationSuccessed, ObjectInDataStoreStateMachine.State.Destroyed);
+ stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Destroying, Event.OperationFailed, ObjectInDataStoreStateMachine.State.Destroying);
+ stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Destroying, Event.DestroyRequested, ObjectInDataStoreStateMachine.State.Destroying);
+ }
+
+ private TemplatePrimaryDataStoreVO waitingForTemplateDownload(TemplateInfo template, PrimaryDataStoreInfo dataStore) {
+ //the naive version, polling.
+ long retries = waitingReties;
+ TemplatePrimaryDataStoreVO templateStoreVO = null;
+ do {
+ try {
+ Thread.sleep(waitingTime);
+ } catch (InterruptedException e) {
+
+ }
+
+ templateStoreVO = templateStoreDao.findByTemplateIdAndPoolIdAndReady(template.getId(), dataStore.getId());
+ if (templateStoreVO != null) {
+ break;
+ }
+ 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, PrimaryDataStore dataStore) {
+ 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() != ObjectInDataStoreStateMachine.State.Ready) {
+ templateStoreVO = waitingForTemplateDownload(template, dataStore);
+ }
+
+ TemplateOnPrimaryDataStoreObject templateStoreObject = new TemplateOnPrimaryDataStoreObject(dataStore, template, templateStoreVO, templateStoreDao, this);
+ return templateStoreObject;
+ }
+
+ @Override
+ public TemplateOnPrimaryDataStoreObject findTemplateOnPrimaryDataStore(TemplateInfo template, PrimaryDataStore dataStore) {
+ SearchCriteriaService<TemplatePrimaryDataStoreVO, TemplatePrimaryDataStoreVO> sc = SearchCriteria2.create(TemplatePrimaryDataStoreVO.class);
+ sc.addAnd(sc.getEntity().getTemplateId(), Op.EQ, template.getId());
+ sc.addAnd(sc.getEntity().getPoolId(), Op.EQ, dataStore.getId());
+ sc.addAnd(sc.getEntity().getDownloadState(), Op.EQ, VMTemplateStorageResourceAssoc.Status.DOWNLOADED);
+ TemplatePrimaryDataStoreVO templateStoreVO = sc.find();
+ if (templateStoreVO == null) {
+ return null;
+ }
+
+ TemplateOnPrimaryDataStoreObject templateStoreObject = new TemplateOnPrimaryDataStoreObject(dataStore, template, templateStoreVO, templateStoreDao, this);
+ return templateStoreObject;
+ }
+
+ @Override
+ public StateMachine2<State, Event, TemplatePrimaryDataStoreVO> getStateMachine() {
+ return stateMachines;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java
deleted file mode 100644
index 38c35f8..0000000
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java
+++ /dev/null
@@ -1,53 +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.volume;
-
-import javax.inject.Inject;
-
-import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
-import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
-import org.apache.cloudstack.storage.datastore.DataStoreManager;
-import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
-import org.apache.cloudstack.storage.datastore.VolumeDataFactory;
-import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
-import org.apache.cloudstack.storage.volume.db.VolumeDao2;
-import org.apache.cloudstack.storage.volume.db.VolumeVO;
-import org.springframework.stereotype.Component;
-
-@Component
-public class VolumeDataFactoryImpl implements VolumeDataFactory {
- @Inject
- VolumeDao2 volumeDao;
- @Inject
- ObjectInDataStoreManager objMap;
- @Inject
- DataStoreManager storeMgr;
- @Override
- public VolumeInfo getVolume(long volumeId, DataStore store) {
- VolumeVO volumeVO = volumeDao.findById(volumeId);
- ObjectInDataStoreVO obj = objMap.findObject(volumeId, DataObjectType.VOLUME, store.getId(), store.getRole());
- if (obj == null) {
- return null;
- }
- VolumeObject vol = VolumeObject.getVolumeObject(store, volumeVO);
- return vol;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java
deleted file mode 100644
index 14d7417..0000000
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java
+++ /dev/null
@@ -1,207 +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.volume;
-
-import java.lang.reflect.Method;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-
-import org.apache.cloudstack.engine.cloud.entity.api.SnapshotEntity;
-import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
-import org.apache.cloudstack.engine.datacenter.entity.api.StorageEntity;
-import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
-import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
-import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
-import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
-import org.apache.cloudstack.framework.async.AsyncCallFuture;
-import org.apache.cloudstack.storage.datastore.PrimaryDataStoreEntityImpl;
-import org.apache.cloudstack.storage.volume.VolumeService.VolumeApiResult;
-
-import com.cloud.utils.exception.CloudRuntimeException;
-
-public class VolumeEntityImpl implements VolumeEntity {
- private VolumeInfo volumeInfo;
- private final VolumeService vs;
- private VolumeApiResult result;
-
- protected VolumeEntityImpl() {
- this.vs = null;
- }
-
- public VolumeEntityImpl(VolumeInfo volumeObject, VolumeService vs) {
- this.volumeInfo = volumeObject;
- this.vs = vs;
- }
-
- public VolumeInfo getVolumeInfo() {
- return volumeInfo;
- }
-
- @Override
- public String getUuid() {
- return volumeInfo.getUuid();
- }
-
- @Override
- public long getId() {
- return volumeInfo.getId();
- }
-
- public String getExternalId() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public String getCurrentState() {
- return null;
- }
-
- @Override
- public String getDesiredState() {
- return null;
- }
-
- @Override
- public Date getCreatedTime() {
- return null;
- }
-
- @Override
- public Date getLastUpdatedTime() {
- return null;
- }
-
- @Override
- public String getOwner() {
- return null;
- }
-
-
- @Override
- public List<Method> getApplicableActions() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public SnapshotEntity takeSnapshotOf(boolean full) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public String reserveForMigration(long expirationTime) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void migrate(String reservationToken) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public VolumeEntity setupForCopy() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void copy(VolumeEntity dest) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void attachTo(String vm, long deviceId) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void detachFrom() {
- // TODO Auto-generated method stub
-
- }
-
-
- @Override
- public long getSize() {
- return volumeInfo.getSize();
- }
-
- @Override
- public DiskFormat getDiskType() {
- return null;
- }
-
- @Override
- public VolumeType getType() {
- return null;
- }
-
- @Override
- public StorageEntity getDataStore() {
- return new PrimaryDataStoreEntityImpl((PrimaryDataStoreInfo) volumeInfo.getDataStore());
- }
-
- @Override
- public void destroy() {
- AsyncCallFuture<VolumeApiResult> future = vs.deleteVolumeAsync(volumeInfo);
- try {
- result = future.get();
- if (!result.isSuccess()) {
- throw new CloudRuntimeException("Failed to create volume:" + result.getResult());
- }
- } catch (InterruptedException e) {
- throw new CloudRuntimeException("wait to delete volume info failed", e);
- } catch (ExecutionException e) {
- throw new CloudRuntimeException("wait to delete volume failed", e);
- }
- }
-
- @Override
- public Map<String, String> getDetails() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void addDetail(String name, String value) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void delDetail(String name, String value) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void updateDetail(String name, String value) {
- // TODO Auto-generated method stub
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java
index 98c6b69..77a5949 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java
@@ -18,6 +18,8 @@
*/
package org.apache.cloudstack.storage.volume;
+import javax.inject.Inject;
+
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeProfile;
import org.apache.cloudstack.storage.volume.db.VolumeDao2;
import org.apache.cloudstack.storage.volume.db.VolumeVO;
@@ -26,7 +28,6 @@ import org.springframework.stereotype.Component;
import com.cloud.storage.Volume;
import com.cloud.storage.Volume.Event;
import com.cloud.storage.Volume.State;
-import com.cloud.utils.component.Inject;
import com.cloud.utils.fsm.NoTransitionException;
import com.cloud.utils.fsm.StateMachine2;
@@ -39,6 +40,7 @@ public class VolumeManagerImpl implements VolumeManager {
initStateMachine();
}
+ @Override
public VolumeVO allocateDuplicateVolume(VolumeVO oldVol) {
/*
VolumeVO newVol = new VolumeVO(oldVol.getVolumeType(), oldVol.getName(), oldVol.getDataCenterId(), oldVol.getDomainId(), oldVol.getAccountId(), oldVol.getDiskOfferingId(), oldVol.getSize());
@@ -47,58 +49,62 @@ public class VolumeManagerImpl implements VolumeManager {
newVol.setInstanceId(oldVol.getInstanceId());
newVol.setRecreatable(oldVol.isRecreatable());
newVol.setReservationId(oldVol.getReservationId());
- */
+ */
return null;
// return _volumeDao.persist(newVol);
}
-
+
private void initStateMachine() {
- s_fsm.addTransition(Volume.State.Allocated, Event.CreateRequested, Volume.State.Creating);
- s_fsm.addTransition(Volume.State.Allocated, Event.DestroyRequested, Volume.State.Destroying);
- s_fsm.addTransition(Volume.State.Creating, Event.OperationRetry, Volume.State.Creating);
- s_fsm.addTransition(Volume.State.Creating, Event.OperationFailed, Volume.State.Allocated);
- s_fsm.addTransition(Volume.State.Creating, Event.OperationSucceeded, Volume.State.Ready);
- s_fsm.addTransition(Volume.State.Creating, Event.DestroyRequested, Volume.State.Destroying);
- s_fsm.addTransition(Volume.State.Creating, Event.CreateRequested, Volume.State.Creating);
- s_fsm.addTransition(Volume.State.Allocated, Event.UploadRequested, Volume.State.UploadOp);
- s_fsm.addTransition(Volume.State.UploadOp, Event.CopyRequested, Volume.State.Creating);// CopyRequested for volume from sec to primary storage
- s_fsm.addTransition(Volume.State.Creating, Event.CopySucceeded, Volume.State.Ready);
- s_fsm.addTransition(Volume.State.Creating, Event.CopyFailed, Volume.State.UploadOp);// Copying volume from sec to primary failed.
- s_fsm.addTransition(Volume.State.UploadOp, Event.DestroyRequested, Volume.State.Destroying);
- s_fsm.addTransition(Volume.State.Ready, Event.DestroyRequested, Volume.State.Destroying);
- s_fsm.addTransition(Volume.State.Destroy, Event.ExpungingRequested, Volume.State.Expunging);
- s_fsm.addTransition(Volume.State.Ready, Event.SnapshotRequested, Volume.State.Snapshotting);
- s_fsm.addTransition(Volume.State.Snapshotting, Event.OperationSucceeded, Volume.State.Ready);
- s_fsm.addTransition(Volume.State.Snapshotting, Event.OperationFailed, Volume.State.Ready);
- s_fsm.addTransition(Volume.State.Ready, Event.MigrationRequested, Volume.State.Migrating);
- s_fsm.addTransition(Volume.State.Migrating, Event.OperationSucceeded, Volume.State.Ready);
- s_fsm.addTransition(Volume.State.Migrating, Event.OperationFailed, Volume.State.Ready);
- s_fsm.addTransition(Volume.State.Destroy, Event.OperationSucceeded, Volume.State.Destroy);
- s_fsm.addTransition(Volume.State.Destroying, Event.OperationSucceeded, Volume.State.Destroy);
- s_fsm.addTransition(Volume.State.Destroying, Event.OperationFailed, Volume.State.Destroying);
- s_fsm.addTransition(Volume.State.Destroying, Event.DestroyRequested, Volume.State.Destroying);
+ s_fsm.addTransition(Volume.State.Allocated, Event.CreateRequested, Volume.State.Creating);
+ s_fsm.addTransition(Volume.State.Allocated, Event.DestroyRequested, Volume.State.Destroying);
+ s_fsm.addTransition(Volume.State.Creating, Event.OperationRetry, Volume.State.Creating);
+ s_fsm.addTransition(Volume.State.Creating, Event.OperationFailed, Volume.State.Allocated);
+ s_fsm.addTransition(Volume.State.Creating, Event.OperationSucceeded, Volume.State.Ready);
+ s_fsm.addTransition(Volume.State.Creating, Event.DestroyRequested, Volume.State.Destroying);
+ s_fsm.addTransition(Volume.State.Creating, Event.CreateRequested, Volume.State.Creating);
+ s_fsm.addTransition(Volume.State.Allocated, Event.UploadRequested, Volume.State.UploadOp);
+ s_fsm.addTransition(Volume.State.UploadOp, Event.CopyRequested, Volume.State.Creating);// CopyRequested for volume from sec to primary storage
+ s_fsm.addTransition(Volume.State.Creating, Event.CopySucceeded, Volume.State.Ready);
+ s_fsm.addTransition(Volume.State.Creating, Event.CopyFailed, Volume.State.UploadOp);// Copying volume from sec to primary failed.
+ s_fsm.addTransition(Volume.State.UploadOp, Event.DestroyRequested, Volume.State.Destroying);
+ s_fsm.addTransition(Volume.State.Ready, Event.DestroyRequested, Volume.State.Destroying);
+ s_fsm.addTransition(Volume.State.Destroy, Event.ExpungingRequested, Volume.State.Expunging);
+ s_fsm.addTransition(Volume.State.Ready, Event.SnapshotRequested, Volume.State.Snapshotting);
+ s_fsm.addTransition(Volume.State.Snapshotting, Event.OperationSucceeded, Volume.State.Ready);
+ s_fsm.addTransition(Volume.State.Snapshotting, Event.OperationFailed, Volume.State.Ready);
+ s_fsm.addTransition(Volume.State.Ready, Event.MigrationRequested, Volume.State.Migrating);
+ s_fsm.addTransition(Volume.State.Migrating, Event.OperationSucceeded, Volume.State.Ready);
+ s_fsm.addTransition(Volume.State.Migrating, Event.OperationFailed, Volume.State.Ready);
+ s_fsm.addTransition(Volume.State.Destroy, Event.OperationSucceeded, Volume.State.Destroy);
+ s_fsm.addTransition(Volume.State.Destroying, Event.OperationSucceeded, Volume.State.Destroy);
+ s_fsm.addTransition(Volume.State.Destroying, Event.OperationFailed, Volume.State.Destroying);
+ s_fsm.addTransition(Volume.State.Destroying, Event.DestroyRequested, Volume.State.Destroying);
}
-
+
@Override
public StateMachine2<State, Event, VolumeVO> getStateMachine() {
return s_fsm;
}
+ @Override
public VolumeVO processEvent(Volume vol, Volume.Event event) throws NoTransitionException {
// _volStateMachine.transitTo(vol, event, null, _volumeDao);
return _volumeDao.findById(vol.getId());
}
+ @Override
public VolumeProfile getProfile(long volumeId) {
// TODO Auto-generated method stub
return null;
}
+ @Override
public VolumeVO getVolume(long volumeId) {
// TODO Auto-generated method stub
return null;
}
+ @Override
public VolumeVO updateVolume(VolumeVO volume) {
// TODO Auto-generated method stub
return null;
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
index 1faacbb..13ae35c 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
@@ -1,20 +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.volume;
-import java.io.File;
+import java.util.Date;
import javax.inject.Inject;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
-import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
+import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
+import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskTypeHelper;
+import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeTypeHelper;
+import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import org.apache.cloudstack.storage.volume.db.VolumeDao2;
import org.apache.cloudstack.storage.volume.db.VolumeVO;
import org.apache.log4j.Logger;
import com.cloud.storage.Volume;
-import com.cloud.utils.component.ComponentInject;
+import com.cloud.storage.Volume.State;
+import com.cloud.utils.component.ComponentContext;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.fsm.NoTransitionException;
import com.cloud.utils.fsm.StateMachine2;
@@ -23,71 +42,84 @@ public class VolumeObject implements VolumeInfo {
private static final Logger s_logger = Logger.getLogger(VolumeObject.class);
protected VolumeVO volumeVO;
private StateMachine2<Volume.State, Volume.Event, VolumeVO> _volStateMachine;
- protected DataStore dataStore;
-
+ protected PrimaryDataStore dataStore;
+ @Inject
+ VolumeDiskTypeHelper diskTypeHelper;
@Inject
VolumeTypeHelper volumeTypeHelper;
@Inject
VolumeDao2 volumeDao;
@Inject
VolumeManager volumeMgr;
- private VolumeObject(DataStore dataStore, VolumeVO volumeVO) {
+ private VolumeObject(PrimaryDataStore dataStore, VolumeVO volumeVO) {
this.volumeVO = volumeVO;
this.dataStore = dataStore;
}
-
- public static VolumeObject getVolumeObject(DataStore dataStore, VolumeVO volumeVO) {
+
+ public static VolumeObject getVolumeObject(PrimaryDataStore dataStore, VolumeVO volumeVO) {
VolumeObject vo = new VolumeObject(dataStore, volumeVO);
- vo = ComponentInject.inject(vo);
+ vo = ComponentContext.inject(vo);
return vo;
}
+ @Override
public String getUuid() {
return volumeVO.getUuid();
}
public void setPath(String uuid) {
- volumeVO.setPath(uuid);
+ volumeVO.setUuid(uuid);
}
+ @Override
public String getPath() {
return volumeVO.getPath();
}
+ @Override
public String getTemplateUuid() {
return null;
}
+ @Override
public String getTemplatePath() {
return null;
}
+ public PrimaryDataStoreInfo getDataStoreInfo() {
+ return dataStore;
+ }
+
public Volume.State getState() {
return volumeVO.getState();
}
- public DataStore getDataStore() {
+ @Override
+ public PrimaryDataStore getDataStore() {
return dataStore;
}
+ @Override
public long getSize() {
return volumeVO.getSize();
}
- public DiskFormat getDiskType() {
- return null;
+ @Override
+ public VolumeDiskType getDiskType() {
+ return diskTypeHelper.getDiskType(volumeVO.getDiskType());
}
- public DataObjectType getType() {
- return DataObjectType.VOLUME;
+ @Override
+ public VolumeType getType() {
+ return volumeTypeHelper.getType(volumeVO.getVolumeType());
}
public long getVolumeId() {
return volumeVO.getId();
}
- public void setVolumeDiskType(DiskFormat type) {
- //volumeVO.setDiskType(type.toString());
+ public void setVolumeDiskType(VolumeDiskType type) {
+ volumeVO.setDiskType(type.toString());
}
public boolean stateTransit(Volume.Event event) {
@@ -110,22 +142,47 @@ public class VolumeObject implements VolumeInfo {
@Override
public long getId() {
- return this.volumeVO.getId();
+ // TODO Auto-generated method stub
+ return 0;
}
@Override
- public boolean isAttachedVM() {
- return (this.volumeVO.getInstanceId() == null) ? false : true;
+ public State getCurrentState() {
+ // TODO Auto-generated method stub
+ return null;
}
@Override
- public String getUri() {
- return this.dataStore.getUri() + File.separator + "?type=volume&path=" + this.volumeVO.getPath();
+ public State getDesiredState() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Date getCreatedDate() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Date getUpdatedDate() {
+ // TODO Auto-generated method stub
+ return null;
}
@Override
- public DiskFormat getFormat() {
+ public String getOwner() {
// TODO Auto-generated method stub
return null;
}
+
+ @Override
+ public String getName() {
+ return this.volumeVO.getName();
+ }
+
+ @Override
+ public boolean isAttachedVM() {
+ return (this.volumeVO.getInstanceId() == null) ? false : true;
+ }
}