Skip to content

Commit cc73f2a

Browse files
committed
add volumeorchestra
1 parent 2300310 commit cc73f2a

12 files changed

Lines changed: 368 additions & 10 deletions

File tree

api/src/com/cloud/storage/Volume.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,14 @@ enum Event {
147147
public void incrUpdatedCount();
148148

149149
public Date getUpdated();
150+
151+
/**
152+
* @return
153+
*/
154+
String getReservationId();
155+
156+
/**
157+
* @param reserv
158+
*/
159+
void setReservationId(String reserv);
150160
}

core/src/com/cloud/storage/VolumeVO.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ public class VolumeVO implements Volume, Identity {
131131
@Column(name = "uuid")
132132
String uuid;
133133

134+
@Column(name="reservation")
135+
String reservationId;
136+
134137
// Real Constructor
135138
public VolumeVO(Type type, String name, long dcId, long domainId, long accountId, long diskOfferingId, long size) {
136139
this.volumeType = type;
@@ -429,6 +432,16 @@ public boolean equals(Object obj) {
429432
}
430433
}
431434

435+
@Override
436+
public String getReservationId() {
437+
return this.reservationId;
438+
}
439+
440+
@Override
441+
public void setReservationId(String reserv) {
442+
this.reservationId = reserv;
443+
}
444+
432445
@Override
433446
public String getUuid() {
434447
return this.uuid;

platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStore.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public class StoreScope {
4444
long getZoneId();
4545
StoreType getType();
4646
StoreScope getScope();
47+
boolean isSharedStorage();
4748
Long getId();
4849
DataStoreDriver getDataStoreDriver();
4950
DataStoreEndPointSelector getEndPointSelector();
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package org.apache.cloudstack.platform.subsystem.api.storage;
22

3+
import com.cloud.storage.Volume;
4+
35
public interface VolumeStrategy {
46
Volume createVolume(Volume vol);
7+
Volume createVolume(Volume vol, DataStore store);
58
Volume copyVolume(Volume srcVol, Volume destVol);
69
Volume createVolumeFromSnapshot(Volume vol, Snapshot snapshot);
710
Volume createVolumeFromTemplate(Volume vol, Template template);
8-
Volume migrateVolume(Volume srcVol, Volume destVol);
11+
Volume migrateVolume(Volume srcVol, DataStore srcStore, Volume destVol, DataStore destStore);
912
boolean deleteVolume(Volume vol);
1013
}

platform/storage/src/org/apache/cloudstack/storage/StorageOrchestrator.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,33 +20,40 @@
2020

2121
import java.util.List;
2222

23+
import com.cloud.deploy.DeploymentPlan;
24+
2325
public interface StorageOrchestrator {
2426

2527
/**
2628
* Prepares all storage ready for a VM to start
2729
* @param vm
2830
* @param reservationId
2931
*/
30-
void prepare(String vm, String reservationId);
32+
void prepare(long vmId, DeploymentPlan plan, String reservationId);
3133

3234
/**
3335
* Releases all storage that were used for a VM shutdown
3436
* @param vm
3537
* @param disks
3638
* @param reservationId
3739
*/
38-
void release(String vm, String reservationId);
40+
void release(long vmId, String reservationId);
3941

4042
/**
4143
* Destroy all disks
4244
* @param disks
4345
* @param reservationId
4446
*/
45-
void destroy(List<String> disks, String reservationId);
47+
void destroy(List<Long> disks, String reservationId);
4648

4749
/**
4850
* Cancel a reservation
4951
* @param reservationId reservation to
5052
*/
5153
void cancel(String reservationId);
54+
55+
/**
56+
* If attaching a volume in allocated state to a running vm, need to create this volume
57+
*/
58+
void prepareAttachDiskToVM(long diskId, long vmId, String reservationId);
5259
}
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.apache.cloudstack.storage;
20+
21+
import java.util.List;
22+
23+
import org.apache.cloudstack.platform.subsystem.api.storage.DataStore;
24+
import org.apache.cloudstack.platform.subsystem.api.storage.StorageProvider;
25+
import org.apache.cloudstack.platform.subsystem.api.storage.VolumeStrategy;
26+
import org.apache.cloudstack.storage.volume.VolumeManager;
27+
import org.apache.log4j.Logger;
28+
29+
import com.cloud.deploy.DeploymentPlan;
30+
import com.cloud.offering.DiskOffering;
31+
import com.cloud.storage.DiskOfferingVO;
32+
import com.cloud.storage.StoragePool;
33+
import com.cloud.storage.Volume;
34+
import com.cloud.storage.VolumeHostVO;
35+
import com.cloud.storage.VolumeVO;
36+
import com.cloud.storage.dao.DiskOfferingDao;
37+
import com.cloud.storage.dao.StoragePoolDao;
38+
import com.cloud.storage.dao.VolumeDao;
39+
import com.cloud.storage.dao.VolumeHostDao;
40+
import com.cloud.utils.component.Inject;
41+
import com.cloud.utils.db.DB;
42+
import com.cloud.utils.db.Transaction;
43+
import com.cloud.utils.exception.CloudRuntimeException;
44+
import com.cloud.utils.fsm.NoTransitionException;
45+
import com.cloud.vm.VirtualMachine;
46+
import com.cloud.vm.dao.VMInstanceDao;
47+
48+
public class StorageOrchestratorImpl implements StorageOrchestrator {
49+
private static final Logger s_logger = Logger.getLogger(StorageOrchestratorImpl.class);
50+
@Inject
51+
StoragePoolDao _storagePoolDao;
52+
@Inject
53+
StorageProviderManager _spManager;
54+
@Inject
55+
VolumeDao _volumeDao;
56+
@Inject
57+
VMInstanceDao _vmDao;
58+
@Inject
59+
DiskOfferingDao _diskOfferingDao;
60+
@Inject
61+
VolumeHostDao _volumeHostDao;
62+
@Inject
63+
StorageProviderManager _storageProviderMgr;
64+
@Inject
65+
VolumeManager _volumeMgr;
66+
67+
protected Volume copyVolumeFromBackupStorage(VolumeVO volume, DataStore destStore, String reservationId) {
68+
StorageProvider sp = _storageProviderMgr.getBackupStorageProvider(volume.getDataCenterId());
69+
70+
VolumeHostVO volumeHostVO = _volumeHostDao.findByVolumeId(volume.getId());
71+
long poolId = volumeHostVO.getHostId();
72+
DataStore srcStore = _storageProviderMgr.getDataStore(poolId);
73+
74+
75+
76+
}
77+
78+
protected Volume migrateVolume(VolumeVO volume, DataStore srcStore, DataStore destStore, String reservationId) throws NoTransitionException {
79+
VolumeStrategy vs = srcStore.getVolumeStrategy();
80+
81+
Transaction txn = Transaction.currentTxn();
82+
txn.start();
83+
volume.setReservationId(reservationId);
84+
volume = _volumeMgr.processEvent(volume, Volume.Event.MigrationRequested);
85+
Volume destVolume = _volumeMgr.allocateDuplicateVolume(volume);
86+
destVolume = _volumeMgr.processEvent(destVolume, Volume.Event.CreateRequested);
87+
txn.commit();
88+
89+
vs.migrateVolume(volume, srcStore, destVolume, destStore);
90+
91+
txn.start();
92+
volume = _volumeMgr.processEvent(volume, Volume.Event.OperationSucceeded);
93+
destVolume = _volumeMgr.processEvent(destVolume, Volume.Event.OperationSucceeded);
94+
txn.commit();
95+
_volumeDao.remove(volume.getId());
96+
return destVolume;
97+
}
98+
99+
@DB
100+
protected void prepareVolumes(List<VolumeVO> vols, Long destPoolId, String reservationId) throws NoTransitionException {
101+
DataStore destStore = null;
102+
if (destPoolId != null) {
103+
destStore = _storageProviderMgr.getDataStore(destPoolId);
104+
}
105+
106+
for (VolumeVO volume : vols) {
107+
if (volume.getPoolId() == null && destStore == null) {
108+
throw new CloudRuntimeException("Volume has no pool associate and also no storage pool assigned in DeployDestination, Unable to create.");
109+
}
110+
if (destStore == null) {
111+
continue;
112+
}
113+
114+
DataStore srcStore = _storageProviderMgr.getDataStore(volume.getPoolId());
115+
boolean needToCreateVolume = false;
116+
boolean needToRecreateVolume = false;
117+
boolean needToMigrateVolume = false;
118+
boolean needToCopyFromSec = false;
119+
120+
Volume.State state = volume.getState();
121+
if (state == Volume.State.Allocated) {
122+
needToCreateVolume = true;
123+
} else if (state == Volume.State.UploadOp) {
124+
needToCopyFromSec = true;
125+
} else if (destStore.getId() != srcStore.getId()) {
126+
if (s_logger.isDebugEnabled()) {
127+
s_logger.debug("Mismatch in storage pool " + destStore.getId() + " assigned by deploymentPlanner and the one associated with volume " + volume);
128+
}
129+
130+
if (Volume.Type.ROOT == volume.getVolumeType()) {
131+
needToMigrateVolume = true;
132+
} else {
133+
if (destStore.getCluterId() != srcStore.getCluterId()) {
134+
needToMigrateVolume = true;
135+
} else if (!srcStore.isSharedStorage() && srcStore.getId() != destStore.getId()) {
136+
needToMigrateVolume = true;
137+
} else {
138+
continue;
139+
}
140+
}
141+
} else {
142+
continue;
143+
}
144+
145+
VolumeStrategy vs = srcStore.getVolumeStrategy();
146+
if (needToCreateVolume) {
147+
volume.setReservationId(reservationId);
148+
volume = _volumeMgr.processEvent(volume, Volume.Event.CreateRequested);
149+
150+
vs.createVolume(volume, destStore);
151+
152+
volume = _volumeMgr.processEvent(volume, Volume.Event.OperationSucceeded);
153+
} else if (needToMigrateVolume) {
154+
migrateVolume(volume, srcStore, destStore, reservationId);
155+
} else if (needToCopyFromSec) {
156+
_volumeMgr.processEvent(volume, Volume.Event.CopyRequested);
157+
} else if (needToRecreateVolume) {
158+
159+
}
160+
}
161+
}
162+
163+
public void prepare(long vmId, DeploymentPlan plan, String reservationId) {
164+
VirtualMachine vm = _vmDao.findById(vmId);
165+
166+
167+
List<VolumeVO> vols = _volumeDao.findUsableVolumesForInstance(vm.getId());
168+
if (s_logger.isDebugEnabled()) {
169+
s_logger.debug("Prepare " + vols.size() + " volumes for " + vm.getInstanceName());
170+
}
171+
172+
173+
}
174+
175+
176+
public void release(long vmId, String reservationId) {
177+
// TODO Auto-generated method stub
178+
179+
}
180+
181+
public void destroy(List<Long> disks, String reservationId) {
182+
// TODO Auto-generated method stub
183+
184+
}
185+
186+
public void cancel(String reservationId) {
187+
// TODO Auto-generated method stub
188+
189+
}
190+
191+
public void prepareAttachDiskToVM(long disk, long vm, String reservationId) {
192+
// TODO Auto-generated method stub
193+
194+
}
195+
196+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package org.apache.cloudstack.storage;
22

3+
import org.apache.cloudstack.platform.subsystem.api.storage.DataStore;
34
import org.apache.cloudstack.platform.subsystem.api.storage.StorageProvider;
45

56
public interface StorageProviderManager {
67
StorageProvider getProvider(String uuid);
8+
StorageProvider getProvider(long poolId);
9+
StorageProvider getBackupStorageProvider(long zoneId);
10+
DataStore getDataStore(long poolId);
711
}

platform/storage/src/org/apache/cloudstack/storage/datastoreconfigurator/XenNfsDataStoreConfigurator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import org.apache.cloudstack.storage.lifecycle.DefaultPrimaryDataStoreLifeCycle;
1212
import org.apache.cloudstack.storage.strategy.XenBackupStrategy;
1313
import org.apache.cloudstack.storage.strategy.XenSnapshotStrategy;
14-
import org.apache.cloudstack.storage.strategy.XenVolumeStrategy;
14+
import org.apache.cloudstack.storage.strategy.DefaultVolumeStrategy;
1515

1616
import com.cloud.storage.StoragePool;
1717

@@ -26,7 +26,7 @@ public DataStore getDataStore(StoragePool pool) {
2626
ds.setUUID(pool.getUuid());
2727
ds.setDataStoreDriver(new XenDataStoreDriver(ds));
2828
ds.setBackupStrategy(new XenBackupStrategy(ds));
29-
ds.setVolumeStrategy(new XenVolumeStrategy(ds));
29+
ds.setVolumeStrategy(new DefaultVolumeStrategy(ds));
3030
ds.setSnapshotStrategy(new XenSnapshotStrategy(ds));
3131
ds.setLifeCycle(new DefaultPrimaryDataStoreLifeCycle(ds));
3232
return ds;

platform/storage/src/org/apache/cloudstack/storage/strategy/XenVolumeStrategy.java renamed to platform/storage/src/org/apache/cloudstack/storage/strategy/DefaultVolumeStrategy.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
import org.apache.cloudstack.platform.subsystem.api.storage.Volume;
77
import org.apache.cloudstack.platform.subsystem.api.storage.VolumeStrategy;
88

9-
public class XenVolumeStrategy implements VolumeStrategy {
9+
public class DefaultVolumeStrategy implements VolumeStrategy {
1010
protected DataStore _ds;
11-
public XenVolumeStrategy(DataStore ds) {
11+
public DefaultVolumeStrategy(DataStore ds) {
1212
_ds = ds;
1313
}
1414

platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/Volume.java renamed to platform/storage/src/org/apache/cloudstack/storage/volume/VolumeManager.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,13 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
package org.apache.cloudstack.platform.subsystem.api.storage;
19+
package org.apache.cloudstack.storage.volume;
2020

21-
public interface Volume extends DataObject {
21+
import com.cloud.storage.Volume;
22+
import com.cloud.storage.VolumeVO;
23+
import com.cloud.utils.fsm.NoTransitionException;
24+
25+
public interface VolumeManager {
26+
VolumeVO allocateDuplicateVolume(VolumeVO oldVol);
27+
VolumeVO processEvent(Volume vol, Volume.Event event) throws NoTransitionException;
2228
}

0 commit comments

Comments
 (0)